[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n[Bb]in/\ngraphics/tiny-renderer/Renderer/obj/\n"
  },
  {
    "path": "LICENSE.md",
    "content": "The code in this repository is licensed under the terms of the MIT license:\n\nThe MIT License (MIT)\nCopyright (c) 2016 Microsoft, Inc\n\nPermission is hereby granted, free of charge, \nto any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to \ndeal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, \nmerge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom \nthe Software is furnished to do so, \nsubject to the following conditions:\n\nThe above copyright notice and this permission notice \nshall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR \nANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, \nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Sample Workbooks\n\nThis repository contains workbooks to learn various APIs across\nAndroid, iOS and Windows.\n\n**If you are looking to file issues or contribute to development of\nthe Xamarin Workbooks app, please head to\nhttps://github.com/Microsoft/workbooks.**\n\n---\n\nTo use these samples, simply checkout this repository and open any of the `.workbook` files \nwith [Xamarin Workbooks](https://developer.xamarin.com/guides/cross-platform/workbooks/)\n\nThe examples are organized by categories:\n\n* SDK - This directory contains sample integrations and accompanying support materials for integrating with Xamarin Workbooks.\n* Azure - Samples showing how to use Azure services, like Cognitive Services and MobileServices\n* CSharp - Walkthrough various new features in the C# language\n* Graphics - The TinyRender graphics tutorial, 2D graphics with SkiaSharp and 3D graphics with Urho\n* Xamarin-Forms - cross-platform mobile apps with Xamarin.Forms\n\nPlatform specific:\n* Android - Android workbooks\n* Mac - Mac workbooks \n* iOS - iOS workbooks \n* WPF - Windows Presentation Foundation workbooks\n"
  },
  {
    "path": "SDK/.gitignore",
    "content": "bin/\nobj/\n*.user*\n"
  },
  {
    "path": "SDK/README.md",
    "content": "# Custom Integrations with Xamarin Workbooks\n\nThis directory contains sample integrations and accompanying support materials\nfor integrating with Xamarin Workbooks.\n\nSee the [full SDK documentation][docs] for details on the Xamarin Developer site.\n\n[docs]: https://developer.xamarin.com/guides/cross-platform/workbooks/sdk/\n"
  },
  {
    "path": "SDK/Samples/KitchenSink/AgentIntegration.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nusing Xamarin.Interactive;\nusing Xamarin.Interactive.Representations;\n\n[assembly: AgentIntegration (typeof (KitchenSinkIntegration.AgentIntegration))]\n\nnamespace KitchenSinkIntegration\n{\n\tclass AgentIntegration : IAgentIntegration\n\t{\n\t\tconst string TAG = nameof (AgentIntegration);\n\n\t\tpublic void IntegrateWith (IAgent agent)\n\t\t{\n\t\t\tagent.RepresentationManager.AddProvider (new SampleRepresentationProvider ());\n\t\t}\n\n\t\tclass SampleRepresentationProvider : RepresentationProvider\n\t\t{\n\t\t\tpublic override bool HasSensibleEnumerator (IEnumerable enumerable)\n\t\t\t{\n\t\t\t\t// for some reason rendering Arrays as enumerables just doesn't\n\t\t\t\t// make sense in the context of this agent integration!\n\t\t\t\tif (enumerable is Array)\n\t\t\t\t\treturn false;\n\n\t\t\t\treturn base.HasSensibleEnumerator (enumerable);\n\t\t\t}\n\n\t\t\tpublic override IEnumerable<object> ProvideRepresentations (object obj)\n\t\t\t{\n\t\t\t\t// we really like green, so return it for all objects!\n\t\t\t\tyield return new Color (0, 1, 0, 0.5);\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "SDK/Samples/KitchenSink/Api.cs",
    "content": "﻿using System;\n\nusing Xamarin.Interactive.Representations;\n\npublic static class KitchenSink\n{\n\tstatic readonly Random random = new Random ();\n\n\tpublic static Color RandomColor ()\n\t\t=> new Color (random.NextDouble (), random.NextDouble (), random.NextDouble ());\n}"
  },
  {
    "path": "SDK/Samples/KitchenSink/KitchenSink.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: MacMobile\n---\n\n```csharp\n#r \"bin/KitchenSinkIntegration.dll\"\n```\n\n```csharp\nKitchenSink.RandomColor ()\n```\n\n```csharp\nnew KitchenSinkIntegration.Person (\"Aaron\")\n```\n\n```csharp\nnew [] { 1, 2, 3 }\n```"
  },
  {
    "path": "SDK/Samples/KitchenSink/KitchenSinkIntegration.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProductVersion>8.0.30703</ProductVersion>\r\n    <SchemaVersion>2.0</SchemaVersion>\r\n    <ProjectGuid>{AA977F86-97C7-47E0-9A53-300799386F30}</ProjectGuid>\r\n    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <OutputType>Library</OutputType>\r\n    <RootNamespace>KitchenSinkIntegration</RootNamespace>\r\n    <AssemblyName>KitchenSinkIntegration</AssemblyName>\r\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\r\n    <TargetFrameworkProfile>Profile78</TargetFrameworkProfile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin</OutputPath>\r\n    <DefineConstants>DEBUG;</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"AgentIntegration.cs\" />\r\n    <Compile Include=\"Api.cs\" />\r\n    <Compile Include=\"Person.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Content Include=\"KitchenSinkIntegration.js\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Xamarin.Interactive\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"KitchenSink.workbook\" />\r\n  </ItemGroup>\r\n  <Import Project=\"..\\XamarinInteractive.targets\" />\r\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\$(TargetFrameworkVersion)\\Microsoft.Portable.CSharp.targets\" />\r\n</Project>\r\n"
  },
  {
    "path": "SDK/Samples/KitchenSink/KitchenSinkIntegration.js",
    "content": "﻿console.log(\"hello from some third party code => %O\", xamarin.interactive)\n\nvar PersonRenderer = (function () {\n  function PersonRenderer () {\n  }\n\n  PersonRenderer.prototype.cssClass = \"renderer-third-party-person\";\n\n  PersonRenderer.prototype.getRepresentations = function () {\n    return [\n      { shortDisplayName: \"Person\" }\n    ]\n  };\n\n  PersonRenderer.prototype.bind = function (renderState) {\n    console.log(\"PersonRenderer: bind: %O\", renderState)\n    this.renderState = renderState;\n  };\n\n  PersonRenderer.prototype.render = function (target) {\n    console.log(\"PersonRenderer: render %O to %O\", this.renderState, target)\n    var elem = document.createElement(\"div\");\n    elem.innerHTML = \"<strong>Person: <em>\" + this.renderState.source.Name + \"</em></strong>\";\n    target.inlineTarget.appendChild(elem);\n  }\n\n  return PersonRenderer;\n})();\n\nxamarin.interactive.RendererRegistry.registerRenderer(\n  function (source) {\n    if (source.$type === \"KitchenSinkIntegration.Person\")\n      return new PersonRenderer;\n  }\n);"
  },
  {
    "path": "SDK/Samples/KitchenSink/KitchenSinkIntegration.sln",
    "content": "\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2012\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"KitchenSinkIntegration\", \"KitchenSinkIntegration.csproj\", \"{AA977F86-97C7-47E0-9A53-300799386F30}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{AA977F86-97C7-47E0-9A53-300799386F30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{AA977F86-97C7-47E0-9A53-300799386F30}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "SDK/Samples/KitchenSink/Person.cs",
    "content": "﻿using System;\n\nusing Xamarin.Interactive.Serialization;\n\nnamespace KitchenSinkIntegration\n{\n\tpublic sealed class Person : ISerializableObject\n\t{\n\t\tpublic string Name { get; }\n\n\t\tpublic Person (string name)\n\t\t{\n\t\t\tif (name == null)\n\t\t\t\tthrow new ArgumentNullException (nameof (name));\n\n\t\t\tName = name;\n\t\t}\n\n\t\tvoid ISerializableObject.Serialize (ObjectSerializer serializer)\n\t\t\t=> serializer.Property (nameof (Name), Name);\n\t}\n}"
  },
  {
    "path": "SDK/Samples/XamarinInteractive.targets",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <InteractiveSDKLocation Condition=\" '$(OS)' == 'Unix' \">\\Library\\Frameworks\\Xamarin.Interactive.framework\\Versions\\Current\\SDK</InteractiveSDKLocation>\n    <InteractiveSDKLocation Condition=\" '$(OS)' != 'Unix' \">C:\\Program Files (x86)\\Xamarin\\Workbooks\\SDK</InteractiveSDKLocation>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ReferencePath>$(InteractiveSDKLocation)</ReferencePath>\n  </PropertyGroup>\n</Project>\n"
  },
  {
    "path": "SDK/typings/xamarin-interactive.d.ts",
    "content": "declare module \"xamarin/interactive/dotnet\" {\n  /**\n   * A .NET CultureInfo.\n   * See https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx .\n   */\n  export interface CultureInfo {\n    name: string\n    lcid: number\n  }\n\n  /**\n   * A serialized .NET object.\n   */\n  export interface ManagedObject {\n    /**\n     * The value of `GetType ().ToString ()` for the underlying .NET object.\n     * Includes namepspace but no assembly qualification.\n     */\n    $type: string\n  }\n}\n\ndeclare module \"xamarin/interactive/rendering\" {\n  import { ManagedObject, CultureInfo } from \"xamarin/interactive/dotnet\"\n\n  export enum RendererRepresentationOptions {\n    None = 0,\n\n    /**\n     * The representation will always be provided the expanded render\n     * targets and will not be collapsible at all.\n     */\n    ForceExpand = 1,\n\n    /**\n     * The representation is collapsible, but will be expanded by default.\n     */\n    ExpandedByDefault = 2,\n\n    /**\n     * The representation is collapsible and will be collapsed by default if\n     * it is the only or initially selected renderer, and otherwise expanded\n     * automatically when selected from the menu.\n     */\n    ExpandedFromMenu = 4,\n\n    /**\n     * The display name of the representation will be suppressed in the\n     * representation button label and shown only in the button's menu,\n     * but only if all other representations also have the hint.\n     */\n    SuppressDisplayNameHint = 8\n  }\n\n  /**\n   * One (of perhaps many) representation(s) for a given renderer.\n   */\n  export interface RendererRepresentation {\n    /**\n     * The name to show in the representation drop-down menu in the client.\n     */\n    shortDisplayName: string\n    /**\n     * An optional piece of state for use by the renderer.\n     */\n    state?: any\n    /**\n     * Optional. Defaults to RendererRepresentationOptions.None.\n     */\n    options?: RendererRepresentationOptions\n    /**\n     * Optional numerical value to determine sort order of renderers in the\n     * client's drop-down menu. Defaults to 0.\n     */\n    order?: number\n  }\n\n  /**\n   * Provides access to the HTML targets during Renderer.render.\n   */\n  export interface RenderTarget {\n    /**\n     * The selected representation to render.\n     */\n    representation: RendererRepresentation\n    /**\n     * The container element to modify for the 'collapsed' rendering.\n     */\n    inlineTarget: HTMLElement\n    /**\n     * The container element to modify for the 'expanded' rendering.\n     */\n    expandedTarget: HTMLElement\n    /**\n     * Returns true if the representation is currently expanded.\n     */\n    isExpanded: boolean\n  }\n\n  /**\n   * Provides access to the serialized object being rendered, and other state.\n   */\n  export interface RenderState {\n    /**\n     * The state of the parent object, if there is one. Renderers might choose\n     * to layout differently depending on whether or not they are being displayed\n     * as part of a member row in an interactive object table, for example.\n     */\n    parentState: RenderState\n    /**\n     * The serialized .NET source object.\n     */\n    source: ManagedObject\n    /**\n     * Optional CultureInfo.\n     */\n    cultureInfo?: CultureInfo\n  }\n\n  /**\n   * Provides custom rendering(s) for ManagedObjects.\n   */\n  export interface Renderer {\n    /**\n     * The CSS class added to both the inline rendering target and the expanded\n     * rendering target.\n     */\n    cssClass: string\n    /**\n     * The representation(s) provided by this Renderer.\n     */\n    getRepresentations(): RendererRepresentation[]\n    /**\n     * Called once when an object is ready for rendering (though some other\n     * renderer may currently be selected). Useful for doing one-time work.\n     */\n    bind(renderState: RenderState): void\n    /**\n     * Called when it is time to render the serialized object into the HTML target(s).\n     */\n    render(target: RenderTarget): void\n\n    /**\n     * Optional; set to false to prevent this renderer's representations from\n     * showing up in the client's drop-down menu.\n     */\n    isEnabled?: boolean\n    /**\n     * Optional; set to true to enable showing the expanded rendering target.\n     */\n    canExpand?: boolean\n    /**\n     * Optional. Notifies renderer when a collapse occurs, in case extra work is\n     * needed beyond the work done during render.\n     */\n    collapse?(): void\n    /**\n     * Optional. Notifies renderer when an expand occurs, in case extra work is\n     * needed beyond the work done during render.\n     */\n    expand?(): void\n  }\n\n  /**\n   * Accessible via xamarin.interactive.RendererRegistry, this is used to\n   * register renderers.\n   */\n  export class RendererRegistry {\n    /**\n     * Register a renderer factory method. Typically this method will check the\n     * type of the source object, and return an appropriate Renderer if it is\n     * a type the caller wants to handle.\n     */\n    registerRenderer(factory: (source: ManagedObject) => Renderer): void\n  }\n}\n"
  },
  {
    "path": "android/README.md",
    "content": "Android Workbooks\n============\n\n* Getting Started\n* User Interface\n"
  },
  {
    "path": "android/getting-started/AndroidAppBasics.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\npackages: []\n---\n\n# Android App Basics\n\nIn this interactive tutorial, you will learn the basics of \ncreating an Android application using Xamarin.Android.\n\n\n## Android User Interface\n\nThe graphical user interface for an Android app is constructed from \n*widgets* such as text fields, buttons, and checkboxes. Widgets can be \nthought of as the building blocks that you use to create a user \ninterface. `View` widgets are used to show text, display graphics, and \ninteract with the user. `ViewGroup` widgets are invisible containers \nthat arrange other widgets on the screen. This tutorial demonstrates \nhow to build a basic user interface for an Android app by creating \nthese widgets, laying them out on the screen, and wiring them up for \nuser interaction. \n\n\n## Getting Started\n\nStart by importing several namespaces that will be required for the code\nin the rest of this tutorial:\n\n```csharp\nusing Android.App;\nusing Android.Widget;\nusing Android.OS;\n```\n\nIn Android, each screen is controlled by an `Activity`. The `Activity` \nis responsible for managing user interaction within a screen of information.\nThere is only one `Activity` in a Xamarin Workbook. The following code\ncreates a reference to this `Activity` object: \n\n```csharp\nvar rootActivity = StartedActivities.First ();\n```\n\nThis `rootActivity` reference is used throughout the remainder of \nthis tutorial. \n\n\n## Defining the User Interface\n\nThe first step in creating a UI is to define a `ViewGroup` that will \nhold the various widgets that comprise the UI of the `Activity`. Next, \none or more `View`s are added to this `ViewGroup` and their parameters are \nconfigured to set how and where each `View` is displayed within the \n`ViewGroup`. \n\n\n### Creating a Layout\n\n`LinearLayout` is a `ViewGroup` that arranges its child `View`s from \ntop to bottom (or from left to right) as they are added. Instantiate a \n`LinearLayout` object and set its orientation to vertical: \n\n```csharp\nvar layout = new LinearLayout (rootActivity);\nlayout.Orientation = Orientation.Vertical;\n\n```\n\nSetting the orientation to vertical causes widgets to be arranged \nfrom top to bottom of the screen as they are added to the layout. \n\n### Adding a Button\n\nThe first widget to add to this layout is a `Button`. Instantiate a \n`Button` object, set its display text to **Click Me!**, and add the\nbutton to the layout: \n\n```csharp\nButton button = new Button(rootActivity);\nbutton.Text = \"Click Me!\";\nlayout.AddView (button);\n```\n\nRun the following code to display the resulting user interface on the \nscreen: \n\n```csharp\nrootActivity.SetContentView(layout);\n```\n\nWhen you click the button, the app does not respond. That is because \nthere is no code to handle the button's click event. This code will be \nadded later in this tutorial. \n\n\n### Adding a TextView\n\nThe next widget to add to this layout is a `TextView`. Instantiate a \n`TextView` object, initialize its text, and add it to the layout: \n\n```csharp\nTextView textView = new TextView(rootActivity);\ntextView.Text = \"This Space is for Rent\";\nlayout.AddView (textView);\n```\n\nWhen you run this code, a `TextView` is created and its message is \ndisplayed below the button. Run the following code, change \nthe text to something different, and then run it again: \n\n```csharp\ntextView.Text = \"This Space is Taken\";\n```\n\n### Modifying View Layout Parameters\n\nYou can call methods on a `View` object to modify how it looks after it \nis instantiated. Run the following line of code to center the \n`TextView` within the `LinearLayout`: \n\n```csharp\ntextView.Gravity = Android.Views.GravityFlags.CenterHorizontal;\n```\n\nThe `TextView` would look better if it had more space around it. Run the \nfollowing code to add padding (20 pixels top and bottom, 10 pixels on \neach side): \n\n\n```csharp\ntextView.SetPadding(10, 20, 10, 20);\n```\n\nTo make the text easier to read, run the following line of code to \nchange the color of the text to yellow: \n\n```csharp\ntextView.SetTextColor(Android.Graphics.Color.Yellow);\n```\n\nAt this point, the app has a simple (though passive) user interface \nthat is displayed in a single `Activity`. The next step is to add code \nto handle user input. \n\n\n## Responding to User Input\n\nAfter the app's user interface is designed, the next step is to create \nevent handlers to respond to user input. The following examples \ndemonstrate how to create event handlers to respond to user clicks on \nthe button. \n\n### Creating an Event Handler\n\nThere are a number of different ways that you can write code to handle \nuser-triggered events. The following code implements an *anonymous \ndelegate* to handle the button click event. This one-line event \nhandler changes the text on the button face when it is clicked: \n\n```csharp\nbutton.Click += delegate { button.Text = \"This Button was clicked\"; };\n```\n\nClick the button after running this code to see the text on the button \nchange. \n\n\n### Displaying a Toast\n\nAnother way to repond to user input is to display a *Toast* message \nthat indicates that the button was clicked. Run this code and click the \nbutton again: \n\n\n```csharp\nbutton.Click += delegate { Toast.MakeText(rootActivity, \"Clicked!\", ToastLength.Long).Show(); };\n```\n\nA toast message is briefly displayed near the bottom of the screen to \nindicate that the button was clicked. \n\nNote that the button text is *also* updated with each click. This is \nbecause each call to `button.Click +=` adds an additional event handler \nthat responds to button clicks (i.e., it doesn't replace the previously \ndefined event handler). Each event handler that is added to the button \n`Click` event is called when when the button is clicked. \n\n\n## Exercises\n\nYou have now seen the basics of how to create a Xamarin.Android user \ninterface and handle user input. Here are some things you can try to \ntest your understanding: \n\n-   Add a `count` variable and increment this count each time the \n    button is clicked. \n\n-   Display the new click count on the button face each time the button \n    is clicked. \n\n-   Try displaying the click count in the `TextView` as well as on \n    the face of the button. \n\n\n## Further Reading\n\nIn a typical Android application, you develop a user interface by \ndefining its layout in an XML file. This XML file describes the \nhierarchical relationships of `View`s and `ViewGroup`s in your UI \n(rather than programmatically, as was demonstrated in this tutorial), \nand it defines the configuration parameters for each `View` and \n`ViewGroup` . For a more detailed explanation about building your first \nAndroid app using Xamarin Studio or Visual Studio, see \n[Hello, Android](https://developer.xamarin.com/guides/android/getting_started/hello,android/). \n"
  },
  {
    "path": "android/getting-started/hello-android-workbook.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\n---\n\n# Android\n\n```csharp\nvar mainActivity = StartedActivities.First();\nvar label = new Android.Widget.TextView(mainActivity) {\n  Text = \"Hello, Workbooks\",\n  TextSize = 36\n};\nmainActivity.SetContentView(label);\n```\n"
  },
  {
    "path": "android/getting-started/meta.json",
    "content": "{\n  \"order\":{\n    \"AndroidAppBasics.workbook\":\"App Basics\",\n    \"hello-android-workbook.workbook\":\"Hello, Android\"\n  }\n}\n"
  },
  {
    "path": "android/meta.json",
    "content": "{\n  \"order\":{\n    \"getting-started\":\"Getting Started\",\n    \"user-interface\":\"User Interface\"\n  }\n}\n"
  },
  {
    "path": "android/user-interface/2D-drawing.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\npackages: []\n---\n\n# 2D Graphics in Xamarin.Android\n\nIn this workbook, you will learn the basics of creating a custom View and 2D drawing using Xamarin.Android.\n\nOne technique for drawing 2D graphics in Android is to use the Canvas APIs. This is a powerful API that allows for very fine grained control for how 2D graphics are created. The Canvas API uses a\\* painter’s model\\* for 2D drawing. Settings such as colour, stroke type, are programatically applied. Methods on the Canvas object are called to perform drawing actions, which are applied in successive order on the underlying bitmap. There are two ways to obtain and draw on a `Canvas` object.\n\nOne is to create a bitmap and provide as a parameter to the `Canvas` constructor. The other way is to subclass `Android.Views.View`, and override the `OnDraw` method. Android will invoke this method each time the View needs to be draw, and will pass in a `Canvas` object to be draw on.\n\nFor this example, let’s consider the case of drawing a progress bar. Part of the bar will be red, and the other part is green.\n\nTo beging, let’s declare all the namespaces that are required for this work through and obtain a reference to the Activity that we will be drawing on:\n\n```csharp\nusing System;\nusing Android.App;\nusing Android.Content;\nusing Android.Graphics;\nusing Android.Graphics.Drawables;\nusing Android.Graphics.Drawables.Shapes;\nusing Android.OS;\nusing Android.Views;\n\nActivity activity=StartedActivities.First();\n```\n\n## Creating a Custom View for Drawing\n\nThe code for drawing the progress bar will be contained in a custom class that extends `Android.Views.View`. This code for this is shown in the following class:\n\n```csharp\npublic class MyRedGreenBar : Android.Views.View\n{\n    Paint greenPaint;\n    Paint redPaint;\n\n    public MyRedGreenBar(Context context) : base(context)\n    {\n        greenPaint = new Paint { \n            AntiAlias=true, \n            Color = Color.Rgb(0x99,0xCC, 0)\n        };\n        greenPaint.SetStyle(Paint.Style.FillAndStroke);\n\n        redPaint = new Paint {\n            AntiAlias = true,\n            Color = Color.Rgb(0xFF, 0x44, 0x44)\n        };\n        redPaint.SetStyle(Paint.Style.FillAndStroke);\n    }\n\n    protected override void OnDraw(Canvas canvas)\n    {\n        base.OnDraw(canvas);\n\n        // First, fill the canvas with the red paint.\n        canvas.DrawPaint(redPaint);\n\n        // Next, draw a green rectangle that covers the left 25% of the canvaa.\n        float middle = canvas.Width * 0.25f;\n        canvas.DrawRect(0,0, middle, Height, greenPaint);\n    }\n}\n```\n\n## Display the View\n\nTo display this view, just set it as the content view for the Activity:\n\n```csharp\nactivity.SetContentView(new MyRedGreenBar(activity));\n```\n\n## Further Reading\n\nTo learn more, you might want to read the [Graphics & Animation Guide](https://developer.xamarin.com/guides/android/application_fundamentals/graphics_and_animation/) in the Xamarin Developer Portal."
  },
  {
    "path": "android/user-interface/AutoCompleteTextView.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\npackages: []\n---\n\n# AutoCompleteTextView\n\nThis guide will demonstrate how to use an AutoCompleteTextView in an Android application. An AutoCompleteTextView will display a list of suggestions that match the text a user has entered into a TextView. An AutoCompleteTextView doesn’t work alone - it requires the assistance of another widget which must extend `Android.Widget.BaseAdapter`. The adapter is a special class that will display a individual item from a list in the drop down list UI that is presented by the AutoCompleteTextView.\n\nFirst, let’s import the necessary namespaces that we need, and declare a list hat holds the names of some monkeys.\n\n```csharp\nusing System;\nusing Android.App;\nusing Android.Util;\nusing Android.Views;\nusing Android.Widget;\n\n// Get a reference to the Activity.\nActivity activity = StartedActivities.First();\n\n// A small list of some different types of monkeys\nList<String> allTheMonkeys = new List<String> { \"Allen's swamp monkey\",\n  \"Black capuchin\", \"Black-headed marmoset\", \"Black-headed night monkey\", \"Black-shanked douc\", \n  \"Cotton top tamarin\",\n  \"Drill\",\n  \"Gee's golden lemur\", \"Geoffrey's tamarin\", \"Gelada\", \"Golden lion Tamarin\", \"Grivet\", \n  \"Japanese macaque\", \n  \"Lesula\", \n  \"Mandril\", \n  \"Yellow baboon\"\n};\n```\n\nWe will need to create an `ArrayAdapter<String>` and assign it to the AutoTextCompleteTextView widget. In this example, each row in the AutoCompleteTextView will use a built-in Android layout, the `Android.Resource.Layout.SimpleListItem1`:\n\n```csharp\nArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, Android.Resource.Layout.SimpleListItem1, allTheMonkeys);\nadapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);\n\nAutoCompleteTextView actv = new AutoCompleteTextView(activity);\nactv.Adapter = adapter;\n```\n\nIn the next snippet, we add the `actv` to the Activity, want to add some padding to the views. Typically, one uses *device-independent pixels (DPs)* for positioning views on an Android layout. However, the `SetPadding` method takes pixels. The `DP2Pixel` method will take a DP value and convert that to pixels appropriate to the device.\n\n```csharp\nint DP2Pixel(int dpValue)\n{\n    float density = activity.Resources.DisplayMetrics.Density;\n    int paddingDP = (int) (dpValue * density);\n    return paddingDP; \n}\n\nint paddingLeft = DP2Pixel(10);\nint paddingRight = paddingLeft;\nint paddingTop = DP2Pixel(20);\nint paddingBottom = DP2Pixel(9);\n\nactv.SetPadding(paddingLeft, 0, paddingRight, 0);\n\nLinearLayout rootLayout = new LinearLayout(activity);\nTextView label = new TextView(activity);\nlabel.Text = \"Pick a Monkey:\";\nlabel.SetPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);\n\nrootLayout.Orientation = Orientation.Vertical;\nrootLayout.AddView(label);\nrootLayout.AddView(actv);\n\nactivity.SetContentView(rootLayout);\n```\n\n## Further Reading\n\nYou may want to check out the ListView and the Spinner workbooks as they are very similar to the AutoCompleteTextView control. To display more complex data, such as a POCO, it is better to create a custom Adapter in C#; you can learn more about this by consulting the [Xamarin ListView & Adapters guide](https://developer.xamarin.com/guides/android/user_interface/working_with_listviews_and_adapters/)."
  },
  {
    "path": "android/user-interface/PropertyAnimation.workbook",
    "content": "```json\n{\"platform\":\"Android\",\"uti\":\"com.xamarin.workbook\",\"packages\":[]}\n```\n\n# Android View Property Animation\n\nIn this interactive tutorial, you will learn the basics of `View`\nproperty animation in Xamarin.Android.\n\nFor a more detailed account of the various Android animation APIs,\nplease checkout out [the\ndocumentation](https://developer.xamarin.com/guides/android/application_fundamentals/graphics_and_animation/\n\"Xamarin.Android animation documentation\").\n\n## Getting Started\n\nWe’ll start by importing several namespaces that we will need.\n\n```csharp\nusing Android.Views;\nusing Android.Widget;\nusing Android.Util;\nusing Android.Graphics;\nusing Android.Graphics.Drawables;\nusing Android.Graphics.Drawables.Shapes;\n```\n\nThere is only one `Activity` in a Xamarin Workbook. Grab the first so\nthat we can adjust its content later (for information on\n`StartedActivities`, type `help` in a workbook code entry).\n\n```csharp\nvar rootActivity = StartedActivities.First ();\n```\n\n`DimToPixels` is a handy utility function we’ll use later on.\n\n```csharp\nint DimToPixels (int dip, ComplexUnitType type = ComplexUnitType.Dip) =>\n\t(int)TypedValue.ApplyDimension (type, dip, rootActivity.Resources.DisplayMetrics);\n```\n\n## World Clocks\n\nOur first example demonstrates animating a collection of `TextClock`\nviews. We start with a set of timezones.\n\nFeel free to adjust this list however you like.\n\n```csharp\nvar timezones = new[] {\n\t\"UTC\", // The World!\n\t\"US/Pacific\", // San Francisco\n\t\"US/Eastern\", // Boston\n\t\"America/Buenos_Aires\",\n\t\"Europe/Copenhagen\",\n\t\"Europe/London\"\n};\n```\n\nPick a color to use for the clockface.\n\n```csharp\nvar clockColor = Color.Rgb (0x73, 0x81, 0x82)\n```\n\nCreating and styling a `TextClock` is fairly straightforward. We make\nthe background a circle using `OvalShape`.\n\n```csharp\nTextClock CreateClockForZone (string zone)\n{\n\tvar clock = new TextClock (rootActivity) {\n\t\tTimeZone = zone,\n\t\tGravity = GravityFlags.Center,\n\t};\n\n\tvar background = new ShapeDrawable (new OvalShape ());\n\tbackground.Paint.Color = clockColor;\n\tclock.Background = background;\n\n\tvar padding = DimToPixels (12);\n\tclock.SetPadding (padding, padding, padding, padding);\n\n\tvar size = DimToPixels (90);\n\tclock.SetMinimumWidth  (size);\n\tclock.SetMinimumHeight (size);\n\n\tclock.SetTextSize (ComplexUnitType.Sp, 15);\n\tclock.SetTextColor (Color.White);\n\n\treturn clock;\n}\n```\n\n### Animation\n\nAndroid provides a `ViewPropertyAnimator` that drives the\n`View.Animate` method.\n\nProperties that can be animated using this method include:\n\n* `alpha`\n\n* `rotation(X|Y)`\n\n* `scale(X|Y)`\n\n* `translation(X|Y|Z)`\n\n* `x|y|z`\n\nLet's make an extension method that animates the `TextClock` as it is\nadded to the grid.\n\n```csharp\nstatic void AnimateEntrance (this TextClock clock, int index)\n{\n\t// Set the initial values to animate from\n\tclock.ScaleX = clock.ScaleY = 0.3f;\n\tclock.Alpha = 0;\n\n\t// Animate in the new values\n\tclock.Animate ()\n\t\t.Alpha (1)\n\t\t.ScaleX (1)\n\t\t.ScaleY (1)\n\t\t.SetStartDelay (index * 100 + 10)\n\t\t.SetDuration (400)\n\t\t.Start ();\n}\n```\n\nSo now we can:\n\n1. Create a `TextClock` for each of our time zones.\n\n2. Add it to the grid.\n\n3. Set up the entrance animation.\n\n```csharp\nvoid AddClocksToGrid (GridLayout grid, IList<string> zones)\n{\n\tvar index = 1;\n\tforeach (var zone in zones) {\n\t\tvar clock = CreateClockForZone (zone);\n\t\tgrid.AddView (clock);\n\n\t\tclock.AnimateEntrance (index++);\n\t}\n}\n```\n\n### Putting it all together\n\nFinally, we set up our content `GridLayout` and add the clocks.\n\n```csharp\nvar rootGrid = new GridLayout (rootActivity) {\n\tColumnCount = 3,\n\tUseDefaultMargins = true,\n\tAlignmentMode = GridAlign.Bounds,\n};\nvar padding = DimToPixels (16, ComplexUnitType.Dip);\nrootGrid.SetPadding (padding, padding, padding, padding);\nrootActivity.SetContentView (rootGrid, new ViewGroup.LayoutParams (-1, -1));\n```\n\n```csharp\nAddClocksToGrid (rootGrid, timezones)\n```\n\n### Exercises\n\nYou have now seen the basics of how `View` animation works in Android.\n\nHere are some things you can try, to test your understanding:\n\n* Animate the rotation of the clock. Note that the rotation value is\n  in **degrees**.\n\n* Increase the **size of the clock text**. What happens to the clock’s\n  shape? Can you fix it?\n\n* Combine what you’ve learned in previous lessons about the `Touch`\n  event. Can you make the clock **shrink a bit when tapped**?\n\n* Replace the clock with a **layout** that includes the clock and a\n  **timezone label**.\n\n"
  },
  {
    "path": "android/user-interface/listview.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\npackages: []\n---\n\n# Using a ListView in Xamarin.Android\n\nThis guide will demonstrate how to use a ListView in an Android application. Although it is an older UI widget, it is great for quick lists. The ListView doesn’t work by itself, the data displayed in a ListView by a class that extends `Android.Widget.BaseAdapter`. In this workbook, we won’t create our own class, instead we’ll just use `Android.Widget.ArrayAdapter<String>` class.\n\nLet’s get started by importing the namespaces and initializing a list of string to display in the ListView. We will also get a reference to the Android Activity used by this workbook:\n\n```csharp\nusing System;\nusing Android.App;\nusing Android.Views;\nusing Android.Widget;\n\nActivity activity = StartedActivities.First();\nList<String> allTheMonkeys =  new List<String> { \"Allen's swamp monkey\",\n  \"Black capuchin\", \"Black-headed marmoset\", \"Black-headed night monkey\", \"Black-shanked douc\", \n  \"Cotton top tamarin\",\n  \"Drill\",\n  \"Gee's golden lemur\", \"Geoffrey's tamarin\", \"Gelada\", \"Golden lion Tamarin\", \"Grivet\", \n  \"Japanese macaque\", \n  \"Lesula\", \n  \"Mandril\", \n  \"Yellow baboon\"\n};\n```\n\nWe will need to create an `ArrayAdapter<String>` and assign it to the ListView widget. In this example, each row in the ListView will use a built-in Android layout, the `Android.Resource.Layout.SimpleListItem1`:\n\n```csharp\nArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, Android.Resource.Layout.SimpleListItem1, allTheMonkeys);\nadapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);\n\nListView listview = new ListView(activity);\nlistview.Adapter = adapter;\n\n// Set an event handler for when the user makes a selection from the spinner.\nlistview.ItemClick += (object sender, AdapterView.ItemClickEventArgs e) => {\n    ListView l = (ListView) sender;\n    string message = String.Format(\"Your favourite monkey is {0}.\", allTheMonkeys[e.Position]);\n    Toast.MakeText(activity, message, ToastLength.Short).Show();\n} ;\n```\n\nIn the next snippet, we add the `listview` to the Activity, want to add some padding to the views. Typically, one uses *device-independent pixels (DPs)* for positioning views on an Android layout. However, the `SetPadding` method takes pixels. The `DP2Pixel` method will take a DP value and convert that to pixels appropriate to the device.\n\n```csharp\nint DP2Pixel(int dpValue)\n{\n    float density = activity.Resources.DisplayMetrics.Density;\n    int paddingDP = (int) (dpValue * density);\n    return paddingDP; \n}\n\nint paddingLeft = DP2Pixel(10);\nint paddingRight = paddingLeft;\nint paddingTop = DP2Pixel(20);\nint paddingBottom = DP2Pixel(9);\n\nlistview.SetPadding(paddingLeft, 0, paddingRight, 0);\n\nLinearLayout rootLayout = new LinearLayout(activity);\nTextView label = new TextView(activity);\nlabel.Text = \"Pick a Monkey:\";\nlabel.SetPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);\n\nrootLayout.Orientation = Orientation.Vertical;\nrootLayout.AddView(label);\nrootLayout.AddView(listview);\n\nactivity.SetContentView(rootLayout);\n```\n\n## Further Reading\n\nYou may want to check out the Spinner and the AutoCompleteTextView workbooks as they are very similar to the ListView control. To display more complex data, such as a POCO, it is better to create a custom Adapter in C#; you can learn more about this by consulting the [Xamarin ListView & Adapters guide](https://developer.xamarin.com/guides/android/user_interface/working_with_listviews_and_adapters/)."
  },
  {
    "path": "android/user-interface/meta.json",
    "content": "{\n  \"order\":{\n    \"2D-drawing.workbook\":\"2D Drawing\",\n    \"AutoCompleteTextView.workbook\":\"AutoComplete Text View\",\n    \"listview.workbook\":\"ListView\",\n    \"popupmenus.workbook\":\"Popup Menus\",\n    \"PropertyAnimation.workbook\":\"Property Animation\",\n    \"spinner.workbook\":\"Spinner\",\n    \"switch.workbook\":\"Switch\",\n    \"views.workbook\":\"Views\"\n  }\n}\n"
  },
  {
    "path": "android/user-interface/popupmenus.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\npackages: []\n---\n\n# Android Popup Menus\n\nA *Popup menu* is a menu that is displayed in a window that is anchored \nto a `View`. In this interactive tutorial, you will learn how to create \na single popup menu item and attach it to a `TextView`. \n\n## Getting Started\n\nStart by importing several namespaces that will be required for the code\nin the rest of this tutorial:\n\n```csharp\nusing Android.App;\nusing Android.Widget;\nusing Android.OS;\n```\n\nNext, create an Android `Activity` and instantiate a screen layout:\n\n```csharp\nvar rootActivity = StartedActivities.First ();\nvar layout = new LinearLayout (rootActivity);\nlayout.Orientation = Orientation.Vertical;\nrootActivity.SetContentView(layout);\n```\n\nBecause `PopupMenu` must be anchored to a `View`, the next step is add \na `TextView` to the layout. This `TextView` will anchor the popup menu: \n\n```csharp\nTextView textView = new TextView(rootActivity);\ntextView.Text = \"Click to Launch Popup Menu\";\nlayout.AddView (textView);\n```\n\nWhen you run this code, a `TextView` should be displayed near\nthe top of the screen.\n\n## Adding a Popup Menu\n\n`PopupMenu` is a `View` that displays a single menu item. Run the \nfollowing code to create a new `PopupMenu` and set its title:\n\n```csharp\nPopupMenu popup = new PopupMenu(rootActivity, textView);\npopup.Menu.Add(new Java.Lang.String(\"This is a Popup Menu\"));\n```\n\nTo display a `PopupMenu`, call its `Show` method. The following code\ncauses the popup menu instantiated above to be displayed when the\n`TextView` is clicked. Run this code and click the `TextView` to see\nwhat happens:\n\n```csharp\ntextView.Click += (s, arg) => {\n    popup.Show();\n};\n```\n\nClicking the `TextView` causes the **This is a Popup Menu** menu item \nto be displayed. \n\nIn the above code, a *lambda exression* is used to implement the event\nhandler for the `TextView` click event. The lambda expression code (the\ncode within the curly braces) calls the popup menu's `Show` method when\nthe `TextView` is clicked.\n\n## Handling Menu Events\n\nWhen the user selects a menu item, the `MenuItemClick` event is raised. \nThe following code displays a `Toast` when the menu item is clicked. \nRun the following code, click the `TextView`, and then click the menu \nto see what happens: \n\n```csharp\npopup.MenuItemClick += (s, arg) => {\n    Toast.MakeText(rootActivity, arg.Item.TitleFormatted + \" selected\", ToastLength.Long).Show();\n};\n```\n\nThe argument passed in the event contains a reference to the popup menu\nitem. In the above code, the title of the selected menu item is extracted\n(via the passed `Item` reference) and displayed in the toast message.\n\nWhen the menu item is dismissed, its `DismissEvent` is raised. Run the \nfollowing code, click the `TextView`, and then click the screen to \ndismiss the menu item: \n\n```csharp\npopup.DismissEvent += (s, arg) => {\n    Toast.MakeText(rootActivity, \"Dismissed\", ToastLength.Long).Show();\n};\n```\n\nWhen you dismiss the menu item, the `DismissEvent` handler above \ndisplays a toast to indicate that the `DismissEvent` handler was called.\n\n## Exercises\n\nYou have now seen the basics of how to use `PopupMenu` in a\nXamarin.Android application. Here are some things you can try to test\nyour understanding:\n\n1. Modify the `MenuItemClick` event handler to display the\n   menu item's `ItemId` in the toast. (Hint: use Workbook code\n   completion to see which properties and methods are available from\n   the `Item` reference.)\n\n2. Is it possible to modify the `DismissEvent` to retrieve and\n   display the menu item's title from the argument passed to \n   `DismissEvent`?\n"
  },
  {
    "path": "android/user-interface/spinner.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\npackages: []\n---\n\n# Using a Spinner in Xamarin.Android\n\nThis guide will demonstrate how to use a Spinner in an Android application. The Spinner doesn’t work by itself, the data displayed in a Spinner is displayed by a class that extends `Android.Widget.BaseAdapter`. In this workbook, we won’t create our own class, instead we’ll just use `Android.Widget.ArrayAdapter<String>` class.\n\nLet’s get started by importing the namespaces and initializing a list of string to display in the Spinner. We will also get a reference to the Android Activity used by this workbook:\n\nStart by importing the namespaces that will be required for the rest of this workbook and get a reference to the Activity:\n\n```csharp\nusing System;\nusing Android.App;\nusing Android.Views;\nusing Android.Widget;\n\nActivity activity = StartedActivities.First();\nList<String> allTheMonkeys =  new List<String> { \"Allen's swamp monkey\",\n  \"Black capuchin\", \"Black-headed marmoset\", \"Black-headed night monkey\", \"Black-shanked douc\", \n  \"Cotton top tamarin\",\n  \"Drill\",\n  \"Gee's golden lemur\", \"Geoffrey's tamarin\", \"Gelada\", \"Golden lion Tamarin\", \"Grivet\", \n  \"Japanese macaque\", \n  \"Lesula\", \n  \"Mandril\", \n  \"Yellow baboon\"\n};\n```\n\nWe will need to create an `ArrayAdapter<String>` and assign it to the Spinner widget. In this example, each row in the Spinner will use a built-in Android layout, the `Android.Resource.Layout.SimpleSpinnerItem`. We can also control the layout used in the Spinner’s drop down list using the `SetDropDownViewResource method`:\n\n```csharp\nArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, Android.Resource.Layout.SimpleSpinnerItem, allTheMonkeys);\nadapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);\n\nSpinner spinner = new Spinner(activity);\nspinner.Adapter = adapter;\n\n// Set an event handler for when the user makes a selection from the spinner.\nspinner.ItemSelected += (sender, args) => {\n    Spinner s= (Spinner) sender;\n    AdapterView.ItemSelectedEventArgs e = (AdapterView.ItemSelectedEventArgs) args;\n    string message = String.Format(\"Your favourite monkey is {0}.\", allTheMonkeys[e.Position]);\n    Toast.MakeText(activity, message, ToastLength.Short).Show();\n};\n```\n\nIn the next snippet, we add the `spinner` to the Activity. Typically, one uses *device-independent pixels (DPs)* for positioning views on an Android layout. However, the `SetPadding` method takes pixels. The `DP2Pixel` method will take a DP value and convert that to pixels appropriate to the device.\n\n```csharp\nint DP2Pixel(int dpValue)\n{\n    float density = activity.Resources.DisplayMetrics.Density;\n    int paddingDP = (int) (dpValue * density);\n    return paddingDP; \n}\n\nint paddingLeft = DP2Pixel(10);\nint paddingRight = paddingLeft;\nint paddingTop = DP2Pixel(20);\nint paddingBottom = DP2Pixel(9);\n\nspinner.SetPadding(paddingLeft, 0, paddingRight, 0);\n\nLinearLayout rootLayout = new LinearLayout(activity);\nTextView label = new TextView(activity);\nlabel.Text = \"Pick a Monkey:\";\nlabel.SetPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);\n\nrootLayout.Orientation = Orientation.Vertical;\nrootLayout.AddView(label);\nrootLayout.AddView(spinner);\n\nactivity.SetContentView(rootLayout);\n```\n\n## Further Reading\n\nYou may want to check out the ListViewand the AutoCompleteTextView workbooks as they are very similar to the Spinner control. To display more complex data, such as a POCO, it is better to create a custom Adapter in C#; you can learn more about this by consulting the [Xamarin ListView & Adapters guide](https://developer.xamarin.com/guides/android/user_interface/working_with_listviews_and_adapters/)."
  },
  {
    "path": "android/user-interface/switch.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\npackages: []\n---\n\n# Android Switches\n\nIn this interactive tutorial, you will learn the basics of\nworking with the Android `Switch` widget in Xamarin.Android.\nThe `Switch` widget allows a user to toggle between two states\nsuch as **ON** and **OFF**.\n\n## Getting Started\n\nStart by importing several namespaces that will be required for the code\nin the rest of this tutorial:\n\n```csharp\nusing Android.App;\nusing Android.Widget;\nusing Android.OS;\n```\n\nNext, create an Android `Activity` and instantiate a screen layout to host \nthe `Switch`: \n\n```csharp\nvar rootActivity = StartedActivities.First ();\nvar layout = new LinearLayout (rootActivity);\nlayout.Orientation = Orientation.Vertical;\nrootActivity.SetContentView(layout);\n```\n\nThis `LinearLayout` is the `ViewGroup` that manages views on the \nscreen. The only view that will be added to this layout is a `Switch`, \nbut you may add more views in the exercises at the end of this \ntutorial. \n\n## Creating a Switch\n\nRun the following code to create a `Switch` object and display it on \nthe screen:\n\n```csharp\nSwitch mySwitch = new Switch (rootActivity);\nlayout.AddView (mySwitch);\n```\n\nThe `Switch` defaults to the **OFF** state. Repeatedly click the \n`Switch` to toggle it **ON** and **OFF**. You should see the `Switch` \nslide to the right and become highlighted when it is turned **ON**. \nAlso, each click causes a sound to be produced. \n\n## Toggling the Switch\n\nYou can programmatically turn the switch **ON** and **OFF** by changing \nits `Checked` property. Make sure the switch is **OFF**, and then run \nthe following line of code to switch it back to **ON**: \n\n```csharp\nmySwitch.Checked = true;\n```\n\nSetting the `Checked` property to `false` turns the switch back **OFF**: \n\n```csharp\nmySwitch.Checked = false;\n```\n\nYou can use the `Checked` property to programatically change the value \nof the `Switch` to your chosen default state when the app starts up. \n\n## Labeling the Switch\n\nOften is is useful to a attach a label to a `Switch` to indicate what it\ndoes. When you set the `Switch`'s `Text` property to a string, that string is\ndisplayed next to the `Switch`:\n\n```csharp\nmySwitch.Text = \"Label for switch\"\n```\n\n## Handling Switch Events\n\nWhen the `Switch`'s value changes, it raises a `CheckedChange` event. The \nfollowing code captures this event and displays a `Toast` message. Run \nthis code and repeatedly click the `Switch` to see what happens: \n\n```csharp\nmySwitch.CheckedChange += delegate(object sender, CompoundButton.CheckedChangeEventArgs e) {\n    if (e.IsChecked) \n        Toast.MakeText(rootActivity, \"Switch was turned ON!\", ToastLength.Long).Show();\n    else\n        Toast.MakeText(rootActivity, \"Switch was turned OFF\", ToastLength.Long).Show();\n}\n```\n\nWhen the Switch button is clicked, the `IsChecked` property of the event \nis set to indicate the state of the Switch after it was clicked. If \n`IsChecked` is `true`, the `Switch` is **ON** and a `Toast` message displays \nthe new state of the `Switch`. If `IsChecked` is `false`, the `Toast` displays \nthat the `Switch` has been turned **OFF**. \n\n## Exercises\n\nYou have now seen how to create a `Switch`, label it, modify its \nstate, and handle `Switch` events. Here are some things you can try to \ntest your understanding: \n\n-   Change the `Switch` event handler to update the `Switch` label (`Text` \n    property) rather than display a `Toast` each time the `Switch` is \n    clicked. \n\n-   Add a `Button` that toggles the state of the `Switch` on and off each\n    time the `Button` is clicked.\n\n-   Add a second `Switch` and implement a logical exclusive-OR operation: \n    set the `Button` text to **ON** when one and only one `Switch` is \n    turned on. Set the text to **OFF** when both `Switch`es are turned \n    off or both are turned on. \n"
  },
  {
    "path": "android/user-interface/views.workbook",
    "content": "```json\n{\"platform\":\"Android\",\"uti\":\"com.xamarin.workbook\"}\n```\n\n# Android View Property Animation\n\nIn this interactive tutorial, you will learn the basics of `View` property animation in Xamarin.Android.\n\nFor a more detailed account of the various Android animation APIs, please checkout out [the documentation](https://developer.xamarin.com/guides/android/application_fundamentals/graphics_and_animation/ \"Xamarin.Android animation documentation\").\n\n## Getting Started\n\nWe’ll start by importing several namespaces that we will need.\n\n```csharp\nusing Android.Views;\nusing Android.Widget;\nusing Android.Util;\nusing Android.Graphics;\nusing Android.Graphics.Drawables;\nusing Android.Graphics.Drawables.Shapes;\n```\n\nThere is only one `Activity` in a Xamarin Workbook. Grab the first so that we can adjust its content later (for information on `StartedActivities`, type `help` in a workbook code entry).\n\n```csharp\nvar rootActivity = StartedActivities.First ();\n```\n\n`DimToPixels` is a handy utility function we’ll use later on.\n\n```csharp\nint DimToPixels (int dip, ComplexUnitType type = ComplexUnitType.Dip) =>\n\t(int)TypedValue.ApplyDimension (type, dip, rootActivity.Resources.DisplayMetrics);\n```\n\n## World Clocks\n\nOur first example demonstrates animating a collection of `TextClock` views. We start with a set of timezones.\n\nFeel free to adjust this list however you like.\n\n```csharp\nvar timezones = new[] {\n\t\"UTC\", // The World!\n\t\"US/Pacific\", // San Francisco\n\t\"US/Eastern\", // Boston\n\t\"America/Buenos_Aires\",\n\t\"Europe/Copenhagen\",\n\t\"Europe/London\"\n};\n```\n\nPick a color to use for the clockface.\n\n```csharp\nvar clockColor = Color.Rgb (0x73, 0x81, 0x82)\n```\n\nCreating and styling a `TextClock` is fairly straightforward. We make the background a circle using `OvalShape`.\n\n```csharp\nTextClock CreateClockForZone (string zone)\n{\n\tvar clock = new TextClock (rootActivity) {\n\t\tTimeZone = zone,\n\t\tGravity = GravityFlags.Center,\n\t};\n\n\tvar background = new ShapeDrawable (new OvalShape ());\n\tbackground.Paint.Color = clockColor;\n\tclock.Background = background;\n\n\tvar padding = DimToPixels (12);\n\tclock.SetPadding (padding, padding, padding, padding);\n\n\tvar size = DimToPixels (90);\n\tclock.SetMinimumWidth  (size);\n\tclock.SetMinimumHeight (size);\n\n\tclock.SetTextSize (ComplexUnitType.Sp, 15);\n\tclock.SetTextColor (Color.White);\n\n\treturn clock;\n}\n```\n\n### Animation\n\nAndroid provides a `ViewPropertyAnimator` that drives the `View.Animate` method.\n\nProperties that can be animated using this method include:\n\n* `alpha`\n\n* `rotation(X|Y)`\n\n* `scale(X|Y)`\n\n* `translation(X|Y|Z)`\n\n* `x|y|z`\n\nLet's make an extension method that animates the `TextClock` as it is added to the grid.\n\n```csharp\nstatic void AnimateEntrance (this TextClock clock, int index)\n{\n\t// Set the initial values to animate from\n\tclock.ScaleX = clock.ScaleY = 0.3f;\n\tclock.Alpha = 0;\n\n\t// Animate in the new values\n\tclock.Animate ()\n\t\t.Alpha (1)\n\t\t.ScaleX (1)\n\t\t.ScaleY (1)\n\t\t.SetStartDelay (index * 100 + 10)\n\t\t.SetDuration (400)\n\t\t.Start ();\n}\n```\n\nSo now we can:\n\n1. Create a `TextClock` for each of our time zones.\n\n2. Add it to the grid.\n\n3. Set up the entrance animation.\n\n```csharp\nvoid AddClocksToGrid (GridLayout grid, IList<string> zones)\n{\n\tvar index = 1;\n\tforeach (var zone in zones) {\n\t\tvar clock = CreateClockForZone (zone);\n\t\tgrid.AddView (clock);\n\n\t\tclock.AnimateEntrance (index++);\n\t}\n}\n```\n\n### Putting it all together\n\nFinally, we set up our content `GridLayout` and add the clocks.\n\n```csharp\nvar rootGrid = new GridLayout (rootActivity) {\n\tColumnCount = 3,\n\tUseDefaultMargins = true,\n\tAlignmentMode = GridAlign.Bounds,\n};\nvar padding = DimToPixels (16, ComplexUnitType.Dip);\nrootGrid.SetPadding (padding, padding, padding, padding);\nrootActivity.SetContentView (rootGrid, new ViewGroup.LayoutParams (-1, -1));\n```\n\n```csharp\nAddClocksToGrid (rootGrid, timezones)\n```\n\n### Exercises\n\nYou have now seen the basics of how `View` animation works in Android.\n\nHere are some things you can try, to test your understanding:\n\n* Animate the rotation of the clock. Note that the rotation value is in **degrees**.\n\n* Increase the **size of the clock text**. What happens to the clock’s shape? Can you fix it?\n\n* Combine what you’ve learned in previous lessons about the `Touch` event. Can you make the clock **shrink a bit when tapped**?\n\n* Replace the clock with a **layout** that includes the clock and a **timezone label**.\n\n"
  },
  {
    "path": "azure/cogs/emotion.workbook/employees.csx",
    "content": "// https://github.com/xamarinhq/app-acquaint/blob/2ca9e83c8344d35288e4ea7868ea6e5795a25e9c/App/Common/Acquaint.Data/SeedData.cs\nusing System.Collections.Generic;\npublic static class SeedData\n{\n\tpublic static List<Acquaintance> Get()\n\t{\n\t\treturn new List<Acquaintance>()\n\t\t{\n\t\t\tnew Acquaintance() { FirstName = \"Joseph\", LastName = \"Grimes\", Company = \"GG Mechanical\", JobTitle = \"Vice President\", Email = \"jgrimes@ggmechanical.com\", Phone = \"414-367-4348\", Street = \"2030 Judah St\", City = \"San Francisco\", PostalCode = \"94144\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/josephgrimes.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Monica\", LastName = \"Green\", Company = \"Calcom Logistics\", JobTitle = \"Director\", Email = \"mgreen@calcomlogistics.com\", Phone = \"925-353-8029\", Street = \"230 3rd Ave\", City = \"San Francisco\", PostalCode = \"94118\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/monicagreen.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Joan\", LastName = \"Mancum\", Company = \"Bay Unified School District\", JobTitle = \"Principal\", Email = \"joan.mancum@busd.org\", Phone = \"914-870-7670\", Street = \"448 Grand Ave\", City = \"South San Francisco\", PostalCode = \"94080\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/joanmancum.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Alvin\", LastName = \"Gray\", Company = \"Pacific Cabinetry\", JobTitle = \"Office Manager\", Email = \"agray@pacificcabinets.com\", Phone = \"720-344-7823\", Street = \"1773 Lincoln St\", City = \"Santa Clara\", PostalCode = \"95050\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/alvingray.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Michelle\", LastName = \"Wilson\", Company = \"Evergreen Mechanical\", JobTitle = \"Sales Manager\", Email = \"mwilson@evergreenmech.com\", Phone = \"917-245-7975\", Street = \"208 Jackson St\", City = \"San Jose\", PostalCode = \"95112\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/michellewilson.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Jennifer\", LastName = \"Gillespie\", Company = \"Peninsula University\", JobTitle = \"Superintendent\", Email = \"jgillespie@peninsula.org\", Phone = \"831-427-6746\", Street = \"10002 N De Anza Blvd\", City = \"Cupertino\", PostalCode = \"95014\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/jennifergillespie.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Thomas\", LastName = \"White\", Company = \"Creative Automotive Group\", JobTitle = \"Service Manager\", Email = \"tom.white@creativeauto.com\", Phone = \"214-865-0771\", Street = \"1181 Linda Mar Blvd\", City = \"Pacifica\", PostalCode = \"94044\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/thomaswhite.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Leon\", LastName = \"Muks\", Company = \"Spacey\", JobTitle = \"President\", Email = \"leon.muks@spacey.io\", Phone = \"310-586-0181\", Street = \"2518 Durant Ave\", City = \"Berkeley\", PostalCode = \"94704\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/leonmuks.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Floyd\", LastName = \"Bell\", Company = \"Netcore\", JobTitle = \"Procurement\", Email = \"floyd.bell@netcore.net\", Phone = \"603-226-4115\", Street = \"450 15th St\", City = \"Oakland\", PostalCode = \"94612\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/floydbell.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Vanessa\", LastName = \"Thornton\", Company = \"Total Sources\", JobTitle = \"Product Manager\", Email = \"vanessa.thornton@totalsourcesinc.com\", Phone = \"419-998-6611\", Street = \"550 Quarry Rd\", City = \"San Carlos\", PostalCode = \"94070\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/vanessathornton.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"John\", LastName = \"Boone\", Company = \"A. L. Price\", JobTitle = \"Executive Associate\", Email = \"jboone@alpricellc.com\", Phone = \"973-579-4610\", Street = \"233 E Harris Ave\", City = \"South San Francisco\", PostalCode = \"94080\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/johnboone.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Ann\", LastName = \"Temple\", Company = \"Foxmoor\", JobTitle = \"Director\", Email = \"ann.temple@foxmoorinc.com\", Phone = \"608-821-7667\", Street = \"1270 San Pablo Ave\", City = \"Berkeley\", PostalCode = \"94706\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/anntemple.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Joseph\", LastName = \"Meeks\", Company = \"Rose Records\", JobTitle = \"Manager\", Email = \"jmeeks@roserecordsllc.com\", Phone = \"978-628-6826\", Street = \"28 N 1st St\", City = \"San Jose\", PostalCode = \"95113\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/josephmeeks.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Michelle\", LastName = \"Herring\", Company = \"Full Color\", JobTitle = \"Production Specialist\", Email = \"michelle.herring@fullcolorus.com\", Phone = \"201-319-9344\", Street = \"213 2nd Ave\", City = \"San Mateo\", PostalCode = \"94401\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/michelleherring.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Daniel\", LastName = \"Jones\", Company = \"Flexus\", JobTitle = \"Quality Assurance Associate\", Email = \"daniel.jones@flexusinc.com\", Phone = \"228-432-8712\", Street = \"850 Bush St\", City = \"San Francisco\", PostalCode = \"94108\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/danieljones.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Margaret\", LastName = \"Cargill\", Company = \"Redwood City Medical Group\", JobTitle = \"Director\", Email = \"mcargill@rcmg.org\", Phone = \"208-816-9793\", Street = \"1037 Middlefield Road\", City = \"Redwood City\", PostalCode = \"94063\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/margaretcargill.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Benjamin\", LastName = \"Jones\", Company = \"JH Manufacturing\", JobTitle = \"Head of Manufacturing\", Email = \"ben.jones@jh.com\", Phone = \"505.562.3086\", Street = \"2091 Cowper St\", City = \"Palo Alto\", PostalCode = \"94306\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/benjaminjones.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Ivan\", LastName = \"Diaz\", Company = \"XYZ Robotics\", JobTitle = \"CEO\", Email = \"ivan.diaz@xyzrobotics.com\", Phone = \"406-496-8774\", Street = \"1960 Mandela Parkway\", City = \"Oakland\", PostalCode = \"94607\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/ivandiaz.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Eric\", LastName = \"Grant\", Company = \"MMSRI, Inc.\", JobTitle = \"Senior Manager\", Email = \"egrant@mmsri.com\", Phone = \"360-693-2388\", Street = \"2043 Martin Luther King Jr. Way\", City = \"Berkeley\", PostalCode = \"94704\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/ericgrant.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Stacey\", LastName = \"Valdovinos\", Company = \"Global Manufacturing\", JobTitle = \"CEO\", Email = \"svaldovinos@globalmanuf.com\", Phone = \"440-243-7987\", Street = \"98 Udayakavi Lane\", City = \"Danville\", PostalCode = \"94526\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/staceyvaldovinos.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Jesus\", LastName = \"Cardell\", Company = \"Pacific Marine Supply\", JobTitle = \"Manager\", Email = \"jcardella@pacificmarine.com\", Phone = \"410-745-5521\", Street = \"1008 Rachele Road\", City = \"Walnut Creek\", PostalCode = \"94597\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/jesuscardell.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Wilma\", LastName = \"Woolley\", Company = \"Mission School District\", JobTitle = \"Superintendent\", Email = \"wwoolley@missionsd.org\", Phone = \"940-696-1852\", Street = \"7277 Moeser Lane\", City = \"El Cerrito\", PostalCode = \"94530\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/wilmawoolley.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Evan\", LastName = \"Armstead\", Company = \"City of Richmond\", JobTitle = \"Board Member\", Email = \"evan.armstead@richmond.org\", Phone = \"415-336-2228\", Street = \"398 23rd St\", City = \"Richmond\", PostalCode = \"94804\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/evanarmstead.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"James\", LastName = \"Jones\", Company = \"East Bay Commercial Bank\", JobTitle = \"Manager\", Email = \"james.jones@eastbaybank.com\", Phone = \"313-248-7644\", Street = \"4501 Pleasanton Way\", City = \"Pleasanton\", PostalCode = \"94556\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/jamesjones.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Douglas\", LastName = \"Greenly\", Company = \"Bay Tech Credit Union\", JobTitle = \"Vice President\", Email = \"d.greenly@baytechcredit.com\", Phone = \"201-929-0094\", Street = \"2267 Alameda Ave\", City = \"Alameda\", PostalCode = \"94501\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/douglasgreenly.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Brent\", LastName = \"Mason\", Company = \"Rockridge Hotel\", JobTitle = \"Concierge\", Email = \"brent.mason@rockridgehotel.com\", Phone = \"940-482-7759\", Street = \"1960 Mandela Parkway\", City = \"Oakland\", PostalCode = \"94607\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/brentmason.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Richard\", LastName = \"Hogan\", Company = \"Marin Luxury Senior Living\", JobTitle = \"Customer Care\", Email = \"rhogan@marinseniorliving.com\", Phone = \"978-658-7545\", Street = \"674 Tiburon Blvd\", City = \"Belvedere Tiburon\", PostalCode = \"94920\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/richardhogan.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Daniel\", LastName = \"Granville\", Company = \"Cityview Consulting\", JobTitle = \"Consultant\", Email = \"dgranville@cityviewconsulting.com\", Phone = \"330-616-7467\", Street = \"300 Spencer Ave\", City = \"Sausalito\", PostalCode = \"94965\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/danielgranville.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Margaret\", LastName = \"Kidd\", Company = \"Marin Cultural Center\", JobTitle = \"President\", Email = \"mkidd@marincultural.org\", Phone = \"406-784-0602\", Street = \"106 Throckmorton Ave\", City = \"Mill Valley\", PostalCode = \"94941\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/margaretkidd.jpg\" },\n\t\t\tnew Acquaintance() { FirstName = \"Leo\", LastName = \"Parson\", Company = \"San Rafel Chamber of Commerce\", JobTitle = \"Board Member\", Email = \"leo.parson@sanrafaelcoc.org\", Phone = \"773-991-5214\", Street = \"199 Clorinda Ave\", City = \"San Rafael\", PostalCode = \"94901\", State = \"CA\", PhotoUrl = \"https://acquaint.blob.core.windows.net/images/leoparson.jpg\" },\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "azure/cogs/emotion.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\npackages:\n- id: Newtonsoft.Json\n  version: 8.0.3\n- id: Microsoft.Net.Http\n  version: 2.2.29\n- id: Microsoft.ProjectOxford.Emotion\n  version: 1.0.331.1\n- id: Microsoft.ProjectOxford.Common\n  version: 1.0.308\n- id: Microsoft.Bcl.Build\n  version: 1.0.21\n- id: Microsoft.Bcl\n  version: 1.1.10\n---\n\n# Azure Cognitive Services\n\nImage analysis with the Cognitive Services' `EmotionServiceClient`\n\n> ⚠️  Visit [Microsoft Cognitive Services](https://www.microsoft.com/cognitive-services) and get a key before you begin.\n\n\n```csharp\nvar emotionKey = \"YOUR_EMOTION_SERVICE_KEY_HERE\";\n```\n\nStart by adding the `Microsoft.ProjectOxford.Emotion` NuGet to the iOS Workbook.\nThe required references are loaded into the workbook below:\n\n```csharp\n#r \"System.Collections\"\n#r \"System.IO\"\n#r \"System.Runtime\"\n#r \"System.Threading.Tasks\"\n#r \"System.Net.Http\"\n#r \"System.Net.Http.Primitives\"\n#r \"System.Net.Http.Extensions\"\n#r \"Newtonsoft.Json\"\n#r \"Microsoft.ProjectOxford.Common\"\n#r \"Microsoft.ProjectOxford.Emotion\"\n```\n\nWe first define a simple data structure to model an employee. Remote properties will be populated from Azure. We define a couple of local properties as well that we’ll need later.\n\n```csharp\nusing Newtonsoft.Json;\n\npublic class Acquaintance\n{\n\tpublic string FirstName { get; set; }\n\tpublic string LastName { get; set; }\n\tpublic string Company { get; set; }\n\tpublic string JobTitle { get; set; }\n\tpublic string Email { get; set; }\n\tpublic string Phone { get; set; }\n\tpublic string Street { get; set; }\n\tpublic string City{ get; set; }\n\tpublic string PostalCode { get; set; }\n\tpublic string State { get; set; }\n\tpublic string PhotoUrl { get; set; }\n\tpublic override string ToString () {\n\t\treturn $\"{FirstName} {LastName} ({JobTitle}) \" + (AvatarImage == null?\"⚪️\":\"☑️\");\n\t}\n\t// client-local properties\n\t[JsonIgnore] public float Happiness { get; set; }\n\t[JsonIgnore] public UIImage AvatarImage { get; set; }\n}\n```\n\nThe list is populated from another sample’s [seed data](https://github.com/xamarinhq/app-acquaint/blob/2ca9e83c8344d35288e4ea7868ea6e5795a25e9c/App/Common/Acquaint.Data/SeedData.cs).\n\n```csharp\n#load \"employees.csx\"\n\nvar employees = SeedData.Get();\n```\n\nHere we fetch the avatar images for each person and cache them back on the model object. Inspecting the `employees` list now shows happy faces!\n\n```csharp\nforeach (var employee in employees) {\n\tvar imageData = NSData.FromUrl (new NSUrl (employee.PhotoUrl));\n\tif (imageData != null)\n\t\temployee.AvatarImage = UIImage.LoadFromData (imageData);\n}\n\nemployees\n```\n\n## Cognitive Services\n\nFor some real fun, we can analyze employee emotions using the Emotions API from [Microsoft Cognitive Services](https://www.microsoft.com/cognitive-services).\n\nTo test the process, analyze the first employee’s emotions in their avatar photo.\nThe Emotion service will fetch the avatar from a URL in this case, but it can also process raw image data sent directly from the client.\n\n```csharp\nusing System.IO;\nusing Microsoft.ProjectOxford.Emotion;\n\nvar emotionClient = new EmotionServiceClient (emotionKey);\nawait emotionClient.RecognizeAsync (employees.First ().PhotoUrl)\n```\n\nThe Emotion API provides an estimation of overall happiness. Perform the same analysis for all the employees and record their happiness. If the service cannot detect a human face, it will return no scores.\n\n```csharp\nforeach (var employee in employees) {\n\tvar emotionData = await emotionClient.RecognizeAsync (employee.PhotoUrl);\n\temployee.Happiness = (emotionData.FirstOrDefault ()?.Scores?.Happiness).GetValueOrDefault ();\n}\n\nemployees\n```\n\nWe want our least happy employees to show up first...\n\n```csharp\nemployees = employees.OrderBy (x => x.Happiness).ToList ()\n```\n\n## Bringing it together on iOS\n\nThe data can be rendered in a UITableView, to interact with live in the iOS simulator.\n\n```csharp\nclass EmployeeTableSource : UITableViewDataSource\n{\n    List<Acquaintance> employees;\n    public EmployeeTableSource (List<Acquaintance> emps)\n    { employees = emps; }\n\tpublic override nint RowsInSection (UITableView tableview, nint section)\n\t\t=> employees.Count;\n\n\tpublic override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tvar employee = employees [indexPath.Row];\n\n\t\tstring emoji;\n\n\t\tif (employee.Happiness >= 0.9) {\n\t\t\temoji = \"😀\";\n\t\t} else if (employee.Happiness >= 0.8) {\n\t\t\temoji = \"🙂\";\n\t\t} else if (employee.Happiness >= 0.4) {\n\t\t\temoji = \"😕\";\n\t\t} else if (employee.Happiness == 0) {\n\t\t\temoji = \"🐶\";\n\t\t} else {\n\t\t\temoji = \"😡\";\n\t\t}\n\n\t\treturn new UITableViewCell (UITableViewCellStyle.Subtitle, \"MyTableCell\") {\n\t\t\tTextLabel  = { Text = $\"{employee.FirstName} {employee.LastName}\" },\n\t\t\tDetailTextLabel = { Text = $\"{employee.Happiness:P} {emoji}\" },\n\t\t\tImageView = { Image = employee.AvatarImage }\n\t\t};\n\t}\n}\n```\n\nTo actually render on the simulator, set the the root view controller:\n\n```csharp\nKeyWindow.RootViewController = new UINavigationController (new UITableViewController {\n\tTitle = \"Happiness Training Candidates\",\n\tTableView = { DataSource = new EmployeeTableSource (employees) }\n})\n```\n\n### Exercises\n\n* Change the background color of the `UITableViewCell` based on the happiness of the employee.\n\n* The Emotions API covers more than just happiness. Try adding information about anger, available in `emotionData`.\n\n* Implement a custom `UITableViewCell` that shows all emotion data.\n"
  },
  {
    "path": "azure/cogs/meta.json",
    "content": "{\n  \"order\":{\n    \"emotion.workbook\":\"Emotion Service\"\n  }\n}\n"
  },
  {
    "path": "azure/meta.json",
    "content": "{\n  \"order\":{\n    \"tryazure\":\"Try Azure\",\n    \"cogs\":\"Cognitive Services\"\n  }\n}\n"
  },
  {
    "path": "azure/tryazure/TryAzure-Mac.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: MacNet45\npackages:\n- id: Newtonsoft.Json\n  version: 9.0.1\n- id: Microsoft.Net.Http\n  version: 2.2.29\n- id: Microsoft.Azure.Mobile.Client\n  version: 3.0.1\n- id: Microsoft.Bcl\n  version: 1.1.10\n---\n\n# Azure TryAppService\n\nTwo NuGets - **Microsoft.Azure.Mobile.Client** & Newtonsoft.Json - have been added and require these references:\n\n```csharp\n#r \"Newtonsoft.Json\"\n#r \"Microsoft.WindowsAzure.Mobile\"\n#r \"Microsoft.WindowsAzure.Mobile.Ext\"\n```\n\nUse the [tryappservice.azure.com](https://tryappservice.azure.com/ \"tryappservice.azure.com\") **Mobile App > TodoList** to create a free back-end to test. This class matches the mobile app backend that is automatically created:\n\n```csharp\nusing Newtonsoft.Json;\nusing Microsoft.WindowsAzure.MobileServices;\n\npublic class TodoItem\n{\n    [JsonProperty(PropertyName = \"id\")]\n    public string ID {get;set;}\n    [JsonProperty(PropertyName = \"text\")]\n    public string Name {get;set;}\n    [JsonProperty(PropertyName = \"complete\")]\n    public bool Done {get;set;}\n    [Version]\n    public string Version { get; set; }\n\tpublic override string ToString() {\n\t\treturn $\"{Name} is \" + (Done?\"done\":\"not done\");\n\t}\n}\n```\n\nReplace the URL below with your temporary, generated endpoint URL:\n\n```csharp\nvar mobileService = new MobileServiceClient (\"https://da0cfa57-0ee0-4-231-b9ee.azurewebsites.net/\");\nvar table = mobileService.GetTable<TodoItem> ();\n```\n\nNow it’s possible to interact with the **Azure App Service**. The following code creates a new `TodoItem` class, inserts it into the table on the server, and retrieves the list from the server:\n\n```csharp\nvar rememberTo = new TodoItem {Name=\"buy apples\"};\nawait table.InsertAsync (rememberTo);\nList<TodoItem> todos = await table.Take (10).ToListAsync ();\n```\n\n\n\n"
  },
  {
    "path": "azure/tryazure/TryAzure-WPF.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: WPF\npackages:\n- id: Microsoft.Bcl\n  version: 1.1.10\n- id: Newtonsoft.Json\n  version: 9.0.1\n- id: Microsoft.Net.Http\n  version: 2.2.29\n- id: Microsoft.Azure.Mobile.Client\n  version: 3.0.1\n---\n\n# Azure TryAppService\n\nTwo NuGets - **Microsoft.Azure.Mobile.Client** & Newtonsoft.Json - have been added and require these references:\n\n```csharp\n#r \"Newtonsoft.Json\"\n#r \"Microsoft.WindowsAzure.Mobile\"\n#r \"Microsoft.WindowsAzure.Mobile.Ext\"\n```\n\nUse the [tryappservice.azure.com](https://tryappservice.azure.com/ \"tryappservice.azure.com\") **Mobile App > TodoList** to create a free back-end to test. This class matches the mobile app backend that is automatically created:\n\n```csharp\nusing Newtonsoft.Json;\nusing Microsoft.WindowsAzure.MobileServices;\n\npublic class TodoItem\n{\n    [JsonProperty(PropertyName = \"id\")]\n    public string ID {get;set;}\n    [JsonProperty(PropertyName = \"text\")]\n    public string Name {get;set;}\n    [JsonProperty(PropertyName = \"complete\")]\n    public bool Done {get;set;}\n    [Version]\n    public string Version { get; set; }\n\tpublic override string ToString() {\n\t\treturn $\"{Name} is \" + (Done?\"done\":\"not done\");\n\t}\n}\n```\n\nReplace the URL below with your temporary, generated endpoint URL:\n\n```csharp\nvar mobileService = new MobileServiceClient (\"https://da0cfa57-0ee0-4-231-b9ee.azurewebsites.net/\");\nvar table = mobileService.GetTable<TodoItem> ();\n```\n\nNow it’s possible to interact with the **Azure App Service**. The following code creates a new `TodoItem` class, inserts it into the table on the server, and retrieves the list from the server:\n\n```csharp\nvar rememberTo = new TodoItem {Name=\"buy apples\"};\nawait table.InsertAsync (rememberTo);\nList<TodoItem> todos = await table.Take (10).ToListAsync ();\n```\n\n"
  },
  {
    "path": "azure/tryazure/TryAzure-iOS.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages:\n- id: Microsoft.Bcl\n  version: 1.1.10\n- id: Microsoft.Net.Http\n  version: 2.2.29\n- id: Microsoft.Azure.Mobile.Client\n  version: 3.0.1\n- id: Newtonsoft.Json\n  version: 9.0.1\n---\n\n# Azure TryAppService\n\nTwo NuGets - **Microsoft.Azure.Mobile.Client** & Newtonsoft.Json - have been added and require these references:\n\n```csharp\n#r \"Newtonsoft.Json\"\n#r \"Microsoft.WindowsAzure.Mobile\"\n#r \"Microsoft.WindowsAzure.Mobile.Ext\"\n```\n\nUse the [tryappservice.azure.com](https://tryappservice.azure.com/ \"tryappservice.azure.com\") **Mobile App > TodoList** to create a free back-end to test. This class matches the mobile app backend that is automatically created:\n\n```csharp\nusing Newtonsoft.Json;\nusing Microsoft.WindowsAzure.MobileServices;\n\npublic class TodoItem\n{\n    [JsonProperty(PropertyName = \"id\")]\n    public string ID {get;set;}\n    [JsonProperty(PropertyName = \"text\")]\n    public string Name {get;set;}\n    [JsonProperty(PropertyName = \"complete\")]\n    public bool Done {get;set;}\n    [Version]\n    public string Version { get; set; }\n\tpublic override string ToString() {\n\t\treturn $\"{Name} is \" + (Done?\"done\":\"not done\");\n\t}\n}\n```\n\nReplace the URL below with your temporary, generated endpoint URL:\n\n```csharp\nvar mobileService = new MobileServiceClient (\"https://da0cfa57-0ee0-4-231-b9ee.azurewebsites.net/\");\nvar table = mobileService.GetTable<TodoItem> ();\n```\n\nNow it’s possible to interact with the **Azure App Service**. The following code creates a new `TodoItem` class, inserts it into the table on the server, and retrieves the list from the server:\n\n```csharp\nvar rememberTo = new TodoItem {Name=\"buy apples\"};\nawait table.InsertAsync (rememberTo);\nList<TodoItem> todos = await table.Take (10).ToListAsync ();\n```\n"
  },
  {
    "path": "azure/tryazure/meta.json",
    "content": "{\n  \"order\":{\n    \"TryAzure-iOS.workbook\":\"Try Azure for iOS\",\n    \"TryAzure-Mac.workbook\":\"Try Azure for Mac\",\n    \"TryAzure-WPF.workbook\":\"Try Azure for WPF\"\n  }\n}\n"
  },
  {
    "path": "charts/meta.json",
    "content": "{\n  \"order\":{\n    \"oxyplot\":\"OxyPlot\",\n    \"xplot\":\"XPlot\"\n  }\n}\n"
  },
  {
    "path": "charts/oxyplot/OxyPlot.workbook",
    "content": "---\nid: ee57cfd4-3bc0-4069-952d-4fa85802fceb\nuti: com.xamarin.workbook\ncopyright: © Copyright 2015, OxyPlot Contributors.\ntitle: Plotting with OxyPlot\nplatforms:\n- Console\npackages:\n- id: OxyPlot.Core\n  version: 1.0.0\n---\n\n# Plotting with OxyPlot\n\n```csharp\n#r \"OxyPlot\"\n\nusing OxyPlot;\nusing OxyPlot.Series;\nusing OxyPlot.Axes;\n\nusing static System.Math;\n```\n\n## Function Series\n\nFirst we create a model, and then add a data series to it.\n\n```csharp\nvar plot = new PlotModel {\n    Title = \"Trigonometric functions\",\n    Subtitle = \"Example using the FunctionSeries\",\n    PlotType = PlotType.Cartesian\n};\n\nplot.Series.Add (new FunctionSeries (\n    Sin, -10, 10, 0.1, \"sin(x)\"));\n\nplot.Series.Add (new FunctionSeries (\n    Cos, -10, 10, 0.1, \"cos(x)\"));\n\nplot.Series.Add (new FunctionSeries (\n    t => 5 * Cos (t),\n    t => 5 * Sin (t),\n    0,\n    2 * PI,\n    0.1,\n    \"5cos(t), 5sin(t)\"));\n```\n\nAnd finally render the result by ensuring the cell yields a `PlotModel` object as its last result.\n\n```csharp\nplot\n```\n\n## Bonus: Fun with bats!\n\n```csharp\ndouble batFn1 (double x) =>\n    2 * Sqrt(-Abs(Abs(x) - 1) *\n        Abs(3 - Abs(x)) / ((Abs(x) - 1) *\n            (3 - Abs(x)))) *\n    (1 + Abs(Abs(x) - 3) / (Abs(x) - 3)) *\n    Sqrt(1 - Pow((x / 7), 2)) + (5 + 0.97 *\n        (Abs(x - 0.5) + Abs(x + 0.5)) - 3 *\n        (Abs(x - 0.75) + Abs(x + 0.75))) *\n    (1 + Abs(1 - Abs(x)) / (1 - Abs(x)));\n\ndouble batFn2 (double x) =>\n    -3 * Sqrt(1 - Pow((x / 7), 2)) *\n    Sqrt(Abs(Abs(x) - 4) / (Abs(x) - 4));\n\ndouble batFn3 (double x) =>\n    Abs(x / 2) - 0.0913722 *\n    (Pow(x, 2)) - 3 + Sqrt(1 - Pow((Abs(Abs(x) - 2) - 1), 2));\n\ndouble batFn4 (double x) =>\n    (2.71052 + (1.5 - .5 * Abs(x)) - 1.35526 *\n    Sqrt(4 - Pow((Abs(x) - 1), 2))) *\n    Sqrt(Abs(Abs(x) - 1) / (Abs(x) - 1)) + 0.9;\n\nvar plot = new PlotModel { Title = \"Fun with Bats\" };\nplot.Series.Add (new FunctionSeries (batFn1, -8, 8, 0.0001)); \nplot.Series.Add (new FunctionSeries (batFn2, -8, 8, 0.0001)); \nplot.Series.Add (new FunctionSeries (batFn3, -8, 8, 0.0001)); \nplot.Series.Add (new FunctionSeries (batFn4, -8, 8, 0.0001));\n\nplot;\n```\n\n## Heat Map Series\n\n```csharp\nvar plot = new PlotModel { Title = \"Heatmap\" };\n\n// Color axis (the X and Y axes are generated automatically)\n\nplot.Axes.Add(new LinearColorAxis {\n    Palette = OxyPalettes.Rainbow(100)\n});\n\n// generate 1d normal distribution\nvar singleData = new double[100];\nfor (int x = 0; x < 100; ++x)\n    singleData[x] = Exp ((-1.0 / 2.0) *\n        Pow (((double)x - 50.0) / 20.0, 2.0));\n\n// generate 2d normal distribution\nvar data = new double[100, 100];\nfor (int x = 0; x < 100; ++x) {\n    for (int y = 0; y < 100; ++y)\n        data[y, x] = singleData[x] *\n            singleData[(y + 30) % 100] *\n            100;\n}\n\nvar heatMapSeries = new HeatMapSeries {\n    X0 = 0,\n    X1 = 99,\n    Y0 = 0,\n    Y1 = 99,\n    Interpolate = true,\n    RenderMethod = HeatMapRenderMethod.Bitmap,\n    Data = data\n};\n\nplot.Series.Add (heatMapSeries);\n\nplot;\n```\n\n> ℹ️ This workbook was adapted from the official [OxyPlot documentation](http://docs.oxyplot.org/en/latest/)."
  },
  {
    "path": "charts/oxyplot/meta.json",
    "content": "{\n  \"order\":{\n    \"OxyPlot.workbook\":\"Get Started with OxyPlot\"\n  }\n}\n"
  },
  {
    "path": "charts/xplot/XPlot.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 036795c2-a071-4ad5-9375-d0c82482d37d\ntitle: XPlot\nplatforms:\n- Console\npackages:\n- id: XPlot.Plotly\n  version: 1.4.2\n---\n\n```csharp\n#r \"XPlot.Plotly\"\n```\n\n# Plotly Example\n\nRandom data, 3D scatter plot.\n\n```csharp\nusing XPlot.Plotly;\n\nvar traces = new List<Graph.Scatter3d>();\n\nvar rnd = new Random();\n\n(List<double> x, List<double> y, List<double> z) GenerateNumbers (int count) {\n    var x = new List<double>();\n    var y = new List<double>();\n    var z = new List<double>();\n    for (int digit = 0; digit < count; digit ++)\n    {\n        x.Add(rnd.NextDouble()*50);\n        y.Add(rnd.NextDouble()*50);\n        z.Add(rnd.NextDouble()*50);\n    }\n    return (x, y, z);\n}\n\nfor (int i = 0; i < 3; i++) {\n    var (x, y, z) = GenerateNumbers (25);\n\n    string randomcolor = $\"rgb({rnd.Next(50, 200)},{rnd.Next(50, 200)},{rnd.Next(50, 200)})\";\n    var trace = new Graph.Scatter3d() {\n        x = x,\n        y = y,\n        z = z,\n        mode = \"markers\", \n        marker = new Graph.Marker() {\n            color = randomcolor,\n            size = 5.0,\n            symbol = \"circle\", \n            line = new Graph.Line() {\n                color = \"rgb(0,0,0)\",\n                width = 0.0\n            }\n        },\n        line = new Graph.Line() {\n            color = \"#1f77b4\",\n            width = 1.0\n        }\n    };\n    traces.Add(trace);\n}\n\nvar layout = new Layout.Layout() {\n    title = \"Dots In Space\",\n    autosize = false,   \n    margin = new Graph.Margin() {\n           l = 0, r = 0, b = 0, t = 65\n    }\n}; \nvar scatterplot = Chart.Plot(traces.ToArray(), layout);\n\nscatterplot.WithWidth(800); \nscatterplot.WithHeight(500);\nscatterplot\n```"
  },
  {
    "path": "charts/xplot/meta.json",
    "content": "{\n  \"order\":{\n    \"XPlot.workbook\":\"Get Started with XPlot\"\n  }\n}\n"
  },
  {
    "path": "csharp/async/README.md",
    "content": "Async-Await Workbook\n=========\n\nA simple `callback` versus `await` demo related to \n[Xamarin's async support overview](https://developer.xamarin.com/guides/cross-platform/advanced/async_support_overview/).\n\n\n![](Screenshots/async.png)\n"
  },
  {
    "path": "csharp/async/async-await-wpf.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: WPF\npackages: []\n---\n\n\n# Async 101\n\nA quick explanation of why `async-await` code is easier to read/follow\nthan old-style callbacks. Read more at\n[Xamarin's async support overview](https://developer.xamarin.com/guides/cross-platform/advanced/async_support_overview/).\n\n\n## The Old Way - Callbacks\n\n1. Get all the config out of the way\n\n```csharp\nvar webClient = new System.Net.WebClient();\nwebClient.Encoding = System.Text.Encoding.UTF8;\n\nvar xmlUri = new Uri(\"http://api.geonames.org/earthquakesXML?north=44.1&south=-9.9&east=-22.4&west=55.2&username=bertt\");\n```\n\n2. We have to set up the 'callback' handler which is called\nwhen the network operation completes\n\n```csharp\nvar response1 = \"\";\nwebClient.DownloadStringCompleted += (s, e) => {\n    response1 = e.Result; // get the downloaded text\n};\nwebClient.DownloadStringAsync(xmlUri);\n```\n\n3. *Then* we call the actual method - confusing huh? The code we just wrote\nabove gets executed *after* this completes!\n\n```csharp\n// this will be blank because the completed even won't have fired in most cases\n// type `response1` in the interactive window to confirm that the XML was downloaded\nresponse1\n```\n\n(we'll check on the response later)\n\n## The New Way - Async\n\n1. Get all the config out of the way\n\n```csharp\n#r \"System.Net.Http\"\n```\n\n```csharp\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.IO;\n\nvar jsonUri = \"http://api.geonames.org/earthquakesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&username=bertt\";\n```\n\n2. The network call code is in a logical place\n\n```csharp\nvar response2 = await new HttpClient().GetStringAsync(jsonUri);\n```\n\n3. *Then* we do something with the result - much easier to follow\nwhat's happening in the code!\n\n```csharp\nConsole.WriteLine(response2.Substring(0,100) + \"...\");\n```\n\n## Finally...\n\nCheck `response1` from the first example again - the completed callback\nhas probably been executed by now...\n\n```csharp\nresponse1\n```\n"
  },
  {
    "path": "csharp/async/async-await.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n---\n\n# Async 101\n\nA quick explanation of why `async-await` code is easier to read/follow\nthan old-style callbacks. Read more at\n[Xamarin's async support overview](https://developer.xamarin.com/guides/cross-platform/advanced/async_support_overview/).\n\n## The Old Way - Callbacks\n\n1. Get all the config out of the way\n\n```csharp\nvar webClient = new System.Net.WebClient();\nwebClient.Encoding = System.Text.Encoding.UTF8;\n\nvar xmlUri = new Uri(\"http://api.geonames.org/earthquakesXML?north=44.1&south=-9.9&east=-22.4&west=55.2&username=bertt\");\n```\n\n1. We have to set up the 'callback' handler which is called\n   when the network operation completes\n\n```csharp\nvar response1 = \"\";\nwebClient.DownloadStringCompleted += (s, e) => {\n    response1 = e.Result; // get the downloaded text\n};\nwebClient.DownloadStringAsync(xmlUri);\n```\n\n1. *Then* we call the actual method - confusing huh? The code we just wrote\n   above gets executed *after* this completes!\n\n```csharp\n// this will be blank because the completed even won't have fired in most cases\n// type `response1` in the interactive window to confirm that the XML was downloaded\nresponse1\n```\n\n\\(we'll check on the response later)\n\n## The New Way - Async\n\n1. Get all the config out of the way\n\n```csharp\n#r \"System.Net.Http\"\n```\n\n```csharp\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.IO;\n\nvar jsonUri = \"http://api.geonames.org/earthquakesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&username=bertt\";\n```\n\n1. The network call code is in a logical place\n\n```csharp\nvar response2 = await new HttpClient().GetStringAsync(jsonUri);\n```\n\n1. *Then* we do something with the result - much easier to follow\n   what's happening in the code!\n\n```csharp\nConsole.WriteLine(response2.Substring(0,100) + \"...\");\n```\n\n## Finally...\n\nCheck `response1` from the first example again - the completed callback\nhas probably been executed by now...\n\n```csharp\nresponse1\n```"
  },
  {
    "path": "csharp/async/meta.json",
    "content": "{\n  \"order\":{\n    \"async-await.workbook\":\"Async Await\",\n    \"async-await-wpf.workbook\":\"Async Await for WPF\"\n  }\n}\n"
  },
  {
    "path": "csharp/collections/README.md",
    "content": "Collections: Arrays Workbook\n=========\n\nQuick explanation of how C# arrays work.\n\n\n![](Screenshots/arrays.png)\n"
  },
  {
    "path": "csharp/collections/arrays.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- Console\n---\n\n# Collections: Arrays\n\nAn array is a simple data structure:\n\n* it stores a collection of data elements,\n* it has a fixed size,\n* it only contains elements that match the declared type.\n\n## Initialization Syntax\n\nThe easiest way to create an array with known values\nis using C#'s initialization syntax:\n\n```csharp\nint[] primes = {2,3,5,7,11,13,17,19,31,37,41,43,47,53,59,61,67,71}\n```\n\nEach value in the array has an `index`, and we can get a value\nby its index:\n\n```csharp\nprimes[9] // prints the 10th prime - arrays are zero-based!\n```\n\n## Create a fixed size array\n\nAnother way to create an array is to declare the array\nwith a known size (20 elements in this example), and\nthen set each value using the index (remember it starts at zero):\n\n```csharp\nvar squares = new int[20]; // 20 elements with default(int) value\nfor (var i = 0; i <20; i++) {\n\tsquares[i] = i*i;\n}\n\nsquares\n```\n\nThe values in the array can then be retrieved by their index:\n\n```csharp\nsquares[4] // 5th square\n```\n\nThe value at an index can also be set to a different value:\n\n```csharp\nsquares[4] = 444 // replace the value in index '4'\n```\n\n## Declare and then set\n\nIf the size of the array is initially unknown, an\narray variable can be declared without specifying the size.\n\n```csharp\nstring[] dwarves;\n// ...\ndwarves = new string[4];\ndwarves[0] = \"Sleepy\";\ndwarves[1] = \"Sneezy\";\ndwarves[2] = \"Dopey\";\ndwarves[3] = \"Doc\";\n\ndwarves\n```\n\nThis highlights a problem with arrays – once the\nsize has been declared, we can't easily change it\nto add another three dwarves:\n\n`dwarves[4] = \"Bashful\"`\n\nwill result in an `IndexOutOfRangeException`. The only\noption is to assign a totally new array to the variable:\n\n```csharp\ndwarves = new string[7];\ndwarves[0] = \"Sleepy\";\ndwarves[1] = \"Sneezy\";\ndwarves[2] = \"Dopey\";\ndwarves[3] = \"Doc\";\ndwarves[4] = \"Bashful\";\ndwarves[5] = \"Grumpy\";\ndwarves[6] = \"Happy\";\n\ndwarves\n```\n\n## Not just simple Types\n\nArrays can also store objects, not just `string` and `int`:\n\n```csharp\nclass Person {\n  public string FirstName {get;set;}\n  public string LastName {get;set;}\n  public override string ToString() => $\"{FirstName} {LastName}\";\n}\nvar goodguys = new Person[2];\ngoodguys[0] = new Person {FirstName=\"Snow\",LastName=\"White\"};\ngoodguys[1] = new Person {FirstName=\"Humbert\",LastName=\"Huntsman\"};\n```\n\n```csharp\ngoodguys // view the array data\n```\n\n## Pros & Cons of Arrays\n\n### Pros\n\n* Simple and easy to understand\n* Fast and efficient\n\n### Cons\n\n* Cannot be resized\n* Elements cannot be added or removed\n\nOther collection types like `List` and `Dictionary` address some\nof the array's limitations.\n"
  },
  {
    "path": "csharp/collections/meta.json",
    "content": "{\n  \"order\":{\n    \"arrays.workbook\":\"Arrays\"\n  }\n}\n"
  },
  {
    "path": "csharp/csharp6/README.md",
    "content": "C# 6 Workbook\n=========\n\nA smattering of C# 6 syntax examples from this\n[C# 6 overview](https://developer.xamarin.com/guides/cross-platform/advanced/csharp_six/).\n\n![](Screenshots/csharp6.png)\n"
  },
  {
    "path": "csharp/csharp6/csharp6.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- Console\n---\n\n# Using C# 6\n\nSome examples from Xamarin's [intro to C# 6](https://developer.xamarin.com/guides/cross-platform/advanced/csharp_six/).\n\n* Null-conditional operator\n\n* String Interpolation\n\n* Expression-bodied Function Members\n\n* Auto-property Initialization\n\n* Index Initializers\n\n* using static\n\n## Null-conditional operator\n\nThe `?.` operator automatically does a null-check before referencing the\nspecified member. The example string array below has a `null` entry:\n\n```csharp\nvar names = new string[] { \"Foo\", null };\n```\n\nIn C# 5, a null-check is required before accessing the `.Length` property:\n\n```csharp\n// C# 5\nint secondLength = 0;\nif (names[1] != null)\n  secondLength = names[1].Length;\n```\n\nC# 6 allows the length to be queried in a single line; the entire\nstatement returns `null` if any object is null.\n\n```csharp\nvar length0 = names[0]?.Length; // 3\nvar length1 = names[1]?.Length; // null\n```\n\nThis can be used in conjunction with the `??` null coalescing operator\nto set a default value (such as `0`) in the example below:\n\n```csharp\nvar lengths = names.Select (names => names?.Length ?? 0); //[3, 0]\n```\n\n## String Interpolation\n\nPreviously strings were built in a number of different ways:\n\n```csharp\nvar animal = \"Monkeys\";\nvar food = \"bananas\";\n\nvar out1 = String.Format (\"{0} love to eat {1}\", animal, food);\nvar out2 = animal + \" love to eat \" + food;\n// or even StringBuilder\n```\n\nC# 6 provides a simple syntax where the fieldname can be\nembedded directly in the string:\n\n```csharp\n$\"{animal} love to eat {food}\"\n```\n\nString-formatting can also be done with this syntax:\n\n```csharp\nvar values = new int[] { 1, 2, 3, 4, 12, 123456 };\nforeach (var s in values.Select (i => $\"The value is {i,10:N2}.\")) {\n   Console.WriteLine (s);\n}\n```\n\n## Expression-bodied Function Members\n\nThe `ToString` override in the following class is an expression-bodied\nfunction - a more succinct declaration syntax.\n\n```csharp\nclass Person\n{\n    public string FirstName { get; }\n    public string LastName { get; }\n    public Person (string firstname, string lastname)\n    {\n       FirstName = firstname;\n       LastName = lastname;\n    }\n    // note there is no explicit `return` keyword\n    public override string ToString () => $\"{LastName}, {FirstName} {LastName}\";\n}\n```\n\n`void` expression bodied functions are also allowed so long as\nthe expression is a statement:\n\n```csharp\npublic void Log(string message) => System.Console.WriteLine($\"{DateTime.Now.ToString (\"s\", System.Globalization.CultureInfo.InvariantCulture )}: {message}\");\n```\n\nThis simple example calls these two methods:\n\n```csharp\nLog(new Person(\"James\", \"Bond\").ToString())\n```\n\n## Auto-property Initialization\n\nProperties (ie. specified with `{get;set;}`) can be initialized inline\nwith C# 6:\n\n```csharp\nclass Todo\n{\n    public bool Done { get; set; } = false;\n    public DateTime Created { get; } = DateTime.Now;\n    public string Description { get; }\n\n    public Todo (string description)\n    {\n       this.Description = description; // can assign (only in constructor!)\n    }\n    public override string ToString () => $\"'{Description}' was created on {Created}\";\n}\n```\n\n```csharp\nnew Todo(\"buy apples\")\n```\n\n## Index Initializers\n\nDictionary-style data structures let you specify key/value\ntypes with a simple object-initializer-like syntax:\n\n```csharp\nvar userInfo = new Dictionary<string,object> {\n    [\"Created\"] = DateTime.Now,\n    [\"Due\"] = DateTime.Now.AddSeconds(60 * 60 * 24),\n    [\"Task\"] = \"buy lettuce\"\n};\n```\n\n## using static\n\nEnumerations, and certain classes such as System.Math, are primarily\nholders of static values and functions. In C# 6, you can import all\nstatic members of a type with a single using static statement:\n\n```csharp\nusing static System.Math;\n```\n\nC# 6 code can then reference the static members directly, avoiding\nrepetition of the class name (eg. `Math.PI` becomes `PI`):\n\n```csharp\npublic class Location \n{\n    public Location (double lat, double @long) {Latitude = lat; Longitude = @long;} \n    public double Latitude = 0; public double Longitude = 0; \n}\nstatic public double MilesBetween(Location loc1, Location loc2)\n{\n  double rlat1  = PI * loc1.Latitude / 180;\n  double rlat2  = PI * loc2.Latitude / 180;\n  double theta  = loc1.Longitude - loc2.Longitude;\n  double rtheta = PI * theta / 180;\n  double dist =\n      Sin(rlat1) * Sin(rlat2) + Cos(rlat1) *\n      Cos(rlat2) * Cos(rtheta);\n  dist = Acos(dist);\n  dist = dist*180/PI;\n  dist = dist*60*1.1515;\n  return dist; //miles\n}\n```\n\n```csharp\nMilesBetween (new Location(-12,22), new Location(-13,33))\n```"
  },
  {
    "path": "csharp/csharp6/meta.json",
    "content": "{\n  \"order\":{\n    \"csharp6.workbook\":\"Using C# 6\"\n  }\n}\n"
  },
  {
    "path": "csharp/csharp7/csharp7.workbook",
    "content": "---\nuti: com.xamarin.workbook\ntitle: What's New in C# 7 | C# Guide\nplatforms:\n- Console\n---\n\n> ⚠️ C# 7 is supported in Xamarin Workbooks 1.2 (or newer).\n> Please update to version 1.2 if you experience issues with this Workbook (you may need to switch to the Alpha or Beta channel).\n\n# What's new in C# 7\n\nC# 7 adds a number of new features to the C# language:\n\n* `out` variables\n\n  * You can declare `out` values inline as arguments to the method where they are used.\n\n* Tuples\n\n  * You can create lightweight, unnamed types that contain multiple public fields. Compilers and IDE tools understand the semantics of these types.\n\n* Pattern Matching\n\n  * You can create branching logic based on arbitrary types and values of the members of those types.\n\n* `ref` locals and returns\n\n  * Method arguments and local variables can be references to other storage.\n\n* Local Functions\n\n  * You can nest functions inside other functions to limit their scope and visibility.\n\n* More expression-bodied members\n\n  * The list of members that can be authored using expressions has grown.\n\n* `throw` Expressions\n\n  * You can throw exceptions in code constructs that previously were not allowed because `throw` was a statement.\n\n* Generalized async return types\n\n  * Methods declared with the `async` modifier can return other types in addition to `Task` and `Task<T>`.\n\n* Numeric literal syntax improvements\n\n  * New tokens improve readability for numeric constants.\n\nThe remainder of this topic discusses each of the features. For each feature, you'll learn the reasoning behind it. You'll learn the syntax. You'll see some sample scenarios where using the new feature will make you more productive as a developer.\n\n## `out` variables\n\nThe existing syntax that supports `out` parameters has been improved in this version.\n\nPreviously, you would need to separate the declaration of the out variable and its initialization into two different statements:\n\n```csharp\nvar input = \"8675309\";\n\nint numericResult;\nif (int.TryParse(input, out numericResult))\n    Console.WriteLine(numericResult);\nelse\n    Console.WriteLine(\"Could not parse input\");\n```\n\nYou can now declare `out` variables in the argument list of a method call, rather than writing a separate declaration statement:\n\n```csharp\nif (int.TryParse(input, out int result))\n    Console.WriteLine(result);\nelse\n    Console.WriteLine(\"Could not parse input\");\n```\n\nYou may want to specify the type of the `out` variable for clarity, as shown above. However, the language does support using an implicitly typed local variable:\n\n```csharp\nif (int.TryParse(input, out var answer))\n    Console.WriteLine(answer);\nelse\n    Console.WriteLine(\"Could not parse input\");\n```\n\n* The code is easier to read.\n\n  * You declare the out variable where you use it, not on another line above.\n\n* No need to assign an initial value.\n\n  * By declaring the `out` variable where it is used in a method call, you can't accidentally use it before it is assigned.\n\nThe most common use for this feature will be the `Try` pattern. In this pattern, a method returns a `bool` indicating success or failure and an`out` variable that provides the result if the method succeeds.\n\n## Tuples\n\nC# provides a rich syntax for classes and structs that is used to explain your design intent. But sometimes that rich syntax requires extra work with minimal benefit. You may often write methods that need a simple structure containing more than one data element. To support these scenarios *tuples* were added to C#. Tuples are lightweight data structures that contain multiple fields to represent the data members. The fields are not validated, and you cannot define your own methods\n\n> ℹ️  Tuples were available before C# 7 as an API, but had many limitations. Most importantly, the members of these tuples were named `Item1`, `Item2` and so on. The language support enables semantic names for the fields of a Tuple.\n\nYou can create a tuple by assigning each member to a value:\n\n```csharp\nvar letters = (\"a\", \"b\");\n```\n\nThat assignment creates a tuple whose members are `Item1` and `Item2`, following the existing System.Tuple syntax. You can modify that assignment to create a tuple that provides semantic names to each of the members of the tuple:\n\n```csharp\n(string Alpha, string Beta) namedLetters = (\"a\", \"b\");\n```\n\n> ℹ️  The new tuples features require the `System.ValueTuple` type. For Visual Studio 15 Preview 5 and earlier preview releases, you must add the NuGet package \"System.ValueTuple\", available in the pre-release stream.\n\nThe `namedLetters` tuple contains fields referred to as `Alpha` and `Beta`. In a tuple assignment, you can also specify the names of the fields on the right-hand side of the assignment:\n\n```csharp\nvar alphabetStart = (Alpha: \"a\", Beta: \"b\");\n```\n\nThe language allows you to specify names for the fields on both the left and right-hand side of the assignment:\n\n```csharp\n(string First, string Second) firstLetters = (Alpha: \"a\", Beta: \"b\");\n```\n\nThe line above generates a warning, `CS8123`, telling you that the names on the right side of the assignment, `Alpha` and `Beta` are ignored because they conflict with the names on the left side, `First` and `Second`.\n\nThe examples above show the basic syntax to declare tuples. Tuples are most useful as return types for `private` and `internal` methods. Tuples provide a simple syntax for those methods to return multiple discrete values: You save the work of authoring a `class` or a `struct` that defines the type returned. There is no need for creating a new type.\n\nCreating a tuple is more efficient and more productive. It is a simpler, lightweight syntax to define a data structure that carries more than one value. The example method below returns the minimum and maximum values found in a sequence of integers:\n\n```csharp\nprivate static (int Max, int Min) Range(IEnumerable<int> numbers)\n{\n    int min = int.MaxValue;\n    int max = int.MinValue;\n    foreach(var n in numbers)\n    {\n        min = (n < min) ? n : min;\n        max = (n > max) ? n : max;\n    }\n    return (max, min);\n}\n```\n\nUsing tuples in this way offers several advantages:\n\n* You save the work of authoring a `class` or a `struct` that defines the type returned.\n\n* You do not need to create new type.\n\n* The language enhancements removes the need to call the `System.Tuple.Create<T>()` methods.\n\nThe declaration for the method provides the names for the fields of the tuple that is returned. When you call the method, the return value is a tuple whose fields are `Max` and `Min`:\n\n```csharp\nint [] numbers = { 97, 243, 254, 41, 132, 26, 167, 19, 201, 252, 119, 68, 17, 66, 131 };\n\nvar range = Range(numbers);\n```\n\nThere may be times when you want to unpackage the members of a tuple that were returned from a method.  You can do that by declaring separate variables for each of the values in the tuple. This is called *deconstructing* the tuple:\n\n```csharp\n(int max, int min) = Range(numbers);\n```\n\nYou can also provide a similar deconstruction for any type in .NET. This is done by writing a `Deconstruct` method as a member of the class. That `Deconstruct` method provides a set of `out` arguments for each of the properties you want to extract. Consider this `Point` class that provides a deconstructor method that extracts the `X` and `Y` coordinates:\n\n```csharp\npublic class Point\n{\n    public Point(double x, double y)\n    {\n        this.X = x;\n        this.Y = y;\n    }\n\n    public double X { get; }\n    public double Y { get; }\n\n    public void Deconstruct(out double x, out double y)\n    {\n        x = this.X;\n        y = this.Y;\n    }\n}\n```\n\nYou can extract the individual fields by assigning a tuple to a `Point`:\n\n```csharp\nvar p = new Point(3.14, 2.71);\n(double X, double Y) = p;\n```\n\nYou are not bound by the names defined in the `Deconstruct` method. You can rename the extract variables as part of the assignment:\n\n```csharp\n(double horizontalDistance, double verticalDistance) = p;\n```\n\n## Pattern matching\n\n*Pattern matching* is a feature that allows you to implement method dispatch on properties other than the type of an object. You're probably already familiar with method dispatch based on the type of an object. In Object Oriented programming, virtual and override methods provide language syntax to implement method dispatching based on an object's type. Base and Derived classes provide different implementations. Pattern matching expressions extend this concept so that you can easily implement similar dispatch patterns for types and data elements that are not related through an inheritance hierarchy.\n\nPattern matching supports `is` expressions and `switch` expressions. Each enables inspecting an object and its properties to determine if that object satisfies the sought pattern. You use the `when` keyword to specify additional rules to the pattern.\n\n### `is` expressions\n\nThe `is` pattern expressions extend the familiar `is` operator to query a object beyond its type.\n\nLet's start with a simple scenario. We'll add capabilities to this scenario that demonstrate how pattern matching expressions make algorithms that work with unrelated types easy. We'll start with a method that computes the sum of a number of die rolls:\n\n```csharp\npublic static int DiceSum(IEnumerable<int> values) => values.Sum()\n```\n\nYou might quickly find that you need to find the sum of die rolls where some of the rolls are made with more than one die. Part of the input sequence may be multiple results instead of a single number:\n\n```csharp\npublic static int DiceSum2(IEnumerable<object> values)\n{\n    var sum = 0;\n    foreach(var item in values)\n    {\n        if (item is int val)\n            sum += val;\n        else if (item is IEnumerable<object> subList)\n            sum += DiceSum2(subList);\n    }\n    return sum;\n}\n```\n\nThe `is` pattern expression works quite well in this scenario. As part of checking the type, you write a variable initialization. This creates a new variable of the validated runtime type.\n\nAs you keep extending these scenarios, you may find that you build more `if` and `else if` statements. Once that becomes unwieldy, you'll likely want to switch to `switch` pattern expressions.\n\n### `switch` expressions\n\nThe `switch` pattern expression has a familiar syntax, based on the `switch` statement already part of the C# language. Let's translate the existing code to use a `switch` expression before adding new cases:\n\n```csharp\npublic static int DiceSum3(IEnumerable<object> values)\n{\n    var sum = 0;\n    foreach (var item in values)\n    {\n        switch (item)\n        {\n            case int val:\n                sum += val;\n                break;\n            case IEnumerable<object> subList:\n                sum += DiceSum3(subList);\n                break;\n        }\n    }\n    return sum;\n}\n```\n\nThe `switch` expressions have a slightly different syntax than the `is` expressions, where you declare the type and variable at the beginning of the `case` expression.\n\nThe `switch` expressions also support constants. This can save time by factoring out simple cases:\n\n```csharp\npublic static int DiceSum4(IEnumerable<object> values)\n{\n    var sum = 0;\n    foreach (var item in values)\n    {\n        switch (item)\n        {\n            case 0:\n                break;\n            case int val:\n                sum += val;\n                break;\n            case IEnumerable<object> subList when subList.Any():\n                sum += DiceSum4(subList);\n                break;\n            case IEnumerable<object> subList:\n                break;\n            case null:\n                break;\n            default:\n                throw new InvalidOperationException(\"unknown item type\");\n        }\n    }\n    return sum;\n}\n```\n\nThe code above adds cases for `0` as a special case of `int`, and `null` as a special case when there is no input. This demonstrates one important new feature in switch pattern expressions: the order of the `case` expressions now matters. The `0` case must appear before the general `int` case. Otherwise, the first pattern to match would be the `int` case, even when the value is `0`.\n\nThis same behavior enables the special case for an empty input sequence. You can see that the case for an `IEnumerable` item that has elements must appear before the general `IEnumerable` case.\n\nThis version has also added a `default` case. The `default` case is always evaluated last, regardless of the order it appears in the source. For that reason, convention is to put the `default` case last.\n\nFinally, let's add one last `case` for a new style of die. Some games use percentile dice to represent larger ranges of numbers.\n\n> ℹ️  Two 10-sided percentile dice can represent every number from 0 through 99. One die has sides labelled `00`, `10`, `20`, ... `90`. The other die has sides labeled `0`, `1`, `2`, ... `9`. Add the two die values together and you can get every number from 0 through 99.\n\nTo add this kind of die to your collection, first define a type to represent the percentile die:\n\n```csharp\npublic struct PercentileDie\n{\n    public int Value { get; }\n    public int Multiplier { get; }\n\n    public PercentileDie(int multiplier, int value)\n    {\n        this.Value = value;\n        this.Multiplier = multiplier;\n    }\n}\n```\n\nThen, add a `case` expression for the new type:\n\n```csharp\npublic static int DiceSum5(IEnumerable<object> values)\n{\n    var sum = 0;\n    foreach (var item in values)\n    {\n        switch (item)\n        {\n            case 0:\n                break;\n            case int val:\n                sum += val;\n                break;\n            case PercentileDie die:\n                sum += die.Multiplier * die.Value;\n                break;\n            case IEnumerable<object> subList when subList.Any():\n                sum += DiceSum5(subList);\n                break;\n            case IEnumerable<object> subList:\n                break;\n            case null:\n                break;\n            default:\n                throw new InvalidOperationException(\"unknown item type\");\n        }\n    }\n    return sum;\n}\n```\n\nThe new syntax for pattern matching expressions makes it easier to create dispatch algorithms based on an object's type, or other properties, using a clear and concise syntax. Pattern matching expressions enable these constructs on data types that are unrelated by inheritance.\n\n## Local functions\n\nMany designs for classes include methods that are called from only one location. These additional private methods keep each method small and focused. However, they can make it harder to understand a class when reading it the first time. These methods must be understood outside of the context of the single calling location.\n\nFor those designs, *local functions* enable you to declare methods inside the context of another method. This makes it easier for readers of the class to see that the local method is only called from the context in which is it declared.\n\nThere are two very common use cases for local functions: public iterator methods and public async methods. Both types of methods generate code that reports errors later than programmers might expect. In the case of iterator methods, any exceptions are observed only when calling code that enumerates the returned sequence. In the case of async methods, any exceptions are only observed when the returned `Task` is awaited.\n\nLet's start with an iterator method:\n\n```csharp\npublic static IEnumerable<char> AlphabetSubset(char start, char end)\n{\n    if ((start < 'a') || (start > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(start), message: \"start must be a letter\");\n    if ((end < 'a') || (end > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(end), message: \"end must be a letter\");\n\n    if (end <= start)\n        throw new ArgumentException($\"{nameof(end)} must be greater than {nameof(start)}\");\n    for (var c = start; c < end; c++)\n        yield return c;\n}\n```\n\nExamine the code below that calls the iterator method incorrectly:\n\n```csharp\nvar resultSet = AlphabetSubset('f', 'a');\nConsole.WriteLine(\"iterator created\");\nforeach (var thing in resultSet)\n    Console.Write($\"{thing}, \");\n```\n\nThe exception is thrown when `resultSet` is iterated, not when `resultSet` is created. In this contained example, most developers could quickly diagnose the problem. However, in larger codebases, the code that creates an iterator often isn't as close to the code that enumerates the result. You can refactor the code so that the public method validates all arguments, and a private method generates the enumeration:\n\n```csharp\npublic static IEnumerable<char> AlphabetSubset2(char start, char end)\n{\n    if ((start < 'a') || (start > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(start), message: \"start must be a letter\");\n    if ((end < 'a') || (end > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(end), message: \"end must be a letter\");\n\n    if (end <= start)\n        throw new ArgumentException($\"{nameof(end)} must be greater than {nameof(start)}\");\n    return alphabetSubsetImplementation(start, end);\n}\n\nprivate static IEnumerable<char> alphabetSubsetImplementation(char start, char end)\n{\n    for (var c = start; c < end; c++)\n        yield return c;\n}\n```\n\nThis refactored version will throw exceptions immediately because the public method is not an iterator method; only the private method uses the `yield return` syntax. However, there are potential problems with this refactoring. The private method should only be called from the public interface method, because otherwise all argument validation is skipped. Readers of the class must discover this fact by reading the entire class and searching for any other references to the `alphabetSubsetImplementation` method.\n\nYou can make that design intent more clear by declaring the `alphabetSubsetImplementation` as a local function inside the public API method:\n\n```csharp\npublic static IEnumerable<char> AlphabetSubset3(char start, char end)\n{\n    if ((start < 'a') || (start > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(start), message: \"start must be a letter\");\n    if ((end < 'a') || (end > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(end), message: \"end must be a letter\");\n\n    if (end <= start)\n        throw new ArgumentException($\"{nameof(end)} must be greater than {nameof(start)}\");\n\n    return alphabetSubsetImplementation();\n\n    IEnumerable<char> alphabetSubsetImplementation()\n    {\n        for (var c = start; c < end; c++)\n            yield return c;\n    }\n}\n```\n\nThe version above makes it clear that the local method is referenced only in the context of the outer method. The rules for local functions also ensure that a developer can't accidentally call the local function from another location in the class and bypass the argument validation.\n\nThe same technique can be employed with `async` methods to ensure that exceptions arising from argument validation are thrown before the asynchronous work begins:\n\n```csharp\npublic Task<string> PerformLongRunningWork(string address, int index, string name)\n{\n    if (string.IsNullOrWhiteSpace(address))\n        throw new ArgumentException(message: \"An address is required\", paramName: nameof(address));\n    if (index < 0)\n        throw new ArgumentOutOfRangeException(paramName: nameof(index), message: \"The index must be non-negative\");\n    if (string.IsNullOrWhiteSpace(name))\n        throw new ArgumentException(message: \"You must supply a name\", paramName: nameof(name));\n\n    return longRunningWorkImplementation();\n\n    async Task<string> longRunningWorkImplementation()\n    {\n        var interimResult = await FirstWork(address);\n        var secondResult = await SecondStep(index, name);\n        return $\"The results are {interimResult} and {secondResult}. Enjoy.\";\n\n        Task<string> FirstWork(string x) => Task.FromResult (x);\n        Task<string> SecondStep(int i, string x) => Task.FromResult ($\"{x}: {i}\");\n    }\n}\n```\n\n> ℹ️  Some of the designs that are supported by local functions could also be accomplished using *lambda expressions*.\n\n## More expression-bodied members\n\nC# 6 introduced expression-bodied members for member functions, and read-only properties. C# 7 expands the allowed members that can be implemented as expressions. In C# 7, you can implement *constructors*, *finalizers*, and `get` and `set` accessors on *properties* and *indexers*. The following code shows examples of each:\n\n```csharp\nclass ExpressionMembersExample\n{\n    // Expression-bodied constructor\n    public ExpressionMembersExample(string label) => this.Label = label;\n\n    // Expression-bodied finalizer\n    ~ExpressionMembersExample() => Console.Error.WriteLine(\"Finalized!\");\n\n    private string label;\n\n    // Expression-bodied get / set accessors.\n    public string Label\n    {\n        get => label;\n        set => this.label = value ?? \"Default label\";\n    }\n}\n```\n\n> ℹ️  This example does not need a finalizer, but it is shown to demonstrate the syntax. You should not implement a finalizer in your class unless it is necessary to  release unmanaged resources. You should also consider using the `System.Runtime.InteropServices.SafeHandle` class instead of managing unmanaged resources directly.\n\nThese new locations for expression-bodied members represent an important milestone for the C# language: These features were implemented by community members working on the open-source [Roslyn](https://github.com/dotnet/Roslyn) project.\n\n## Throw expressions\n\nIn C#, `throw` has always been a statement. Because `throw` is a statement, not an expression, there were C# constructs where you could not use it. These included conditional expressions, null coalescing expressions, and some lambda expressions. The addition of expression-bodied members adds more locations where `throw` expressions would be useful. So that you can write any of these constructs, C# 7 introduces *throw expressions*.\n\nThe syntax is the same as you've always used for `throw` statements. The only difference is that now you can place them in new locations, such as in a conditional expression:\n\n```csharp\nclass ExpressionMembersExample\n{\n    private string name;\n\n    public string Name\n    {\n        get => name;\n        set => name = value ??\n            throw new ArgumentNullException(paramName: nameof(value), message: \"New name must not be null\");\n    }\n}\n```\n\nThis features enables using throw expressions in initialization expressions:\n\n```csharp\nclass ConfigResource { }\nstatic ConfigResource LoadConfigResourceOrDefault () => null;\n\nprivate ConfigResource loadedConfig = LoadConfigResourceOrDefault() ??\n   throw new InvalidOperationException(\"Could not load config\");\n```\n\nPreviously, those initializations would need to be in a constructor, with the throw statements in the body of the constructor:\n\n```csharp\nclass ApplicationOptions\n{\n    public ApplicationOptions()\n    {\n        var loadedConfig = LoadConfigResourceOrDefault();\n        if (loadedConfig == null)\n            throw new InvalidOperationException(\"Could not load config\");\n    }\n}\n```\n\n> ℹ️  Both of the preceding constructs will cause exceptions to be thrown during the construction of an object. Those are often difficult to recover from. For that reason, designs that throw exceptions during construction are discouraged.\n\n## Numeric literal syntax improvements\n\nMisreading numeric constants can make it harder to understand code when reading it for the first time. This often occurs when those numbers are used as bit masks or other symbolic rather than numeric values. C# 7 includes two new features to make it easier to write numbers in the most readable fashion for the intended use: *binary literals*, and *digit separators*.\n\nFor those times when you are creating bit masks, or whenever a binary representation of a number makes the most readable code, write that number in binary:\n\n```csharp\npublic const int One =  0b0001;\npublic const int Two =  0b0010;\npublic const int Four = 0b0100;\npublic const int Eight = 0b1000;\n```\n\nThe `0b` at the beginning of the constant indicates that the number is written as a binary number.\n\nBinary numbers can get very long, so it's often easier to see the bit patterns by introducing the `_` as a digit separator:\n\n```csharp\npublic const int Sixteen =   0b0001_0000;\npublic const int ThirtyTwo = 0b0010_0000;\npublic const int SixtyFour = 0b0100_0000;\npublic const int OneHundredTwentyEight = 0b1000_0000;\n```\n\nThe digit separator can appear anywhere in the constant. For base 10 numbers, it would be common to use it as a thousands separator:\n\n```csharp\npublic const long BillionsAndBillions = 100_000_000_000;\n```\n\nThe digit separator can be used with `decimal`, `float` and `double` types as well:\n\n```csharp\npublic const double AvogadroConstant = 6.022_140_857_747_474e23;\npublic const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M;\n```\n\nTaken together, you can declare numeric constants with much more readability.\n\n## Ref locals and returns\n\nThis feature enables algorithms that use and return references to variables defined elsewhere. One example is working with large matrices, and finding a single location with certain characteristics. One method would return the two indices for a single location in the matrix:\n\n```csharp\npublic static (int i, int j) Find(int[,] matrix, Func<int, bool> predicate)\n{\n    for (int i = 0; i < matrix.GetLength(0); i++)\n        for (int j = 0; j < matrix.GetLength(1); j++)\n            if (predicate(matrix[i, j]))\n                return (i, j);\n    return (-1, -1); // Not found\n}\n```\n\nThere are many issues with this code. First of all, it's a public method that's returning a tuple. The language supports this, but user defined types (either classes or structs) are preferred for public APIs.\n\nSecond, this method is returning the indices to the item in the matrix. That leads callers to write code that uses those indices to dereference the matrix and modify a single element:\n\n```csharp\nvar matrix = new int[,] {\n    { 5, 9, 11, 4},\n    { 3, 10, 18, 9},\n    { 1, 19, 42, 2},\n    { 0, 3, 4, 31},\n};\n\nvar indices = Find(matrix, (val) => val == 42);\nConsole.WriteLine(indices);\nmatrix[indices.i, indices.j] = 24;\n```\n\nYou'd rather write a method that returns a *reference* to the element of the matrix that you want to change. You could only accomplish this by using unsafe code and returning a pointer to an `int` in previous versions.\n\nLet's walk through a series of changes to demonstrate the ref local feature and show how to create a method that returns a reference to internal storage. Along the way, you'll learn the rules of the ref return and ref local feature that protects you from accidentally misusing it.\n\nStart by modifying the `Find` method declaration so that it returns a `ref int` instead of a tuple. Then, modify the return statement so it returns the value stored in the matrix instead of the two indices:\n\n```csharp\n// Note that this won't compile.\n// Method declaration indicates ref return,\n// but return statement specifies a value return.\n//\n// public static ref int Find2(int[,] matrix, Func<int, bool> predicate)\n// {\n//     for (int i = 0; i < matrix.GetLength(0); i++)\n//         for (int j = 0; j < matrix.GetLength(1); j++)\n//             if (predicate(matrix[i, j]))\n//                 return matrix[i, j];\n//     throw new InvalidOperationException(\"Not found\");\n// }\n```\n\nWhen you declare that a method returns a `ref` variable, you must also add the `ref` keyword to each return statement. That indicates return by reference, and helps developers reading the code later remember that the method returns by reference:\n\n```csharp\npublic static ref int Find3(int[,] matrix, Func<int, bool> predicate)\n{\n    for (int i = 0; i < matrix.GetLength(0); i++)\n        for (int j = 0; j < matrix.GetLength(1); j++)\n            if (predicate(matrix[i, j]))\n                return ref matrix[i, j];\n    throw new InvalidOperationException(\"Not found\");\n}\n```\n\nNow that the method returns a reference to the integer value in the matrix, you need to modify where it's called.  The `var` declaration means that `valItem` is now an `int` rather than a tuple:\n\n```csharp\nvar valItem = Find3(matrix, (val) => val == 42);\nConsole.WriteLine(valItem);\nvalItem = 24;\nConsole.WriteLine(matrix[4, 2]);\n```\n\nThe second `WriteLine` statement in the example above prints out the value `42`, not `24`. The variable `valItem` is an `int`, not a `ref int`. The `var` keyword enables the compiler to specify the type, but will not implicitly add the `ref` modifier. Instead, the value referred to by the `ref return` is *copied* to the variable on the left-hand side of the assignment. The variable is not a `ref` local.\n\nIn order to get the result you want, you need to add the `ref` modifier to the local variable declaration to make the variable a reference when the return value is a reference:\n\n```csharp\nref var item = ref Find3(matrix, (val) => val == 42);\nConsole.WriteLine(item);\nitem = 24;\nConsole.WriteLine(matrix[4, 2]);\n```\n\nNow, the second `WriteLine` statement in the example above will print out the value `24`, indicating that the storage in the matrix has been modified. The local variable has been declared with the `ref` modifier, and it will take a `ref` return. You must initialize a `ref` variable when it is declared, you cannot split the declaration and the initialization.\n\nThe C# language has two other rules that protect you from misusing the `ref` locals and returns:\n\n* You cannot assign a value to a `ref` variable.\n\n  * That disallows statements like `ref int i = sequence.Count();`\n\n* You cannot return a `ref` to a variable whose lifetime does not extend beyond the execution of the method.\n\n  * That means you cannot return a reference to a local variable, or similar scope.\n\nThese rules ensure that you cannot accidentally mix value variables and reference variables. They also ensure that you cannot have a reference variable refer to storage that is a candidate for garbage collection.\n\nThe addition of ref locals and ref returns enable algorithms that are more efficient by avoiding copying values, or performing dereferencing operations multiple times.\n"
  },
  {
    "path": "csharp/csharp7/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\ntitle: What's New in C# 7 | C# Guide\nplatforms:\n- Console\n---\n\n> ⚠️ C# 7 is supported in Xamarin Workbooks 1.2 (or newer).\n> Please update to version 1.2 if you experience issues with this Workbook (you may need to switch to the Alpha or Beta channel).\n\n# What's new in C# 7\n\nC# 7 adds a number of new features to the C# language:\n\n* `out` variables\n\n  * You can declare `out` values inline as arguments to the method where they are used.\n\n* Tuples\n\n  * You can create lightweight, unnamed types that contain multiple public fields. Compilers and IDE tools understand the semantics of these types.\n\n* Pattern Matching\n\n  * You can create branching logic based on arbitrary types and values of the members of those types.\n\n* `ref` locals and returns\n\n  * Method arguments and local variables can be references to other storage.\n\n* Local Functions\n\n  * You can nest functions inside other functions to limit their scope and visibility.\n\n* More expression-bodied members\n\n  * The list of members that can be authored using expressions has grown.\n\n* `throw` Expressions\n\n  * You can throw exceptions in code constructs that previously were not allowed because `throw` was a statement.\n\n* Generalized async return types\n\n  * Methods declared with the `async` modifier can return other types in addition to `Task` and `Task<T>`.\n\n* Numeric literal syntax improvements\n\n  * New tokens improve readability for numeric constants.\n\nThe remainder of this topic discusses each of the features. For each feature, you'll learn the reasoning behind it. You'll learn the syntax. You'll see some sample scenarios where using the new feature will make you more productive as a developer.\n\n## `out` variables\n\nThe existing syntax that supports `out` parameters has been improved in this version.\n\nPreviously, you would need to separate the declaration of the out variable and its initialization into two different statements:\n\n```csharp\nvar input = \"8675309\";\n\nint numericResult;\nif (int.TryParse(input, out numericResult))\n    Console.WriteLine(numericResult);\nelse\n    Console.WriteLine(\"Could not parse input\");\n```\n\nYou can now declare `out` variables in the argument list of a method call, rather than writing a separate declaration statement:\n\n```csharp\nif (int.TryParse(input, out int result))\n    Console.WriteLine(result);\nelse\n    Console.WriteLine(\"Could not parse input\");\n```\n\nYou may want to specify the type of the `out` variable for clarity, as shown above. However, the language does support using an implicitly typed local variable:\n\n```csharp\nif (int.TryParse(input, out var answer))\n    Console.WriteLine(answer);\nelse\n    Console.WriteLine(\"Could not parse input\");\n```\n\n* The code is easier to read.\n\n  * You declare the out variable where you use it, not on another line above.\n\n* No need to assign an initial value.\n\n  * By declaring the `out` variable where it is used in a method call, you can't accidentally use it before it is assigned.\n\nThe most common use for this feature will be the `Try` pattern. In this pattern, a method returns a `bool` indicating success or failure and an`out` variable that provides the result if the method succeeds.\n\n## Tuples\n\nC# provides a rich syntax for classes and structs that is used to explain your design intent. But sometimes that rich syntax requires extra work with minimal benefit. You may often write methods that need a simple structure containing more than one data element. To support these scenarios *tuples* were added to C#. Tuples are lightweight data structures that contain multiple fields to represent the data members. The fields are not validated, and you cannot define your own methods\n\n> ℹ️  Tuples were available before C# 7 as an API, but had many limitations. Most importantly, the members of these tuples were named `Item1`, `Item2` and so on. The language support enables semantic names for the fields of a Tuple.\n\nYou can create a tuple by assigning each member to a value:\n\n```csharp\nvar letters = (\"a\", \"b\");\n```\n\nThat assignment creates a tuple whose members are `Item1` and `Item2`, following the existing System.Tuple syntax. You can modify that assignment to create a tuple that provides semantic names to each of the members of the tuple:\n\n```csharp\n(string Alpha, string Beta) namedLetters = (\"a\", \"b\");\n```\n\n> ℹ️  The new tuples features require the `System.ValueTuple` type. For Visual Studio 15 Preview 5 and earlier preview releases, you must add the NuGet package \"System.ValueTuple\", available in the pre-release stream.\n\nThe `namedLetters` tuple contains fields referred to as `Alpha` and `Beta`. In a tuple assignment, you can also specify the names of the fields on the right-hand side of the assignment:\n\n```csharp\nvar alphabetStart = (Alpha: \"a\", Beta: \"b\");\n```\n\nThe language allows you to specify names for the fields on both the left and right-hand side of the assignment:\n\n```csharp\n(string First, string Second) firstLetters = (Alpha: \"a\", Beta: \"b\");\n```\n\nThe line above generates a warning, `CS8123`, telling you that the names on the right side of the assignment, `Alpha` and `Beta` are ignored because they conflict with the names on the left side, `First` and `Second`.\n\nThe examples above show the basic syntax to declare tuples. Tuples are most useful as return types for `private` and `internal` methods. Tuples provide a simple syntax for those methods to return multiple discrete values: You save the work of authoring a `class` or a `struct` that defines the type returned. There is no need for creating a new type.\n\nCreating a tuple is more efficient and more productive. It is a simpler, lightweight syntax to define a data structure that carries more than one value. The example method below returns the minimum and maximum values found in a sequence of integers:\n\n```csharp\nprivate static (int Max, int Min) Range(IEnumerable<int> numbers)\n{\n    int min = int.MaxValue;\n    int max = int.MinValue;\n    foreach(var n in numbers)\n    {\n        min = (n < min) ? n : min;\n        max = (n > max) ? n : max;\n    }\n    return (max, min);\n}\n```\n\nUsing tuples in this way offers several advantages:\n\n* You save the work of authoring a `class` or a `struct` that defines the type returned.\n\n* You do not need to create new type.\n\n* The language enhancements removes the need to call the `System.Tuple.Create<T>()` methods.\n\nThe declaration for the method provides the names for the fields of the tuple that is returned. When you call the method, the return value is a tuple whose fields are `Max` and `Min`:\n\n```csharp\nint [] numbers = { 97, 243, 254, 41, 132, 26, 167, 19, 201, 252, 119, 68, 17, 66, 131 };\n\nvar range = Range(numbers);\n```\n\nThere may be times when you want to unpackage the members of a tuple that were returned from a method.  You can do that by declaring separate variables for each of the values in the tuple. This is called *deconstructing* the tuple:\n\n```csharp\n(int max, int min) = Range(numbers);\n```\n\nYou can also provide a similar deconstruction for any type in .NET. This is done by writing a `Deconstruct` method as a member of the class. That `Deconstruct` method provides a set of `out` arguments for each of the properties you want to extract. Consider this `Point` class that provides a deconstructor method that extracts the `X` and `Y` coordinates:\n\n```csharp\npublic class Point\n{\n    public Point(double x, double y)\n    {\n        this.X = x;\n        this.Y = y;\n    }\n\n    public double X { get; }\n    public double Y { get; }\n\n    public void Deconstruct(out double x, out double y)\n    {\n        x = this.X;\n        y = this.Y;\n    }\n}\n```\n\nYou can extract the individual fields by assigning a tuple to a `Point`:\n\n```csharp\nvar p = new Point(3.14, 2.71);\n(double X, double Y) = p;\n```\n\nYou are not bound by the names defined in the `Deconstruct` method. You can rename the extract variables as part of the assignment:\n\n```csharp\n(double horizontalDistance, double verticalDistance) = p;\n```\n\n## Pattern matching\n\n*Pattern matching* is a feature that allows you to implement method dispatch on properties other than the type of an object. You're probably already familiar with method dispatch based on the type of an object. In Object Oriented programming, virtual and override methods provide language syntax to implement method dispatching based on an object's type. Base and Derived classes provide different implementations. Pattern matching expressions extend this concept so that you can easily implement similar dispatch patterns for types and data elements that are not related through an inheritance hierarchy.\n\nPattern matching supports `is` expressions and `switch` expressions. Each enables inspecting an object and its properties to determine if that object satisfies the sought pattern. You use the `when` keyword to specify additional rules to the pattern.\n\n### `is` expressions\n\nThe `is` pattern expressions extend the familiar `is` operator to query a object beyond its type.\n\nLet's start with a simple scenario. We'll add capabilities to this scenario that demonstrate how pattern matching expressions make algorithms that work with unrelated types easy. We'll start with a method that computes the sum of a number of die rolls:\n\n```csharp\npublic static int DiceSum(IEnumerable<int> values) => values.Sum()\n```\n\nYou might quickly find that you need to find the sum of die rolls where some of the rolls are made with more than one die. Part of the input sequence may be multiple results instead of a single number:\n\n```csharp\npublic static int DiceSum2(IEnumerable<object> values)\n{\n    var sum = 0;\n    foreach(var item in values)\n    {\n        if (item is int val)\n            sum += val;\n        else if (item is IEnumerable<object> subList)\n            sum += DiceSum2(subList);\n    }\n    return sum;\n}\n```\n\nThe `is` pattern expression works quite well in this scenario. As part of checking the type, you write a variable initialization. This creates a new variable of the validated runtime type.\n\nAs you keep extending these scenarios, you may find that you build more `if` and `else if` statements. Once that becomes unwieldy, you'll likely want to switch to `switch` pattern expressions.\n\n### `switch` expressions\n\nThe `switch` pattern expression has a familiar syntax, based on the `switch` statement already part of the C# language. Let's translate the existing code to use a `switch` expression before adding new cases:\n\n```csharp\npublic static int DiceSum3(IEnumerable<object> values)\n{\n    var sum = 0;\n    foreach (var item in values)\n    {\n        switch (item)\n        {\n            case int val:\n                sum += val;\n                break;\n            case IEnumerable<object> subList:\n                sum += DiceSum3(subList);\n                break;\n        }\n    }\n    return sum;\n}\n```\n\nThe `switch` expressions have a slightly different syntax than the `is` expressions, where you declare the type and variable at the beginning of the `case` expression.\n\nThe `switch` expressions also support constants. This can save time by factoring out simple cases:\n\n```csharp\npublic static int DiceSum4(IEnumerable<object> values)\n{\n    var sum = 0;\n    foreach (var item in values)\n    {\n        switch (item)\n        {\n            case 0:\n                break;\n            case int val:\n                sum += val;\n                break;\n            case IEnumerable<object> subList when subList.Any():\n                sum += DiceSum4(subList);\n                break;\n            case IEnumerable<object> subList:\n                break;\n            case null:\n                break;\n            default:\n                throw new InvalidOperationException(\"unknown item type\");\n        }\n    }\n    return sum;\n}\n```\n\nThe code above adds cases for `0` as a special case of `int`, and `null` as a special case when there is no input. This demonstrates one important new feature in switch pattern expressions: the order of the `case` expressions now matters. The `0` case must appear before the general `int` case. Otherwise, the first pattern to match would be the `int` case, even when the value is `0`.\n\nThis same behavior enables the special case for an empty input sequence. You can see that the case for an `IEnumerable` item that has elements must appear before the general `IEnumerable` case.\n\nThis version has also added a `default` case. The `default` case is always evaluated last, regardless of the order it appears in the source. For that reason, convention is to put the `default` case last.\n\nFinally, let's add one last `case` for a new style of die. Some games use percentile dice to represent larger ranges of numbers.\n\n> ℹ️  Two 10-sided percentile dice can represent every number from 0 through 99. One die has sides labelled `00`, `10`, `20`, ... `90`. The other die has sides labeled `0`, `1`, `2`, ... `9`. Add the two die values together and you can get every number from 0 through 99.\n\nTo add this kind of die to your collection, first define a type to represent the percentile die:\n\n```csharp\npublic struct PercentileDie\n{\n    public int Value { get; }\n    public int Multiplier { get; }\n\n    public PercentileDie(int multiplier, int value)\n    {\n        this.Value = value;\n        this.Multiplier = multiplier;\n    }\n}\n```\n\nThen, add a `case` expression for the new type:\n\n```csharp\npublic static int DiceSum5(IEnumerable<object> values)\n{\n    var sum = 0;\n    foreach (var item in values)\n    {\n        switch (item)\n        {\n            case 0:\n                break;\n            case int val:\n                sum += val;\n                break;\n            case PercentileDie die:\n                sum += die.Multiplier * die.Value;\n                break;\n            case IEnumerable<object> subList when subList.Any():\n                sum += DiceSum5(subList);\n                break;\n            case IEnumerable<object> subList:\n                break;\n            case null:\n                break;\n            default:\n                throw new InvalidOperationException(\"unknown item type\");\n        }\n    }\n    return sum;\n}\n```\n\nThe new syntax for pattern matching expressions makes it easier to create dispatch algorithms based on an object's type, or other properties, using a clear and concise syntax. Pattern matching expressions enable these constructs on data types that are unrelated by inheritance.\n\n## Local functions\n\nMany designs for classes include methods that are called from only one location. These additional private methods keep each method small and focused. However, they can make it harder to understand a class when reading it the first time. These methods must be understood outside of the context of the single calling location.\n\nFor those designs, *local functions* enable you to declare methods inside the context of another method. This makes it easier for readers of the class to see that the local method is only called from the context in which is it declared.\n\nThere are two very common use cases for local functions: public iterator methods and public async methods. Both types of methods generate code that reports errors later than programmers might expect. In the case of iterator methods, any exceptions are observed only when calling code that enumerates the returned sequence. In the case of async methods, any exceptions are only observed when the returned `Task` is awaited.\n\nLet's start with an iterator method:\n\n```csharp\npublic static IEnumerable<char> AlphabetSubset(char start, char end)\n{\n    if ((start < 'a') || (start > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(start), message: \"start must be a letter\");\n    if ((end < 'a') || (end > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(end), message: \"end must be a letter\");\n\n    if (end <= start)\n        throw new ArgumentException($\"{nameof(end)} must be greater than {nameof(start)}\");\n    for (var c = start; c < end; c++)\n        yield return c;\n}\n```\n\nExamine the code below that calls the iterator method incorrectly:\n\n```csharp\nvar resultSet = AlphabetSubset('f', 'a');\nConsole.WriteLine(\"iterator created\");\nforeach (var thing in resultSet)\n    Console.Write($\"{thing}, \");\n```\n\nThe exception is thrown when `resultSet` is iterated, not when `resultSet` is created. In this contained example, most developers could quickly diagnose the problem. However, in larger codebases, the code that creates an iterator often isn't as close to the code that enumerates the result. You can refactor the code so that the public method validates all arguments, and a private method generates the enumeration:\n\n```csharp\npublic static IEnumerable<char> AlphabetSubset2(char start, char end)\n{\n    if ((start < 'a') || (start > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(start), message: \"start must be a letter\");\n    if ((end < 'a') || (end > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(end), message: \"end must be a letter\");\n\n    if (end <= start)\n        throw new ArgumentException($\"{nameof(end)} must be greater than {nameof(start)}\");\n    return alphabetSubsetImplementation(start, end);\n}\n\nprivate static IEnumerable<char> alphabetSubsetImplementation(char start, char end)\n{ \n    for (var c = start; c < end; c++)\n        yield return c;\n}\n```\n\nThis refactored version will throw exceptions immediately because the public method is not an iterator method; only the private method uses the `yield return` syntax. However, there are potential problems with this refactoring. The private method should only be called from the public interface method, because otherwise all argument validation is skipped. Readers of the class must discover this fact by reading the entire class and searching for any other references to the `alphabetSubsetImplementation` method.\n\nYou can make that design intent more clear by declaring the `alphabetSubsetImplementation` as a local function inside the public API method:\n\n```csharp\npublic static IEnumerable<char> AlphabetSubset3(char start, char end)\n{\n    if ((start < 'a') || (start > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(start), message: \"start must be a letter\");\n    if ((end < 'a') || (end > 'z'))\n        throw new ArgumentOutOfRangeException(paramName: nameof(end), message: \"end must be a letter\");\n\n    if (end <= start)\n        throw new ArgumentException($\"{nameof(end)} must be greater than {nameof(start)}\");\n\n    return alphabetSubsetImplementation();\n\n    IEnumerable<char> alphabetSubsetImplementation()\n    {\n        for (var c = start; c < end; c++)\n            yield return c;\n    }\n}\n```\n\nThe version above makes it clear that the local method is referenced only in the context of the outer method. The rules for local functions also ensure that a developer can't accidentally call the local function from another location in the class and bypass the argument validation.\n\nThe same technique can be employed with `async` methods to ensure that exceptions arising from argument validation are thrown before the asynchronous work begins:\n\n```csharp\npublic Task<string> PerformLongRunningWork(string address, int index, string name)\n{\n    if (string.IsNullOrWhiteSpace(address))\n        throw new ArgumentException(message: \"An address is required\", paramName: nameof(address));\n    if (index < 0)\n        throw new ArgumentOutOfRangeException(paramName: nameof(index), message: \"The index must be non-negative\");\n    if (string.IsNullOrWhiteSpace(name))\n        throw new ArgumentException(message: \"You must supply a name\", paramName: nameof(name));\n\n    return longRunningWorkImplementation();\n\n    async Task<string> longRunningWorkImplementation()\n    {\n        var interimResult = await FirstWork(address);\n        var secondResult = await SecondStep(index, name);\n        return $\"The results are {interimResult} and {secondResult}. Enjoy.\";\n\n        Task<string> FirstWork(string x) => Task.FromResult (x);\n        Task<string> SecondStep(int i, string x) => Task.FromResult ($\"{x}: {i}\");\n    }\n}\n```\n\n> ℹ️  Some of the designs that are supported by local functions could also be accomplished using *lambda expressions*.\n\n## More expression-bodied members\n\nC# 6 introduced expression-bodied members for member functions, and read-only properties. C# 7 expands the allowed members that can be implemented as expressions. In C# 7, you can implement *constructors*, *finalizers*, and `get` and `set` accessors on *properties* and *indexers*. The following code shows examples of each:\n\n```csharp\nclass ExpressionMembersExample\n{\n    // Expression-bodied constructor\n    public ExpressionMembersExample(string label) => this.Label = label;\n\n    // Expression-bodied finalizer\n    ~ExpressionMembersExample() => Console.Error.WriteLine(\"Finalized!\");\n\n    private string label;\n\n    // Expression-bodied get / set accessors.\n    public string Label\n    {\n        get => label;\n        set => this.label = value ?? \"Default label\";\n    }\n}\n```\n\n> ℹ️  This example does not need a finalizer, but it is shown to demonstrate the syntax. You should not implement a finalizer in your class unless it is necessary to  release unmanaged resources. You should also consider using the `System.Runtime.InteropServices.SafeHandle` class instead of managing unmanaged resources directly.\n\nThese new locations for expression-bodied members represent an important milestone for the C# language: These features were implemented by community members working on the open-source [Roslyn](https://github.com/dotnet/Roslyn) project.\n\n## Throw expressions\n\nIn C#, `throw` has always been a statement. Because `throw` is a statement, not an expression, there were C# constructs where you could not use it. These included conditional expressions, null coalescing expressions, and some lambda expressions. The addition of expression-bodied members adds more locations where `throw` expressions would be useful. So that you can write any of these constructs, C# 7 introduces *throw expressions*.\n\nThe syntax is the same as you've always used for `throw` statements. The only difference is that now you can place them in new locations, such as in a conditional expression:\n\n```csharp\nclass ExpressionMembersExample\n{\n    private string name;\n\n    public string Name\n    {\n        get => name;\n        set => name = value ?? \n            throw new ArgumentNullException(paramName: nameof(value), message: \"New name must not be null\");\n    }\n}\n```\n\nThis features enables using throw expressions in initialization expressions:\n\n```csharp\nclass ConfigResource { }\nstatic ConfigResource LoadConfigResourceOrDefault () => null;\n\nprivate ConfigResource loadedConfig = LoadConfigResourceOrDefault() ?? \n   throw new InvalidOperationException(\"Could not load config\");\n```\n\nPreviously, those initializations would need to be in a constructor, with the throw statements in the body of the constructor:\n\n```csharp\nclass ApplicationOptions\n{\n    public ApplicationOptions()\n    {\n        var loadedConfig = LoadConfigResourceOrDefault();\n        if (loadedConfig == null)\n            throw new InvalidOperationException(\"Could not load config\");\n    }\n}\n```\n\n> ℹ️  Both of the preceding constructs will cause exceptions to be thrown during the construction of an object. Those are often difficult to recover from. For that reason, designs that throw exceptions during construction are discouraged.\n\n## Numeric literal syntax improvements\n\nMisreading numeric constants can make it harder to understand code when reading it for the first time. This often occurs when those numbers are used as bit masks or other symbolic rather than numeric values. C# 7 includes two new features to make it easier to write numbers in the most readable fashion for the intended use: *binary literals*, and *digit separators*.\n\nFor those times when you are creating bit masks, or whenever a binary representation of a number makes the most readable code, write that number in binary:\n\n```csharp\npublic const int One =  0b0001;\npublic const int Two =  0b0010;\npublic const int Four = 0b0100;\npublic const int Eight = 0b1000;\n```\n\nThe `0b` at the beginning of the constant indicates that the number is written as a binary number.\n\nBinary numbers can get very long, so it's often easier to see the bit patterns by introducing the `_` as a digit separator:\n\n```csharp\npublic const int Sixteen =   0b0001_0000;\npublic const int ThirtyTwo = 0b0010_0000;\npublic const int SixtyFour = 0b0100_0000;\npublic const int OneHundredTwentyEight = 0b1000_0000;\n```\n\nThe digit separator can appear anywhere in the constant. For base 10 numbers, it would be common to use it as a thousands separator:\n\n```csharp\npublic const long BillionsAndBillions = 100_000_000_000;\n```\n\nThe digit separator can be used with `decimal`, `float` and `double` types as well:\n\n```csharp\npublic const double AvogadroConstant = 6.022_140_857_747_474e23;\npublic const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M;\n```\n\nTaken together, you can declare numeric constants with much more readability.\n\n## Ref locals and returns\n\nThis feature enables algorithms that use and return references to variables defined elsewhere. One example is working with large matrices, and finding a single location with certain characteristics. One method would return the two indices for a single location in the matrix:\n\n```csharp\npublic static (int i, int j) Find(int[,] matrix, Func<int, bool> predicate)\n{\n    for (int i = 0; i < matrix.GetLength(0); i++)\n        for (int j = 0; j < matrix.GetLength(1); j++)\n            if (predicate(matrix[i, j]))\n                return (i, j);\n    return (-1, -1); // Not found\n}\n```\n\nThere are many issues with this code. First of all, it's a public method that's returning a tuple. The language supports this, but user defined types (either classes or structs) are preferred for public APIs.\n\nSecond, this method is returning the indices to the item in the matrix. That leads callers to write code that uses those indices to dereference the matrix and modify a single element:\n\n```csharp\nvar matrix = new int[,] {\n    { 5, 9, 11, 4},\n    { 3, 10, 18, 9},\n    { 1, 19, 42, 2},\n    { 0, 3, 4, 31},\n};\n\nvar indices = Find(matrix, (val) => val == 42);\nConsole.WriteLine(indices);\nmatrix[indices.i, indices.j] = 24;\n```\n\nYou'd rather write a method that returns a *reference* to the element of the matrix that you want to change. You could only accomplish this by using unsafe code and returning a pointer to an `int` in previous versions.\n\nLet's walk through a series of changes to demonstrate the ref local feature and show how to create a method that returns a reference to internal storage. Along the way, you'll learn the rules of the ref return and ref local feature that protects you from accidentally misusing it.\n\nStart by modifying the `Find` method declaration so that it returns a `ref int` instead of a tuple. Then, modify the return statement so it returns the value stored in the matrix instead of the two indices:\n\n```csharp\n// Note that this won't compile.\n// Method declaration indicates ref return,\n// but return statement specifies a value return.\n//\n// public static ref int Find2(int[,] matrix, Func<int, bool> predicate)\n// {\n//     for (int i = 0; i < matrix.GetLength(0); i++)\n//         for (int j = 0; j < matrix.GetLength(1); j++)\n//             if (predicate(matrix[i, j]))\n//                 return matrix[i, j];\n//     throw new InvalidOperationException(\"Not found\");\n// }\n```\n\nWhen you declare that a method returns a `ref` variable, you must also add the `ref` keyword to each return statement. That indicates return by reference, and helps developers reading the code later remember that the method returns by reference:\n\n```csharp\npublic static ref int Find3(int[,] matrix, Func<int, bool> predicate)\n{\n    for (int i = 0; i < matrix.GetLength(0); i++)\n        for (int j = 0; j < matrix.GetLength(1); j++)\n            if (predicate(matrix[i, j]))\n                return ref matrix[i, j];\n    throw new InvalidOperationException(\"Not found\");\n}\n```\n\nNow that the method returns a reference to the integer value in the matrix, you need to modify where it's called.  The `var` declaration means that `valItem` is now an `int` rather than a tuple:\n\n```csharp\nvar valItem = Find3(matrix, (val) => val == 42);\nConsole.WriteLine(valItem);\nvalItem = 24;\nConsole.WriteLine(matrix[4, 2]);\n```\n\nThe second `WriteLine` statement in the example above prints out the value `42`, not `24`. The variable `valItem` is an `int`, not a `ref int`. The `var` keyword enables the compiler to specify the type, but will not implicitly add the `ref` modifier. Instead, the value referred to by the `ref return` is *copied* to the variable on the left-hand side of the assignment. The variable is not a `ref` local.\n\nIn order to get the result you want, you need to add the `ref` modifier to the local variable declaration to make the variable a reference when the return value is a reference:\n\n```csharp\nref var item = ref Find3(matrix, (val) => val == 42);\nConsole.WriteLine(item);\nitem = 24;\nConsole.WriteLine(matrix[4, 2]);\n```\n\nNow, the second `WriteLine` statement in the example above will print out the value `24`, indicating that the storage in the matrix has been modified. The local variable has been declared with the `ref` modifier, and it will take a `ref` return. You must initialize a `ref` variable when it is declared, you cannot split the declaration and the initialization.\n\nThe C# language has two other rules that protect you from misusing the `ref` locals and returns:\n\n* You cannot assign a value to a `ref` variable.\n\n  * That disallows statements like `ref int i = sequence.Count();`\n\n* You cannot return a `ref` to a variable whose lifetime does not extend beyond the execution of the method.\n\n  * That means you cannot return a reference to a local variable, or similar scope.\n\nThese rules ensure that you cannot accidentally mix value variables and reference variables. They also ensure that you cannot have a reference variable refer to storage that is a candidate for garbage collection.\n\nThe addition of ref locals and ref returns enable algorithms that are more efficient by avoiding copying values, or performing dereferencing operations multiple times.\n"
  },
  {
    "path": "csharp/csharp7/meta.json",
    "content": "{\n  \"order\":{\n    \"csharp7.workbook\":\"What's new in C# 7\"\n  }\n}\n"
  },
  {
    "path": "csharp/linq/101-linq-examples.workbook/101_Linq_Examples.csx",
    "content": "#r \"System.Xml.Linq\"\n#r \"System.Data\"\n#r \"System.Data.DataSetExtensions\"\n\nusing System.Xml.Linq;\nusing System.Data;\n\n\npublic class Product\n{\n    public int ProductID { get; set; }\n    public string ProductName { get; set; }\n    public string Category { get; set; }\n    public decimal UnitPrice { get; set; }\n    public int UnitsInStock { get; set; }\n}\n\npublic class Order\n{\n    public int OrderID { get; set; }\n    public DateTime OrderDate { get; set; }\n    public decimal Total { get; set; }\n}\n\npublic class Customer\n{\n    public string CustomerID { get; set; }\n    public string CompanyName { get; set; }\n    public string Address { get; set; }\n    public string City { get; set; }\n    public string Region { get; set; }\n    public string PostalCode { get; set; }\n    public string Country { get; set; }\n    public string Phone { get; set; }\n    public string Fax { get; set; }\n    public Order[] Orders { get; set; }\n}\n\n// Data\nvar productList = \n    new List<Product> {\n    new Product { ProductID = 1, ProductName = \"Chai\", Category = \"Beverages\", UnitPrice = 18.0000M, UnitsInStock = 39 },\n    new Product { ProductID = 2, ProductName = \"Chang\", Category = \"Beverages\", UnitPrice = 19.0000M, UnitsInStock = 17 },\n    new Product { ProductID = 3, ProductName = \"Aniseed Syrup\", Category = \"Condiments\", UnitPrice = 10.0000M, UnitsInStock = 13 },\n    new Product { ProductID = 4, ProductName = \"Chef Anton's Cajun Seasoning\", Category = \"Condiments\", UnitPrice = 22.0000M, UnitsInStock = 53 },\n    new Product { ProductID = 5, ProductName = \"Chef Anton's Gumbo Mix\", Category = \"Condiments\", UnitPrice = 21.3500M, UnitsInStock = 0 },\n    new Product { ProductID = 6, ProductName = \"Grandma's Boysenberry Spread\", Category = \"Condiments\", UnitPrice = 25.0000M, UnitsInStock = 120 },\n    new Product { ProductID = 7, ProductName = \"Uncle Bob's Organic Dried Pears\", Category = \"Produce\", UnitPrice = 30.0000M, UnitsInStock = 15 },\n    new Product { ProductID = 8, ProductName = \"Northwoods Cranberry Sauce\", Category = \"Condiments\", UnitPrice = 40.0000M, UnitsInStock = 6 },\n    new Product { ProductID = 9, ProductName = \"Mishi Kobe Niku\", Category = \"Meat/Poultry\", UnitPrice = 97.0000M, UnitsInStock = 29 },\n    new Product { ProductID = 10, ProductName = \"Ikura\", Category = \"Seafood\", UnitPrice = 31.0000M, UnitsInStock = 31 },\n    new Product { ProductID = 11, ProductName = \"Queso Cabrales\", Category = \"Dairy Products\", UnitPrice = 21.0000M, UnitsInStock = 22 },\n    new Product { ProductID = 12, ProductName = \"Queso Manchego La Pastora\", Category = \"Dairy Products\", UnitPrice = 38.0000M, UnitsInStock = 86 },\n    new Product { ProductID = 13, ProductName = \"Konbu\", Category = \"Seafood\", UnitPrice = 6.0000M, UnitsInStock = 24 },\n    new Product { ProductID = 14, ProductName = \"Tofu\", Category = \"Produce\", UnitPrice = 23.2500M, UnitsInStock = 35 },\n    new Product { ProductID = 15, ProductName = \"Genen Shouyu\", Category = \"Condiments\", UnitPrice = 15.5000M, UnitsInStock = 39 },\n    new Product { ProductID = 16, ProductName = \"Pavlova\", Category = \"Confections\", UnitPrice = 17.4500M, UnitsInStock = 29 },\n    new Product { ProductID = 17, ProductName = \"Alice Mutton\", Category = \"Meat/Poultry\", UnitPrice = 39.0000M, UnitsInStock = 0 },\n    new Product { ProductID = 18, ProductName = \"Carnarvon Tigers\", Category = \"Seafood\", UnitPrice = 62.5000M, UnitsInStock = 42 },\n    new Product { ProductID = 19, ProductName = \"Teatime Chocolate Biscuits\", Category = \"Confections\", UnitPrice = 9.2000M, UnitsInStock = 25 },\n    new Product { ProductID = 20, ProductName = \"Sir Rodney's Marmalade\", Category = \"Confections\", UnitPrice = 81.0000M, UnitsInStock = 40 },\n    new Product { ProductID = 21, ProductName = \"Sir Rodney's Scones\", Category = \"Confections\", UnitPrice = 10.0000M, UnitsInStock = 3 },\n    new Product { ProductID = 22, ProductName = \"Gustaf's Knäckebröd\", Category = \"Grains/Cereals\", UnitPrice = 21.0000M, UnitsInStock = 104 },\n    new Product { ProductID = 23, ProductName = \"Tunnbröd\", Category = \"Grains/Cereals\", UnitPrice = 9.0000M, UnitsInStock = 61 },\n    new Product { ProductID = 24, ProductName = \"Guaraná Fantástica\", Category = \"Beverages\", UnitPrice = 4.5000M, UnitsInStock = 20 },\n    new Product { ProductID = 25, ProductName = \"NuNuCa Nuß-Nougat-Creme\", Category = \"Confections\", UnitPrice = 14.0000M, UnitsInStock = 76 },\n    new Product { ProductID = 26, ProductName = \"Gumbär Gummibärchen\", Category = \"Confections\", UnitPrice = 31.2300M, UnitsInStock = 15 },\n    new Product { ProductID = 27, ProductName = \"Schoggi Schokolade\", Category = \"Confections\", UnitPrice = 43.9000M, UnitsInStock = 49 },\n    new Product { ProductID = 28, ProductName = \"Rössle Sauerkraut\", Category = \"Produce\", UnitPrice = 45.6000M, UnitsInStock = 26 },\n    new Product { ProductID = 29, ProductName = \"Thüringer Rostbratwurst\", Category = \"Meat/Poultry\", UnitPrice = 123.7900M, UnitsInStock = 0 },\n    new Product { ProductID = 30, ProductName = \"Nord-Ost Matjeshering\", Category = \"Seafood\", UnitPrice = 25.8900M, UnitsInStock = 10 },\n    new Product { ProductID = 31, ProductName = \"Gorgonzola Telino\", Category = \"Dairy Products\", UnitPrice = 12.5000M, UnitsInStock = 0 },\n    new Product { ProductID = 32, ProductName = \"Mascarpone Fabioli\", Category = \"Dairy Products\", UnitPrice = 32.0000M, UnitsInStock = 9 },\n    new Product { ProductID = 33, ProductName = \"Geitost\", Category = \"Dairy Products\", UnitPrice = 2.5000M, UnitsInStock = 112 },\n    new Product { ProductID = 34, ProductName = \"Sasquatch Ale\", Category = \"Beverages\", UnitPrice = 14.0000M, UnitsInStock = 111 },\n    new Product { ProductID = 35, ProductName = \"Steeleye Stout\", Category = \"Beverages\", UnitPrice = 18.0000M, UnitsInStock = 20 },\n    new Product { ProductID = 36, ProductName = \"Inlagd Sill\", Category = \"Seafood\", UnitPrice = 19.0000M, UnitsInStock = 112 },\n    new Product { ProductID = 37, ProductName = \"Gravad lax\", Category = \"Seafood\", UnitPrice = 26.0000M, UnitsInStock = 11 },\n    new Product { ProductID = 38, ProductName = \"Côte de Blaye\", Category = \"Beverages\", UnitPrice = 263.5000M, UnitsInStock = 17 },\n    new Product { ProductID = 39, ProductName = \"Chartreuse verte\", Category = \"Beverages\", UnitPrice = 18.0000M, UnitsInStock = 69 },\n    new Product { ProductID = 40, ProductName = \"Boston Crab Meat\", Category = \"Seafood\", UnitPrice = 18.4000M, UnitsInStock = 123 },\n    new Product { ProductID = 41, ProductName = \"Jack's New England Clam Chowder\", Category = \"Seafood\", UnitPrice = 9.6500M, UnitsInStock = 85 },\n    new Product { ProductID = 42, ProductName = \"Singaporean Hokkien Fried Mee\", Category = \"Grains/Cereals\", UnitPrice = 14.0000M, UnitsInStock = 26 },\n    new Product { ProductID = 43, ProductName = \"Ipoh Coffee\", Category = \"Beverages\", UnitPrice = 46.0000M, UnitsInStock = 17 },\n    new Product { ProductID = 44, ProductName = \"Gula Malacca\", Category = \"Condiments\", UnitPrice = 19.4500M, UnitsInStock = 27 },\n    new Product { ProductID = 45, ProductName = \"Rogede sild\", Category = \"Seafood\", UnitPrice = 9.5000M, UnitsInStock = 5 },\n    new Product { ProductID = 46, ProductName = \"Spegesild\", Category = \"Seafood\", UnitPrice = 12.0000M, UnitsInStock = 95 },\n    new Product { ProductID = 47, ProductName = \"Zaanse koeken\", Category = \"Confections\", UnitPrice = 9.5000M, UnitsInStock = 36 },\n    new Product { ProductID = 48, ProductName = \"Chocolade\", Category = \"Confections\", UnitPrice = 12.7500M, UnitsInStock = 15 },\n    new Product { ProductID = 49, ProductName = \"Maxilaku\", Category = \"Confections\", UnitPrice = 20.0000M, UnitsInStock = 10 },\n    new Product { ProductID = 50, ProductName = \"Valkoinen suklaa\", Category = \"Confections\", UnitPrice = 16.2500M, UnitsInStock = 65 },\n    new Product { ProductID = 51, ProductName = \"Manjimup Dried Apples\", Category = \"Produce\", UnitPrice = 53.0000M, UnitsInStock = 20 },\n    new Product { ProductID = 52, ProductName = \"Filo Mix\", Category = \"Grains/Cereals\", UnitPrice = 7.0000M, UnitsInStock = 38 },\n    new Product { ProductID = 53, ProductName = \"Perth Pasties\", Category = \"Meat/Poultry\", UnitPrice = 32.8000M, UnitsInStock = 0 },\n    new Product { ProductID = 54, ProductName = \"Tourtière\", Category = \"Meat/Poultry\", UnitPrice = 7.4500M, UnitsInStock = 21 },\n    new Product { ProductID = 55, ProductName = \"Pâté chinois\", Category = \"Meat/Poultry\", UnitPrice = 24.0000M, UnitsInStock = 115 },\n    new Product { ProductID = 56, ProductName = \"Gnocchi di nonna Alice\", Category = \"Grains/Cereals\", UnitPrice = 38.0000M, UnitsInStock = 21 },\n    new Product { ProductID = 57, ProductName = \"Ravioli Angelo\", Category = \"Grains/Cereals\", UnitPrice = 19.5000M, UnitsInStock = 36 },\n    new Product { ProductID = 58, ProductName = \"Escargots de Bourgogne\", Category = \"Seafood\", UnitPrice = 13.2500M, UnitsInStock = 62 },\n    new Product { ProductID = 59, ProductName = \"Raclette Courdavault\", Category = \"Dairy Products\", UnitPrice = 55.0000M, UnitsInStock = 79 },\n    new Product { ProductID = 60, ProductName = \"Camembert Pierrot\", Category = \"Dairy Products\", UnitPrice = 34.0000M, UnitsInStock = 19 },\n    new Product { ProductID = 61, ProductName = \"Sirop d'érable\", Category = \"Condiments\", UnitPrice = 28.5000M, UnitsInStock = 113 },\n    new Product { ProductID = 62, ProductName = \"Tarte au sucre\", Category = \"Confections\", UnitPrice = 49.3000M, UnitsInStock = 17 },\n    new Product { ProductID = 63, ProductName = \"Vegie-spread\", Category = \"Condiments\", UnitPrice = 43.9000M, UnitsInStock = 24 },\n    new Product { ProductID = 64, ProductName = \"Wimmers gute Semmelknödel\", Category = \"Grains/Cereals\", UnitPrice = 33.2500M, UnitsInStock = 22 },\n    new Product { ProductID = 65, ProductName = \"Louisiana Fiery Hot Pepper Sauce\", Category = \"Condiments\", UnitPrice = 21.0500M, UnitsInStock = 76 },\n    new Product { ProductID = 66, ProductName = \"Louisiana Hot Spiced Okra\", Category = \"Condiments\", UnitPrice = 17.0000M, UnitsInStock = 4 },\n    new Product { ProductID = 67, ProductName = \"Laughing Lumberjack Lager\", Category = \"Beverages\", UnitPrice = 14.0000M, UnitsInStock = 52 },\n    new Product { ProductID = 68, ProductName = \"Scottish Longbreads\", Category = \"Confections\", UnitPrice = 12.5000M, UnitsInStock = 6 },\n    new Product { ProductID = 69, ProductName = \"Gudbrandsdalsost\", Category = \"Dairy Products\", UnitPrice = 36.0000M, UnitsInStock = 26 },\n    new Product { ProductID = 70, ProductName = \"Outback Lager\", Category = \"Beverages\", UnitPrice = 15.0000M, UnitsInStock = 15 },\n    new Product { ProductID = 71, ProductName = \"Flotemysost\", Category = \"Dairy Products\", UnitPrice = 21.5000M, UnitsInStock = 26 },\n    new Product { ProductID = 72, ProductName = \"Mozzarella di Giovanni\", Category = \"Dairy Products\", UnitPrice = 34.8000M, UnitsInStock = 14 },\n    new Product { ProductID = 73, ProductName = \"Röd Kaviar\", Category = \"Seafood\", UnitPrice = 15.0000M, UnitsInStock = 101 },\n    new Product { ProductID = 74, ProductName = \"Longlife Tofu\", Category = \"Produce\", UnitPrice = 10.0000M, UnitsInStock = 4 },\n    new Product { ProductID = 75, ProductName = \"Rhönbräu Klosterbier\", Category = \"Beverages\", UnitPrice = 7.7500M, UnitsInStock = 125 },\n    new Product { ProductID = 76, ProductName = \"Lakkalikööri\", Category = \"Beverages\", UnitPrice = 18.0000M, UnitsInStock = 57 },\n    new Product { ProductID = 77, ProductName = \"Original Frankfurter grüne Soße\", Category = \"Condiments\", UnitPrice = 13.0000M, UnitsInStock = 32 }\n};\n\nList<Product> GetProductList() => productList;\n\n// Customer/Order data read into memory from XML file using XLinq:\n\nvar customerList = (\n    from e in XDocument.Load(\"Customers.xml\").\n              Root.Elements(\"customer\")\n    select new Customer\n    {\n        CustomerID = (string)e.Element(\"id\"),\n        CompanyName = (string)e.Element(\"name\"),\n        Address = (string)e.Element(\"address\"),\n        City = (string)e.Element(\"city\"),\n        Region = (string)e.Element(\"region\"),\n        PostalCode = (string)e.Element(\"postalcode\"),\n        Country = (string)e.Element(\"country\"),\n        Phone = (string)e.Element(\"phone\"),\n        Fax = (string)e.Element(\"fax\"),\n        Orders = (\n            from o in e.Elements(\"orders\").Elements(\"order\")\n            select new Order\n            {\n                OrderID = (int)o.Element(\"id\"),\n                OrderDate = (DateTime)o.Element(\"orderdate\"),\n                Total = (decimal)o.Element(\"total\")\n            })\n            .ToArray()\n    })\n    .ToList();\n\nList<Customer> GetCustomerList() => customerList;\n\npublic class Supplier\n{\n    public string SupplierName { get; set; }\n    public string Address { get; set; }\n    public string City { get; set; }\n    public string Country { get; set; }\n}\n\nvar supplierList = new List<Supplier>(){\n                    new Supplier {SupplierName = \"Exotic Liquids\", Address = \"49 Gilbert St.\", City = \"London\", Country = \"UK\"},\n                    new Supplier {SupplierName = \"New Orleans Cajun Delights\", Address = \"P.O. Box 78934\", City = \"New Orleans\", Country = \"USA\"},\n                    new Supplier {SupplierName = \"Grandma Kelly's Homestead\", Address = \"707 Oxford Rd.\", City = \"Ann Arbor\", Country = \"USA\"},\n                    new Supplier {SupplierName = \"Tokyo Traders\", Address = \"9-8 Sekimai Musashino-shi\", City = \"Tokyo\", Country = \"Japan\"},\n                    new Supplier {SupplierName = \"Cooperativa de Quesos 'Las Cabras'\", Address = \"Calle del Rosal 4\", City = \"Oviedo\", Country = \"Spain\"},\n                    new Supplier {SupplierName = \"Mayumi's\", Address = \"92 Setsuko Chuo-ku\", City = \"Osaka\", Country = \"Japan\"},\n                    new Supplier {SupplierName = \"Pavlova, Ltd.\", Address = \"74 Rose St. Moonie Ponds\", City = \"Melbourne\", Country = \"Australia\"},\n                    new Supplier {SupplierName = \"Specialty Biscuits, Ltd.\", Address = \"29 King's Way\", City = \"Manchester\", Country = \"UK\"},\n                    new Supplier {SupplierName = \"PB Knäckebröd AB\", Address = \"Kaloadagatan 13\", City = \"Göteborg\", Country = \"Sweden\"},\n                    new Supplier {SupplierName = \"Refrescos Americanas LTDA\", Address = \"Av. das Americanas 12.890\", City = \"Sao Paulo\", Country = \"Brazil\"},\n                    new Supplier {SupplierName = \"Heli Süßwaren GmbH & Co. KG\", Address = \"Tiergartenstraße 5\", City = \"Berlin\", Country = \"Germany\"},\n                    new Supplier {SupplierName = \"Plutzer Lebensmittelgroßmärkte AG\", Address = \"Bogenallee 51\", City = \"Frankfurt\", Country = \"Germany\"},\n                    new Supplier {SupplierName = \"Nord-Ost-Fisch Handelsgesellschaft mbH\", Address = \"Frahmredder 112a\", City = \"Cuxhaven\", Country = \"Germany\"},\n                    new Supplier {SupplierName = \"Formaggi Fortini s.r.l.\", Address = \"Viale Dante, 75\", City = \"Ravenna\", Country = \"Italy\"},\n                    new Supplier {SupplierName = \"Norske Meierier\", Address = \"Hatlevegen 5\", City = \"Sandvika\", Country = \"Norway\"},\n                    new Supplier {SupplierName = \"Bigfoot Breweries\", Address = \"3400 - 8th Avenue Suite 210\", City = \"Bend\", Country = \"USA\"},\n                    new Supplier {SupplierName = \"Svensk Sjöföda AB\", Address = \"Brovallavägen 231\", City = \"Stockholm\", Country = \"Sweden\"},\n                    new Supplier {SupplierName = \"Aux joyeux ecclésiastiques\", Address = \"203, Rue des Francs-Bourgeois\", City = \"Paris\", Country = \"France\"},\n                    new Supplier {SupplierName = \"New England Seafood Cannery\", Address = \"Order Processing Dept. 2100 Paul Revere Blvd.\", City = \"Boston\", Country = \"USA\"},\n                    new Supplier {SupplierName = \"Leka Trading\", Address = \"471 Serangoon Loop, Suite #402\", City = \"Singapore\", Country = \"Singapore\"},\n                    new Supplier {SupplierName = \"Lyngbysild\", Address = \"Lyngbysild Fiskebakken 10\", City = \"Lyngby\", Country = \"Denmark\"},\n                    new Supplier {SupplierName = \"Zaanse Snoepfabriek\", Address = \"Verkoop Rijnweg 22\", City = \"Zaandam\", Country = \"Netherlands\"},\n                    new Supplier {SupplierName = \"Karkki Oy\", Address = \"Valtakatu 12\", City = \"Lappeenranta\", Country = \"Finland\"},\n                    new Supplier {SupplierName = \"G'day, Mate\", Address = \"170 Prince Edward Parade Hunter's Hill\", City = \"Sydney\", Country = \"Australia\"},\n                    new Supplier {SupplierName = \"Ma Maison\", Address = \"2960 Rue St. Laurent\", City = \"Montréal\", Country = \"Canada\"},\n                    new Supplier {SupplierName = \"Pasta Buttini s.r.l.\", Address = \"Via dei Gelsomini, 153\", City = \"Salerno\", Country = \"Italy\"},\n                    new Supplier {SupplierName = \"Escargots Nouveaux\", Address = \"22, rue H. Voiron\", City = \"Montceau\", Country = \"France\"},\n                    new Supplier {SupplierName = \"Gai pâturage\", Address = \"Bat. B 3, rue des Alpes\", City = \"Annecy\", Country = \"France\"},\n                    new Supplier {SupplierName = \"Forêts d'érables\", Address = \"148 rue Chasseur\", City = \"Ste-Hyacinthe\", Country = \"Canada\"},\n                };\n\nList<Supplier> GetSupplierList() => supplierList;\n\n#region Projection\n\nvar testDS = TestHelper.CreateTestDataset();\n\ninternal class TestHelper\n    {\n\n        internal static IEnumerable<string> ZipToStrings<T,U>(IEnumerable<T> xs, IEnumerable<U> ys, Func<T,U,string> fn){\n            return xs.Zip(ys, fn);\n        }\n\n        internal static DataSet CreateTestDataset()\n        {\n            DataSet ds = new DataSet();\n\n            // Customers Table\n            ds.Tables.Add(CreateNumbersTable());\n            ds.Tables.Add(CreateLowNumbersTable());\n            ds.Tables.Add(CreateEmptyNumbersTable());\n            ds.Tables.Add(CreateProductList());\n            ds.Tables.Add(CreateDigitsTable());\n            ds.Tables.Add(CreateWordsTable());\n            ds.Tables.Add(CreateWords2Table());\n            ds.Tables.Add(CreateWords3Table());\n            ds.Tables.Add(CreateWords4Table());\n            ds.Tables.Add(CreateAnagramsTable());\n            ds.Tables.Add(CreateNumbersATable());\n            ds.Tables.Add(CreateNumbersBTable());\n            ds.Tables.Add(CreateFactorsOf300());\n            ds.Tables.Add(CreateDoublesTable());\n            ds.Tables.Add(CreateScoreRecordsTable());\n            ds.Tables.Add(CreateAttemptedWithdrawalsTable());\n            ds.Tables.Add(CreateEmployees1Table());\n            ds.Tables.Add(CreateEmployees2Table());\n\n            CreateCustomersAndOrdersTables(ds);\n\n            ds.AcceptChanges();\n            return ds;\n        }\n\n\n        private static DataTable CreateNumbersTable()\n        {\n\n            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n            DataTable table = new DataTable(\"Numbers\");\n            table.Columns.Add(\"number\", typeof(int));\n\n            foreach (int n in numbers)\n            {\n                table.Rows.Add(new object[] { n });\n            }\n\n            return table;\n        }\n\n        private static DataTable CreateEmptyNumbersTable()\n        {\n\n            DataTable table = new DataTable(\"EmptyNumbers\");\n            table.Columns.Add(\"number\", typeof(int));\n            return table;\n        }\n\n        private static DataTable CreateDigitsTable()\n        {\n\n            string[] digits = { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" };\n            DataTable table = new DataTable(\"Digits\");\n            table.Columns.Add(\"digit\", typeof(string));\n\n            foreach (string digit in digits)\n            {\n                table.Rows.Add(new object[] { digit });\n            }\n            return table;\n        }\n\n        private static DataTable CreateWordsTable()\n        {\n            string[] words = { \"aPPLE\", \"BlUeBeRrY\", \"cHeRry\" };\n            DataTable table = new DataTable(\"Words\");\n            table.Columns.Add(\"word\", typeof(string));\n\n            foreach (string word in words)\n            {\n                table.Rows.Add(new object[] { word });\n            }\n            return table;\n        }\n\n        private static DataTable CreateWords2Table()\n        {\n            string[] words = { \"believe\", \"relief\", \"receipt\", \"field\" };\n            DataTable table = new DataTable(\"Words2\");\n            table.Columns.Add(\"word\", typeof(string));\n\n            foreach (string word in words)\n            {\n                table.Rows.Add(new object[] { word });\n            }\n            return table;\n        }\n\n        private static DataTable CreateWords3Table()\n        {\n            string[] words = { \"aPPLE\", \"AbAcUs\", \"bRaNcH\", \"BlUeBeRrY\", \"ClOvEr\", \"cHeRry\" };\n            DataTable table = new DataTable(\"Words3\");\n            table.Columns.Add(\"word\", typeof(string));\n\n            foreach (string word in words)\n            {\n                table.Rows.Add(new object[] { word });\n            }\n            return table;\n        }\n\n        private static DataTable CreateWords4Table()\n        {\n            string[] words = { \"blueberry\", \"chimpanzee\", \"abacus\", \"banana\", \"apple\", \"cheese\" };\n            DataTable table = new DataTable(\"Words4\");\n            table.Columns.Add(\"word\", typeof(string));\n\n            foreach (string word in words)\n            {\n                table.Rows.Add(new object[] { word });\n            }\n            return table;\n        }\n\n        private static DataTable CreateAnagramsTable()\n        {\n            string[] anagrams = { \"from   \", \" salt\", \" earn \", \"  last   \", \" near \", \" form  \" };\n            DataTable table = new DataTable(\"Anagrams\");\n            table.Columns.Add(\"anagram\", typeof(string));\n\n            foreach (string word in anagrams)\n            {\n                table.Rows.Add(new object[] { word });\n            }\n            return table;\n        }\n\n        private static DataTable CreateScoreRecordsTable()\n        {\n            var scoreRecords = new[] { new {Name = \"Alice\", Score = 50},\n                                new {Name = \"Bob\"  , Score = 40},\n                                new {Name = \"Cathy\", Score = 45}\n                            };\n\n            DataTable table = new DataTable(\"ScoreRecords\");\n            table.Columns.Add(\"Name\", typeof(string));\n            table.Columns.Add(\"Score\", typeof(int));\n\n            foreach (var r in scoreRecords)\n            {\n                table.Rows.Add(new object[] { r.Name, r.Score });\n            }\n            return table;\n        }\n\n        private static DataTable CreateAttemptedWithdrawalsTable()\n        {\n            int[] attemptedWithdrawals = { 20, 10, 40, 50, 10, 70, 30 };\n\n            DataTable table = new DataTable(\"AttemptedWithdrawals\");\n            table.Columns.Add(\"withdrawal\", typeof(int));\n\n            foreach (var r in attemptedWithdrawals)\n            {\n                table.Rows.Add(new object[] { r });\n            }\n            return table;\n        }\n\n        private static DataTable CreateNumbersATable()\n        {\n            int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };\n            DataTable table = new DataTable(\"NumbersA\");\n            table.Columns.Add(\"number\", typeof(int));\n\n            foreach (int number in numbersA)\n            {\n                table.Rows.Add(new object[] { number });\n            }\n            return table;\n        }\n\n        private static DataTable CreateNumbersBTable()\n        {\n            int[] numbersB = { 1, 3, 5, 7, 8 };\n            DataTable table = new DataTable(\"NumbersB\");\n            table.Columns.Add(\"number\", typeof(int));\n\n            foreach (int number in numbersB)\n            {\n                table.Rows.Add(new object[] { number });\n            }\n            return table;\n        }\n\n        private static DataTable CreateLowNumbersTable()\n        {\n            int[] lowNumbers = { 1, 11, 3, 19, 41, 65, 19 };\n            DataTable table = new DataTable(\"LowNumbers\");\n            table.Columns.Add(\"number\", typeof(int));\n\n            foreach (int number in lowNumbers)\n            {\n                table.Rows.Add(new object[] { number });\n            }\n            return table;\n        }\n\n        private static DataTable CreateFactorsOf300()\n        {\n            int[] factorsOf300 = { 2, 2, 3, 5, 5 };\n\n            DataTable table = new DataTable(\"FactorsOf300\");\n            table.Columns.Add(\"factor\", typeof(int));\n\n            foreach (int factor in factorsOf300)\n            {\n                table.Rows.Add(new object[] { factor });\n            }\n            return table;\n        }\n\n        private static DataTable CreateDoublesTable()\n        {\n            double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };\n\n            DataTable table = new DataTable(\"Doubles\");\n            table.Columns.Add(\"double\", typeof(double));\n\n            foreach (double d in doubles)\n            {\n                table.Rows.Add(new object[] { d });\n            }\n            return table;\n        }\n\n        private static DataTable CreateEmployees1Table()\n        {\n\n            DataTable table = new DataTable(\"Employees1\");\n            table.Columns.Add(\"id\", typeof(int));\n            table.Columns.Add(\"name\", typeof(string));\n            table.Columns.Add(\"worklevel\", typeof(int));\n\n            table.Rows.Add(new object[] { 1, \"Jones\", 5 });\n            table.Rows.Add(new object[] { 2, \"Smith\", 5 });\n            table.Rows.Add(new object[] { 2, \"Smith\", 5 });\n            table.Rows.Add(new object[] { 3, \"Smith\", 6 });\n            table.Rows.Add(new object[] { 4, \"Arthur\", 11 });\n            table.Rows.Add(new object[] { 5, \"Arthur\", 12 });\n\n            return table;\n        }\n\n        private static DataTable CreateEmployees2Table()\n        {\n\n            DataTable table = new DataTable(\"Employees2\");\n            table.Columns.Add(\"id\", typeof(int));\n            table.Columns.Add(\"lastname\", typeof(string));\n            table.Columns.Add(\"level\", typeof(int));\n\n            table.Rows.Add(new object[] { 1, \"Jones\", 10 });\n            table.Rows.Add(new object[] { 2, \"Jagger\", 5 });\n            table.Rows.Add(new object[] { 3, \"Thomas\", 6 });\n            table.Rows.Add(new object[] { 4, \"Collins\", 11 });\n            table.Rows.Add(new object[] { 4, \"Collins\", 12 });\n            table.Rows.Add(new object[] { 5, \"Arthur\", 12 });\n\n            return table;\n        }\n\n        private static void CreateCustomersAndOrdersTables(DataSet ds)\n        {\n\n            DataTable customers = new DataTable(\"Customers\");\n            customers.Columns.Add(\"CustomerID\", typeof(string));\n            customers.Columns.Add(\"CompanyName\", typeof(string));\n            customers.Columns.Add(\"Address\", typeof(string));\n            customers.Columns.Add(\"City\", typeof(string));\n            customers.Columns.Add(\"Region\", typeof(string));\n            customers.Columns.Add(\"PostalCode\", typeof(string));\n            customers.Columns.Add(\"Country\", typeof(string));\n            customers.Columns.Add(\"Phone\", typeof(string));\n            customers.Columns.Add(\"Fax\", typeof(string));\n\n            ds.Tables.Add(customers);\n\n            DataTable orders = new DataTable(\"Orders\");\n\n            orders.Columns.Add(\"OrderID\", typeof(int));\n            orders.Columns.Add(\"CustomerID\", typeof(string));\n            orders.Columns.Add(\"OrderDate\", typeof(DateTime));\n            orders.Columns.Add(\"Total\", typeof(decimal));\n\n            ds.Tables.Add(orders);\n\n            DataRelation co = new DataRelation(\"CustomersOrders\", customers.Columns[\"CustomerID\"], orders.Columns[\"CustomerID\"], true);\n            ds.Relations.Add(co);\n\n            var customerList = (\n                from e in XDocument.Load(\"customers.xml\").\n                          Root.Elements(\"customer\")\n                select new Customer\n                {\n                    CustomerID = (string)e.Element(\"id\"),\n                    CompanyName = (string)e.Element(\"name\"),\n                    Address = (string)e.Element(\"address\"),\n                    City = (string)e.Element(\"city\"),\n                    Region = (string)e.Element(\"region\"),\n                    PostalCode = (string)e.Element(\"postalcode\"),\n                    Country = (string)e.Element(\"country\"),\n                    Phone = (string)e.Element(\"phone\"),\n                    Fax = (string)e.Element(\"fax\"),\n                    Orders = (\n                        from o in e.Elements(\"orders\").Elements(\"order\")\n                        select new Order\n                        {\n                            OrderID = (int)o.Element(\"id\"),\n                            OrderDate = (DateTime)o.Element(\"orderdate\"),\n                            Total = (decimal)o.Element(\"total\")\n                        })\n                        .ToArray()\n                }\n                ).ToList();\n\n            foreach (Customer cust in customerList)\n            {\n                customers.Rows.Add(new object[] {cust.CustomerID, cust.CompanyName, cust.Address, cust.City, cust.Region,\n                                                cust.PostalCode, cust.Country, cust.Phone, cust.Fax});\n                foreach (Order order in cust.Orders)\n                {\n                    orders.Rows.Add(new object[] { order.OrderID, cust.CustomerID, order.OrderDate, order.Total });\n                }\n            }\n        }\n\n        private static DataTable CreateProductList()\n        {\n\n            DataTable table = new DataTable(\"Products\");\n            table.Columns.Add(\"ProductID\", typeof(int));\n            table.Columns.Add(\"ProductName\", typeof(string));\n            table.Columns.Add(\"Category\", typeof(string));\n            table.Columns.Add(\"UnitPrice\", typeof(decimal));\n            table.Columns.Add(\"UnitsInStock\", typeof(int));\n\n            var productList = new[] {\n              new { ProductID = 1, ProductName = \"Chai\", Category = \"Beverages\", \n                UnitPrice = 18.0000M, UnitsInStock = 39 },\n              new { ProductID = 2, ProductName = \"Chang\", Category = \"Beverages\", \n                UnitPrice = 19.0000M, UnitsInStock = 17 },\n              new { ProductID = 3, ProductName = \"Aniseed Syrup\", Category = \"Condiments\", \n                UnitPrice = 10.0000M, UnitsInStock = 13 },\n              new { ProductID = 4, ProductName = \"Chef Anton's Cajun Seasoning\", Category = \"Condiments\", \n                UnitPrice = 22.0000M, UnitsInStock = 53 },\n              new { ProductID = 5, ProductName = \"Chef Anton's Gumbo Mix\", Category = \"Condiments\", \n                UnitPrice = 21.3500M, UnitsInStock = 0 },\n              new { ProductID = 6, ProductName = \"Grandma's Boysenberry Spread\", Category = \"Condiments\", \n                UnitPrice = 25.0000M, UnitsInStock = 120 },\n              new { ProductID = 7, ProductName = \"Uncle Bob's Organic Dried Pears\", Category = \"Produce\", \n                UnitPrice = 30.0000M, UnitsInStock = 15 },\n              new { ProductID = 8, ProductName = \"Northwoods Cranberry Sauce\", Category = \"Condiments\", \n                UnitPrice = 40.0000M, UnitsInStock = 6 },\n              new { ProductID = 9, ProductName = \"Mishi Kobe Niku\", Category = \"Meat/Poultry\", \n                UnitPrice = 97.0000M, UnitsInStock = 29 },\n              new { ProductID = 10, ProductName = \"Ikura\", Category = \"Seafood\", \n                UnitPrice = 31.0000M, UnitsInStock = 31 },\n              new { ProductID = 11, ProductName = \"Queso Cabrales\", Category = \"Dairy Products\", \n                UnitPrice = 21.0000M, UnitsInStock = 22 },\n              new { ProductID = 12, ProductName = \"Queso Manchego La Pastora\", Category = \"Dairy Products\", \n                UnitPrice = 38.0000M, UnitsInStock = 86 },\n              new { ProductID = 13, ProductName = \"Konbu\", Category = \"Seafood\", \n                UnitPrice = 6.0000M, UnitsInStock = 24 },\n              new { ProductID = 14, ProductName = \"Tofu\", Category = \"Produce\", \n                UnitPrice = 23.2500M, UnitsInStock = 35 },\n              new { ProductID = 15, ProductName = \"Genen Shouyu\", Category = \"Condiments\", \n                UnitPrice = 15.5000M, UnitsInStock = 39 },\n              new { ProductID = 16, ProductName = \"Pavlova\", Category = \"Confections\", \n                UnitPrice = 17.4500M, UnitsInStock = 29 },\n              new { ProductID = 17, ProductName = \"Alice Mutton\", Category = \"Meat/Poultry\", \n                UnitPrice = 39.0000M, UnitsInStock = 0 },\n              new { ProductID = 18, ProductName = \"Carnarvon Tigers\", Category = \"Seafood\", \n                UnitPrice = 62.5000M, UnitsInStock = 42 },\n              new { ProductID = 19, ProductName = \"Teatime Chocolate Biscuits\", Category = \"Confections\", \n                UnitPrice = 9.2000M, UnitsInStock = 25 },\n              new { ProductID = 20, ProductName = \"Sir Rodney's Marmalade\", Category = \"Confections\", \n                UnitPrice = 81.0000M, UnitsInStock = 40 },\n              new { ProductID = 21, ProductName = \"Sir Rodney's Scones\", Category = \"Confections\", \n                UnitPrice = 10.0000M, UnitsInStock = 3 },\n              new { ProductID = 22, ProductName = \"Gustaf's Knäckebröd\", Category = \"Grains/Cereals\", \n                UnitPrice = 21.0000M, UnitsInStock = 104 },\n              new { ProductID = 23, ProductName = \"Tunnbröd\", Category = \"Grains/Cereals\", \n                UnitPrice = 9.0000M, UnitsInStock = 61 },\n              new { ProductID = 24, ProductName = \"Guaraná Fantástica\", Category = \"Beverages\", \n                UnitPrice = 4.5000M, UnitsInStock = 20 },\n              new { ProductID = 25, ProductName = \"NuNuCa Nuß-Nougat-Creme\", Category = \"Confections\", \n                UnitPrice = 14.0000M, UnitsInStock = 76 },\n              new { ProductID = 26, ProductName = \"Gumbär Gummibärchen\", Category = \"Confections\", \n                UnitPrice = 31.2300M, UnitsInStock = 15 },\n              new { ProductID = 27, ProductName = \"Schoggi Schokolade\", Category = \"Confections\", \n                UnitPrice = 43.9000M, UnitsInStock = 49 },\n              new { ProductID = 28, ProductName = \"Rössle Sauerkraut\", Category = \"Produce\", \n                UnitPrice = 45.6000M, UnitsInStock = 26 },\n              new { ProductID = 29, ProductName = \"Thüringer Rostbratwurst\", Category = \"Meat/Poultry\", \n                UnitPrice = 123.7900M, UnitsInStock = 0 },\n              new { ProductID = 30, ProductName = \"Nord-Ost Matjeshering\", Category = \"Seafood\", \n                UnitPrice = 25.8900M, UnitsInStock = 10 },\n              new { ProductID = 31, ProductName = \"Gorgonzola Telino\", Category = \"Dairy Products\", \n                UnitPrice = 12.5000M, UnitsInStock = 0 },\n              new { ProductID = 32, ProductName = \"Mascarpone Fabioli\", Category = \"Dairy Products\", \n                UnitPrice = 32.0000M, UnitsInStock = 9 },\n              new { ProductID = 33, ProductName = \"Geitost\", Category = \"Dairy Products\", \n                UnitPrice = 2.5000M, UnitsInStock = 112 },\n              new { ProductID = 34, ProductName = \"Sasquatch Ale\", Category = \"Beverages\", \n                UnitPrice = 14.0000M, UnitsInStock = 111 },\n              new { ProductID = 35, ProductName = \"Steeleye Stout\", Category = \"Beverages\", \n                UnitPrice = 18.0000M, UnitsInStock = 20 },\n              new { ProductID = 36, ProductName = \"Inlagd Sill\", Category = \"Seafood\", \n                UnitPrice = 19.0000M, UnitsInStock = 112 },\n              new { ProductID = 37, ProductName = \"Gravad lax\", Category = \"Seafood\", \n                UnitPrice = 26.0000M, UnitsInStock = 11 },\n              new { ProductID = 38, ProductName = \"Côte de Blaye\", Category = \"Beverages\", \n                UnitPrice = 263.5000M, UnitsInStock = 17 },\n              new { ProductID = 39, ProductName = \"Chartreuse verte\", Category = \"Beverages\", \n                UnitPrice = 18.0000M, UnitsInStock = 69 },\n              new { ProductID = 40, ProductName = \"Boston Crab Meat\", Category = \"Seafood\", \n                UnitPrice = 18.4000M, UnitsInStock = 123 },\n              new { ProductID = 41, ProductName = \"Jack's New England Clam Chowder\", Category = \"Seafood\", \n                UnitPrice = 9.6500M, UnitsInStock = 85 },\n              new { ProductID = 42, ProductName = \"Singaporean Hokkien Fried Mee\", Category = \"Grains/Cereals\", \n                UnitPrice = 14.0000M, UnitsInStock = 26 },\n              new { ProductID = 43, ProductName = \"Ipoh Coffee\", Category = \"Beverages\", \n                UnitPrice = 46.0000M, UnitsInStock = 17 },\n              new { ProductID = 44, ProductName = \"Gula Malacca\", Category = \"Condiments\", \n                UnitPrice = 19.4500M, UnitsInStock = 27 },\n              new { ProductID = 45, ProductName = \"Rogede sild\", Category = \"Seafood\", \n                UnitPrice = 9.5000M, UnitsInStock = 5 },\n              new { ProductID = 46, ProductName = \"Spegesild\", Category = \"Seafood\", \n                UnitPrice = 12.0000M, UnitsInStock = 95 },\n              new { ProductID = 47, ProductName = \"Zaanse koeken\", Category = \"Confections\", \n                UnitPrice = 9.5000M, UnitsInStock = 36 },\n              new { ProductID = 48, ProductName = \"Chocolade\", Category = \"Confections\", \n                UnitPrice = 12.7500M, UnitsInStock = 15 },\n              new { ProductID = 49, ProductName = \"Maxilaku\", Category = \"Confections\", \n                UnitPrice = 20.0000M, UnitsInStock = 10 },\n              new { ProductID = 50, ProductName = \"Valkoinen suklaa\", Category = \"Confections\", \n                UnitPrice = 16.2500M, UnitsInStock = 65 },\n              new { ProductID = 51, ProductName = \"Manjimup Dried Apples\", Category = \"Produce\", \n                UnitPrice = 53.0000M, UnitsInStock = 20 },\n              new { ProductID = 52, ProductName = \"Filo Mix\", Category = \"Grains/Cereals\", \n                UnitPrice = 7.0000M, UnitsInStock = 38 },\n              new { ProductID = 53, ProductName = \"Perth Pasties\", Category = \"Meat/Poultry\", \n                UnitPrice = 32.8000M, UnitsInStock = 0 },\n              new { ProductID = 54, ProductName = \"Tourtière\", Category = \"Meat/Poultry\", \n                UnitPrice = 7.4500M, UnitsInStock = 21 },\n              new { ProductID = 55, ProductName = \"Pâté chinois\", Category = \"Meat/Poultry\", \n                UnitPrice = 24.0000M, UnitsInStock = 115 },\n              new { ProductID = 56, ProductName = \"Gnocchi di nonna Alice\", Category = \"Grains/Cereals\", \n                UnitPrice = 38.0000M, UnitsInStock = 21 },\n              new { ProductID = 57, ProductName = \"Ravioli Angelo\", Category = \"Grains/Cereals\", \n                UnitPrice = 19.5000M, UnitsInStock = 36 },\n              new { ProductID = 58, ProductName = \"Escargots de Bourgogne\", Category = \"Seafood\", \n                UnitPrice = 13.2500M, UnitsInStock = 62 },\n              new { ProductID = 59, ProductName = \"Raclette Courdavault\", Category = \"Dairy Products\", \n                UnitPrice = 55.0000M, UnitsInStock = 79 },\n              new { ProductID = 60, ProductName = \"Camembert Pierrot\", Category = \"Dairy Products\", \n                UnitPrice = 34.0000M, UnitsInStock = 19 },\n              new { ProductID = 61, ProductName = \"Sirop d'érable\", Category = \"Condiments\", \n                UnitPrice = 28.5000M, UnitsInStock = 113 },\n              new { ProductID = 62, ProductName = \"Tarte au sucre\", Category = \"Confections\", \n                UnitPrice = 49.3000M, UnitsInStock = 17 },\n              new { ProductID = 63, ProductName = \"Vegie-spread\", Category = \"Condiments\", \n                UnitPrice = 43.9000M, UnitsInStock = 24 },\n              new { ProductID = 64, ProductName = \"Wimmers gute Semmelknödel\", Category = \"Grains/Cereals\", \n                UnitPrice = 33.2500M, UnitsInStock = 22 },\n              new { ProductID = 65, ProductName = \"Louisiana Fiery Hot Pepper Sauce\", Category = \"Condiments\", \n                UnitPrice = 21.0500M, UnitsInStock = 76 },\n              new { ProductID = 66, ProductName = \"Louisiana Hot Spiced Okra\", Category = \"Condiments\", \n                UnitPrice = 17.0000M, UnitsInStock = 4 },\n              new { ProductID = 67, ProductName = \"Laughing Lumberjack Lager\", Category = \"Beverages\", \n                UnitPrice = 14.0000M, UnitsInStock = 52 },\n              new { ProductID = 68, ProductName = \"Scottish Longbreads\", Category = \"Confections\", \n                UnitPrice = 12.5000M, UnitsInStock = 6 },\n              new { ProductID = 69, ProductName = \"Gudbrandsdalsost\", Category = \"Dairy Products\", \n                UnitPrice = 36.0000M, UnitsInStock = 26 },\n              new { ProductID = 70, ProductName = \"Outback Lager\", Category = \"Beverages\", \n                UnitPrice = 15.0000M, UnitsInStock = 15 },\n              new { ProductID = 71, ProductName = \"Flotemysost\", Category = \"Dairy Products\", \n                UnitPrice = 21.5000M, UnitsInStock = 26 },\n              new { ProductID = 72, ProductName = \"Mozzarella di Giovanni\", Category = \"Dairy Products\", \n                UnitPrice = 34.8000M, UnitsInStock = 14 },\n              new { ProductID = 73, ProductName = \"Röd Kaviar\", Category = \"Seafood\", \n                UnitPrice = 15.0000M, UnitsInStock = 101 },\n              new { ProductID = 74, ProductName = \"Longlife Tofu\", Category = \"Produce\", \n                UnitPrice = 10.0000M, UnitsInStock = 4 },\n              new { ProductID = 75, ProductName = \"Rhönbräu Klosterbier\", Category = \"Beverages\", \n                UnitPrice = 7.7500M, UnitsInStock = 125 },\n              new { ProductID = 76, ProductName = \"Lakkalikööri\", Category = \"Beverages\", \n                UnitPrice = 18.0000M, UnitsInStock = 57 },\n              new { ProductID = 77, ProductName = \"Original Frankfurter grüne Soße\", Category = \"Condiments\", \n                UnitPrice = 13.0000M, UnitsInStock = 32 }\n            };\n\n            foreach (var x in productList)\n            {\n                table.Rows.Add(new object[] { x.ProductID, x.ProductName, x.Category, x.UnitPrice, x.UnitsInStock });\n            }\n\n            return table;\n        }\n    }\n\n#endregion\n"
  },
  {
    "path": "csharp/linq/101-linq-examples.workbook/Customers.xml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<customers>\r\n  <customer>\r\n    <id>ALFKI</id>\r\n    <name>Alfreds Futterkiste</name>\r\n    <address>Obere Str. 57</address>\r\n    <city>Berlin</city>\r\n    <postalcode>12209</postalcode>\r\n    <country>Germany</country>\r\n    <phone>030-0074321</phone>\r\n    <fax>030-0076545</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10643</id>\r\n        <orderdate>1997-08-25T00:00:00</orderdate>\r\n        <total>814.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10692</id>\r\n        <orderdate>1997-10-03T00:00:00</orderdate>\r\n        <total>878.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10702</id>\r\n        <orderdate>1997-10-13T00:00:00</orderdate>\r\n        <total>330.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10835</id>\r\n        <orderdate>1998-01-15T00:00:00</orderdate>\r\n        <total>845.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10952</id>\r\n        <orderdate>1998-03-16T00:00:00</orderdate>\r\n        <total>471.20</total>\r\n      </order>\r\n      <order>\r\n        <id>11011</id>\r\n        <orderdate>1998-04-09T00:00:00</orderdate>\r\n        <total>933.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>ANATR</id>\r\n    <name>Ana Trujillo Emparedados y helados</name>\r\n    <address>Avda. de la Constitución 2222</address>\r\n    <city>México D.F.</city>\r\n    <postalcode>05021</postalcode>\r\n    <country>Mexico</country>\r\n    <phone>(5) 555-4729</phone>\r\n    <fax>(5) 555-3745</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10308</id>\r\n        <orderdate>1996-09-18T00:00:00</orderdate>\r\n        <total>88.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10625</id>\r\n        <orderdate>1997-08-08T00:00:00</orderdate>\r\n        <total>479.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10759</id>\r\n        <orderdate>1997-11-28T00:00:00</orderdate>\r\n        <total>320.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10926</id>\r\n        <orderdate>1998-03-04T00:00:00</orderdate>\r\n        <total>514.40</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>ANTON</id>\r\n    <name>Antonio Moreno Taquería</name>\r\n    <address>Mataderos  2312</address>\r\n    <city>México D.F.</city>\r\n    <postalcode>05023</postalcode>\r\n    <country>Mexico</country>\r\n    <phone>(5) 555-3932</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10365</id>\r\n        <orderdate>1996-11-27T00:00:00</orderdate>\r\n        <total>403.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10507</id>\r\n        <orderdate>1997-04-15T00:00:00</orderdate>\r\n        <total>749.06</total>\r\n      </order>\r\n      <order>\r\n        <id>10535</id>\r\n        <orderdate>1997-05-13T00:00:00</orderdate>\r\n        <total>1940.85</total>\r\n      </order>\r\n      <order>\r\n        <id>10573</id>\r\n        <orderdate>1997-06-19T00:00:00</orderdate>\r\n        <total>2082.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10677</id>\r\n        <orderdate>1997-09-22T00:00:00</orderdate>\r\n        <total>813.36</total>\r\n      </order>\r\n      <order>\r\n        <id>10682</id>\r\n        <orderdate>1997-09-25T00:00:00</orderdate>\r\n        <total>375.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10856</id>\r\n        <orderdate>1998-01-28T00:00:00</orderdate>\r\n        <total>660.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>AROUT</id>\r\n    <name>Around the Horn</name>\r\n    <address>120 Hanover Sq.</address>\r\n    <city>London</city>\r\n    <postalcode>WA1 1DP</postalcode>\r\n    <country>UK</country>\r\n    <phone>(171) 555-7788</phone>\r\n    <fax>(171) 555-6750</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10355</id>\r\n        <orderdate>1996-11-15T00:00:00</orderdate>\r\n        <total>480.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10383</id>\r\n        <orderdate>1996-12-16T00:00:00</orderdate>\r\n        <total>899.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10453</id>\r\n        <orderdate>1997-02-21T00:00:00</orderdate>\r\n        <total>407.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10558</id>\r\n        <orderdate>1997-06-04T00:00:00</orderdate>\r\n        <total>2142.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10707</id>\r\n        <orderdate>1997-10-16T00:00:00</orderdate>\r\n        <total>1641.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10741</id>\r\n        <orderdate>1997-11-14T00:00:00</orderdate>\r\n        <total>228.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10743</id>\r\n        <orderdate>1997-11-17T00:00:00</orderdate>\r\n        <total>319.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10768</id>\r\n        <orderdate>1997-12-08T00:00:00</orderdate>\r\n        <total>1477.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10793</id>\r\n        <orderdate>1997-12-24T00:00:00</orderdate>\r\n        <total>191.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10864</id>\r\n        <orderdate>1998-02-02T00:00:00</orderdate>\r\n        <total>282.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10920</id>\r\n        <orderdate>1998-03-03T00:00:00</orderdate>\r\n        <total>390.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10953</id>\r\n        <orderdate>1998-03-16T00:00:00</orderdate>\r\n        <total>4441.25</total>\r\n      </order>\r\n      <order>\r\n        <id>11016</id>\r\n        <orderdate>1998-04-10T00:00:00</orderdate>\r\n        <total>491.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>BERGS</id>\r\n    <name>Berglunds snabbköp</name>\r\n    <address>Berguvsvägen  8</address>\r\n    <city>Luleå</city>\r\n    <postalcode>S-958 22</postalcode>\r\n    <country>Sweden</country>\r\n    <phone>0921-12 34 65</phone>\r\n    <fax>0921-12 34 67</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10278</id>\r\n        <orderdate>1996-08-12T00:00:00</orderdate>\r\n        <total>1488.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10280</id>\r\n        <orderdate>1996-08-14T00:00:00</orderdate>\r\n        <total>613.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10384</id>\r\n        <orderdate>1996-12-16T00:00:00</orderdate>\r\n        <total>2222.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10444</id>\r\n        <orderdate>1997-02-12T00:00:00</orderdate>\r\n        <total>1031.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10445</id>\r\n        <orderdate>1997-02-13T00:00:00</orderdate>\r\n        <total>174.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10524</id>\r\n        <orderdate>1997-05-01T00:00:00</orderdate>\r\n        <total>3192.65</total>\r\n      </order>\r\n      <order>\r\n        <id>10572</id>\r\n        <orderdate>1997-06-18T00:00:00</orderdate>\r\n        <total>1501.08</total>\r\n      </order>\r\n      <order>\r\n        <id>10626</id>\r\n        <orderdate>1997-08-11T00:00:00</orderdate>\r\n        <total>1503.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10654</id>\r\n        <orderdate>1997-09-02T00:00:00</orderdate>\r\n        <total>601.83</total>\r\n      </order>\r\n      <order>\r\n        <id>10672</id>\r\n        <orderdate>1997-09-17T00:00:00</orderdate>\r\n        <total>3815.25</total>\r\n      </order>\r\n      <order>\r\n        <id>10689</id>\r\n        <orderdate>1997-10-01T00:00:00</orderdate>\r\n        <total>472.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10733</id>\r\n        <orderdate>1997-11-07T00:00:00</orderdate>\r\n        <total>1459.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10778</id>\r\n        <orderdate>1997-12-16T00:00:00</orderdate>\r\n        <total>96.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10837</id>\r\n        <orderdate>1998-01-16T00:00:00</orderdate>\r\n        <total>1064.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10857</id>\r\n        <orderdate>1998-01-28T00:00:00</orderdate>\r\n        <total>2048.21</total>\r\n      </order>\r\n      <order>\r\n        <id>10866</id>\r\n        <orderdate>1998-02-03T00:00:00</orderdate>\r\n        <total>1096.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10875</id>\r\n        <orderdate>1998-02-06T00:00:00</orderdate>\r\n        <total>709.55</total>\r\n      </order>\r\n      <order>\r\n        <id>10924</id>\r\n        <orderdate>1998-03-04T00:00:00</orderdate>\r\n        <total>1835.70</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>BLAUS</id>\r\n    <name>Blauer See Delikatessen</name>\r\n    <address>Forsterstr. 57</address>\r\n    <city>Mannheim</city>\r\n    <postalcode>68306</postalcode>\r\n    <country>Germany</country>\r\n    <phone>0621-08460</phone>\r\n    <fax>0621-08924</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10501</id>\r\n        <orderdate>1997-04-09T00:00:00</orderdate>\r\n        <total>149.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10509</id>\r\n        <orderdate>1997-04-17T00:00:00</orderdate>\r\n        <total>136.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10582</id>\r\n        <orderdate>1997-06-27T00:00:00</orderdate>\r\n        <total>330.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10614</id>\r\n        <orderdate>1997-07-29T00:00:00</orderdate>\r\n        <total>464.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10853</id>\r\n        <orderdate>1998-01-27T00:00:00</orderdate>\r\n        <total>625.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10956</id>\r\n        <orderdate>1998-03-17T00:00:00</orderdate>\r\n        <total>677.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11058</id>\r\n        <orderdate>1998-04-29T00:00:00</orderdate>\r\n        <total>858.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>BLONP</id>\r\n    <name>Blondel père et fils</name>\r\n    <address>24, place Kléber</address>\r\n    <city>Strasbourg</city>\r\n    <postalcode>67000</postalcode>\r\n    <country>France</country>\r\n    <phone>88.60.15.31</phone>\r\n    <fax>88.60.15.32</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10265</id>\r\n        <orderdate>1996-07-25T00:00:00</orderdate>\r\n        <total>1176.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10297</id>\r\n        <orderdate>1996-09-04T00:00:00</orderdate>\r\n        <total>1420.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10360</id>\r\n        <orderdate>1996-11-22T00:00:00</orderdate>\r\n        <total>7390.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10436</id>\r\n        <orderdate>1997-02-05T00:00:00</orderdate>\r\n        <total>1994.52</total>\r\n      </order>\r\n      <order>\r\n        <id>10449</id>\r\n        <orderdate>1997-02-18T00:00:00</orderdate>\r\n        <total>1838.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10559</id>\r\n        <orderdate>1997-06-05T00:00:00</orderdate>\r\n        <total>520.41</total>\r\n      </order>\r\n      <order>\r\n        <id>10566</id>\r\n        <orderdate>1997-06-12T00:00:00</orderdate>\r\n        <total>1761.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10584</id>\r\n        <orderdate>1997-06-30T00:00:00</orderdate>\r\n        <total>593.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10628</id>\r\n        <orderdate>1997-08-12T00:00:00</orderdate>\r\n        <total>450.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10679</id>\r\n        <orderdate>1997-09-23T00:00:00</orderdate>\r\n        <total>660.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10826</id>\r\n        <orderdate>1998-01-12T00:00:00</orderdate>\r\n        <total>730.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>BOLID</id>\r\n    <name>Bólido Comidas preparadas</name>\r\n    <address>C/ Araquil, 67</address>\r\n    <city>Madrid</city>\r\n    <postalcode>28023</postalcode>\r\n    <country>Spain</country>\r\n    <phone>(91) 555 22 82</phone>\r\n    <fax>(91) 555 91 99</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10326</id>\r\n        <orderdate>1996-10-10T00:00:00</orderdate>\r\n        <total>982.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10801</id>\r\n        <orderdate>1997-12-29T00:00:00</orderdate>\r\n        <total>3026.85</total>\r\n      </order>\r\n      <order>\r\n        <id>10970</id>\r\n        <orderdate>1998-03-24T00:00:00</orderdate>\r\n        <total>224.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>BONAP</id>\r\n    <name>Bon app'</name>\r\n    <address>12, rue des Bouchers</address>\r\n    <city>Marseille</city>\r\n    <postalcode>13008</postalcode>\r\n    <country>France</country>\r\n    <phone>91.24.45.40</phone>\r\n    <fax>91.24.45.41</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10331</id>\r\n        <orderdate>1996-10-16T00:00:00</orderdate>\r\n        <total>88.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10340</id>\r\n        <orderdate>1996-10-29T00:00:00</orderdate>\r\n        <total>2436.18</total>\r\n      </order>\r\n      <order>\r\n        <id>10362</id>\r\n        <orderdate>1996-11-25T00:00:00</orderdate>\r\n        <total>1549.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10470</id>\r\n        <orderdate>1997-03-11T00:00:00</orderdate>\r\n        <total>1820.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10511</id>\r\n        <orderdate>1997-04-18T00:00:00</orderdate>\r\n        <total>2550.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10525</id>\r\n        <orderdate>1997-05-02T00:00:00</orderdate>\r\n        <total>818.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10663</id>\r\n        <orderdate>1997-09-10T00:00:00</orderdate>\r\n        <total>1930.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10715</id>\r\n        <orderdate>1997-10-23T00:00:00</orderdate>\r\n        <total>1296.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10730</id>\r\n        <orderdate>1997-11-05T00:00:00</orderdate>\r\n        <total>484.26</total>\r\n      </order>\r\n      <order>\r\n        <id>10732</id>\r\n        <orderdate>1997-11-06T00:00:00</orderdate>\r\n        <total>360.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10755</id>\r\n        <orderdate>1997-11-26T00:00:00</orderdate>\r\n        <total>1948.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10827</id>\r\n        <orderdate>1998-01-12T00:00:00</orderdate>\r\n        <total>843.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10871</id>\r\n        <orderdate>1998-02-05T00:00:00</orderdate>\r\n        <total>1979.23</total>\r\n      </order>\r\n      <order>\r\n        <id>10876</id>\r\n        <orderdate>1998-02-09T00:00:00</orderdate>\r\n        <total>917.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10932</id>\r\n        <orderdate>1998-03-06T00:00:00</orderdate>\r\n        <total>1788.63</total>\r\n      </order>\r\n      <order>\r\n        <id>10940</id>\r\n        <orderdate>1998-03-11T00:00:00</orderdate>\r\n        <total>360.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11076</id>\r\n        <orderdate>1998-05-06T00:00:00</orderdate>\r\n        <total>792.75</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>BOTTM</id>\r\n    <name>Bottom-Dollar Markets</name>\r\n    <address>23 Tsawassen Blvd.</address>\r\n    <city>Tsawassen</city>\r\n    <region>BC</region>\r\n    <postalcode>T2F 8M4</postalcode>\r\n    <country>Canada</country>\r\n    <phone>(604) 555-4729</phone>\r\n    <fax>(604) 555-3745</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10389</id>\r\n        <orderdate>1996-12-20T00:00:00</orderdate>\r\n        <total>1832.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10410</id>\r\n        <orderdate>1997-01-10T00:00:00</orderdate>\r\n        <total>802.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10411</id>\r\n        <orderdate>1997-01-10T00:00:00</orderdate>\r\n        <total>966.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10431</id>\r\n        <orderdate>1997-01-30T00:00:00</orderdate>\r\n        <total>1892.25</total>\r\n      </order>\r\n      <order>\r\n        <id>10492</id>\r\n        <orderdate>1997-04-01T00:00:00</orderdate>\r\n        <total>851.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10742</id>\r\n        <orderdate>1997-11-14T00:00:00</orderdate>\r\n        <total>3118.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10918</id>\r\n        <orderdate>1998-03-02T00:00:00</orderdate>\r\n        <total>1447.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10944</id>\r\n        <orderdate>1998-03-12T00:00:00</orderdate>\r\n        <total>1025.32</total>\r\n      </order>\r\n      <order>\r\n        <id>10949</id>\r\n        <orderdate>1998-03-13T00:00:00</orderdate>\r\n        <total>4422.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10975</id>\r\n        <orderdate>1998-03-25T00:00:00</orderdate>\r\n        <total>717.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10982</id>\r\n        <orderdate>1998-03-27T00:00:00</orderdate>\r\n        <total>1014.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11027</id>\r\n        <orderdate>1998-04-16T00:00:00</orderdate>\r\n        <total>877.72</total>\r\n      </order>\r\n      <order>\r\n        <id>11045</id>\r\n        <orderdate>1998-04-23T00:00:00</orderdate>\r\n        <total>1309.50</total>\r\n      </order>\r\n      <order>\r\n        <id>11048</id>\r\n        <orderdate>1998-04-24T00:00:00</orderdate>\r\n        <total>525.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>BSBEV</id>\r\n    <name>B's Beverages</name>\r\n    <address>Fauntleroy Circus</address>\r\n    <city>London</city>\r\n    <postalcode>EC2 5NT</postalcode>\r\n    <country>UK</country>\r\n    <phone>(171) 555-1212</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10289</id>\r\n        <orderdate>1996-08-26T00:00:00</orderdate>\r\n        <total>479.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10471</id>\r\n        <orderdate>1997-03-11T00:00:00</orderdate>\r\n        <total>1328.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10484</id>\r\n        <orderdate>1997-03-24T00:00:00</orderdate>\r\n        <total>386.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10538</id>\r\n        <orderdate>1997-05-15T00:00:00</orderdate>\r\n        <total>139.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10539</id>\r\n        <orderdate>1997-05-16T00:00:00</orderdate>\r\n        <total>355.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10578</id>\r\n        <orderdate>1997-06-24T00:00:00</orderdate>\r\n        <total>477.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10599</id>\r\n        <orderdate>1997-07-15T00:00:00</orderdate>\r\n        <total>493.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10943</id>\r\n        <orderdate>1998-03-11T00:00:00</orderdate>\r\n        <total>711.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10947</id>\r\n        <orderdate>1998-03-13T00:00:00</orderdate>\r\n        <total>220.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11023</id>\r\n        <orderdate>1998-04-14T00:00:00</orderdate>\r\n        <total>1500.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>CACTU</id>\r\n    <name>Cactus Comidas para llevar</name>\r\n    <address>Cerrito 333</address>\r\n    <city>Buenos Aires</city>\r\n    <postalcode>1010</postalcode>\r\n    <country>Argentina</country>\r\n    <phone>(1) 135-5555</phone>\r\n    <fax>(1) 135-4892</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10521</id>\r\n        <orderdate>1997-04-29T00:00:00</orderdate>\r\n        <total>225.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10782</id>\r\n        <orderdate>1997-12-17T00:00:00</orderdate>\r\n        <total>12.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10819</id>\r\n        <orderdate>1998-01-07T00:00:00</orderdate>\r\n        <total>477.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10881</id>\r\n        <orderdate>1998-02-11T00:00:00</orderdate>\r\n        <total>150.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10937</id>\r\n        <orderdate>1998-03-10T00:00:00</orderdate>\r\n        <total>644.80</total>\r\n      </order>\r\n      <order>\r\n        <id>11054</id>\r\n        <orderdate>1998-04-28T00:00:00</orderdate>\r\n        <total>305.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>CENTC</id>\r\n    <name>Centro comercial Moctezuma</name>\r\n    <address>Sierras de Granada 9993</address>\r\n    <city>México D.F.</city>\r\n    <postalcode>05022</postalcode>\r\n    <country>Mexico</country>\r\n    <phone>(5) 555-3392</phone>\r\n    <fax>(5) 555-7293</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10259</id>\r\n        <orderdate>1996-07-18T00:00:00</orderdate>\r\n        <total>100.80</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>CHOPS</id>\r\n    <name>Chop-suey Chinese</name>\r\n    <address>Hauptstr. 29</address>\r\n    <city>Bern</city>\r\n    <postalcode>3012</postalcode>\r\n    <country>Switzerland</country>\r\n    <phone>0452-076545</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10254</id>\r\n        <orderdate>1996-07-11T00:00:00</orderdate>\r\n        <total>556.62</total>\r\n      </order>\r\n      <order>\r\n        <id>10370</id>\r\n        <orderdate>1996-12-03T00:00:00</orderdate>\r\n        <total>1117.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10519</id>\r\n        <orderdate>1997-04-28T00:00:00</orderdate>\r\n        <total>2314.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10731</id>\r\n        <orderdate>1997-11-06T00:00:00</orderdate>\r\n        <total>1890.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10746</id>\r\n        <orderdate>1997-11-19T00:00:00</orderdate>\r\n        <total>2311.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10966</id>\r\n        <orderdate>1998-03-20T00:00:00</orderdate>\r\n        <total>1098.46</total>\r\n      </order>\r\n      <order>\r\n        <id>11029</id>\r\n        <orderdate>1998-04-16T00:00:00</orderdate>\r\n        <total>1286.80</total>\r\n      </order>\r\n      <order>\r\n        <id>11041</id>\r\n        <orderdate>1998-04-22T00:00:00</orderdate>\r\n        <total>1773.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>COMMI</id>\r\n    <name>Comércio Mineiro</name>\r\n    <address>Av. dos Lusíadas, 23</address>\r\n    <city>São Paulo</city>\r\n    <region>SP</region>\r\n    <postalcode>05432-043</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(11) 555-7647</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10290</id>\r\n        <orderdate>1996-08-27T00:00:00</orderdate>\r\n        <total>2169.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10466</id>\r\n        <orderdate>1997-03-06T00:00:00</orderdate>\r\n        <total>216.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10494</id>\r\n        <orderdate>1997-04-02T00:00:00</orderdate>\r\n        <total>912.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10969</id>\r\n        <orderdate>1998-03-23T00:00:00</orderdate>\r\n        <total>108.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11042</id>\r\n        <orderdate>1998-04-22T00:00:00</orderdate>\r\n        <total>405.75</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>CONSH</id>\r\n    <name>Consolidated Holdings</name>\r\n    <address>Berkeley Gardens, 12 Brewery </address>\r\n    <city>London</city>\r\n    <postalcode>WX1 6LT</postalcode>\r\n    <country>UK</country>\r\n    <phone>(171) 555-2282</phone>\r\n    <fax>(171) 555-9199</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10435</id>\r\n        <orderdate>1997-02-04T00:00:00</orderdate>\r\n        <total>631.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10462</id>\r\n        <orderdate>1997-03-03T00:00:00</orderdate>\r\n        <total>156.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10848</id>\r\n        <orderdate>1998-01-23T00:00:00</orderdate>\r\n        <total>931.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>DRACD</id>\r\n    <name>Drachenblut Delikatessen</name>\r\n    <address>Walserweg 21</address>\r\n    <city>Aachen</city>\r\n    <postalcode>52066</postalcode>\r\n    <country>Germany</country>\r\n    <phone>0241-039123</phone>\r\n    <fax>0241-059428</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10363</id>\r\n        <orderdate>1996-11-26T00:00:00</orderdate>\r\n        <total>447.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10391</id>\r\n        <orderdate>1996-12-23T00:00:00</orderdate>\r\n        <total>86.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10797</id>\r\n        <orderdate>1997-12-25T00:00:00</orderdate>\r\n        <total>420.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10825</id>\r\n        <orderdate>1998-01-09T00:00:00</orderdate>\r\n        <total>1030.76</total>\r\n      </order>\r\n      <order>\r\n        <id>11036</id>\r\n        <orderdate>1998-04-20T00:00:00</orderdate>\r\n        <total>1692.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11067</id>\r\n        <orderdate>1998-05-04T00:00:00</orderdate>\r\n        <total>86.85</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>DUMON</id>\r\n    <name>Du monde entier</name>\r\n    <address>67, rue des Cinquante Otages</address>\r\n    <city>Nantes</city>\r\n    <postalcode>44000</postalcode>\r\n    <country>France</country>\r\n    <phone>40.67.88.88</phone>\r\n    <fax>40.67.89.89</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10311</id>\r\n        <orderdate>1996-09-20T00:00:00</orderdate>\r\n        <total>268.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10609</id>\r\n        <orderdate>1997-07-24T00:00:00</orderdate>\r\n        <total>424.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10683</id>\r\n        <orderdate>1997-09-26T00:00:00</orderdate>\r\n        <total>63.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10890</id>\r\n        <orderdate>1998-02-16T00:00:00</orderdate>\r\n        <total>860.10</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>EASTC</id>\r\n    <name>Eastern Connection</name>\r\n    <address>35 King George</address>\r\n    <city>London</city>\r\n    <postalcode>WX3 6FW</postalcode>\r\n    <country>UK</country>\r\n    <phone>(171) 555-0297</phone>\r\n    <fax>(171) 555-3373</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10364</id>\r\n        <orderdate>1996-11-26T00:00:00</orderdate>\r\n        <total>950.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10400</id>\r\n        <orderdate>1997-01-01T00:00:00</orderdate>\r\n        <total>3063.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10532</id>\r\n        <orderdate>1997-05-09T00:00:00</orderdate>\r\n        <total>796.35</total>\r\n      </order>\r\n      <order>\r\n        <id>10726</id>\r\n        <orderdate>1997-11-03T00:00:00</orderdate>\r\n        <total>655.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10987</id>\r\n        <orderdate>1998-03-31T00:00:00</orderdate>\r\n        <total>2772.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11024</id>\r\n        <orderdate>1998-04-15T00:00:00</orderdate>\r\n        <total>1966.81</total>\r\n      </order>\r\n      <order>\r\n        <id>11047</id>\r\n        <orderdate>1998-04-24T00:00:00</orderdate>\r\n        <total>817.88</total>\r\n      </order>\r\n      <order>\r\n        <id>11056</id>\r\n        <orderdate>1998-04-28T00:00:00</orderdate>\r\n        <total>3740.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>ERNSH</id>\r\n    <name>Ernst Handel</name>\r\n    <address>Kirchgasse 6</address>\r\n    <city>Graz</city>\r\n    <postalcode>8010</postalcode>\r\n    <country>Austria</country>\r\n    <phone>7675-3425</phone>\r\n    <fax>7675-3426</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10258</id>\r\n        <orderdate>1996-07-17T00:00:00</orderdate>\r\n        <total>1614.88</total>\r\n      </order>\r\n      <order>\r\n        <id>10263</id>\r\n        <orderdate>1996-07-23T00:00:00</orderdate>\r\n        <total>1873.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10351</id>\r\n        <orderdate>1996-11-11T00:00:00</orderdate>\r\n        <total>5398.72</total>\r\n      </order>\r\n      <order>\r\n        <id>10368</id>\r\n        <orderdate>1996-11-29T00:00:00</orderdate>\r\n        <total>1689.78</total>\r\n      </order>\r\n      <order>\r\n        <id>10382</id>\r\n        <orderdate>1996-12-13T00:00:00</orderdate>\r\n        <total>2900.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10390</id>\r\n        <orderdate>1996-12-23T00:00:00</orderdate>\r\n        <total>2090.88</total>\r\n      </order>\r\n      <order>\r\n        <id>10402</id>\r\n        <orderdate>1997-01-02T00:00:00</orderdate>\r\n        <total>2713.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10403</id>\r\n        <orderdate>1997-01-03T00:00:00</orderdate>\r\n        <total>855.02</total>\r\n      </order>\r\n      <order>\r\n        <id>10430</id>\r\n        <orderdate>1997-01-30T00:00:00</orderdate>\r\n        <total>4899.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10442</id>\r\n        <orderdate>1997-02-11T00:00:00</orderdate>\r\n        <total>1792.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10514</id>\r\n        <orderdate>1997-04-22T00:00:00</orderdate>\r\n        <total>8623.45</total>\r\n      </order>\r\n      <order>\r\n        <id>10571</id>\r\n        <orderdate>1997-06-17T00:00:00</orderdate>\r\n        <total>550.59</total>\r\n      </order>\r\n      <order>\r\n        <id>10595</id>\r\n        <orderdate>1997-07-10T00:00:00</orderdate>\r\n        <total>4725.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10633</id>\r\n        <orderdate>1997-08-15T00:00:00</orderdate>\r\n        <total>5510.59</total>\r\n      </order>\r\n      <order>\r\n        <id>10667</id>\r\n        <orderdate>1997-09-12T00:00:00</orderdate>\r\n        <total>1536.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10698</id>\r\n        <orderdate>1997-10-09T00:00:00</orderdate>\r\n        <total>3436.44</total>\r\n      </order>\r\n      <order>\r\n        <id>10764</id>\r\n        <orderdate>1997-12-03T00:00:00</orderdate>\r\n        <total>2286.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10771</id>\r\n        <orderdate>1997-12-10T00:00:00</orderdate>\r\n        <total>344.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10773</id>\r\n        <orderdate>1997-12-11T00:00:00</orderdate>\r\n        <total>2030.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10776</id>\r\n        <orderdate>1997-12-15T00:00:00</orderdate>\r\n        <total>6635.28</total>\r\n      </order>\r\n      <order>\r\n        <id>10795</id>\r\n        <orderdate>1997-12-24T00:00:00</orderdate>\r\n        <total>2158.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10836</id>\r\n        <orderdate>1998-01-16T00:00:00</orderdate>\r\n        <total>4705.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10854</id>\r\n        <orderdate>1998-01-27T00:00:00</orderdate>\r\n        <total>2966.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10895</id>\r\n        <orderdate>1998-02-18T00:00:00</orderdate>\r\n        <total>6379.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10968</id>\r\n        <orderdate>1998-03-23T00:00:00</orderdate>\r\n        <total>1408.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10979</id>\r\n        <orderdate>1998-03-26T00:00:00</orderdate>\r\n        <total>4813.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10990</id>\r\n        <orderdate>1998-04-01T00:00:00</orderdate>\r\n        <total>4288.85</total>\r\n      </order>\r\n      <order>\r\n        <id>11008</id>\r\n        <orderdate>1998-04-08T00:00:00</orderdate>\r\n        <total>4680.90</total>\r\n      </order>\r\n      <order>\r\n        <id>11017</id>\r\n        <orderdate>1998-04-13T00:00:00</orderdate>\r\n        <total>6750.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11072</id>\r\n        <orderdate>1998-05-05T00:00:00</orderdate>\r\n        <total>5218.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>FAMIA</id>\r\n    <name>Familia Arquibaldo</name>\r\n    <address>Rua Orós, 92</address>\r\n    <city>São Paulo</city>\r\n    <region>SP</region>\r\n    <postalcode>05442-030</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(11) 555-9857</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10347</id>\r\n        <orderdate>1996-11-06T00:00:00</orderdate>\r\n        <total>814.42</total>\r\n      </order>\r\n      <order>\r\n        <id>10386</id>\r\n        <orderdate>1996-12-18T00:00:00</orderdate>\r\n        <total>166.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10414</id>\r\n        <orderdate>1997-01-14T00:00:00</orderdate>\r\n        <total>224.83</total>\r\n      </order>\r\n      <order>\r\n        <id>10512</id>\r\n        <orderdate>1997-04-21T00:00:00</orderdate>\r\n        <total>525.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10581</id>\r\n        <orderdate>1997-06-26T00:00:00</orderdate>\r\n        <total>310.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10650</id>\r\n        <orderdate>1997-08-29T00:00:00</orderdate>\r\n        <total>1779.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10725</id>\r\n        <orderdate>1997-10-31T00:00:00</orderdate>\r\n        <total>287.80</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>FISSA</id>\r\n    <name>FISSA Fabrica Inter. Salchichas S.A.</name>\r\n    <address>C/ Moralzarzal, 86</address>\r\n    <city>Madrid</city>\r\n    <postalcode>28034</postalcode>\r\n    <country>Spain</country>\r\n    <phone>(91) 555 94 44</phone>\r\n    <fax>(91) 555 55 93</fax>\r\n    <orders />\r\n  </customer>\r\n  <customer>\r\n    <id>FOLIG</id>\r\n    <name>Folies gourmandes</name>\r\n    <address>184, chaussée de Tournai</address>\r\n    <city>Lille</city>\r\n    <postalcode>59000</postalcode>\r\n    <country>France</country>\r\n    <phone>20.16.10.16</phone>\r\n    <fax>20.16.10.17</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10408</id>\r\n        <orderdate>1997-01-08T00:00:00</orderdate>\r\n        <total>1622.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10480</id>\r\n        <orderdate>1997-03-20T00:00:00</orderdate>\r\n        <total>756.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10634</id>\r\n        <orderdate>1997-08-15T00:00:00</orderdate>\r\n        <total>4985.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10763</id>\r\n        <orderdate>1997-12-03T00:00:00</orderdate>\r\n        <total>616.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10789</id>\r\n        <orderdate>1997-12-22T00:00:00</orderdate>\r\n        <total>3687.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>FOLKO</id>\r\n    <name>Folk och fä HB</name>\r\n    <address>Åkergatan 24</address>\r\n    <city>Bräcke</city>\r\n    <postalcode>S-844 67</postalcode>\r\n    <country>Sweden</country>\r\n    <phone>0695-34 67 21</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10264</id>\r\n        <orderdate>1996-07-24T00:00:00</orderdate>\r\n        <total>695.62</total>\r\n      </order>\r\n      <order>\r\n        <id>10327</id>\r\n        <orderdate>1996-10-11T00:00:00</orderdate>\r\n        <total>1810.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10378</id>\r\n        <orderdate>1996-12-10T00:00:00</orderdate>\r\n        <total>103.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10434</id>\r\n        <orderdate>1997-02-03T00:00:00</orderdate>\r\n        <total>321.12</total>\r\n      </order>\r\n      <order>\r\n        <id>10460</id>\r\n        <orderdate>1997-02-28T00:00:00</orderdate>\r\n        <total>176.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10533</id>\r\n        <orderdate>1997-05-12T00:00:00</orderdate>\r\n        <total>2222.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10561</id>\r\n        <orderdate>1997-06-06T00:00:00</orderdate>\r\n        <total>2844.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10703</id>\r\n        <orderdate>1997-10-14T00:00:00</orderdate>\r\n        <total>2545.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10762</id>\r\n        <orderdate>1997-12-02T00:00:00</orderdate>\r\n        <total>4337.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10774</id>\r\n        <orderdate>1997-12-11T00:00:00</orderdate>\r\n        <total>868.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10824</id>\r\n        <orderdate>1998-01-09T00:00:00</orderdate>\r\n        <total>250.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10880</id>\r\n        <orderdate>1998-02-10T00:00:00</orderdate>\r\n        <total>1500.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10902</id>\r\n        <orderdate>1998-02-23T00:00:00</orderdate>\r\n        <total>863.43</total>\r\n      </order>\r\n      <order>\r\n        <id>10955</id>\r\n        <orderdate>1998-03-17T00:00:00</orderdate>\r\n        <total>74.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10977</id>\r\n        <orderdate>1998-03-26T00:00:00</orderdate>\r\n        <total>2233.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10980</id>\r\n        <orderdate>1998-03-27T00:00:00</orderdate>\r\n        <total>248.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10993</id>\r\n        <orderdate>1998-04-01T00:00:00</orderdate>\r\n        <total>4895.44</total>\r\n      </order>\r\n      <order>\r\n        <id>11001</id>\r\n        <orderdate>1998-04-06T00:00:00</orderdate>\r\n        <total>2769.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11050</id>\r\n        <orderdate>1998-04-27T00:00:00</orderdate>\r\n        <total>810.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>FRANK</id>\r\n    <name>Frankenversand</name>\r\n    <address>Berliner Platz 43</address>\r\n    <city>München</city>\r\n    <postalcode>80805</postalcode>\r\n    <country>Germany</country>\r\n    <phone>089-0877310</phone>\r\n    <fax>089-0877451</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10267</id>\r\n        <orderdate>1996-07-29T00:00:00</orderdate>\r\n        <total>3536.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10337</id>\r\n        <orderdate>1996-10-24T00:00:00</orderdate>\r\n        <total>2467.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10342</id>\r\n        <orderdate>1996-10-30T00:00:00</orderdate>\r\n        <total>1840.64</total>\r\n      </order>\r\n      <order>\r\n        <id>10396</id>\r\n        <orderdate>1996-12-27T00:00:00</orderdate>\r\n        <total>1903.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10488</id>\r\n        <orderdate>1997-03-27T00:00:00</orderdate>\r\n        <total>1512.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10560</id>\r\n        <orderdate>1997-06-06T00:00:00</orderdate>\r\n        <total>1072.42</total>\r\n      </order>\r\n      <order>\r\n        <id>10623</id>\r\n        <orderdate>1997-08-07T00:00:00</orderdate>\r\n        <total>1336.95</total>\r\n      </order>\r\n      <order>\r\n        <id>10653</id>\r\n        <orderdate>1997-09-02T00:00:00</orderdate>\r\n        <total>1083.15</total>\r\n      </order>\r\n      <order>\r\n        <id>10670</id>\r\n        <orderdate>1997-09-16T00:00:00</orderdate>\r\n        <total>2301.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10675</id>\r\n        <orderdate>1997-09-19T00:00:00</orderdate>\r\n        <total>1423.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10717</id>\r\n        <orderdate>1997-10-24T00:00:00</orderdate>\r\n        <total>1270.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10791</id>\r\n        <orderdate>1997-12-23T00:00:00</orderdate>\r\n        <total>1829.76</total>\r\n      </order>\r\n      <order>\r\n        <id>10859</id>\r\n        <orderdate>1998-01-29T00:00:00</orderdate>\r\n        <total>1078.69</total>\r\n      </order>\r\n      <order>\r\n        <id>10929</id>\r\n        <orderdate>1998-03-05T00:00:00</orderdate>\r\n        <total>1174.75</total>\r\n      </order>\r\n      <order>\r\n        <id>11012</id>\r\n        <orderdate>1998-04-09T00:00:00</orderdate>\r\n        <total>2825.30</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>FRANR</id>\r\n    <name>France restauration</name>\r\n    <address>54, rue Royale</address>\r\n    <city>Nantes</city>\r\n    <postalcode>44000</postalcode>\r\n    <country>France</country>\r\n    <phone>40.32.21.21</phone>\r\n    <fax>40.32.21.20</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10671</id>\r\n        <orderdate>1997-09-17T00:00:00</orderdate>\r\n        <total>920.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10860</id>\r\n        <orderdate>1998-01-29T00:00:00</orderdate>\r\n        <total>519.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10971</id>\r\n        <orderdate>1998-03-24T00:00:00</orderdate>\r\n        <total>1733.06</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>FRANS</id>\r\n    <name>Franchi S.p.A.</name>\r\n    <address>Via Monte Bianco 34</address>\r\n    <city>Torino</city>\r\n    <postalcode>10100</postalcode>\r\n    <country>Italy</country>\r\n    <phone>011-4988260</phone>\r\n    <fax>011-4988261</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10422</id>\r\n        <orderdate>1997-01-22T00:00:00</orderdate>\r\n        <total>49.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10710</id>\r\n        <orderdate>1997-10-20T00:00:00</orderdate>\r\n        <total>93.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10753</id>\r\n        <orderdate>1997-11-25T00:00:00</orderdate>\r\n        <total>88.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10807</id>\r\n        <orderdate>1997-12-31T00:00:00</orderdate>\r\n        <total>18.40</total>\r\n      </order>\r\n      <order>\r\n        <id>11026</id>\r\n        <orderdate>1998-04-15T00:00:00</orderdate>\r\n        <total>1030.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11060</id>\r\n        <orderdate>1998-04-30T00:00:00</orderdate>\r\n        <total>266.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>FURIB</id>\r\n    <name>Furia Bacalhau e Frutos do Mar</name>\r\n    <address>Jardim das rosas n. 32</address>\r\n    <city>Lisboa</city>\r\n    <postalcode>1675</postalcode>\r\n    <country>Portugal</country>\r\n    <phone>(1) 354-2534</phone>\r\n    <fax>(1) 354-2535</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10328</id>\r\n        <orderdate>1996-10-14T00:00:00</orderdate>\r\n        <total>1168.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10352</id>\r\n        <orderdate>1996-11-12T00:00:00</orderdate>\r\n        <total>136.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10464</id>\r\n        <orderdate>1997-03-04T00:00:00</orderdate>\r\n        <total>1609.28</total>\r\n      </order>\r\n      <order>\r\n        <id>10491</id>\r\n        <orderdate>1997-03-31T00:00:00</orderdate>\r\n        <total>259.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10551</id>\r\n        <orderdate>1997-05-28T00:00:00</orderdate>\r\n        <total>1677.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10604</id>\r\n        <orderdate>1997-07-18T00:00:00</orderdate>\r\n        <total>230.85</total>\r\n      </order>\r\n      <order>\r\n        <id>10664</id>\r\n        <orderdate>1997-09-10T00:00:00</orderdate>\r\n        <total>1288.39</total>\r\n      </order>\r\n      <order>\r\n        <id>10963</id>\r\n        <orderdate>1998-03-19T00:00:00</orderdate>\r\n        <total>57.80</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>GALED</id>\r\n    <name>Galería del gastrónomo</name>\r\n    <address>Rambla de Cataluña, 23</address>\r\n    <city>Barcelona</city>\r\n    <postalcode>08022</postalcode>\r\n    <country>Spain</country>\r\n    <phone>(93) 203 4560</phone>\r\n    <fax>(93) 203 4561</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10366</id>\r\n        <orderdate>1996-11-28T00:00:00</orderdate>\r\n        <total>136.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10426</id>\r\n        <orderdate>1997-01-27T00:00:00</orderdate>\r\n        <total>338.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10568</id>\r\n        <orderdate>1997-06-13T00:00:00</orderdate>\r\n        <total>155.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10887</id>\r\n        <orderdate>1998-02-13T00:00:00</orderdate>\r\n        <total>70.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10928</id>\r\n        <orderdate>1998-03-05T00:00:00</orderdate>\r\n        <total>137.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>GODOS</id>\r\n    <name>Godos Cocina Típica</name>\r\n    <address>C/ Romero, 33</address>\r\n    <city>Sevilla</city>\r\n    <postalcode>41101</postalcode>\r\n    <country>Spain</country>\r\n    <phone>(95) 555 82 82</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10303</id>\r\n        <orderdate>1996-09-11T00:00:00</orderdate>\r\n        <total>1117.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10550</id>\r\n        <orderdate>1997-05-28T00:00:00</orderdate>\r\n        <total>683.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10629</id>\r\n        <orderdate>1997-08-12T00:00:00</orderdate>\r\n        <total>2775.05</total>\r\n      </order>\r\n      <order>\r\n        <id>10872</id>\r\n        <orderdate>1998-02-05T00:00:00</orderdate>\r\n        <total>2058.46</total>\r\n      </order>\r\n      <order>\r\n        <id>10874</id>\r\n        <orderdate>1998-02-06T00:00:00</orderdate>\r\n        <total>310.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10888</id>\r\n        <orderdate>1998-02-16T00:00:00</orderdate>\r\n        <total>605.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10911</id>\r\n        <orderdate>1998-02-26T00:00:00</orderdate>\r\n        <total>858.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10948</id>\r\n        <orderdate>1998-03-13T00:00:00</orderdate>\r\n        <total>2362.25</total>\r\n      </order>\r\n      <order>\r\n        <id>11009</id>\r\n        <orderdate>1998-04-08T00:00:00</orderdate>\r\n        <total>616.50</total>\r\n      </order>\r\n      <order>\r\n        <id>11037</id>\r\n        <orderdate>1998-04-21T00:00:00</orderdate>\r\n        <total>60.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>GOURL</id>\r\n    <name>Gourmet Lanchonetes</name>\r\n    <address>Av. Brasil, 442</address>\r\n    <city>Campinas</city>\r\n    <region>SP</region>\r\n    <postalcode>04876-786</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(11) 555-9482</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10423</id>\r\n        <orderdate>1997-01-23T00:00:00</orderdate>\r\n        <total>1020.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10652</id>\r\n        <orderdate>1997-09-01T00:00:00</orderdate>\r\n        <total>318.84</total>\r\n      </order>\r\n      <order>\r\n        <id>10685</id>\r\n        <orderdate>1997-09-29T00:00:00</orderdate>\r\n        <total>801.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10709</id>\r\n        <orderdate>1997-10-17T00:00:00</orderdate>\r\n        <total>3424.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10734</id>\r\n        <orderdate>1997-11-07T00:00:00</orderdate>\r\n        <total>1498.35</total>\r\n      </order>\r\n      <order>\r\n        <id>10777</id>\r\n        <orderdate>1997-12-15T00:00:00</orderdate>\r\n        <total>224.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10790</id>\r\n        <orderdate>1997-12-22T00:00:00</orderdate>\r\n        <total>722.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10959</id>\r\n        <orderdate>1998-03-18T00:00:00</orderdate>\r\n        <total>131.75</total>\r\n      </order>\r\n      <order>\r\n        <id>11049</id>\r\n        <orderdate>1998-04-24T00:00:00</orderdate>\r\n        <total>273.60</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>GREAL</id>\r\n    <name>Great Lakes Food Market</name>\r\n    <address>2732 Baker Blvd.</address>\r\n    <city>Eugene</city>\r\n    <region>OR</region>\r\n    <postalcode>97403</postalcode>\r\n    <country>USA</country>\r\n    <phone>(503) 555-7555</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10528</id>\r\n        <orderdate>1997-05-06T00:00:00</orderdate>\r\n        <total>392.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10589</id>\r\n        <orderdate>1997-07-04T00:00:00</orderdate>\r\n        <total>72.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10616</id>\r\n        <orderdate>1997-07-31T00:00:00</orderdate>\r\n        <total>4807.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10617</id>\r\n        <orderdate>1997-07-31T00:00:00</orderdate>\r\n        <total>1402.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10656</id>\r\n        <orderdate>1997-09-04T00:00:00</orderdate>\r\n        <total>604.22</total>\r\n      </order>\r\n      <order>\r\n        <id>10681</id>\r\n        <orderdate>1997-09-25T00:00:00</orderdate>\r\n        <total>1287.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10816</id>\r\n        <orderdate>1998-01-06T00:00:00</orderdate>\r\n        <total>8446.45</total>\r\n      </order>\r\n      <order>\r\n        <id>10936</id>\r\n        <orderdate>1998-03-09T00:00:00</orderdate>\r\n        <total>456.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11006</id>\r\n        <orderdate>1998-04-07T00:00:00</orderdate>\r\n        <total>329.68</total>\r\n      </order>\r\n      <order>\r\n        <id>11040</id>\r\n        <orderdate>1998-04-22T00:00:00</orderdate>\r\n        <total>200.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11061</id>\r\n        <orderdate>1998-04-30T00:00:00</orderdate>\r\n        <total>510.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>GROSR</id>\r\n    <name>GROSELLA-Restaurante</name>\r\n    <address>5ª Ave. Los Palos Grandes</address>\r\n    <city>Caracas</city>\r\n    <region>DF</region>\r\n    <postalcode>1081</postalcode>\r\n    <country>Venezuela</country>\r\n    <phone>(2) 283-2951</phone>\r\n    <fax>(2) 283-3397</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10268</id>\r\n        <orderdate>1996-07-30T00:00:00</orderdate>\r\n        <total>1101.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10785</id>\r\n        <orderdate>1997-12-18T00:00:00</orderdate>\r\n        <total>387.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>HANAR</id>\r\n    <name>Hanari Carnes</name>\r\n    <address>Rua do Paço, 67</address>\r\n    <city>Rio de Janeiro</city>\r\n    <region>RJ</region>\r\n    <postalcode>05454-876</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(21) 555-0091</phone>\r\n    <fax>(21) 555-8765</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10250</id>\r\n        <orderdate>1996-07-08T00:00:00</orderdate>\r\n        <total>1552.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10253</id>\r\n        <orderdate>1996-07-10T00:00:00</orderdate>\r\n        <total>1444.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10541</id>\r\n        <orderdate>1997-05-19T00:00:00</orderdate>\r\n        <total>1946.52</total>\r\n      </order>\r\n      <order>\r\n        <id>10645</id>\r\n        <orderdate>1997-08-26T00:00:00</orderdate>\r\n        <total>1535.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10690</id>\r\n        <orderdate>1997-10-02T00:00:00</orderdate>\r\n        <total>862.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10770</id>\r\n        <orderdate>1997-12-09T00:00:00</orderdate>\r\n        <total>236.25</total>\r\n      </order>\r\n      <order>\r\n        <id>10783</id>\r\n        <orderdate>1997-12-18T00:00:00</orderdate>\r\n        <total>1442.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10886</id>\r\n        <orderdate>1998-02-13T00:00:00</orderdate>\r\n        <total>3127.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10903</id>\r\n        <orderdate>1998-02-24T00:00:00</orderdate>\r\n        <total>932.05</total>\r\n      </order>\r\n      <order>\r\n        <id>10922</id>\r\n        <orderdate>1998-03-03T00:00:00</orderdate>\r\n        <total>742.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10925</id>\r\n        <orderdate>1998-03-04T00:00:00</orderdate>\r\n        <total>475.15</total>\r\n      </order>\r\n      <order>\r\n        <id>10981</id>\r\n        <orderdate>1998-03-27T00:00:00</orderdate>\r\n        <total>15810.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11022</id>\r\n        <orderdate>1998-04-14T00:00:00</orderdate>\r\n        <total>1402.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11052</id>\r\n        <orderdate>1998-04-27T00:00:00</orderdate>\r\n        <total>1332.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>HILAA</id>\r\n    <name>HILARIÓN-Abastos</name>\r\n    <address>Carrera 22 con Ave. Carlos Soublette #8-35</address>\r\n    <city>San Cristóbal</city>\r\n    <region>Táchira</region>\r\n    <postalcode>5022</postalcode>\r\n    <country>Venezuela</country>\r\n    <phone>(5) 555-1340</phone>\r\n    <fax>(5) 555-1948</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10257</id>\r\n        <orderdate>1996-07-16T00:00:00</orderdate>\r\n        <total>1119.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10395</id>\r\n        <orderdate>1996-12-26T00:00:00</orderdate>\r\n        <total>2122.92</total>\r\n      </order>\r\n      <order>\r\n        <id>10476</id>\r\n        <orderdate>1997-03-17T00:00:00</orderdate>\r\n        <total>180.48</total>\r\n      </order>\r\n      <order>\r\n        <id>10486</id>\r\n        <orderdate>1997-03-26T00:00:00</orderdate>\r\n        <total>1272.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10490</id>\r\n        <orderdate>1997-03-31T00:00:00</orderdate>\r\n        <total>3163.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10498</id>\r\n        <orderdate>1997-04-07T00:00:00</orderdate>\r\n        <total>575.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10552</id>\r\n        <orderdate>1997-05-29T00:00:00</orderdate>\r\n        <total>880.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10601</id>\r\n        <orderdate>1997-07-16T00:00:00</orderdate>\r\n        <total>2285.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10613</id>\r\n        <orderdate>1997-07-29T00:00:00</orderdate>\r\n        <total>353.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10641</id>\r\n        <orderdate>1997-08-22T00:00:00</orderdate>\r\n        <total>2054.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10705</id>\r\n        <orderdate>1997-10-15T00:00:00</orderdate>\r\n        <total>378.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10796</id>\r\n        <orderdate>1997-12-25T00:00:00</orderdate>\r\n        <total>2341.36</total>\r\n      </order>\r\n      <order>\r\n        <id>10863</id>\r\n        <orderdate>1998-02-02T00:00:00</orderdate>\r\n        <total>441.15</total>\r\n      </order>\r\n      <order>\r\n        <id>10901</id>\r\n        <orderdate>1998-02-23T00:00:00</orderdate>\r\n        <total>934.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10957</id>\r\n        <orderdate>1998-03-18T00:00:00</orderdate>\r\n        <total>1762.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10960</id>\r\n        <orderdate>1998-03-19T00:00:00</orderdate>\r\n        <total>265.35</total>\r\n      </order>\r\n      <order>\r\n        <id>10976</id>\r\n        <orderdate>1998-03-25T00:00:00</orderdate>\r\n        <total>912.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11055</id>\r\n        <orderdate>1998-04-28T00:00:00</orderdate>\r\n        <total>1727.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>HUNGC</id>\r\n    <name>Hungry Coyote Import Store</name>\r\n    <address>City Center Plaza, 516 Main St.</address>\r\n    <city>Elgin</city>\r\n    <region>OR</region>\r\n    <postalcode>97827</postalcode>\r\n    <country>USA</country>\r\n    <phone>(503) 555-6874</phone>\r\n    <fax>(503) 555-2376</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10375</id>\r\n        <orderdate>1996-12-06T00:00:00</orderdate>\r\n        <total>338.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10394</id>\r\n        <orderdate>1996-12-25T00:00:00</orderdate>\r\n        <total>442.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10415</id>\r\n        <orderdate>1997-01-15T00:00:00</orderdate>\r\n        <total>102.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10600</id>\r\n        <orderdate>1997-07-16T00:00:00</orderdate>\r\n        <total>479.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10660</id>\r\n        <orderdate>1997-09-08T00:00:00</orderdate>\r\n        <total>1701.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>HUNGO</id>\r\n    <name>Hungry Owl All-Night Grocers</name>\r\n    <address>8 Johnstown Road</address>\r\n    <city>Cork</city>\r\n    <region>Co. Cork</region>\r\n    <country>Ireland</country>\r\n    <phone>2967 542</phone>\r\n    <fax>2967 3333</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10298</id>\r\n        <orderdate>1996-09-05T00:00:00</orderdate>\r\n        <total>2645.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10309</id>\r\n        <orderdate>1996-09-19T00:00:00</orderdate>\r\n        <total>1762.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10335</id>\r\n        <orderdate>1996-10-22T00:00:00</orderdate>\r\n        <total>2036.16</total>\r\n      </order>\r\n      <order>\r\n        <id>10373</id>\r\n        <orderdate>1996-12-05T00:00:00</orderdate>\r\n        <total>1366.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10380</id>\r\n        <orderdate>1996-12-12T00:00:00</orderdate>\r\n        <total>1313.82</total>\r\n      </order>\r\n      <order>\r\n        <id>10429</id>\r\n        <orderdate>1997-01-29T00:00:00</orderdate>\r\n        <total>1441.38</total>\r\n      </order>\r\n      <order>\r\n        <id>10503</id>\r\n        <orderdate>1997-04-11T00:00:00</orderdate>\r\n        <total>2048.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10516</id>\r\n        <orderdate>1997-04-24T00:00:00</orderdate>\r\n        <total>2381.05</total>\r\n      </order>\r\n      <order>\r\n        <id>10567</id>\r\n        <orderdate>1997-06-12T00:00:00</orderdate>\r\n        <total>2519.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10646</id>\r\n        <orderdate>1997-08-27T00:00:00</orderdate>\r\n        <total>1446.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10661</id>\r\n        <orderdate>1997-09-09T00:00:00</orderdate>\r\n        <total>562.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10687</id>\r\n        <orderdate>1997-09-30T00:00:00</orderdate>\r\n        <total>4960.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10701</id>\r\n        <orderdate>1997-10-13T00:00:00</orderdate>\r\n        <total>2864.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10712</id>\r\n        <orderdate>1997-10-21T00:00:00</orderdate>\r\n        <total>1233.48</total>\r\n      </order>\r\n      <order>\r\n        <id>10736</id>\r\n        <orderdate>1997-11-11T00:00:00</orderdate>\r\n        <total>997.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10897</id>\r\n        <orderdate>1998-02-19T00:00:00</orderdate>\r\n        <total>10835.24</total>\r\n      </order>\r\n      <order>\r\n        <id>10912</id>\r\n        <orderdate>1998-02-26T00:00:00</orderdate>\r\n        <total>6200.55</total>\r\n      </order>\r\n      <order>\r\n        <id>10985</id>\r\n        <orderdate>1998-03-30T00:00:00</orderdate>\r\n        <total>2023.38</total>\r\n      </order>\r\n      <order>\r\n        <id>11063</id>\r\n        <orderdate>1998-04-30T00:00:00</orderdate>\r\n        <total>1342.95</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>ISLAT</id>\r\n    <name>Island Trading</name>\r\n    <address>Garden House, Crowther Way</address>\r\n    <city>Cowes</city>\r\n    <region>Isle of Wight</region>\r\n    <postalcode>PO31 7PJ</postalcode>\r\n    <country>UK</country>\r\n    <phone>(198) 555-8888</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10315</id>\r\n        <orderdate>1996-09-26T00:00:00</orderdate>\r\n        <total>516.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10318</id>\r\n        <orderdate>1996-10-01T00:00:00</orderdate>\r\n        <total>240.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10321</id>\r\n        <orderdate>1996-10-03T00:00:00</orderdate>\r\n        <total>144.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10473</id>\r\n        <orderdate>1997-03-13T00:00:00</orderdate>\r\n        <total>230.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10621</id>\r\n        <orderdate>1997-08-05T00:00:00</orderdate>\r\n        <total>758.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10674</id>\r\n        <orderdate>1997-09-18T00:00:00</orderdate>\r\n        <total>45.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10749</id>\r\n        <orderdate>1997-11-20T00:00:00</orderdate>\r\n        <total>1080.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10798</id>\r\n        <orderdate>1997-12-26T00:00:00</orderdate>\r\n        <total>446.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10829</id>\r\n        <orderdate>1998-01-13T00:00:00</orderdate>\r\n        <total>1764.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10933</id>\r\n        <orderdate>1998-03-06T00:00:00</orderdate>\r\n        <total>920.60</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>KOENE</id>\r\n    <name>Königlich Essen</name>\r\n    <address>Maubelstr. 90</address>\r\n    <city>Brandenburg</city>\r\n    <postalcode>14776</postalcode>\r\n    <country>Germany</country>\r\n    <phone>0555-09876</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10323</id>\r\n        <orderdate>1996-10-07T00:00:00</orderdate>\r\n        <total>164.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10325</id>\r\n        <orderdate>1996-10-09T00:00:00</orderdate>\r\n        <total>1497.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10456</id>\r\n        <orderdate>1997-02-25T00:00:00</orderdate>\r\n        <total>557.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10457</id>\r\n        <orderdate>1997-02-25T00:00:00</orderdate>\r\n        <total>1584.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10468</id>\r\n        <orderdate>1997-03-07T00:00:00</orderdate>\r\n        <total>717.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10506</id>\r\n        <orderdate>1997-04-15T00:00:00</orderdate>\r\n        <total>415.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10542</id>\r\n        <orderdate>1997-05-20T00:00:00</orderdate>\r\n        <total>469.11</total>\r\n      </order>\r\n      <order>\r\n        <id>10630</id>\r\n        <orderdate>1997-08-13T00:00:00</orderdate>\r\n        <total>903.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10718</id>\r\n        <orderdate>1997-10-27T00:00:00</orderdate>\r\n        <total>3463.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10799</id>\r\n        <orderdate>1997-12-26T00:00:00</orderdate>\r\n        <total>1553.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10817</id>\r\n        <orderdate>1998-01-06T00:00:00</orderdate>\r\n        <total>10952.84</total>\r\n      </order>\r\n      <order>\r\n        <id>10849</id>\r\n        <orderdate>1998-01-23T00:00:00</orderdate>\r\n        <total>967.82</total>\r\n      </order>\r\n      <order>\r\n        <id>10893</id>\r\n        <orderdate>1998-02-18T00:00:00</orderdate>\r\n        <total>5502.11</total>\r\n      </order>\r\n      <order>\r\n        <id>11028</id>\r\n        <orderdate>1998-04-16T00:00:00</orderdate>\r\n        <total>2160.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LACOR</id>\r\n    <name>La corne d'abondance</name>\r\n    <address>67, avenue de l'Europe</address>\r\n    <city>Versailles</city>\r\n    <postalcode>78000</postalcode>\r\n    <country>France</country>\r\n    <phone>30.59.84.10</phone>\r\n    <fax>30.59.85.11</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10858</id>\r\n        <orderdate>1998-01-29T00:00:00</orderdate>\r\n        <total>649.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10927</id>\r\n        <orderdate>1998-03-05T00:00:00</orderdate>\r\n        <total>800.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10972</id>\r\n        <orderdate>1998-03-24T00:00:00</orderdate>\r\n        <total>251.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10973</id>\r\n        <orderdate>1998-03-24T00:00:00</orderdate>\r\n        <total>291.55</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LAMAI</id>\r\n    <name>La maison d'Asie</name>\r\n    <address>1 rue Alsace-Lorraine</address>\r\n    <city>Toulouse</city>\r\n    <postalcode>31000</postalcode>\r\n    <country>France</country>\r\n    <phone>61.77.61.10</phone>\r\n    <fax>61.77.61.11</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10350</id>\r\n        <orderdate>1996-11-11T00:00:00</orderdate>\r\n        <total>642.06</total>\r\n      </order>\r\n      <order>\r\n        <id>10358</id>\r\n        <orderdate>1996-11-20T00:00:00</orderdate>\r\n        <total>429.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10371</id>\r\n        <orderdate>1996-12-03T00:00:00</orderdate>\r\n        <total>72.96</total>\r\n      </order>\r\n      <order>\r\n        <id>10413</id>\r\n        <orderdate>1997-01-14T00:00:00</orderdate>\r\n        <total>2123.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10425</id>\r\n        <orderdate>1997-01-24T00:00:00</orderdate>\r\n        <total>360.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10454</id>\r\n        <orderdate>1997-02-21T00:00:00</orderdate>\r\n        <total>331.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10493</id>\r\n        <orderdate>1997-04-02T00:00:00</orderdate>\r\n        <total>608.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10500</id>\r\n        <orderdate>1997-04-09T00:00:00</orderdate>\r\n        <total>523.26</total>\r\n      </order>\r\n      <order>\r\n        <id>10610</id>\r\n        <orderdate>1997-07-25T00:00:00</orderdate>\r\n        <total>299.25</total>\r\n      </order>\r\n      <order>\r\n        <id>10631</id>\r\n        <orderdate>1997-08-14T00:00:00</orderdate>\r\n        <total>55.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10787</id>\r\n        <orderdate>1997-12-19T00:00:00</orderdate>\r\n        <total>2622.76</total>\r\n      </order>\r\n      <order>\r\n        <id>10832</id>\r\n        <orderdate>1998-01-14T00:00:00</orderdate>\r\n        <total>475.11</total>\r\n      </order>\r\n      <order>\r\n        <id>10923</id>\r\n        <orderdate>1998-03-03T00:00:00</orderdate>\r\n        <total>748.80</total>\r\n      </order>\r\n      <order>\r\n        <id>11051</id>\r\n        <orderdate>1998-04-27T00:00:00</orderdate>\r\n        <total>36.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LAUGB</id>\r\n    <name>Laughing Bacchus Wine Cellars</name>\r\n    <address>1900 Oak St.</address>\r\n    <city>Vancouver</city>\r\n    <region>BC</region>\r\n    <postalcode>V3F 2K1</postalcode>\r\n    <country>Canada</country>\r\n    <phone>(604) 555-3392</phone>\r\n    <fax>(604) 555-7293</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10495</id>\r\n        <orderdate>1997-04-03T00:00:00</orderdate>\r\n        <total>278.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10620</id>\r\n        <orderdate>1997-08-05T00:00:00</orderdate>\r\n        <total>57.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10810</id>\r\n        <orderdate>1998-01-01T00:00:00</orderdate>\r\n        <total>187.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LAZYK</id>\r\n    <name>Lazy K Kountry Store</name>\r\n    <address>12 Orchestra Terrace</address>\r\n    <city>Walla Walla</city>\r\n    <region>WA</region>\r\n    <postalcode>99362</postalcode>\r\n    <country>USA</country>\r\n    <phone>(509) 555-7969</phone>\r\n    <fax>(509) 555-6221</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10482</id>\r\n        <orderdate>1997-03-21T00:00:00</orderdate>\r\n        <total>147.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10545</id>\r\n        <orderdate>1997-05-22T00:00:00</orderdate>\r\n        <total>210.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LEHMS</id>\r\n    <name>Lehmanns Marktstand</name>\r\n    <address>Magazinweg 7</address>\r\n    <city>Frankfurt a.M. </city>\r\n    <postalcode>60528</postalcode>\r\n    <country>Germany</country>\r\n    <phone>069-0245984</phone>\r\n    <fax>069-0245874</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10279</id>\r\n        <orderdate>1996-08-13T00:00:00</orderdate>\r\n        <total>351.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10284</id>\r\n        <orderdate>1996-08-19T00:00:00</orderdate>\r\n        <total>1170.38</total>\r\n      </order>\r\n      <order>\r\n        <id>10343</id>\r\n        <orderdate>1996-10-31T00:00:00</orderdate>\r\n        <total>1584.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10497</id>\r\n        <orderdate>1997-04-04T00:00:00</orderdate>\r\n        <total>1380.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10522</id>\r\n        <orderdate>1997-04-30T00:00:00</orderdate>\r\n        <total>2318.24</total>\r\n      </order>\r\n      <order>\r\n        <id>10534</id>\r\n        <orderdate>1997-05-12T00:00:00</orderdate>\r\n        <total>465.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10536</id>\r\n        <orderdate>1997-05-14T00:00:00</orderdate>\r\n        <total>1645.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10557</id>\r\n        <orderdate>1997-06-03T00:00:00</orderdate>\r\n        <total>1152.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10592</id>\r\n        <orderdate>1997-07-08T00:00:00</orderdate>\r\n        <total>516.47</total>\r\n      </order>\r\n      <order>\r\n        <id>10593</id>\r\n        <orderdate>1997-07-09T00:00:00</orderdate>\r\n        <total>1994.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10772</id>\r\n        <orderdate>1997-12-10T00:00:00</orderdate>\r\n        <total>3603.22</total>\r\n      </order>\r\n      <order>\r\n        <id>10862</id>\r\n        <orderdate>1998-01-30T00:00:00</orderdate>\r\n        <total>581.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10891</id>\r\n        <orderdate>1998-02-17T00:00:00</orderdate>\r\n        <total>368.93</total>\r\n      </order>\r\n      <order>\r\n        <id>10934</id>\r\n        <orderdate>1998-03-09T00:00:00</orderdate>\r\n        <total>500.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11070</id>\r\n        <orderdate>1998-05-05T00:00:00</orderdate>\r\n        <total>1629.98</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LETSS</id>\r\n    <name>Let's Stop N Shop</name>\r\n    <address>87 Polk St. Suite 5</address>\r\n    <city>San Francisco</city>\r\n    <region>CA</region>\r\n    <postalcode>94117</postalcode>\r\n    <country>USA</country>\r\n    <phone>(415) 555-5938</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10579</id>\r\n        <orderdate>1997-06-25T00:00:00</orderdate>\r\n        <total>317.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10719</id>\r\n        <orderdate>1997-10-27T00:00:00</orderdate>\r\n        <total>844.25</total>\r\n      </order>\r\n      <order>\r\n        <id>10735</id>\r\n        <orderdate>1997-11-10T00:00:00</orderdate>\r\n        <total>536.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10884</id>\r\n        <orderdate>1998-02-12T00:00:00</orderdate>\r\n        <total>1378.07</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LILAS</id>\r\n    <name>LILA-Supermercado</name>\r\n    <address>Carrera 52 con Ave. Bolívar #65-98 Llano Largo</address>\r\n    <city>Barquisimeto</city>\r\n    <region>Lara</region>\r\n    <postalcode>3508</postalcode>\r\n    <country>Venezuela</country>\r\n    <phone>(9) 331-6954</phone>\r\n    <fax>(9) 331-7256</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10283</id>\r\n        <orderdate>1996-08-16T00:00:00</orderdate>\r\n        <total>1414.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10296</id>\r\n        <orderdate>1996-09-03T00:00:00</orderdate>\r\n        <total>1050.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10330</id>\r\n        <orderdate>1996-10-16T00:00:00</orderdate>\r\n        <total>1649.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10357</id>\r\n        <orderdate>1996-11-19T00:00:00</orderdate>\r\n        <total>1167.68</total>\r\n      </order>\r\n      <order>\r\n        <id>10381</id>\r\n        <orderdate>1996-12-12T00:00:00</orderdate>\r\n        <total>112.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10461</id>\r\n        <orderdate>1997-02-28T00:00:00</orderdate>\r\n        <total>1538.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10499</id>\r\n        <orderdate>1997-04-08T00:00:00</orderdate>\r\n        <total>1412.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10543</id>\r\n        <orderdate>1997-05-21T00:00:00</orderdate>\r\n        <total>1504.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10780</id>\r\n        <orderdate>1997-12-16T00:00:00</orderdate>\r\n        <total>720.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10823</id>\r\n        <orderdate>1998-01-09T00:00:00</orderdate>\r\n        <total>2826.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10899</id>\r\n        <orderdate>1998-02-20T00:00:00</orderdate>\r\n        <total>122.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10997</id>\r\n        <orderdate>1998-04-03T00:00:00</orderdate>\r\n        <total>1885.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11065</id>\r\n        <orderdate>1998-05-01T00:00:00</orderdate>\r\n        <total>189.42</total>\r\n      </order>\r\n      <order>\r\n        <id>11071</id>\r\n        <orderdate>1998-05-05T00:00:00</orderdate>\r\n        <total>484.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LINOD</id>\r\n    <name>LINO-Delicateses</name>\r\n    <address>Ave. 5 de Mayo Porlamar</address>\r\n    <city>I. de Margarita</city>\r\n    <region>Nueva Esparta</region>\r\n    <postalcode>4980</postalcode>\r\n    <country>Venezuela</country>\r\n    <phone>(8) 34-56-12</phone>\r\n    <fax>(8) 34-93-93</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10405</id>\r\n        <orderdate>1997-01-06T00:00:00</orderdate>\r\n        <total>400.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10485</id>\r\n        <orderdate>1997-03-25T00:00:00</orderdate>\r\n        <total>1584.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10638</id>\r\n        <orderdate>1997-08-20T00:00:00</orderdate>\r\n        <total>2720.05</total>\r\n      </order>\r\n      <order>\r\n        <id>10697</id>\r\n        <orderdate>1997-10-08T00:00:00</orderdate>\r\n        <total>805.42</total>\r\n      </order>\r\n      <order>\r\n        <id>10729</id>\r\n        <orderdate>1997-11-04T00:00:00</orderdate>\r\n        <total>1850.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10811</id>\r\n        <orderdate>1998-01-02T00:00:00</orderdate>\r\n        <total>852.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10838</id>\r\n        <orderdate>1998-01-19T00:00:00</orderdate>\r\n        <total>1938.38</total>\r\n      </order>\r\n      <order>\r\n        <id>10840</id>\r\n        <orderdate>1998-01-19T00:00:00</orderdate>\r\n        <total>211.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10919</id>\r\n        <orderdate>1998-03-02T00:00:00</orderdate>\r\n        <total>1122.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10954</id>\r\n        <orderdate>1998-03-17T00:00:00</orderdate>\r\n        <total>1659.54</total>\r\n      </order>\r\n      <order>\r\n        <id>11014</id>\r\n        <orderdate>1998-04-10T00:00:00</orderdate>\r\n        <total>243.18</total>\r\n      </order>\r\n      <order>\r\n        <id>11039</id>\r\n        <orderdate>1998-04-21T00:00:00</orderdate>\r\n        <total>3090.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>LONEP</id>\r\n    <name>Lonesome Pine Restaurant</name>\r\n    <address>89 Chiaroscuro Rd.</address>\r\n    <city>Portland</city>\r\n    <region>OR</region>\r\n    <postalcode>97219</postalcode>\r\n    <country>USA</country>\r\n    <phone>(503) 555-9573</phone>\r\n    <fax>(503) 555-9646</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10307</id>\r\n        <orderdate>1996-09-17T00:00:00</orderdate>\r\n        <total>424.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10317</id>\r\n        <orderdate>1996-09-30T00:00:00</orderdate>\r\n        <total>288.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10544</id>\r\n        <orderdate>1997-05-21T00:00:00</orderdate>\r\n        <total>417.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10662</id>\r\n        <orderdate>1997-09-09T00:00:00</orderdate>\r\n        <total>125.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10665</id>\r\n        <orderdate>1997-09-11T00:00:00</orderdate>\r\n        <total>1295.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10867</id>\r\n        <orderdate>1998-02-03T00:00:00</orderdate>\r\n        <total>98.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10883</id>\r\n        <orderdate>1998-02-12T00:00:00</orderdate>\r\n        <total>36.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11018</id>\r\n        <orderdate>1998-04-13T00:00:00</orderdate>\r\n        <total>1575.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>MAGAA</id>\r\n    <name>Magazzini Alimentari Riuniti</name>\r\n    <address>Via Ludovico il Moro 22</address>\r\n    <city>Bergamo</city>\r\n    <postalcode>24100</postalcode>\r\n    <country>Italy</country>\r\n    <phone>035-640230</phone>\r\n    <fax>035-640231</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10275</id>\r\n        <orderdate>1996-08-07T00:00:00</orderdate>\r\n        <total>291.84</total>\r\n      </order>\r\n      <order>\r\n        <id>10300</id>\r\n        <orderdate>1996-09-09T00:00:00</orderdate>\r\n        <total>608.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10404</id>\r\n        <orderdate>1997-01-03T00:00:00</orderdate>\r\n        <total>1591.25</total>\r\n      </order>\r\n      <order>\r\n        <id>10467</id>\r\n        <orderdate>1997-03-06T00:00:00</orderdate>\r\n        <total>235.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10635</id>\r\n        <orderdate>1997-08-18T00:00:00</orderdate>\r\n        <total>1326.22</total>\r\n      </order>\r\n      <order>\r\n        <id>10754</id>\r\n        <orderdate>1997-11-25T00:00:00</orderdate>\r\n        <total>55.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10784</id>\r\n        <orderdate>1997-12-18T00:00:00</orderdate>\r\n        <total>1488.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10818</id>\r\n        <orderdate>1998-01-07T00:00:00</orderdate>\r\n        <total>833.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10939</id>\r\n        <orderdate>1998-03-10T00:00:00</orderdate>\r\n        <total>637.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10950</id>\r\n        <orderdate>1998-03-16T00:00:00</orderdate>\r\n        <total>110.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>MAISD</id>\r\n    <name>Maison Dewey</name>\r\n    <address>Rue Joseph-Bens 532</address>\r\n    <city>Bruxelles</city>\r\n    <postalcode>B-1180</postalcode>\r\n    <country>Belgium</country>\r\n    <phone>(02) 201 24 67</phone>\r\n    <fax>(02) 201 24 68</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10529</id>\r\n        <orderdate>1997-05-07T00:00:00</orderdate>\r\n        <total>946.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10649</id>\r\n        <orderdate>1997-08-28T00:00:00</orderdate>\r\n        <total>1434.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10760</id>\r\n        <orderdate>1997-12-01T00:00:00</orderdate>\r\n        <total>2917.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10892</id>\r\n        <orderdate>1998-02-17T00:00:00</orderdate>\r\n        <total>2090.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10896</id>\r\n        <orderdate>1998-02-19T00:00:00</orderdate>\r\n        <total>750.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10978</id>\r\n        <orderdate>1998-03-26T00:00:00</orderdate>\r\n        <total>1303.20</total>\r\n      </order>\r\n      <order>\r\n        <id>11004</id>\r\n        <orderdate>1998-04-07T00:00:00</orderdate>\r\n        <total>295.38</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>MEREP</id>\r\n    <name>Mère Paillarde</name>\r\n    <address>43 rue St. Laurent</address>\r\n    <city>Montréal</city>\r\n    <region>Québec</region>\r\n    <postalcode>H1J 1C3</postalcode>\r\n    <country>Canada</country>\r\n    <phone>(514) 555-8054</phone>\r\n    <fax>(514) 555-8055</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10332</id>\r\n        <orderdate>1996-10-17T00:00:00</orderdate>\r\n        <total>1786.88</total>\r\n      </order>\r\n      <order>\r\n        <id>10339</id>\r\n        <orderdate>1996-10-28T00:00:00</orderdate>\r\n        <total>3354.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10376</id>\r\n        <orderdate>1996-12-09T00:00:00</orderdate>\r\n        <total>399.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10424</id>\r\n        <orderdate>1997-01-23T00:00:00</orderdate>\r\n        <total>9194.56</total>\r\n      </order>\r\n      <order>\r\n        <id>10439</id>\r\n        <orderdate>1997-02-07T00:00:00</orderdate>\r\n        <total>1078.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10505</id>\r\n        <orderdate>1997-04-14T00:00:00</orderdate>\r\n        <total>147.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10565</id>\r\n        <orderdate>1997-06-11T00:00:00</orderdate>\r\n        <total>639.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10570</id>\r\n        <orderdate>1997-06-17T00:00:00</orderdate>\r\n        <total>2465.25</total>\r\n      </order>\r\n      <order>\r\n        <id>10590</id>\r\n        <orderdate>1997-07-07T00:00:00</orderdate>\r\n        <total>1101.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10605</id>\r\n        <orderdate>1997-07-21T00:00:00</orderdate>\r\n        <total>4109.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10618</id>\r\n        <orderdate>1997-08-01T00:00:00</orderdate>\r\n        <total>2697.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10619</id>\r\n        <orderdate>1997-08-04T00:00:00</orderdate>\r\n        <total>1260.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10724</id>\r\n        <orderdate>1997-10-30T00:00:00</orderdate>\r\n        <total>638.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>MORGK</id>\r\n    <name>Morgenstern Gesundkost</name>\r\n    <address>Heerstr. 22</address>\r\n    <city>Leipzig</city>\r\n    <postalcode>04179</postalcode>\r\n    <country>Germany</country>\r\n    <phone>0342-023176</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10277</id>\r\n        <orderdate>1996-08-09T00:00:00</orderdate>\r\n        <total>1200.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10575</id>\r\n        <orderdate>1997-06-20T00:00:00</orderdate>\r\n        <total>2147.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10699</id>\r\n        <orderdate>1997-10-09T00:00:00</orderdate>\r\n        <total>114.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10779</id>\r\n        <orderdate>1997-12-16T00:00:00</orderdate>\r\n        <total>1335.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10945</id>\r\n        <orderdate>1998-03-12T00:00:00</orderdate>\r\n        <total>245.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>NORTS</id>\r\n    <name>North/South</name>\r\n    <address>South House, 300 Queensbridge</address>\r\n    <city>London</city>\r\n    <postalcode>SW7 1RZ</postalcode>\r\n    <country>UK</country>\r\n    <phone>(171) 555-7733</phone>\r\n    <fax>(171) 555-2530</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10517</id>\r\n        <orderdate>1997-04-24T00:00:00</orderdate>\r\n        <total>352.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10752</id>\r\n        <orderdate>1997-11-24T00:00:00</orderdate>\r\n        <total>252.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11057</id>\r\n        <orderdate>1998-04-29T00:00:00</orderdate>\r\n        <total>45.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>OCEAN</id>\r\n    <name>Océano Atlántico Ltda.</name>\r\n    <address>Ing. Gustavo Moncada 8585, Piso 20-A</address>\r\n    <city>Buenos Aires</city>\r\n    <postalcode>1010</postalcode>\r\n    <country>Argentina</country>\r\n    <phone>(1) 135-5333</phone>\r\n    <fax>(1) 135-5535</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10409</id>\r\n        <orderdate>1997-01-09T00:00:00</orderdate>\r\n        <total>319.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10531</id>\r\n        <orderdate>1997-05-08T00:00:00</orderdate>\r\n        <total>110.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10898</id>\r\n        <orderdate>1998-02-20T00:00:00</orderdate>\r\n        <total>30.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10958</id>\r\n        <orderdate>1998-03-18T00:00:00</orderdate>\r\n        <total>781.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10986</id>\r\n        <orderdate>1998-03-30T00:00:00</orderdate>\r\n        <total>2220.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>OLDWO</id>\r\n    <name>Old World Delicatessen</name>\r\n    <address>2743 Bering St.</address>\r\n    <city>Anchorage</city>\r\n    <region>AK</region>\r\n    <postalcode>99508</postalcode>\r\n    <country>USA</country>\r\n    <phone>(907) 555-7584</phone>\r\n    <fax>(907) 555-2880</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10260</id>\r\n        <orderdate>1996-07-19T00:00:00</orderdate>\r\n        <total>1504.65</total>\r\n      </order>\r\n      <order>\r\n        <id>10305</id>\r\n        <orderdate>1996-09-13T00:00:00</orderdate>\r\n        <total>3741.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10338</id>\r\n        <orderdate>1996-10-25T00:00:00</orderdate>\r\n        <total>934.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10441</id>\r\n        <orderdate>1997-02-10T00:00:00</orderdate>\r\n        <total>1755.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10594</id>\r\n        <orderdate>1997-07-09T00:00:00</orderdate>\r\n        <total>565.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10680</id>\r\n        <orderdate>1997-09-24T00:00:00</orderdate>\r\n        <total>1261.88</total>\r\n      </order>\r\n      <order>\r\n        <id>10706</id>\r\n        <orderdate>1997-10-16T00:00:00</orderdate>\r\n        <total>1893.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10855</id>\r\n        <orderdate>1998-01-27T00:00:00</orderdate>\r\n        <total>2227.89</total>\r\n      </order>\r\n      <order>\r\n        <id>10965</id>\r\n        <orderdate>1998-03-20T00:00:00</orderdate>\r\n        <total>848.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11034</id>\r\n        <orderdate>1998-04-20T00:00:00</orderdate>\r\n        <total>539.40</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>OTTIK</id>\r\n    <name>Ottilies Käseladen</name>\r\n    <address>Mehrheimerstr. 369</address>\r\n    <city>Köln</city>\r\n    <postalcode>50739</postalcode>\r\n    <country>Germany</country>\r\n    <phone>0221-0644327</phone>\r\n    <fax>0221-0765721</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10407</id>\r\n        <orderdate>1997-01-07T00:00:00</orderdate>\r\n        <total>1194.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10508</id>\r\n        <orderdate>1997-04-16T00:00:00</orderdate>\r\n        <total>240.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10554</id>\r\n        <orderdate>1997-05-30T00:00:00</orderdate>\r\n        <total>1728.52</total>\r\n      </order>\r\n      <order>\r\n        <id>10580</id>\r\n        <orderdate>1997-06-26T00:00:00</orderdate>\r\n        <total>1013.74</total>\r\n      </order>\r\n      <order>\r\n        <id>10684</id>\r\n        <orderdate>1997-09-26T00:00:00</orderdate>\r\n        <total>1768.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10766</id>\r\n        <orderdate>1997-12-05T00:00:00</orderdate>\r\n        <total>2310.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10833</id>\r\n        <orderdate>1998-01-15T00:00:00</orderdate>\r\n        <total>906.93</total>\r\n      </order>\r\n      <order>\r\n        <id>10999</id>\r\n        <orderdate>1998-04-03T00:00:00</orderdate>\r\n        <total>1197.95</total>\r\n      </order>\r\n      <order>\r\n        <id>11020</id>\r\n        <orderdate>1998-04-14T00:00:00</orderdate>\r\n        <total>632.40</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>PARIS</id>\r\n    <name>Paris spécialités</name>\r\n    <address>265, boulevard Charonne</address>\r\n    <city>Paris</city>\r\n    <postalcode>75012</postalcode>\r\n    <country>France</country>\r\n    <phone>(1) 42.34.22.66</phone>\r\n    <fax>(1) 42.34.22.77</fax>\r\n    <orders />\r\n  </customer>\r\n  <customer>\r\n    <id>PERIC</id>\r\n    <name>Pericles Comidas clásicas</name>\r\n    <address>Calle Dr. Jorge Cash 321</address>\r\n    <city>México D.F.</city>\r\n    <postalcode>05033</postalcode>\r\n    <country>Mexico</country>\r\n    <phone>(5) 552-3745</phone>\r\n    <fax>(5) 545-3745</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10322</id>\r\n        <orderdate>1996-10-04T00:00:00</orderdate>\r\n        <total>112.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10354</id>\r\n        <orderdate>1996-11-14T00:00:00</orderdate>\r\n        <total>568.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10474</id>\r\n        <orderdate>1997-03-13T00:00:00</orderdate>\r\n        <total>1249.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10502</id>\r\n        <orderdate>1997-04-10T00:00:00</orderdate>\r\n        <total>816.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10995</id>\r\n        <orderdate>1998-04-02T00:00:00</orderdate>\r\n        <total>1196.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11073</id>\r\n        <orderdate>1998-05-05T00:00:00</orderdate>\r\n        <total>300.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>PICCO</id>\r\n    <name>Piccolo und mehr</name>\r\n    <address>Geislweg 14</address>\r\n    <city>Salzburg</city>\r\n    <postalcode>5020</postalcode>\r\n    <country>Austria</country>\r\n    <phone>6562-9722</phone>\r\n    <fax>6562-9723</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10353</id>\r\n        <orderdate>1996-11-13T00:00:00</orderdate>\r\n        <total>8593.28</total>\r\n      </order>\r\n      <order>\r\n        <id>10392</id>\r\n        <orderdate>1996-12-24T00:00:00</orderdate>\r\n        <total>1440.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10427</id>\r\n        <orderdate>1997-01-27T00:00:00</orderdate>\r\n        <total>651.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10489</id>\r\n        <orderdate>1997-03-28T00:00:00</orderdate>\r\n        <total>439.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10530</id>\r\n        <orderdate>1997-05-08T00:00:00</orderdate>\r\n        <total>4180.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10597</id>\r\n        <orderdate>1997-07-11T00:00:00</orderdate>\r\n        <total>718.08</total>\r\n      </order>\r\n      <order>\r\n        <id>10686</id>\r\n        <orderdate>1997-09-30T00:00:00</orderdate>\r\n        <total>1404.45</total>\r\n      </order>\r\n      <order>\r\n        <id>10747</id>\r\n        <orderdate>1997-11-19T00:00:00</orderdate>\r\n        <total>1912.85</total>\r\n      </order>\r\n      <order>\r\n        <id>10844</id>\r\n        <orderdate>1998-01-21T00:00:00</orderdate>\r\n        <total>735.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11053</id>\r\n        <orderdate>1998-04-27T00:00:00</orderdate>\r\n        <total>3055.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>PRINI</id>\r\n    <name>Princesa Isabel Vinhos</name>\r\n    <address>Estrada da saúde n. 58</address>\r\n    <city>Lisboa</city>\r\n    <postalcode>1756</postalcode>\r\n    <country>Portugal</country>\r\n    <phone>(1) 356-5634</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10336</id>\r\n        <orderdate>1996-10-23T00:00:00</orderdate>\r\n        <total>285.12</total>\r\n      </order>\r\n      <order>\r\n        <id>10397</id>\r\n        <orderdate>1996-12-27T00:00:00</orderdate>\r\n        <total>716.72</total>\r\n      </order>\r\n      <order>\r\n        <id>10433</id>\r\n        <orderdate>1997-02-03T00:00:00</orderdate>\r\n        <total>851.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10477</id>\r\n        <orderdate>1997-03-17T00:00:00</orderdate>\r\n        <total>558.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10808</id>\r\n        <orderdate>1998-01-01T00:00:00</orderdate>\r\n        <total>1411.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11007</id>\r\n        <orderdate>1998-04-08T00:00:00</orderdate>\r\n        <total>2633.90</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>QUEDE</id>\r\n    <name>Que Delícia</name>\r\n    <address>Rua da Panificadora, 12</address>\r\n    <city>Rio de Janeiro</city>\r\n    <region>RJ</region>\r\n    <postalcode>02389-673</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(21) 555-4252</phone>\r\n    <fax>(21) 555-4545</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10261</id>\r\n        <orderdate>1996-07-19T00:00:00</orderdate>\r\n        <total>448.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10291</id>\r\n        <orderdate>1996-08-27T00:00:00</orderdate>\r\n        <total>497.52</total>\r\n      </order>\r\n      <order>\r\n        <id>10379</id>\r\n        <orderdate>1996-12-11T00:00:00</orderdate>\r\n        <total>863.28</total>\r\n      </order>\r\n      <order>\r\n        <id>10421</id>\r\n        <orderdate>1997-01-21T00:00:00</orderdate>\r\n        <total>1194.27</total>\r\n      </order>\r\n      <order>\r\n        <id>10587</id>\r\n        <orderdate>1997-07-02T00:00:00</orderdate>\r\n        <total>807.38</total>\r\n      </order>\r\n      <order>\r\n        <id>10647</id>\r\n        <orderdate>1997-08-27T00:00:00</orderdate>\r\n        <total>636.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10720</id>\r\n        <orderdate>1997-10-28T00:00:00</orderdate>\r\n        <total>550.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10794</id>\r\n        <orderdate>1997-12-24T00:00:00</orderdate>\r\n        <total>314.76</total>\r\n      </order>\r\n      <order>\r\n        <id>10989</id>\r\n        <orderdate>1998-03-31T00:00:00</orderdate>\r\n        <total>1353.60</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>QUEEN</id>\r\n    <name>Queen Cozinha</name>\r\n    <address>Alameda dos Canàrios, 891</address>\r\n    <city>São Paulo</city>\r\n    <region>SP</region>\r\n    <postalcode>05487-020</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(11) 555-1189</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10372</id>\r\n        <orderdate>1996-12-04T00:00:00</orderdate>\r\n        <total>9210.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10406</id>\r\n        <orderdate>1997-01-07T00:00:00</orderdate>\r\n        <total>1830.78</total>\r\n      </order>\r\n      <order>\r\n        <id>10487</id>\r\n        <orderdate>1997-03-26T00:00:00</orderdate>\r\n        <total>889.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10637</id>\r\n        <orderdate>1997-08-19T00:00:00</orderdate>\r\n        <total>2761.94</total>\r\n      </order>\r\n      <order>\r\n        <id>10659</id>\r\n        <orderdate>1997-09-05T00:00:00</orderdate>\r\n        <total>1227.02</total>\r\n      </order>\r\n      <order>\r\n        <id>10704</id>\r\n        <orderdate>1997-10-14T00:00:00</orderdate>\r\n        <total>595.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10728</id>\r\n        <orderdate>1997-11-04T00:00:00</orderdate>\r\n        <total>1296.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10786</id>\r\n        <orderdate>1997-12-19T00:00:00</orderdate>\r\n        <total>1531.08</total>\r\n      </order>\r\n      <order>\r\n        <id>10868</id>\r\n        <orderdate>1998-02-04T00:00:00</orderdate>\r\n        <total>1920.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10913</id>\r\n        <orderdate>1998-02-26T00:00:00</orderdate>\r\n        <total>768.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10914</id>\r\n        <orderdate>1998-02-27T00:00:00</orderdate>\r\n        <total>537.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10961</id>\r\n        <orderdate>1998-03-19T00:00:00</orderdate>\r\n        <total>1119.90</total>\r\n      </order>\r\n      <order>\r\n        <id>11068</id>\r\n        <orderdate>1998-05-04T00:00:00</orderdate>\r\n        <total>2027.08</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>QUICK</id>\r\n    <name>QUICK-Stop</name>\r\n    <address>Taucherstraße 10</address>\r\n    <city>Cunewalde</city>\r\n    <postalcode>01307</postalcode>\r\n    <country>Germany</country>\r\n    <phone>0372-035188</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10273</id>\r\n        <orderdate>1996-08-05T00:00:00</orderdate>\r\n        <total>2037.28</total>\r\n      </order>\r\n      <order>\r\n        <id>10285</id>\r\n        <orderdate>1996-08-20T00:00:00</orderdate>\r\n        <total>1743.36</total>\r\n      </order>\r\n      <order>\r\n        <id>10286</id>\r\n        <orderdate>1996-08-21T00:00:00</orderdate>\r\n        <total>3016.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10313</id>\r\n        <orderdate>1996-09-24T00:00:00</orderdate>\r\n        <total>182.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10345</id>\r\n        <orderdate>1996-11-04T00:00:00</orderdate>\r\n        <total>2924.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10361</id>\r\n        <orderdate>1996-11-22T00:00:00</orderdate>\r\n        <total>2046.24</total>\r\n      </order>\r\n      <order>\r\n        <id>10418</id>\r\n        <orderdate>1997-01-17T00:00:00</orderdate>\r\n        <total>1814.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10451</id>\r\n        <orderdate>1997-02-19T00:00:00</orderdate>\r\n        <total>3849.66</total>\r\n      </order>\r\n      <order>\r\n        <id>10515</id>\r\n        <orderdate>1997-04-23T00:00:00</orderdate>\r\n        <total>9921.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10527</id>\r\n        <orderdate>1997-05-05T00:00:00</orderdate>\r\n        <total>1503.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10540</id>\r\n        <orderdate>1997-05-19T00:00:00</orderdate>\r\n        <total>10191.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10549</id>\r\n        <orderdate>1997-05-27T00:00:00</orderdate>\r\n        <total>3554.28</total>\r\n      </order>\r\n      <order>\r\n        <id>10588</id>\r\n        <orderdate>1997-07-03T00:00:00</orderdate>\r\n        <total>3120.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10658</id>\r\n        <orderdate>1997-09-05T00:00:00</orderdate>\r\n        <total>4464.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10691</id>\r\n        <orderdate>1997-10-03T00:00:00</orderdate>\r\n        <total>10164.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10694</id>\r\n        <orderdate>1997-10-06T00:00:00</orderdate>\r\n        <total>4825.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10721</id>\r\n        <orderdate>1997-10-29T00:00:00</orderdate>\r\n        <total>923.88</total>\r\n      </order>\r\n      <order>\r\n        <id>10745</id>\r\n        <orderdate>1997-11-18T00:00:00</orderdate>\r\n        <total>4529.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10765</id>\r\n        <orderdate>1997-12-04T00:00:00</orderdate>\r\n        <total>1515.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10788</id>\r\n        <orderdate>1997-12-22T00:00:00</orderdate>\r\n        <total>731.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10845</id>\r\n        <orderdate>1998-01-21T00:00:00</orderdate>\r\n        <total>3812.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10865</id>\r\n        <orderdate>1998-02-02T00:00:00</orderdate>\r\n        <total>16387.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10878</id>\r\n        <orderdate>1998-02-10T00:00:00</orderdate>\r\n        <total>1539.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10938</id>\r\n        <orderdate>1998-03-10T00:00:00</orderdate>\r\n        <total>2731.88</total>\r\n      </order>\r\n      <order>\r\n        <id>10962</id>\r\n        <orderdate>1998-03-19T00:00:00</orderdate>\r\n        <total>3584.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10991</id>\r\n        <orderdate>1998-04-01T00:00:00</orderdate>\r\n        <total>2296.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10996</id>\r\n        <orderdate>1998-04-02T00:00:00</orderdate>\r\n        <total>560.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11021</id>\r\n        <orderdate>1998-04-14T00:00:00</orderdate>\r\n        <total>6306.24</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>RANCH</id>\r\n    <name>Rancho grande</name>\r\n    <address>Av. del Libertador 900</address>\r\n    <city>Buenos Aires</city>\r\n    <postalcode>1010</postalcode>\r\n    <country>Argentina</country>\r\n    <phone>(1) 123-5555</phone>\r\n    <fax>(1) 123-5556</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10448</id>\r\n        <orderdate>1997-02-17T00:00:00</orderdate>\r\n        <total>443.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10716</id>\r\n        <orderdate>1997-10-24T00:00:00</orderdate>\r\n        <total>706.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10828</id>\r\n        <orderdate>1998-01-13T00:00:00</orderdate>\r\n        <total>932.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10916</id>\r\n        <orderdate>1998-02-27T00:00:00</orderdate>\r\n        <total>686.70</total>\r\n      </order>\r\n      <order>\r\n        <id>11019</id>\r\n        <orderdate>1998-04-13T00:00:00</orderdate>\r\n        <total>76.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>RATTC</id>\r\n    <name>Rattlesnake Canyon Grocery</name>\r\n    <address>2817 Milton Dr.</address>\r\n    <city>Albuquerque</city>\r\n    <region>NM</region>\r\n    <postalcode>87110</postalcode>\r\n    <country>USA</country>\r\n    <phone>(505) 555-5939</phone>\r\n    <fax>(505) 555-3620</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10262</id>\r\n        <orderdate>1996-07-22T00:00:00</orderdate>\r\n        <total>584.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10272</id>\r\n        <orderdate>1996-08-02T00:00:00</orderdate>\r\n        <total>1456.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10294</id>\r\n        <orderdate>1996-08-30T00:00:00</orderdate>\r\n        <total>1887.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10314</id>\r\n        <orderdate>1996-09-25T00:00:00</orderdate>\r\n        <total>2094.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10316</id>\r\n        <orderdate>1996-09-27T00:00:00</orderdate>\r\n        <total>2835.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10346</id>\r\n        <orderdate>1996-11-05T00:00:00</orderdate>\r\n        <total>1618.88</total>\r\n      </order>\r\n      <order>\r\n        <id>10401</id>\r\n        <orderdate>1997-01-01T00:00:00</orderdate>\r\n        <total>3868.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10479</id>\r\n        <orderdate>1997-03-19T00:00:00</orderdate>\r\n        <total>10495.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10564</id>\r\n        <orderdate>1997-06-10T00:00:00</orderdate>\r\n        <total>1234.05</total>\r\n      </order>\r\n      <order>\r\n        <id>10569</id>\r\n        <orderdate>1997-06-16T00:00:00</orderdate>\r\n        <total>890.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10598</id>\r\n        <orderdate>1997-07-14T00:00:00</orderdate>\r\n        <total>2388.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10761</id>\r\n        <orderdate>1997-12-02T00:00:00</orderdate>\r\n        <total>507.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10820</id>\r\n        <orderdate>1998-01-07T00:00:00</orderdate>\r\n        <total>1140.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10852</id>\r\n        <orderdate>1998-01-26T00:00:00</orderdate>\r\n        <total>2984.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10889</id>\r\n        <orderdate>1998-02-16T00:00:00</orderdate>\r\n        <total>11380.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10988</id>\r\n        <orderdate>1998-03-31T00:00:00</orderdate>\r\n        <total>3574.80</total>\r\n      </order>\r\n      <order>\r\n        <id>11000</id>\r\n        <orderdate>1998-04-06T00:00:00</orderdate>\r\n        <total>903.75</total>\r\n      </order>\r\n      <order>\r\n        <id>11077</id>\r\n        <orderdate>1998-05-06T00:00:00</orderdate>\r\n        <total>1255.72</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>REGGC</id>\r\n    <name>Reggiani Caseifici</name>\r\n    <address>Strada Provinciale 124</address>\r\n    <city>Reggio Emilia</city>\r\n    <postalcode>42100</postalcode>\r\n    <country>Italy</country>\r\n    <phone>0522-556721</phone>\r\n    <fax>0522-556722</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10288</id>\r\n        <orderdate>1996-08-23T00:00:00</orderdate>\r\n        <total>80.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10428</id>\r\n        <orderdate>1997-01-28T00:00:00</orderdate>\r\n        <total>192.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10443</id>\r\n        <orderdate>1997-02-12T00:00:00</orderdate>\r\n        <total>517.44</total>\r\n      </order>\r\n      <order>\r\n        <id>10562</id>\r\n        <orderdate>1997-06-09T00:00:00</orderdate>\r\n        <total>488.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10586</id>\r\n        <orderdate>1997-07-02T00:00:00</orderdate>\r\n        <total>23.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10655</id>\r\n        <orderdate>1997-09-03T00:00:00</orderdate>\r\n        <total>154.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10727</id>\r\n        <orderdate>1997-11-03T00:00:00</orderdate>\r\n        <total>1624.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10812</id>\r\n        <orderdate>1998-01-02T00:00:00</orderdate>\r\n        <total>1692.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10908</id>\r\n        <orderdate>1998-02-26T00:00:00</orderdate>\r\n        <total>663.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10942</id>\r\n        <orderdate>1998-03-11T00:00:00</orderdate>\r\n        <total>560.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11010</id>\r\n        <orderdate>1998-04-09T00:00:00</orderdate>\r\n        <total>645.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11062</id>\r\n        <orderdate>1998-04-30T00:00:00</orderdate>\r\n        <total>406.40</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>RICAR</id>\r\n    <name>Ricardo Adocicados</name>\r\n    <address>Av. Copacabana, 267</address>\r\n    <city>Rio de Janeiro</city>\r\n    <region>RJ</region>\r\n    <postalcode>02389-890</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(21) 555-3412</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10287</id>\r\n        <orderdate>1996-08-22T00:00:00</orderdate>\r\n        <total>819.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10299</id>\r\n        <orderdate>1996-09-06T00:00:00</orderdate>\r\n        <total>349.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10447</id>\r\n        <orderdate>1997-02-14T00:00:00</orderdate>\r\n        <total>914.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10481</id>\r\n        <orderdate>1997-03-20T00:00:00</orderdate>\r\n        <total>1472.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10563</id>\r\n        <orderdate>1997-06-10T00:00:00</orderdate>\r\n        <total>965.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10622</id>\r\n        <orderdate>1997-08-06T00:00:00</orderdate>\r\n        <total>560.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10648</id>\r\n        <orderdate>1997-08-28T00:00:00</orderdate>\r\n        <total>372.38</total>\r\n      </order>\r\n      <order>\r\n        <id>10813</id>\r\n        <orderdate>1998-01-05T00:00:00</orderdate>\r\n        <total>602.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10851</id>\r\n        <orderdate>1998-01-26T00:00:00</orderdate>\r\n        <total>2603.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10877</id>\r\n        <orderdate>1998-02-09T00:00:00</orderdate>\r\n        <total>1955.12</total>\r\n      </order>\r\n      <order>\r\n        <id>11059</id>\r\n        <orderdate>1998-04-29T00:00:00</orderdate>\r\n        <total>1838.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>RICSU</id>\r\n    <name>Richter Supermarkt</name>\r\n    <address>Grenzacherweg 237</address>\r\n    <city>Genève</city>\r\n    <postalcode>1203</postalcode>\r\n    <country>Switzerland</country>\r\n    <phone>0897-034214</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10255</id>\r\n        <orderdate>1996-07-12T00:00:00</orderdate>\r\n        <total>2490.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10419</id>\r\n        <orderdate>1997-01-20T00:00:00</orderdate>\r\n        <total>2097.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10537</id>\r\n        <orderdate>1997-05-14T00:00:00</orderdate>\r\n        <total>1823.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10666</id>\r\n        <orderdate>1997-09-12T00:00:00</orderdate>\r\n        <total>4666.94</total>\r\n      </order>\r\n      <order>\r\n        <id>10751</id>\r\n        <orderdate>1997-11-24T00:00:00</orderdate>\r\n        <total>1631.48</total>\r\n      </order>\r\n      <order>\r\n        <id>10758</id>\r\n        <orderdate>1997-11-28T00:00:00</orderdate>\r\n        <total>1644.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10931</id>\r\n        <orderdate>1998-03-06T00:00:00</orderdate>\r\n        <total>799.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10951</id>\r\n        <orderdate>1998-03-16T00:00:00</orderdate>\r\n        <total>458.76</total>\r\n      </order>\r\n      <order>\r\n        <id>11033</id>\r\n        <orderdate>1998-04-17T00:00:00</orderdate>\r\n        <total>3232.80</total>\r\n      </order>\r\n      <order>\r\n        <id>11075</id>\r\n        <orderdate>1998-05-06T00:00:00</orderdate>\r\n        <total>498.10</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>ROMEY</id>\r\n    <name>Romero y tomillo</name>\r\n    <address>Gran Vía, 1</address>\r\n    <city>Madrid</city>\r\n    <postalcode>28001</postalcode>\r\n    <country>Spain</country>\r\n    <phone>(91) 745 6200</phone>\r\n    <fax>(91) 745 6210</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10281</id>\r\n        <orderdate>1996-08-14T00:00:00</orderdate>\r\n        <total>86.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10282</id>\r\n        <orderdate>1996-08-15T00:00:00</orderdate>\r\n        <total>155.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10306</id>\r\n        <orderdate>1996-09-16T00:00:00</orderdate>\r\n        <total>498.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10917</id>\r\n        <orderdate>1998-03-02T00:00:00</orderdate>\r\n        <total>365.89</total>\r\n      </order>\r\n      <order>\r\n        <id>11013</id>\r\n        <orderdate>1998-04-09T00:00:00</orderdate>\r\n        <total>361.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>SANTG</id>\r\n    <name>Santé Gourmet</name>\r\n    <address>Erling Skakkes gate 78</address>\r\n    <city>Stavern</city>\r\n    <postalcode>4110</postalcode>\r\n    <country>Norway</country>\r\n    <phone>07-98 92 35</phone>\r\n    <fax>07-98 92 47</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10387</id>\r\n        <orderdate>1996-12-18T00:00:00</orderdate>\r\n        <total>1058.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10520</id>\r\n        <orderdate>1997-04-29T00:00:00</orderdate>\r\n        <total>200.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10639</id>\r\n        <orderdate>1997-08-20T00:00:00</orderdate>\r\n        <total>500.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10831</id>\r\n        <orderdate>1998-01-14T00:00:00</orderdate>\r\n        <total>2684.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10909</id>\r\n        <orderdate>1998-02-26T00:00:00</orderdate>\r\n        <total>670.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11015</id>\r\n        <orderdate>1998-04-10T00:00:00</orderdate>\r\n        <total>622.35</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>SAVEA</id>\r\n    <name>Save-a-lot Markets</name>\r\n    <address>187 Suffolk Ln.</address>\r\n    <city>Boise</city>\r\n    <region>ID</region>\r\n    <postalcode>83720</postalcode>\r\n    <country>USA</country>\r\n    <phone>(208) 555-8097</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10324</id>\r\n        <orderdate>1996-10-08T00:00:00</orderdate>\r\n        <total>5275.72</total>\r\n      </order>\r\n      <order>\r\n        <id>10393</id>\r\n        <orderdate>1996-12-25T00:00:00</orderdate>\r\n        <total>2556.95</total>\r\n      </order>\r\n      <order>\r\n        <id>10398</id>\r\n        <orderdate>1996-12-30T00:00:00</orderdate>\r\n        <total>2505.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10440</id>\r\n        <orderdate>1997-02-10T00:00:00</orderdate>\r\n        <total>4924.14</total>\r\n      </order>\r\n      <order>\r\n        <id>10452</id>\r\n        <orderdate>1997-02-20T00:00:00</orderdate>\r\n        <total>2018.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10510</id>\r\n        <orderdate>1997-04-18T00:00:00</orderdate>\r\n        <total>4707.54</total>\r\n      </order>\r\n      <order>\r\n        <id>10555</id>\r\n        <orderdate>1997-06-02T00:00:00</orderdate>\r\n        <total>2944.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10603</id>\r\n        <orderdate>1997-07-18T00:00:00</orderdate>\r\n        <total>1483.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10607</id>\r\n        <orderdate>1997-07-22T00:00:00</orderdate>\r\n        <total>6475.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10612</id>\r\n        <orderdate>1997-07-28T00:00:00</orderdate>\r\n        <total>6375.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10627</id>\r\n        <orderdate>1997-08-11T00:00:00</orderdate>\r\n        <total>1185.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10657</id>\r\n        <orderdate>1997-09-04T00:00:00</orderdate>\r\n        <total>4371.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10678</id>\r\n        <orderdate>1997-09-23T00:00:00</orderdate>\r\n        <total>5256.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10700</id>\r\n        <orderdate>1997-10-10T00:00:00</orderdate>\r\n        <total>1638.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10711</id>\r\n        <orderdate>1997-10-21T00:00:00</orderdate>\r\n        <total>4451.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10713</id>\r\n        <orderdate>1997-10-22T00:00:00</orderdate>\r\n        <total>2827.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10714</id>\r\n        <orderdate>1997-10-22T00:00:00</orderdate>\r\n        <total>2205.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10722</id>\r\n        <orderdate>1997-10-29T00:00:00</orderdate>\r\n        <total>1570.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10748</id>\r\n        <orderdate>1997-11-20T00:00:00</orderdate>\r\n        <total>2196.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10757</id>\r\n        <orderdate>1997-11-27T00:00:00</orderdate>\r\n        <total>3082.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10815</id>\r\n        <orderdate>1998-01-05T00:00:00</orderdate>\r\n        <total>40.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10847</id>\r\n        <orderdate>1998-01-22T00:00:00</orderdate>\r\n        <total>4931.92</total>\r\n      </order>\r\n      <order>\r\n        <id>10882</id>\r\n        <orderdate>1998-02-11T00:00:00</orderdate>\r\n        <total>892.64</total>\r\n      </order>\r\n      <order>\r\n        <id>10894</id>\r\n        <orderdate>1998-02-18T00:00:00</orderdate>\r\n        <total>2753.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10941</id>\r\n        <orderdate>1998-03-11T00:00:00</orderdate>\r\n        <total>4011.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10983</id>\r\n        <orderdate>1998-03-27T00:00:00</orderdate>\r\n        <total>720.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10984</id>\r\n        <orderdate>1998-03-30T00:00:00</orderdate>\r\n        <total>1809.75</total>\r\n      </order>\r\n      <order>\r\n        <id>11002</id>\r\n        <orderdate>1998-04-06T00:00:00</orderdate>\r\n        <total>1811.10</total>\r\n      </order>\r\n      <order>\r\n        <id>11030</id>\r\n        <orderdate>1998-04-17T00:00:00</orderdate>\r\n        <total>12615.05</total>\r\n      </order>\r\n      <order>\r\n        <id>11031</id>\r\n        <orderdate>1998-04-17T00:00:00</orderdate>\r\n        <total>2393.50</total>\r\n      </order>\r\n      <order>\r\n        <id>11064</id>\r\n        <orderdate>1998-05-01T00:00:00</orderdate>\r\n        <total>4330.40</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>SEVES</id>\r\n    <name>Seven Seas Imports</name>\r\n    <address>90 Wadhurst Rd.</address>\r\n    <city>London</city>\r\n    <postalcode>OX15 4NB</postalcode>\r\n    <country>UK</country>\r\n    <phone>(171) 555-1717</phone>\r\n    <fax>(171) 555-5646</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10359</id>\r\n        <orderdate>1996-11-21T00:00:00</orderdate>\r\n        <total>3471.68</total>\r\n      </order>\r\n      <order>\r\n        <id>10377</id>\r\n        <orderdate>1996-12-09T00:00:00</orderdate>\r\n        <total>863.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10388</id>\r\n        <orderdate>1996-12-19T00:00:00</orderdate>\r\n        <total>1228.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10472</id>\r\n        <orderdate>1997-03-12T00:00:00</orderdate>\r\n        <total>1036.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10523</id>\r\n        <orderdate>1997-05-01T00:00:00</orderdate>\r\n        <total>2444.31</total>\r\n      </order>\r\n      <order>\r\n        <id>10547</id>\r\n        <orderdate>1997-05-23T00:00:00</orderdate>\r\n        <total>1792.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10800</id>\r\n        <orderdate>1997-12-26T00:00:00</orderdate>\r\n        <total>1468.94</total>\r\n      </order>\r\n      <order>\r\n        <id>10804</id>\r\n        <orderdate>1997-12-30T00:00:00</orderdate>\r\n        <total>2278.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10869</id>\r\n        <orderdate>1998-02-04T00:00:00</orderdate>\r\n        <total>1630.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>SIMOB</id>\r\n    <name>Simons bistro</name>\r\n    <address>Vinbæltet 34</address>\r\n    <city>København</city>\r\n    <postalcode>1734</postalcode>\r\n    <country>Denmark</country>\r\n    <phone>31 12 34 56</phone>\r\n    <fax>31 13 35 57</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10341</id>\r\n        <orderdate>1996-10-29T00:00:00</orderdate>\r\n        <total>352.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10417</id>\r\n        <orderdate>1997-01-16T00:00:00</orderdate>\r\n        <total>11188.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10556</id>\r\n        <orderdate>1997-06-03T00:00:00</orderdate>\r\n        <total>835.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10642</id>\r\n        <orderdate>1997-08-22T00:00:00</orderdate>\r\n        <total>696.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10669</id>\r\n        <orderdate>1997-09-15T00:00:00</orderdate>\r\n        <total>570.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10802</id>\r\n        <orderdate>1997-12-29T00:00:00</orderdate>\r\n        <total>2942.81</total>\r\n      </order>\r\n      <order>\r\n        <id>11074</id>\r\n        <orderdate>1998-05-06T00:00:00</orderdate>\r\n        <total>232.08</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>SPECD</id>\r\n    <name>Spécialités du monde</name>\r\n    <address>25, rue Lauriston</address>\r\n    <city>Paris</city>\r\n    <postalcode>75016</postalcode>\r\n    <country>France</country>\r\n    <phone>(1) 47.55.60.10</phone>\r\n    <fax>(1) 47.55.60.20</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10738</id>\r\n        <orderdate>1997-11-12T00:00:00</orderdate>\r\n        <total>52.35</total>\r\n      </order>\r\n      <order>\r\n        <id>10907</id>\r\n        <orderdate>1998-02-25T00:00:00</orderdate>\r\n        <total>108.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10964</id>\r\n        <orderdate>1998-03-20T00:00:00</orderdate>\r\n        <total>2052.50</total>\r\n      </order>\r\n      <order>\r\n        <id>11043</id>\r\n        <orderdate>1998-04-22T00:00:00</orderdate>\r\n        <total>210.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>SPLIR</id>\r\n    <name>Split Rail Beer &amp; Ale</name>\r\n    <address>P.O. Box 555</address>\r\n    <city>Lander</city>\r\n    <region>WY</region>\r\n    <postalcode>82520</postalcode>\r\n    <country>USA</country>\r\n    <phone>(307) 555-4680</phone>\r\n    <fax>(307) 555-6525</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10271</id>\r\n        <orderdate>1996-08-01T00:00:00</orderdate>\r\n        <total>48.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10329</id>\r\n        <orderdate>1996-10-15T00:00:00</orderdate>\r\n        <total>4578.43</total>\r\n      </order>\r\n      <order>\r\n        <id>10349</id>\r\n        <orderdate>1996-11-08T00:00:00</orderdate>\r\n        <total>141.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10369</id>\r\n        <orderdate>1996-12-02T00:00:00</orderdate>\r\n        <total>2390.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10385</id>\r\n        <orderdate>1996-12-17T00:00:00</orderdate>\r\n        <total>691.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10432</id>\r\n        <orderdate>1997-01-31T00:00:00</orderdate>\r\n        <total>485.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10756</id>\r\n        <orderdate>1997-11-27T00:00:00</orderdate>\r\n        <total>1990.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10821</id>\r\n        <orderdate>1998-01-08T00:00:00</orderdate>\r\n        <total>678.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10974</id>\r\n        <orderdate>1998-03-25T00:00:00</orderdate>\r\n        <total>439.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>SUPRD</id>\r\n    <name>Suprêmes délices</name>\r\n    <address>Boulevard Tirou, 255</address>\r\n    <city>Charleroi</city>\r\n    <postalcode>B-6000</postalcode>\r\n    <country>Belgium</country>\r\n    <phone>(071) 23 67 22 20</phone>\r\n    <fax>(071) 23 67 22 21</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10252</id>\r\n        <orderdate>1996-07-09T00:00:00</orderdate>\r\n        <total>3597.90</total>\r\n      </order>\r\n      <order>\r\n        <id>10302</id>\r\n        <orderdate>1996-09-10T00:00:00</orderdate>\r\n        <total>2708.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10458</id>\r\n        <orderdate>1997-02-26T00:00:00</orderdate>\r\n        <total>3891.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10463</id>\r\n        <orderdate>1997-03-04T00:00:00</orderdate>\r\n        <total>713.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10475</id>\r\n        <orderdate>1997-03-14T00:00:00</orderdate>\r\n        <total>1505.18</total>\r\n      </order>\r\n      <order>\r\n        <id>10767</id>\r\n        <orderdate>1997-12-05T00:00:00</orderdate>\r\n        <total>28.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10841</id>\r\n        <orderdate>1998-01-20T00:00:00</orderdate>\r\n        <total>4581.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10846</id>\r\n        <orderdate>1998-01-22T00:00:00</orderdate>\r\n        <total>1112.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10885</id>\r\n        <orderdate>1998-02-12T00:00:00</orderdate>\r\n        <total>1209.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10930</id>\r\n        <orderdate>1998-03-06T00:00:00</orderdate>\r\n        <total>2255.50</total>\r\n      </order>\r\n      <order>\r\n        <id>11035</id>\r\n        <orderdate>1998-04-20T00:00:00</orderdate>\r\n        <total>1754.50</total>\r\n      </order>\r\n      <order>\r\n        <id>11038</id>\r\n        <orderdate>1998-04-21T00:00:00</orderdate>\r\n        <total>732.60</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>THEBI</id>\r\n    <name>The Big Cheese</name>\r\n    <address>89 Jefferson Way, Suite 2</address>\r\n    <city>Portland</city>\r\n    <region>OR</region>\r\n    <postalcode>97201</postalcode>\r\n    <country>USA</country>\r\n    <phone>(503) 555-3612</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10310</id>\r\n        <orderdate>1996-09-20T00:00:00</orderdate>\r\n        <total>336.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10708</id>\r\n        <orderdate>1997-10-17T00:00:00</orderdate>\r\n        <total>180.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10805</id>\r\n        <orderdate>1997-12-30T00:00:00</orderdate>\r\n        <total>2775.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10992</id>\r\n        <orderdate>1998-04-01T00:00:00</orderdate>\r\n        <total>69.60</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>THECR</id>\r\n    <name>The Cracker Box</name>\r\n    <address>55 Grizzly Peak Rd.</address>\r\n    <city>Butte</city>\r\n    <region>MT</region>\r\n    <postalcode>59801</postalcode>\r\n    <country>USA</country>\r\n    <phone>(406) 555-5834</phone>\r\n    <fax>(406) 555-8083</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10624</id>\r\n        <orderdate>1997-08-07T00:00:00</orderdate>\r\n        <total>1393.24</total>\r\n      </order>\r\n      <order>\r\n        <id>10775</id>\r\n        <orderdate>1997-12-12T00:00:00</orderdate>\r\n        <total>228.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11003</id>\r\n        <orderdate>1998-04-06T00:00:00</orderdate>\r\n        <total>326.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>TOMSP</id>\r\n    <name>Toms Spezialitäten</name>\r\n    <address>Luisenstr. 48</address>\r\n    <city>Münster</city>\r\n    <postalcode>44087</postalcode>\r\n    <country>Germany</country>\r\n    <phone>0251-031259</phone>\r\n    <fax>0251-035695</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10438</id>\r\n        <orderdate>1997-02-06T00:00:00</orderdate>\r\n        <total>454.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10446</id>\r\n        <orderdate>1997-02-14T00:00:00</orderdate>\r\n        <total>246.24</total>\r\n      </order>\r\n      <order>\r\n        <id>10548</id>\r\n        <orderdate>1997-05-26T00:00:00</orderdate>\r\n        <total>240.10</total>\r\n      </order>\r\n      <order>\r\n        <id>10608</id>\r\n        <orderdate>1997-07-23T00:00:00</orderdate>\r\n        <total>1064.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10967</id>\r\n        <orderdate>1998-03-23T00:00:00</orderdate>\r\n        <total>910.40</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>TORTU</id>\r\n    <name>Tortuga Restaurante</name>\r\n    <address>Avda. Azteca 123</address>\r\n    <city>México D.F.</city>\r\n    <postalcode>05033</postalcode>\r\n    <country>Mexico</country>\r\n    <phone>(5) 555-2933</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10276</id>\r\n        <orderdate>1996-08-08T00:00:00</orderdate>\r\n        <total>420.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10293</id>\r\n        <orderdate>1996-08-29T00:00:00</orderdate>\r\n        <total>848.70</total>\r\n      </order>\r\n      <order>\r\n        <id>10304</id>\r\n        <orderdate>1996-09-12T00:00:00</orderdate>\r\n        <total>954.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10319</id>\r\n        <orderdate>1996-10-02T00:00:00</orderdate>\r\n        <total>1191.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10518</id>\r\n        <orderdate>1997-04-25T00:00:00</orderdate>\r\n        <total>4150.05</total>\r\n      </order>\r\n      <order>\r\n        <id>10576</id>\r\n        <orderdate>1997-06-23T00:00:00</orderdate>\r\n        <total>838.45</total>\r\n      </order>\r\n      <order>\r\n        <id>10676</id>\r\n        <orderdate>1997-09-22T00:00:00</orderdate>\r\n        <total>534.85</total>\r\n      </order>\r\n      <order>\r\n        <id>10842</id>\r\n        <orderdate>1998-01-20T00:00:00</orderdate>\r\n        <total>975.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10915</id>\r\n        <orderdate>1998-02-27T00:00:00</orderdate>\r\n        <total>539.50</total>\r\n      </order>\r\n      <order>\r\n        <id>11069</id>\r\n        <orderdate>1998-05-04T00:00:00</orderdate>\r\n        <total>360.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>TRADH</id>\r\n    <name>Tradição Hipermercados</name>\r\n    <address>Av. Inês de Castro, 414</address>\r\n    <city>São Paulo</city>\r\n    <region>SP</region>\r\n    <postalcode>05634-030</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(11) 555-2167</phone>\r\n    <fax>(11) 555-2168</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10249</id>\r\n        <orderdate>1996-07-05T00:00:00</orderdate>\r\n        <total>1863.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10292</id>\r\n        <orderdate>1996-08-28T00:00:00</orderdate>\r\n        <total>1296.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10496</id>\r\n        <orderdate>1997-04-04T00:00:00</orderdate>\r\n        <total>190.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10606</id>\r\n        <orderdate>1997-07-22T00:00:00</orderdate>\r\n        <total>1130.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10830</id>\r\n        <orderdate>1998-01-13T00:00:00</orderdate>\r\n        <total>1974.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10834</id>\r\n        <orderdate>1998-01-15T00:00:00</orderdate>\r\n        <total>1432.71</total>\r\n      </order>\r\n      <order>\r\n        <id>10839</id>\r\n        <orderdate>1998-01-19T00:00:00</orderdate>\r\n        <total>827.55</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>TRAIH</id>\r\n    <name>Trail's Head Gourmet Provisioners</name>\r\n    <address>722 DaVinci Blvd.</address>\r\n    <city>Kirkland</city>\r\n    <region>WA</region>\r\n    <postalcode>98034</postalcode>\r\n    <country>USA</country>\r\n    <phone>(206) 555-8257</phone>\r\n    <fax>(206) 555-2174</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10574</id>\r\n        <orderdate>1997-06-19T00:00:00</orderdate>\r\n        <total>764.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10577</id>\r\n        <orderdate>1997-06-23T00:00:00</orderdate>\r\n        <total>569.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10822</id>\r\n        <orderdate>1998-01-08T00:00:00</orderdate>\r\n        <total>237.90</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>VAFFE</id>\r\n    <name>Vaffeljernet</name>\r\n    <address>Smagsløget 45</address>\r\n    <city>Århus</city>\r\n    <postalcode>8200</postalcode>\r\n    <country>Denmark</country>\r\n    <phone>86 21 32 43</phone>\r\n    <fax>86 22 33 44</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10367</id>\r\n        <orderdate>1996-11-28T00:00:00</orderdate>\r\n        <total>834.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10399</id>\r\n        <orderdate>1996-12-31T00:00:00</orderdate>\r\n        <total>1765.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10465</id>\r\n        <orderdate>1997-03-05T00:00:00</orderdate>\r\n        <total>2518.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10591</id>\r\n        <orderdate>1997-07-07T00:00:00</orderdate>\r\n        <total>812.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10602</id>\r\n        <orderdate>1997-07-17T00:00:00</orderdate>\r\n        <total>48.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10688</id>\r\n        <orderdate>1997-10-01T00:00:00</orderdate>\r\n        <total>3160.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10744</id>\r\n        <orderdate>1997-11-17T00:00:00</orderdate>\r\n        <total>736.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10769</id>\r\n        <orderdate>1997-12-08T00:00:00</orderdate>\r\n        <total>1684.28</total>\r\n      </order>\r\n      <order>\r\n        <id>10921</id>\r\n        <orderdate>1998-03-03T00:00:00</orderdate>\r\n        <total>1936.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10946</id>\r\n        <orderdate>1998-03-12T00:00:00</orderdate>\r\n        <total>1407.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10994</id>\r\n        <orderdate>1998-04-02T00:00:00</orderdate>\r\n        <total>940.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>VICTE</id>\r\n    <name>Victuailles en stock</name>\r\n    <address>2, rue du Commerce</address>\r\n    <city>Lyon</city>\r\n    <postalcode>69004</postalcode>\r\n    <country>France</country>\r\n    <phone>78.32.54.86</phone>\r\n    <fax>78.32.54.87</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10251</id>\r\n        <orderdate>1996-07-08T00:00:00</orderdate>\r\n        <total>654.06</total>\r\n      </order>\r\n      <order>\r\n        <id>10334</id>\r\n        <orderdate>1996-10-21T00:00:00</orderdate>\r\n        <total>144.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10450</id>\r\n        <orderdate>1997-02-19T00:00:00</orderdate>\r\n        <total>425.12</total>\r\n      </order>\r\n      <order>\r\n        <id>10459</id>\r\n        <orderdate>1997-02-27T00:00:00</orderdate>\r\n        <total>1659.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10478</id>\r\n        <orderdate>1997-03-18T00:00:00</orderdate>\r\n        <total>471.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10546</id>\r\n        <orderdate>1997-05-23T00:00:00</orderdate>\r\n        <total>2812.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10806</id>\r\n        <orderdate>1997-12-31T00:00:00</orderdate>\r\n        <total>439.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10814</id>\r\n        <orderdate>1998-01-05T00:00:00</orderdate>\r\n        <total>1788.45</total>\r\n      </order>\r\n      <order>\r\n        <id>10843</id>\r\n        <orderdate>1998-01-21T00:00:00</orderdate>\r\n        <total>159.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10850</id>\r\n        <orderdate>1998-01-23T00:00:00</orderdate>\r\n        <total>629.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>VINET</id>\r\n    <name>Vins et alcools Chevalier</name>\r\n    <address>59 rue de l'Abbaye</address>\r\n    <city>Reims</city>\r\n    <postalcode>51100</postalcode>\r\n    <country>France</country>\r\n    <phone>26.47.15.10</phone>\r\n    <fax>26.47.15.11</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10274</id>\r\n        <orderdate>1996-08-06T00:00:00</orderdate>\r\n        <total>538.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10295</id>\r\n        <orderdate>1996-09-02T00:00:00</orderdate>\r\n        <total>121.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10737</id>\r\n        <orderdate>1997-11-11T00:00:00</orderdate>\r\n        <total>139.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10739</id>\r\n        <orderdate>1997-11-12T00:00:00</orderdate>\r\n        <total>240.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>WANDK</id>\r\n    <name>Die Wandernde Kuh</name>\r\n    <address>Adenauerallee 900</address>\r\n    <city>Stuttgart</city>\r\n    <postalcode>70563</postalcode>\r\n    <country>Germany</country>\r\n    <phone>0711-020361</phone>\r\n    <fax>0711-035428</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10301</id>\r\n        <orderdate>1996-09-09T00:00:00</orderdate>\r\n        <total>755.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10312</id>\r\n        <orderdate>1996-09-23T00:00:00</orderdate>\r\n        <total>1614.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10348</id>\r\n        <orderdate>1996-11-07T00:00:00</orderdate>\r\n        <total>363.60</total>\r\n      </order>\r\n      <order>\r\n        <id>10356</id>\r\n        <orderdate>1996-11-18T00:00:00</orderdate>\r\n        <total>1106.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10513</id>\r\n        <orderdate>1997-04-22T00:00:00</orderdate>\r\n        <total>1942.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10632</id>\r\n        <orderdate>1997-08-14T00:00:00</orderdate>\r\n        <total>589.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10640</id>\r\n        <orderdate>1997-08-21T00:00:00</orderdate>\r\n        <total>708.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10651</id>\r\n        <orderdate>1997-09-01T00:00:00</orderdate>\r\n        <total>397.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10668</id>\r\n        <orderdate>1997-09-15T00:00:00</orderdate>\r\n        <total>625.28</total>\r\n      </order>\r\n      <order>\r\n        <id>11046</id>\r\n        <orderdate>1998-04-23T00:00:00</orderdate>\r\n        <total>1485.80</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>WARTH</id>\r\n    <name>Wartian Herkku</name>\r\n    <address>Torikatu 38</address>\r\n    <city>Oulu</city>\r\n    <postalcode>90110</postalcode>\r\n    <country>Finland</country>\r\n    <phone>981-443655</phone>\r\n    <fax>981-443655</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10266</id>\r\n        <orderdate>1996-07-26T00:00:00</orderdate>\r\n        <total>346.56</total>\r\n      </order>\r\n      <order>\r\n        <id>10270</id>\r\n        <orderdate>1996-08-01T00:00:00</orderdate>\r\n        <total>1376.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10320</id>\r\n        <orderdate>1996-10-03T00:00:00</orderdate>\r\n        <total>516.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10333</id>\r\n        <orderdate>1996-10-18T00:00:00</orderdate>\r\n        <total>877.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10412</id>\r\n        <orderdate>1997-01-13T00:00:00</orderdate>\r\n        <total>334.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10416</id>\r\n        <orderdate>1997-01-16T00:00:00</orderdate>\r\n        <total>720.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10437</id>\r\n        <orderdate>1997-02-05T00:00:00</orderdate>\r\n        <total>393.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10455</id>\r\n        <orderdate>1997-02-24T00:00:00</orderdate>\r\n        <total>2684.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10526</id>\r\n        <orderdate>1997-05-05T00:00:00</orderdate>\r\n        <total>1151.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10553</id>\r\n        <orderdate>1997-05-30T00:00:00</orderdate>\r\n        <total>1546.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10583</id>\r\n        <orderdate>1997-06-30T00:00:00</orderdate>\r\n        <total>2237.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10636</id>\r\n        <orderdate>1997-08-19T00:00:00</orderdate>\r\n        <total>629.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10750</id>\r\n        <orderdate>1997-11-21T00:00:00</orderdate>\r\n        <total>1590.56</total>\r\n      </order>\r\n      <order>\r\n        <id>10781</id>\r\n        <orderdate>1997-12-17T00:00:00</orderdate>\r\n        <total>975.88</total>\r\n      </order>\r\n      <order>\r\n        <id>11025</id>\r\n        <orderdate>1998-04-15T00:00:00</orderdate>\r\n        <total>270.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>WELLI</id>\r\n    <name>Wellington Importadora</name>\r\n    <address>Rua do Mercado, 12</address>\r\n    <city>Resende</city>\r\n    <region>SP</region>\r\n    <postalcode>08737-363</postalcode>\r\n    <country>Brazil</country>\r\n    <phone>(14) 555-8122</phone>\r\n    <orders>\r\n      <order>\r\n        <id>10256</id>\r\n        <orderdate>1996-07-15T00:00:00</orderdate>\r\n        <total>517.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10420</id>\r\n        <orderdate>1997-01-21T00:00:00</orderdate>\r\n        <total>1707.84</total>\r\n      </order>\r\n      <order>\r\n        <id>10585</id>\r\n        <orderdate>1997-07-01T00:00:00</orderdate>\r\n        <total>142.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10644</id>\r\n        <orderdate>1997-08-25T00:00:00</orderdate>\r\n        <total>1371.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10803</id>\r\n        <orderdate>1997-12-30T00:00:00</orderdate>\r\n        <total>1193.01</total>\r\n      </order>\r\n      <order>\r\n        <id>10809</id>\r\n        <orderdate>1998-01-01T00:00:00</orderdate>\r\n        <total>140.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10900</id>\r\n        <orderdate>1998-02-20T00:00:00</orderdate>\r\n        <total>33.75</total>\r\n      </order>\r\n      <order>\r\n        <id>10905</id>\r\n        <orderdate>1998-02-24T00:00:00</orderdate>\r\n        <total>342.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10935</id>\r\n        <orderdate>1998-03-09T00:00:00</orderdate>\r\n        <total>619.50</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>WHITC</id>\r\n    <name>White Clover Markets</name>\r\n    <address>305 - 14th Ave. S. Suite 3B</address>\r\n    <city>Seattle</city>\r\n    <region>WA</region>\r\n    <postalcode>98128</postalcode>\r\n    <country>USA</country>\r\n    <phone>(206) 555-4112</phone>\r\n    <fax>(206) 555-4115</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10269</id>\r\n        <orderdate>1996-07-31T00:00:00</orderdate>\r\n        <total>642.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10344</id>\r\n        <orderdate>1996-11-01T00:00:00</orderdate>\r\n        <total>2296.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10469</id>\r\n        <orderdate>1997-03-10T00:00:00</orderdate>\r\n        <total>956.68</total>\r\n      </order>\r\n      <order>\r\n        <id>10483</id>\r\n        <orderdate>1997-03-24T00:00:00</orderdate>\r\n        <total>668.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10504</id>\r\n        <orderdate>1997-04-11T00:00:00</orderdate>\r\n        <total>1388.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10596</id>\r\n        <orderdate>1997-07-11T00:00:00</orderdate>\r\n        <total>1180.88</total>\r\n      </order>\r\n      <order>\r\n        <id>10693</id>\r\n        <orderdate>1997-10-06T00:00:00</orderdate>\r\n        <total>2071.20</total>\r\n      </order>\r\n      <order>\r\n        <id>10696</id>\r\n        <orderdate>1997-10-08T00:00:00</orderdate>\r\n        <total>996.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10723</id>\r\n        <orderdate>1997-10-30T00:00:00</orderdate>\r\n        <total>468.45</total>\r\n      </order>\r\n      <order>\r\n        <id>10740</id>\r\n        <orderdate>1997-11-13T00:00:00</orderdate>\r\n        <total>1416.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10861</id>\r\n        <orderdate>1998-01-30T00:00:00</orderdate>\r\n        <total>3523.40</total>\r\n      </order>\r\n      <order>\r\n        <id>10904</id>\r\n        <orderdate>1998-02-24T00:00:00</orderdate>\r\n        <total>1924.25</total>\r\n      </order>\r\n      <order>\r\n        <id>11032</id>\r\n        <orderdate>1998-04-17T00:00:00</orderdate>\r\n        <total>8902.50</total>\r\n      </order>\r\n      <order>\r\n        <id>11066</id>\r\n        <orderdate>1998-05-01T00:00:00</orderdate>\r\n        <total>928.75</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>WILMK</id>\r\n    <name>Wilman Kala</name>\r\n    <address>Keskuskatu 45</address>\r\n    <city>Helsinki</city>\r\n    <postalcode>21240</postalcode>\r\n    <country>Finland</country>\r\n    <phone>90-224 8858</phone>\r\n    <fax>90-224 8858</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10248</id>\r\n        <orderdate>1996-07-04T00:00:00</orderdate>\r\n        <total>440.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10615</id>\r\n        <orderdate>1997-07-30T00:00:00</orderdate>\r\n        <total>120.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10673</id>\r\n        <orderdate>1997-09-18T00:00:00</orderdate>\r\n        <total>412.35</total>\r\n      </order>\r\n      <order>\r\n        <id>10695</id>\r\n        <orderdate>1997-10-07T00:00:00</orderdate>\r\n        <total>642.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10873</id>\r\n        <orderdate>1998-02-06T00:00:00</orderdate>\r\n        <total>336.80</total>\r\n      </order>\r\n      <order>\r\n        <id>10879</id>\r\n        <orderdate>1998-02-10T00:00:00</orderdate>\r\n        <total>611.30</total>\r\n      </order>\r\n      <order>\r\n        <id>10910</id>\r\n        <orderdate>1998-02-26T00:00:00</orderdate>\r\n        <total>452.90</total>\r\n      </order>\r\n      <order>\r\n        <id>11005</id>\r\n        <orderdate>1998-04-07T00:00:00</orderdate>\r\n        <total>586.00</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n  <customer>\r\n    <id>WOLZA</id>\r\n    <name>Wolski  Zajazd</name>\r\n    <address>ul. Filtrowa 68</address>\r\n    <city>Warszawa</city>\r\n    <postalcode>01-012</postalcode>\r\n    <country>Poland</country>\r\n    <phone>(26) 642-7012</phone>\r\n    <fax>(26) 642-7012</fax>\r\n    <orders>\r\n      <order>\r\n        <id>10374</id>\r\n        <orderdate>1996-12-05T00:00:00</orderdate>\r\n        <total>459.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10611</id>\r\n        <orderdate>1997-07-25T00:00:00</orderdate>\r\n        <total>808.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10792</id>\r\n        <orderdate>1997-12-23T00:00:00</orderdate>\r\n        <total>399.85</total>\r\n      </order>\r\n      <order>\r\n        <id>10870</id>\r\n        <orderdate>1998-02-04T00:00:00</orderdate>\r\n        <total>160.00</total>\r\n      </order>\r\n      <order>\r\n        <id>10906</id>\r\n        <orderdate>1998-02-25T00:00:00</orderdate>\r\n        <total>427.50</total>\r\n      </order>\r\n      <order>\r\n        <id>10998</id>\r\n        <orderdate>1998-04-03T00:00:00</orderdate>\r\n        <total>686.00</total>\r\n      </order>\r\n      <order>\r\n        <id>11044</id>\r\n        <orderdate>1998-04-23T00:00:00</orderdate>\r\n        <total>591.60</total>\r\n      </order>\r\n    </orders>\r\n  </customer>\r\n</customers>"
  },
  {
    "path": "csharp/linq/101-linq-examples.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- Console\n---\n\n# 101 (and then some) LINQ Examples\n\nLanguage Integrated Query provides a consistent query syntax across a variety of data sources and formats.  In a LINQ query, you are always working with objects. You use the same basic coding patterns to query and transform data in XML documents, SQL databases, Datasets, .NET collections, and any other format for which a LINQ provider is available.\n\n```csharp\n//Support classes\n#load \"101_Linq_Examples.csx\"\n```\n\n## Restriction Operators\n\nThese examples show different uses of Restriction Operators:\n\n### Where - Simple 1\n\nThis example finds all elements of an array less than 5\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nvar lowNums =\n    from num in numbers\n    where num < 5\n    select num;\n```\n\n### Where - Simple 2\n\nThis example finds all products that are out of stock.\n\n```csharp\nList<Product> products = productList;\n\nvar soldOutProducts =\n    from prod in products\n    where prod.UnitsInStock == 0\n    select prod;\n\nConsole.WriteLine(\"Sold out products:\");\nforeach (var product in soldOutProducts)\n{\n    Console.WriteLine($\"{product.ProductName} is sold out.\");\n};\nsoldOutProducts\n```\n\n### Where - Simple 3\n\nThis example finds all products that are in stock and cost more than 3.00 per unit.\n\n```csharp\nvar expensiveInStockProducts =\n                    from prod in products\n                    where prod.UnitsInStock > 0 && prod.UnitPrice > 3.00M\n                    select prod;\nConsole.WriteLine(\"In-stock products that cost more than $3.00:\");\nforeach (var product in expensiveInStockProducts)\n{\n    Console.WriteLine($\"{product.ProductName} is in stock and costs ${product.UnitPrice:N2}.\");\n}\nexpensiveInStockProducts\n```\n\n### Where - Drilldown\n\nThis example finds all customers in Washington and then uses the resulting sequence to drill down into their orders.\n\n```csharp\nvar waCustomers =\n    from cust in customerList\n    where cust.Region == \"WA\"\n    select cust;\n\nConsole.WriteLine(\"Customers from Washington and their orders:\");\nforeach (var customer in waCustomers)\n{\n    Console.WriteLine(\"Customer {0}: {1}\", customer.CustomerID, customer.CompanyName);\n    foreach (var order in customer.Orders)\n    {\n        Console.WriteLine(\"  Order {0}: {1}\", order.OrderID, order.OrderDate);\n    }\n}\nwaCustomers\n```\n\n### Where - Indexed\n\nThis example shows an indexed Where clause that returns digits whose name is shorter than their value.\n\n```csharp\nstring[] digits = { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" };\n\nvar shortDigits = digits.Where((digit, index) => digit.Length < index);\n\nConsole.WriteLine(\"Short digits:\");\nforeach (var d in shortDigits)\n{\n    Console.WriteLine($\"The word {d} is shorter than its value.\");\n\n}\n```\n\n## Projection Operators\n\nThese samples shows different uses of Projection Operators\n\n### Select - Simple 1\n\nThis sample uses `select` to produce a sequence of ints one higher than those in an existing array of ints.\n\n```csharp\nusing System.Data;\nusing System.Linq;\n\nvar numbers = testDS.Tables[\"Numbers\"].AsEnumerable();\n\nvar numsPlusOne =\n    from n in numbers\n    select n.Field<int>(0) + 1;\n\nConsole.WriteLine(\"Numbers and their successors:\");\nTestHelper.ZipToStrings<DataRow,int>(numbers, numsPlusOne, (a,b)=>$\"{a.Field<int>(0)} + 1 = {b}\");\n```\n\n### Select - Simple 2\n\nThis sample uses `select` to return a sequence of just the names of a list of products.\n\n```csharp\nvar products = testDS.Tables[\"Products\"].AsEnumerable();\n\nvar productNames =\n    from p in products\n    select p.Field<string>(\"ProductName\");\n\nConsole.WriteLine(\"Product Names:\");\nforeach (var productName in productNames)\n{\n    Console.WriteLine(productName);\n}\n```\n\n### Select - Transformation\n\nThis sample uses `select` to produce a sequence of strings representing the text version of a sequence of ints.\n\n```csharp\nvar numbers = testDS.Tables[\"Numbers\"].AsEnumerable();\nvar strings = new [] { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" };\n\nvar textNums = numbers.Select(p => strings[p.Field<int>(\"number\")]);\n\nConsole.WriteLine(\"Number strings:\");\nTestHelper.ZipToStrings<DataRow, string>(numbers, textNums, (a,b)=>$\"String at index [{a.Field<int>(\"number\")}] is {b}\");\n```\n\n### Select - Anonymous Types 1\n\nThis sample uses `select` to produce a sequence of the uppercase and lowercase versions of each word in the original array\n\n```csharp\nvar words = testDS.Tables[\"Words\"].AsEnumerable();\n\nvar upperLowerWords = words.Select(p => new\n{\n    Upper = (p.Field<string>(0)).ToUpper(),\n    Lower = (p.Field<string>(0)).ToLower()\n});\n\nforeach (var ul in upperLowerWords)\n{\n    Console.WriteLine(\"Uppercase: \" + ul.Upper + \", Lowercase: \" + ul.Lower);\n}\n```\n\n### Select - Anonymous Types 2\n\nThis sample uses `select` to produce a sequence containing text representations of digits and whether their length is even or odd.\n\n```csharp\nvar numbers = testDS.Tables[\"Numbers\"].AsEnumerable();\nvar digits = testDS.Tables[\"Digits\"];\nstring[] strings = { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" };\n\nvar digitOddEvens = numbers.\n    Select(n => new\n    {\n        Digit = digits.Rows[n.Field<int>(\"number\")][\"digit\"],\n        Even = (n.Field<int>(\"number\") % 2 == 0)\n    });\n\nforeach (var d in digitOddEvens)\n{\n    Console.WriteLine(\"The digit {0} is {1}.\", d.Digit, d.Even ? \"even\" : \"odd\");\n}\n```\n\n### Select - Anonymous Types 3\n\nThis sample uses `select` to produce a sequence containing some properties of `Products`, including `UnitPrice` which is renamed to `Price` in the resulting type.\n\n```csharp\nvar products = testDS.Tables[\"Products\"].AsEnumerable();\n\nvar productInfos = products.\n    Select(n => new\n    {\n        ProductName = n.Field<string>(\"ProductName\"),\n        Category = n.Field<string>(\"Category\"),\n        Price = n.Field<decimal>(\"UnitPrice\")\n    });\n\nConsole.WriteLine(\"Product Info:\");\nforeach (var productInfo in productInfos)\n{\n    Console.WriteLine($\"{productInfo.ProductName} is in the category {productInfo.Category} and costs ${productInfo.Price:N2} per unit.\");\n}\n```\n\n### Select - Indexed\n\nThis sample uses an indexed `Select` clause to determine if the value of ints in an array match their position in the array.\n\n```csharp\nvar numbers = testDS.Tables[\"Numbers\"].AsEnumerable();\n\nvar numsInPlace = numbers.Select((num, index) => new\n{\n    Num = num.Field<int>(\"number\"),\n    InPlace = (num.Field<int>(\"number\") == index)\n});\n\nConsole.WriteLine(\"Number: In-place:\");\nforeach (var n in numsInPlace)\n{\n    Console.WriteLine(\"{0}: {1}\", n.Num, n.InPlace);\n}\n```\n\n### Select - Filtered\n\nThis sample combines `select` and `where` to make a simple query that returns the text form of each digit less than 5.\n\n```csharp\nvar numbers = testDS.Tables[\"Numbers\"].AsEnumerable();\nvar digits = testDS.Tables[\"Digits\"];\n\nvar lowNums =\n    from n in numbers\n    where n.Field<int>(\"number\") < 5\n    select digits.Rows[n.Field<int>(\"number\")].Field<string>(\"digit\");\n\nConsole.WriteLine(\"Numbers < 5:\");\nforeach (var num in lowNums)\n{\n    Console.WriteLine(num);\n}\n```\n\n### SelectMany - Compound from 1\n\nThis sample uses a compound `from` clause to make a query that returns all pairs of numbers from both arrays such that the number from `numbersA` is less than the number from `numbersB`.\n\n```csharp\nvar numbersA = testDS.Tables[\"NumbersA\"].AsEnumerable();\nvar numbersB = testDS.Tables[\"NumbersB\"].AsEnumerable();\n\nvar pairs =\n    from a in numbersA\n    from b in numbersB\n    where a.Field<int>(\"number\") < b.Field<int>(\"number\")\n    select new { a = a.Field<int>(\"number\"), b = b.Field<int>(\"number\") };\n\nConsole.WriteLine(\"Pairs where a < b:\");\nforeach (var pair in pairs)\n{\n    Console.WriteLine(\"{0} is less than {1}\", pair.a, pair.b);\n}\n```\n\n### SelectMany - Compound from 2\n\nThis sample uses a compound `from` clause to select all orders where the order total is less than 500.00.\n\n```csharp\nvar customers = testDS.Tables[\"Customers\"].AsEnumerable();\nvar orders = testDS.Tables[\"Orders\"].AsEnumerable();\n\nvar smallOrders =\n    from c in customers\n    from o in orders\n    where c.Field<string>(\"CustomerID\") == o.Field<string>(\"CustomerID\")\n        && o.Field<decimal>(\"Total\") < 500.00M\n    select new\n    {\n        CustomerID = c.Field<string>(\"CustomerID\"),\n        OrderID = o.Field<int>(\"OrderID\"),\n        Total = o.Field<decimal>(\"Total\")\n    };\n```\n\n### SelectMany - Compound from 3\n\nThis sample uses a compound `from` clause to select all orders where the order was made in 1998 or later.\n\n```csharp\nvar customers = testDS.Tables[\"Customers\"].AsEnumerable();\nvar orders = testDS.Tables[\"Orders\"].AsEnumerable();\n\nvar myOrders =\n    from c in customers\n    from o in orders\n    where c.Field<string>(\"CustomerID\") == o.Field<string>(\"CustomerID\") &&\n    o.Field<DateTime>(\"OrderDate\") >= new DateTime(1998, 1, 1)\n    select new\n    {\n        CustomerID = c.Field<string>(\"CustomerID\"),\n        OrderID = o.Field<int>(\"OrderID\"),\n        OrderDate = o.Field<DateTime>(\"OrderDate\")\n    };\n```\n\n### SelectMany - from Assignment\n\nThis sample uses a compound `from` clause to select all orders where the order total is greater than 2000.00 and uses `from` assignment to avoid requesting the total twice.\n\n```csharp\nvar customers = testDS.Tables[\"Customers\"].AsEnumerable();\nvar orders = testDS.Tables[\"Orders\"].AsEnumerable();\n\nvar myOrders =\n    from c in customers\n    from o in orders\n    let total = o.Field<decimal>(\"Total\")\n    where c.Field<string>(\"CustomerID\") == o.Field<string>(\"CustomerID\")\n        && total >= 2000.0M\n    select new { CustomerID = c.Field<string>(\"CustomerID\"), OrderID = o.Field<int>(\"OrderID\"), total };\n```\n\n### SelectMany - Multiple from\n\nThis sample uses multiple `from` clauses so that filtering on customers can be done before selecting their orders.  This makes the query more efficient by not selecting and then discarding orders for customers outside of Washington.\n\n```csharp\nvar customers = testDS.Tables[\"Customers\"].AsEnumerable();\nvar orders = testDS.Tables[\"Orders\"].AsEnumerable();\nDateTime cutoffDate = new DateTime(1997, 1, 1);\n\nvar myOrders =\n    from c in customers\n    where c.Field<string>(\"Region\") == \"WA\"\n    from o in orders\n    where c.Field<string>(\"CustomerID\") == o.Field<string>(\"CustomerID\")\n    && (DateTime)o[\"OrderDate\"] >= cutoffDate\n    select new { CustomerID = c.Field<string>(\"CustomerID\"), OrderID = o.Field<int>(\"OrderID\") };\n```\n\n### SelectMany - Indexed\n\nThis sample uses an indexed `SelectMany` clause to select all orders, while referring to customers by the order in which they are returned from the query.\n\n```csharp\nvar customers = testDS.Tables[\"Customers\"].AsEnumerable();\nvar orders = testDS.Tables[\"Orders\"].AsEnumerable();\n\nvar customerOrders =\n    customers.SelectMany(\n        (cust, custIndex) =>\n        orders.Where(o => cust.Field<string>(\"CustomerID\") == o.Field<string>(\"CustomerID\"))\n            .Select(o => new { CustomerIndex = custIndex + 1, OrderID = o.Field<int>(\"OrderID\") }));\n```\n\n## Partitioning Operators\n\nThese samples show different uses of Partitioning Operators\n\n### Take - Simple\n\nThis sample uses `Take` to get only the first 3 elements of the array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nvar first3Numbers = numbers.Take(3);\n```\n\n## Take - Nested\n\nThis sample uses `Take` to get the first 3 orders from customers in Washington.\n\n```csharp\nList<Customer> customers = customerList;\n\nvar first3WAOrders = (\n    from cust in customers\n    from order in cust.Orders\n    where cust.Region == \"WA\"\n    select new { cust.CustomerID, order.OrderID, order.OrderDate })\n    .Take(3);\n```\n\n## Skip - Simple\n\nThis sample uses `Skip` to get all but the first four elements of the array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nvar allButFirst4Numbers = numbers.Skip(4);\n\nConsole.WriteLine(\"All but first 4 numbers:\");\nforeach (var n in allButFirst4Numbers)\n{\n    Console.WriteLine(n);\n}\n```\n\n## Skip - Nested\n\nThis sample uses `Skip` to get all but the first 2 orders from customers in Washington.\n\n```csharp\nList<Customer> customers = customerList;\n\nvar waOrders =\n    from cust in customers\n    from order in cust.Orders\n    where cust.Region == \"WA\"\n    select new { cust.CustomerID, order.OrderID, order.OrderDate };\n\nvar allButFirst2Orders = waOrders.Skip(2);\n```\n\n## TakeWhile - Simple\n\nThis sample uses `TakeWhile` to return elements starting from the beginning of the array until a number is read whose value is not less than 6.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nvar firstNumbersLessThan6 = numbers.TakeWhile(n => n < 6);\n```\n\n## TakeWhile - Indexed\n\nThis sample uses `TakeWhile` to return elements starting from the beginning of the array until a number is hit that is less than its position in the array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nvar firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);\n```\n\n## SkipWhile - Simple\n\nThis sample uses `SkipWhile` to get the elements of the array starting from the first element divisible by 3.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\n// In the lambda expression, 'n' is the input parameter that identifies each\n// element in the collection in succession. It is is inferred to be\n// of type int because numbers is an int array.\nvar allButFirst3Numbers = numbers.SkipWhile(n => n % 3 != 0);\n```\n\n## SkipWhile - Indexed\n\nThis sample uses `SkipWhile` to get the elements of the array starting from the first element less than its position.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nvar laterNumbers = numbers.SkipWhile((n, index) => n >= index);\n```\n\n## Ordering operators\n\nThese samples show different uses of Ordering Operators.\n\n### OrderBy - Simple 1\n\nThis sample uses `orderby` to sort a list of words alphabetically.\n\n```csharp\nstring[] words = { \"cherry\", \"apple\", \"blueberry\" };\n\nvar sortedWords =\n    from word in words\n    orderby word\n    select word;\n```\n\n### OrderBy - Simple 2\n\nThis sample uses `orderby` to sort a list of words by length.\n\n```csharp\nstring[] words = { \"cherry\", \"apple\", \"blueberry\" };\n\nvar sortedWords =\n    from word in words\n    orderby word.Length\n    select word;\n```\n\n### OrderBy - Simple 3\n\nThis sample uses `orderby` to sort a list of products by name.\n\nUse the \"descending\" keyword at the end of the clause to perform a reverse ordering\n\n```csharp\nList<Product> products = productList;\n\nvar sortedProducts =\n    from prod in products\n    orderby prod.ProductName\n    select prod;\n```\n\n### OrderBy - Comparer\n\nThis sample uses an `OrderBy` clause with a custom comparer to do a case-insensitive sort of the words in an array.\n\n```csharp\n// Custom comparer for use with ordering operators\npublic class CaseInsensitiveComparer : IComparer<string>\n{\n    public int Compare(string x, string y)\n    {\n        return string.Compare(x, y, StringComparison.OrdinalIgnoreCase);\n    }\n}\n\nstring[] words = { \"aPPLE\", \"AbAcUs\", \"bRaNcH\", \"BlUeBeRrY\", \"ClOvEr\", \"cHeRry\" };\n\nvar sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer());\n```\n\n### OrderByDescending - Simple 1\n\nThis sample uses `orderby` and `descending` to sort a list of doubles from highest to lowest.\n\n```csharp\ndouble[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };\n\nvar sortedDoubles =\n    from d in doubles\n    orderby d descending\n    select d;\n```\n\n### OrderByDescending - Simple 2\n\nThis sample uses `orderby` to sort a list of products by units in stock from highest to lowest.\n\n```csharp\nList<Product> products = productList;\n\nvar sortedProducts =\n    from prod in products\n    orderby prod.UnitsInStock descending\n    select prod\n```\n\n### OrderByDescending - Comparer\n\nThis sample uses method syntax to call `OrderByDescending` because it enables you to use a custom comparer.\n\n```csharp\nstring[] words = { \"aPPLE\", \"AbAcUs\", \"bRaNcH\", \"BlUeBeRrY\", \"ClOvEr\", \"cHeRry\" };\n\nvar sortedWords = words.OrderByDescending(a => a, new CaseInsensitiveComparer());\n```\n\n### ThenBy - Simple\n\nThis sample uses a compound `orderby` to sort a list of digits, first by length of their name, and then alphabetically by the name itself.\n\n```csharp\nstring[] digits = { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" };\n\nvar sortedDigits =\n    from digit in digits\n    orderby digit.Length, digit\n    select digit;\n```\n\n### ThenBy - Comparer\n\nThe first query in this sample uses method syntax to call `OrderBy` and `ThenBy` with a custom comparer to sort first by word length and then by a case-insensitive sort of the words in an array.\n\nThe second two queries show another way to perform the same task.\n\n```csharp\nstring[] words = { \"aPPLE\", \"AbAcUs\", \"bRaNcH\", \"BlUeBeRrY\", \"ClOvEr\", \"cHeRry\" };\n\nvar sortedWords =\n    words.OrderBy(a => a.Length)\n         .ThenBy(a => a, new CaseInsensitiveComparer());\n```\n\nAlternative:\n\n```csharp\n// Another way. TODO is this use of ThenBy correct? It seems to work on this sample array.\nvar sortedWords2 =\n    from word in words\n    orderby word.Length\n    select word;\n```\n\nAnother alternative:\n\n```csharp\nvar sortedWords3 = sortedWords2.ThenBy(a => a, new CaseInsensitiveComparer());\n```\n\n### ThenByDescending - Simple\n\nThis sample uses a compound `orderby` to sort a list of products, first by category, and then by unit price, from highest to lowest.\n\n```csharp\nList<Product> products = productList;\n\nvar sortedProducts =\n    from prod in products\n    orderby prod.Category, prod.UnitPrice descending\n    select prod;\n```\n\n### ThenByDescending - Comparer\n\nThis sample uses an `OrderBy` and a `ThenBy` clause with a custom comparer to sort first by word length and then by a case-insensitive descending sort of the words in an array.\n\n```csharp\nstring[] words = { \"aPPLE\", \"AbAcUs\", \"bRaNcH\", \"BlUeBeRrY\", \"ClOvEr\", \"cHeRry\" };\n\nvar sortedWords =\n    words.OrderBy(a => a.Length)\n         .ThenByDescending(a => a, new CaseInsensitiveComparer());\n```\n\n### Reverse\n\nThis sample uses `Reverse` to create a list of all digits in the array whose second letter is 'i' that is reversed from the order in the original array.\n\n```csharp\nstring[] digits = { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" };\n\nvar reversedIDigits = (\n    from digit in digits\n    where digit[1] == 'i'\n    select digit)\n    .Reverse();\n```\n\n## Grouping Operators\n\nThese samples shows different uses of Grouping Operators.\n\n### GroupBy - Simple 1\n\nThis sample uses `group by` to partition a list of numbers by their remainder when divided by 5.\n\n```csharp\nvar numbers = testDS.Tables[\"Numbers\"].AsEnumerable();\n\nvar numberGroups =\n    from n in numbers\n    group n by n.Field<int>(\"number\") % 5 into g\n    select new { Remainder = g.Key, Numbers = g };\n\nforeach (var g in numberGroups)\n{\n    Console.WriteLine(\"Numbers with a remainder of {0} when divided by 5:\", g.Remainder);\n    foreach (var n in g.Numbers)\n    {\n        Console.WriteLine(n.Field<int>(\"number\"));\n    }\n}\n```\n\n### GroupBy - Simple 2\n\nThis sample uses `group by` to partition a list of words by their first letter.\n\n```csharp\nvar words4 = testDS.Tables[\"Words4\"].AsEnumerable();\n\nvar wordGroups =\n    from w in words4\n    group w by w.Field<string>(\"word\")[0] into g\n    select new { FirstLetter = g.Key, Words = g };\n\nforeach (var g in wordGroups)\n{\n    Console.WriteLine(\"Words that start with the letter '{0}':\", g.FirstLetter);\n    foreach (var w in g.Words)\n    {\n        Console.WriteLine(w.Field<string>(\"word\"));\n    }\n}\n```\n\n### GroupBy - Simple 3\n\nThis sample uses `group by` to partition a list of products by category.\n\n```csharp\nvar products = testDS.Tables[\"Products\"].AsEnumerable();\n\nvar productGroups =\n    from p in products\n    group p by p.Field<string>(\"Category\") into g\n    select new { Category = g.Key, Products = g };\n\nforeach (var g in productGroups)\n{\n    Console.WriteLine(\"Category: {0}\", g.Category);\n    foreach (var w in g.Products)\n    {\n        Console.WriteLine(\"\\t\" + w.Field<string>(\"ProductName\"));\n    }\n}\n```\n\n### GroupBy - Nested\n\nThis sample uses `group by` to partition a list of each customer's orders, first by year, and then by month.\n\n```csharp\nvar customers = testDS.Tables[\"Customers\"].AsEnumerable();\n\nvar customerOrderGroups =\n    from c in customers\n    select\n        new\n        {\n            CompanyName = c.Field<string>(\"CompanyName\"),\n            YearGroups =\n                from o in c.GetChildRows(\"CustomersOrders\")\n                group o by o.Field<DateTime>(\"OrderDate\").Year into yg\n                select\n                    new\n                    {\n                        Year = yg.Key,\n                        MonthGroups =\n                            from o in yg\n                            group o by o.Field<DateTime>(\"OrderDate\").Month into mg\n                            select new { Month = mg.Key, Orders = mg }\n                    }\n        };\n\nforeach (var cog in customerOrderGroups)\n{\n    Console.WriteLine(\"CompanyName= {0}\", cog.CompanyName);\n    foreach (var yg in cog.YearGroups)\n    {\n        Console.WriteLine(\"\\t Year= {0}\", yg.Year);\n        foreach (var mg in yg.MonthGroups)\n        {\n            Console.WriteLine(\"\\t\\t Month= {0}\", mg.Month);\n            foreach (var order in mg.Orders)\n            {\n                Console.WriteLine(\"\\t\\t\\t OrderID= {0} \", order.Field<int>(\"OrderID\"));\n                Console.WriteLine(\"\\t\\t\\t OrderDate= {0} \", order.Field<DateTime>(\"OrderDate\"));\n            }\n        }\n    }\n}\n```\n\n### GroupBy - Comparer\n\nThis sample uses `GroupBy` to partition trimmed elements of an array using a custom comparer that matches words that are anagrams of each other.\n\n```csharp\nprivate class AnagramEqualityComparer : IEqualityComparer<string>\n{\n    public bool Equals(string x, string y)\n    {\n        return getCanonicalString(x) == getCanonicalString(y);\n    }\n\n    public int GetHashCode(string obj)\n    {\n        return getCanonicalString(obj).GetHashCode();\n    }\n\n    private string getCanonicalString(string word)\n    {\n        char[] wordChars = word.ToCharArray();\n        Array.Sort<char>(wordChars);\n        return new string(wordChars);\n    }\n}\n\nvar anagrams = testDS.Tables[\"Anagrams\"].AsEnumerable();\n\nvar orderGroups = anagrams.GroupBy(w => w.Field<string>(\"anagram\").Trim(), new AnagramEqualityComparer());\n\nforeach (var g in orderGroups)\n{\n    Console.WriteLine(\"Key: {0}\", g.Key);\n    foreach (var w in g)\n    {\n        Console.WriteLine($\"\\t has the anagram: {w.Field<string>(\"anagram\")}\");\n    }\n}\n```\n\n### GroupBy - Comparer, Mapped\n\nThis sample uses `GroupBy` to partition trimmed elements of an array using a custom comparer that matches words that are anagrams of each other, and then converts the results to uppercase.\n\n```csharp\nvar anagrams = testDS.Tables[\"Anagrams\"].AsEnumerable();\n\nvar orderGroups = anagrams.GroupBy(\n    w => w.Field<string>(\"anagram\").Trim(),\n    a => a.Field<string>(\"anagram\").ToUpper(),\n    new AnagramEqualityComparer()\n    );\n\nforeach (var g in orderGroups)\n{\n    Console.WriteLine(\"Key: {0}\", g.Key);\n    foreach (var w in g)\n    {\n        Console.WriteLine(\"\\t\" + w);\n    }\n}\n```\n\n## Set Operators\n\nThese samples show different uses of Set Operators.\n\n### Distinct - 1\n\nThis sample uses `Distinct` to remove duplicate elements in a sequence of factors of 300.\n\n```csharp\nint[] factorsOf300 = { 2, 2, 3, 5, 5 };\n\nvar uniqueFactors = factorsOf300.Distinct();\n```\n\n### Distinct - 2\n\nThis sample uses `Distinct` to find the unique Category names.\n\n```csharp\nList<Product> products = productList;\n\nvar categoryNames = (\n    from prod in products\n    select prod.Category)\n    .Distinct();\n```\n\n### Union - 1\n\nThis sample uses `Union` to create one sequence that contains the unique values from both arrays.\n\n```csharp\nint[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };\nint[] numbersB = { 1, 3, 5, 7, 8 };\n\nvar uniqueNumbers = numbersA.Union(numbersB);\n```\n\n### Union - 2\n\nThis sample uses `Union` to create one sequence that contains the unique first letter from both product and customer names.\n\n```csharp\nList<Product> products = GetProductList();\nList<Customer> customers = GetCustomerList();\n\nvar productFirstChars =\n    from prod in products\n    select prod.ProductName[0];\nvar customerFirstChars =\n    from cust in customers\n    select cust.CompanyName[0];\n\nvar uniqueFirstChars = productFirstChars.Union(customerFirstChars);\n```\n\n### Intersect - 1\n\nThis sample uses `Intersect` to create one sequence that contains the common values shared by both arrays.\n\n```csharp\nint[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };\nint[] numbersB = { 1, 3, 5, 7, 8 };\n\nvar commonNumbers = numbersA.Intersect(numbersB);\n```\n\n### Intersect - 2\n\nThis sample uses `Intersect` to create one sequence that contains the common first letter from both product and customer names.\n\n```csharp\nList<Product> products = GetProductList();\nList<Customer> customers = GetCustomerList();\n\nvar productFirstChars =\n    from prod in products\n    select prod.ProductName[0];\nvar customerFirstChars =\n    from cust in customers\n    select cust.CompanyName[0];\n\nvar commonFirstChars = productFirstChars.Intersect(customerFirstChars);\n```\n\n### Except - 1\n\nThis sample uses `Except` to create a sequence that contains the values from `numbersA` that are not also in `numbersB`.\n\n```csharp\nint[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };\nint[] numbersB = { 1, 3, 5, 7, 8 };\n\nIEnumerable<int> aOnlyNumbers = numbersA.Except(numbersB);\n```\n\n### Except - 2\n\nThis sample uses `Except` to create one sequence that contains the first letters of product names that are not also first letters of customer names.\n\n```csharp\nList<Product> products = GetProductList();\nList<Customer> customers = GetCustomerList();\n\nvar productFirstChars =\n    from prod in products\n    select prod.ProductName[0];\nvar customerFirstChars =\n    from cust in customers\n    select cust.CompanyName[0];\n\nvar productOnlyFirstChars = productFirstChars.Except(customerFirstChars);\n```\n\n## Conversion Operators\n\nThese samples show different uses of Conversion Operators.\n\n### ToArray\n\nThis sample uses `ToArray` to immediately evaluate a sequence into an array.\n\n```csharp\ndouble[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };\n\nvar sortedDoubles =\n    from d in doubles\n    orderby d descending\n    select d;\nvar doublesArray = sortedDoubles.ToArray();\n\nConsole.WriteLine(\"Every other double from highest to lowest:\");\nfor (int d = 0; d < doublesArray.Length; d += 2)\n{\n    Console.WriteLine(doublesArray[d]);\n}\n```\n\n### ToList\n\nThis sample uses `ToList` to immediately evaluate a sequence into a `List<T>`.\n\n```csharp\nstring[] words = { \"cherry\", \"apple\", \"blueberry\" };\n\nvar sortedWords =\n    from w in words\n    orderby w\n    select w;\nvar wordList = sortedWords.ToList();\n\nConsole.WriteLine(\"The sorted word list:\");\nforeach (var w in wordList)\n{\n    Console.WriteLine(w);\n}\n```\n\n### ToDictionary\n\nThis sample uses `ToDictionary` to immediately evaluate a sequence and a related key expression into a dictionary.\n\n```csharp\nvar scoreRecords = new[] { new {Name = \"Alice\", Score = 50},\n                            new {Name = \"Bob\"  , Score = 40},\n                            new {Name = \"Cathy\", Score = 45}\n                        };\n\nvar scoreRecordsDict = scoreRecords.ToDictionary(sr => sr.Name);\n\nConsole.WriteLine(\"Bob's score: {0}\", scoreRecordsDict[\"Bob\"]);\n```\n\n### OfType\n\nThis sample uses `OfType` to return only the elements of the array that are of type double.\n\n```csharp\nobject[] numbers = { null, 1.0, \"two\", 3, \"four\", 5, \"six\", 7.0 };\n\nvar doubles = numbers.OfType<double>();\n```\n\n## Element Operators\n\nThese samples show different uses of Element Operators\n\n### First - Simple\n\nThis sample uses `First` to return the first matching element as a `Product`.\n\n```csharp\nList<Product> products = GetProductList();\n\nProduct product12 = (\n    from prod in products\n    where prod.ProductID == 12\n    select prod)\n    .First();\n```\n\n### First - Condition\n\nThis sample uses `First` to find the first element in the array that starts with 'o'.\n\n```csharp\nstring[] strings = { \"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\" };\n\nstring startsWithO = strings.First(s => s[0] == 'o');\n```\n\n### FirstOrDefault - Simple\n\nThis sample uses `FirstOrDefault` to try to return the first element of the sequence, unless there are no elements, in which case the default value for that type is returned. `FirstOrDefault` is useful for creating outer joins.\n\n```csharp\nint[] numbers = { };\n\nint firstNumOrDefault = numbers.FirstOrDefault();\n```\n\n### FirstOrDefault - Condition\n\nThis sample uses `FirstOrDefault` to return the first product whose ProductID is 789 as a single `Product` object, unless there is no match, in which case `null` is returned.\n\n```csharp\nList<Product> products = GetProductList();\n\nProduct product789 = products.FirstOrDefault(p => p.ProductID == 789);\n\nConsole.WriteLine(\"Product 789 exists: {0}\", product789 != null);\n```\n\n### ElementAt\n\nThis sample uses `ElementAt` to retrieve the second number greater than 5 from an array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nint fourthLowNum = (\n    from num in numbers\n    where num > 5\n    select num)\n    .ElementAt(1);  // second number is index 1 because sequences use 0-based indexing\n\nConsole.WriteLine(\"Second number > 5: {0}\", fourthLowNum);\n```\n\n## Generation Operators\n\nThese samples show different uses of Generation Operators.\n\n### Range\n\nThis sample uses `Range` to generate a sequence of numbers from 100 to 149 that is used to find which numbers in that range are odd and even.\n\n```csharp\nvar numbers =\n    from n in Enumerable.Range(100, 50)\n    select new { Number = n, OddEven = n % 2 == 1 ? \"odd\" : \"even\" };\n\nforeach (var n in numbers)\n{\n    Console.WriteLine(\"The number {0} is {1}.\", n.Number, n.OddEven);\n}\n```\n\n### Repeat\n\nThis sample uses `Repeat` to generate a sequence that contains the number 7 ten times.\n\n```csharp\nvar numbers = Enumerable.Repeat(7, 10);\n\nforeach (var n in numbers)\n{\n    Console.WriteLine(n);\n}\n```\n\n## Quantifiers\n\nThese samples show different uses of Quantifiers.\n\n### Any - Simple\n\nThis sample uses `Any`to determine if any of the words in the array contain the substring 'ei'.\n\n```csharp\nstring[] words = { \"believe\", \"relief\", \"receipt\", \"field\" };\n\nbool iAfterE = words.Any(w => w.Contains(\"ei\"));\n```\n\n### Any - Grouped\n\nThis sample uses `Any` to return a grouped a list of products only for categories that have at least one product that is out of stock.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar productGroups =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    where prodGroup.Any(p => p.UnitsInStock == 0)\n    select new { Category = prodGroup.Key, Products = prodGroup };\n```\n\n### All - Simple\n\nThis sample uses `All` to determine whether an array contains only odd numbers.\n\n```csharp\nint[] numbers = { 1, 11, 3, 19, 41, 65, 19 };\n\nbool onlyOdd = numbers.All(n => n % 2 == 1);\n```\n\n### All - Grouped\n\nThis sample uses `All` to return a grouped a list of products only for categories that have all of their products in stock.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar productGroups =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    where prodGroup.All(p => p.UnitsInStock > 0)\n    select new { Category = prodGroup.Key, Products = prodGroup };\n```\n\n## Aggregate Operators\n\nThese samples show different uses of Aggregate Operators\n\n### Count - Simple\n\nThis sample uses `Count` to get the number of unique factors of 300.\n\n```csharp\nint[] primeFactorsOf300 = { 2, 2, 3, 5, 5 };\n\nint uniqueFactors = primeFactorsOf300.Distinct().Count();\n\nConsole.WriteLine(\"There are {0} unique prime factors of 300.\", uniqueFactors);\n```\n\n### Count - Conditional\n\nThis sample uses `Count` to get the number of odd ints in the array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nint oddNumbers = numbers.Count(n => n % 2 == 1);\n\nConsole.WriteLine(\"There are {0} odd numbers in the list.\", oddNumbers);\n```\n\n### Count - Nested\n\nThis sample uses `Count` to return a list of customers and how many orders each has.\n\n```csharp\nList<Customer> customers = GetCustomerList();\n\nvar orderCounts =\n    from cust in customers\n    select new { cust.CustomerID, OrderCount = cust.Orders.Count() };\n```\n\n### Count - Grouped\n\nThis sample uses `Count`to return a list of categories and how many products each has.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar categoryCounts =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    select new { Category = prodGroup.Key, ProductCount = prodGroup.Count() };\n```\n\n### Sum - Simple\n\nThis sample uses `Sum` to add all the numbers in an array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\ndouble numSum = numbers.Sum();\n```\n\n### Sum - Projection\n\nThis sample uses `Sum` to get the total number of characters of all words in the array.\n\n```csharp\nstring[] words = { \"cherry\", \"apple\", \"blueberry\" };\n\ndouble totalChars = words.Sum(w => w.Length);\n```\n\n### Sum - Grouped\n\nThis sample uses `Sum` to get the total units in stock for each product category.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar categories =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    select new { Category = prodGroup.Key, TotalUnitsInStock = prodGroup.Sum(p => p.UnitsInStock) };\n```\n\n### Min - Simple\n\nThis sample uses `Min` to get the lowest number in an array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nint minNum = numbers.Min();\n```\n\n### Min - Projection\n\nThis sample uses `Min` to get the length of the shortest word in an array.\n\n```csharp\nstring[] words = { \"cherry\", \"apple\", \"blueberry\" };\n\nint shortestWord = words.Min(w => w.Length);\n```\n\n### Min - Grouped\n\nThis sample uses `Min` to get the cheapest price among each category's products.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar categories =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    select new { Category = prodGroup.Key, CheapestPrice = prodGroup.Min(p => p.UnitPrice) };\n```\n\n### Min - Elements\n\nThis sample uses `Min` to get the products with the cheapest price in each category.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar categories =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    let minPrice = prodGroup.Min(p => p.UnitPrice)\n    select new { Category = prodGroup.Key, CheapestProducts = prodGroup.Where(p => p.UnitPrice == minPrice) };\n```\n\n### Max - Simple\n\nThis sample uses `Max` to get the highest number in an array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nint maxNum = numbers.Max();\n```\n\n### Max - Projection\n\nThis sample uses `Max` to get the length of the longest word in an array.\n\n```csharp\nstring[] words = { \"cherry\", \"apple\", \"blueberry\" };\n\nint longestLength = words.Max(w => w.Length);\n```\n\n### Max - Grouped\n\nThis sample uses `Max` to get the most expensive price among each category's products.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar categories =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    select new { Category = prodGroup.Key, MostExpensivePrice = prodGroup.Max(p => p.UnitPrice) };\n```\n\n### Max - Elements\n\nThis sample uses `Max` to get the products with the most expensive price in each category.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar categories =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    let maxPrice = prodGroup.Max(p => p.UnitPrice)\n    select new { Category = prodGroup.Key, MostExpensiveProducts = prodGroup.Where(p => p.UnitPrice == maxPrice) };\n```\n\n### Average - Simple\n\nThis sample uses `Average` to get the average of all numbers in an array.\n\n```csharp\nint[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\ndouble averageNum = numbers.Average();\n```\n\n### Average - Projection\n\nThis sample uses `Average` to get the average length of the words in the array.\n\n```csharp\nstring[] words = { \"cherry\", \"apple\", \"blueberry\" };\n\ndouble averageLength = words.Average(w => w.Length);\n```\n\n### Average - Grouped\n\nThis sample uses `Average` to get the average price of each category's products.\n\n```csharp\nList<Product> products = GetProductList();\n\nvar categories =\n    from prod in products\n    group prod by prod.Category into prodGroup\n    select new { Category = prodGroup.Key, AveragePrice = prodGroup.Average(p => p.UnitPrice) };\n```\n\n### Aggregate - Simple\n\nThis sample uses `Aggregate` to create a running product on the array that calculates the total product of all elements.\n\n```csharp\ndouble[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 };\n\ndouble product = doubles.Aggregate((runningProduct, nextFactor) => runningProduct * nextFactor);\n```\n\n### Aggregate - Seed\n\nThis sample uses `Aggregate` to create a running account balance that subtracts each withdrawal from the initial balance of 100, as long as the balance never drops below 0.\n\n```csharp\ndouble startBalance = 100.0;\n\nint[] attemptedWithdrawals = { 20, 10, 40, 50, 10, 70, 30 };\n\ndouble endBalance =\n    attemptedWithdrawals.Aggregate(startBalance,\n        (balance, nextWithdrawal) =>\n            ((nextWithdrawal <= balance) ? (balance - nextWithdrawal) : balance));\n```\n\n## Miscellaneous Operators\n\nThese samples show different uses of Miscellaneous Operators.\n\n### Concat - 1\n\nThis sample uses `Concat` to create one sequence that contains each array's values, one after the other.\n\n```csharp\nint[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };\nint[] numbersB = { 1, 3, 5, 7, 8 };\n\nvar allNumbers = numbersA.Concat(numbersB);\n```\n\n### Concat - 2\n\nThis sample uses `Concat` to create one sequence that contains the names of all customers and products, including any duplicates.\n\n```csharp\nList<Customer> customers = GetCustomerList();\nList<Product> products = GetProductList();\n\nvar customerNames =\n    from cust in customers\n    select cust.CompanyName;\nvar productNames =\n    from prod in products\n    select prod.ProductName;\n\nvar allNames = customerNames.Concat(productNames);\n```\n\n### EqualAll - 1\n\nThis sample uses `SequenceEquals` to see if two sequences match on all elements in the same order.\n\n```csharp\nvar wordsA = new string[] { \"cherry\", \"apple\", \"blueberry\" };\nvar wordsB = new string[] { \"cherry\", \"apple\", \"blueberry\" };\n\nbool match = wordsA.SequenceEqual(wordsB);\n```\n\n### EqualAll - 2\n\nThis sample uses `SequenceEqual` to see if two sequences match on all elements in the same order.\n\n```csharp\nvar wordsA = new string[] { \"cherry\", \"apple\", \"blueberry\" };\nvar wordsB = new string[] { \"apple\", \"blueberry\", \"cherry\" };\n\nbool match = wordsA.SequenceEqual(wordsB);\n```\n\n## Custom Sequence Operators\n\nThis sample shows the use of a Custom Sequence Operator. It calculates the dot product of two integer vectors.\n\n```csharp\npublic static IEnumerable<S> Combine<S>(this IEnumerable<DataRow> first, IEnumerable<DataRow> second, System.Func<DataRow, DataRow, S> func)\n{\n    using (IEnumerator<DataRow> e1 = first.GetEnumerator(), e2 = second.GetEnumerator())\n    {\n        while (e1.MoveNext() && e2.MoveNext())\n        {\n            yield return func(e1.Current, e2.Current);\n        }\n    }\n}\n\nvar numbersA = testDS.Tables[\"NumbersA\"].AsEnumerable();\nvar numbersB = testDS.Tables[\"NumbersB\"].AsEnumerable();\n\nint dotProduct = numbersA.Combine(numbersB, (a, b) => a.Field<int>(\"number\") * b.Field<int>(\"number\")).Sum();\n```\n\n## Query Execution\n\nThese samples show different concepts of Query Execution.\n\n### Deferred Execution\n\nThe following sample shows how query execution is deferred until the query is enumerated at a foreach statement.\n\n```csharp\n// Queries are not executed until you enumerate over them.\nint[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nint i = 0;\nvar simpleQuery =\n    from num in numbers\n    select ++i;\n\n// The local variable 'i' is not incremented\n// until the query is executed in the foreach loop.\nConsole.WriteLine(\"The current value of i is {0}\", i); //i is still zero\n\nforeach (var item in simpleQuery)\n{\n    Console.WriteLine(\"v = {0}, i = {1}\", item, i); // now i is incremented          \n}\n```\n\n### Immediate Execution\n\nThe following sample shows how queries can be executed immediately with operators such as `ToList()`.\n\n```csharp\n// Methods like ToList(), Max(), and Count() cause the query to be\n// executed immediately.            \nint[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\n\nint i = 0;\nvar immediateQuery = (\n    from num in numbers\n    select ++i)\n    .ToList();\n\nConsole.WriteLine(\"The current value of i is {0}\", i); //i has been incremented\n\nforeach (var item in immediateQuery)\n{\n    Console.WriteLine(\"v = {0}, i = {1}\", item, i);\n}\n```\n\n### Query Reuse\n\nThe following sample shows how, because of deferred execution, queries can be used again after data changes and will then operate on the new data.\n\n```csharp\n// Deferred execution lets us define a query once\n// and then reuse it later in various ways.\nint[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };\nvar lowNumbers =\n    from num in numbers\n    where num <= 3\n    select num;\n\nConsole.WriteLine(\"First run numbers <= 3:\");\nforeach (int n in lowNumbers)\n{\n    Console.WriteLine(n);\n}\n\n// Query the original query.\nvar lowEvenNumbers =\n    from num in lowNumbers\n    where num % 2 == 0\n    select num;\n\nConsole.WriteLine(\"Run lowEvenNumbers query:\");\nforeach (int n in lowEvenNumbers)\n{\n    Console.WriteLine(n);\n}\n\n// Modify the source data.\nfor (int i = 0; i < 10; i++)\n{\n    numbers[i] = -numbers[i];\n}\n\n// During this second run, the same query object,\n// lowNumbers, will be iterating over the new state\n// of numbers[], producing different results:\nConsole.WriteLine(\"Second run numbers <= 3:\");\nforeach (int n in lowNumbers)\n{\n    Console.WriteLine(n);\n}\n```\n\n## Join Operators\n\nThese samples show different uses of Join Operators.\n\n### Cross Join\n\nThis sample shows how to perform a simple inner equijoin of two sequences to produce a flat result set that consists of each element in suppliers that has a matching element in customers.\n\n```csharp\nList<Customer> customers = GetCustomerList();\nList<Supplier> suppliers = GetSupplierList();\n\nvar custSupJoin =\n    from sup in suppliers\n    join cust in customers on sup.Country equals cust.Country\n    select new { Country = sup.Country, SupplierName = sup.SupplierName, CustomerName = cust.CompanyName };\n\nforeach (var item in custSupJoin)\n{\n    Console.WriteLine(\"Country = {0}, Supplier = {1}, Customer = {2}\", item.Country, item.SupplierName, item.CustomerName);\n}\n```\n\n### Group Join\n\nA group join produces a hierarchical sequence. The following query is an inner join that produces a sequence of objects, each of which has a key and an inner sequence of all matching elements.\n\n```csharp\nList<Customer> customers = GetCustomerList();\nList<Supplier> suppliers = GetSupplierList();\n\nvar custSupQuery =\n    from sup in suppliers\n    join cust in customers on sup.Country equals cust.Country into cs\n    select new { Key = sup.Country, Items = cs };\n\n\nforeach (var item in custSupQuery)\n{\n    Console.WriteLine(item.Key + \":\");\n    foreach (var element in item.Items)\n    {\n        Console.WriteLine(\"   \" + element.CompanyName);\n    }\n}\n```\n\n### Group Join - 2\n\nThe group join operator is more general than join, as this slightly more verbose version of the cross join sample shows.\n\n```csharp\nstring[] categories = new string[]{ \n\"Beverages\", \n\"Condiments\", \n\"Vegetables\", \n\"Dairy Products\", \n\"Seafood\" };\n\nList<Product> products = GetProductList();\n\nvar prodByCategory =\n    from cat in categories\n    join prod in products on cat equals prod.Category into ps\n    from p in ps\n    select new { Category = cat, p.ProductName };\n\nforeach (var item in prodByCategory)\n{\n    Console.WriteLine(item.ProductName + \": \" + item.Category);\n}\n```\n\n### Left Outer Join\n\nA left outer join produces a result set that includes all the left hand side elements at least once, even if they don't match any right hand side elements.\n\n```csharp\nList<Customer> customers = GetCustomerList();\nList<Supplier> suppliers = GetSupplierList();\n\nvar supplierCusts =\n    from sup in suppliers\n    join cust in customers on sup.Country equals cust.Country into cs\n    from c in cs.DefaultIfEmpty()  // DefaultIfEmpty preserves left-hand elements that have no matches on the right side \n    orderby sup.SupplierName\n    select new\n    {\n        Country = sup.Country,\n        CompanyName = c == null ? \"(No customers)\" : c.CompanyName,\n        SupplierName = sup.SupplierName\n    };\n\nforeach (var item in supplierCusts)\n{\n    Console.WriteLine(\"{0} ({1}): {2}\", item.SupplierName, item.Country, item.CompanyName);\n}\n```\n\n## Join With Projection\n\nFor each customer in the table of customers, this query returns all the suppliers from that same country, or else a string indicating that no suppliers from that country were found.\n\n```csharp\nList<Customer> customers = GetCustomerList();\nList<Supplier> suppliers = GetSupplierList();\n\nvar custSuppliers =\n    from cust in customers\n    join sup in suppliers on cust.Country equals sup.Country into ss\n    from s in ss.DefaultIfEmpty()\n    orderby cust.CompanyName\n    select new\n    {\n        Country = cust.Country,\n        CompanyName = cust.CompanyName,\n        SupplierName = s == null ? \"(No suppliers)\" : s.SupplierName\n    };\n\nforeach (var item in custSuppliers)\n{\n    Console.WriteLine(\"{0} ({1}): {2}\", item.CompanyName, item.Country, item.SupplierName);\n}\n```\n\n## Join With Projection - 2\n\nFor each supplier in the table of suppliers, this query returns all the customers from the same city and country, or else a string indicating that no customers from that city/country were found.\n\nNote the use of anonymous types to encapsulate the multiple key values.\n\n```csharp\nList<Customer> customers = GetCustomerList();\nList<Supplier> suppliers = GetSupplierList();\n\nvar supplierCusts =\n    from sup in suppliers\n    join cust in customers on new { sup.City, sup.Country } equals new { cust.City, cust.Country } into cs\n    from c in cs.DefaultIfEmpty() //Remove DefaultIfEmpty method call to make this an inner join\n    orderby sup.SupplierName\n    select new\n    {\n        Country = sup.Country,\n        City = sup.City,\n        SupplierName = sup.SupplierName,\n        CompanyName = c == null ? \"(No customers)\" : c.CompanyName\n    };\n\nforeach (var item in supplierCusts)\n{\n    Console.WriteLine(\"{0} ({1}, {2}): {3}\", item.SupplierName, item.City, item.Country, item.CompanyName);\n}\n```"
  },
  {
    "path": "csharp/linq/meta.json",
    "content": "{\n  \"order\":{\n    \"101-linq-examples.workbook\":\"101 Linq Examples\"\n  }\n}\n"
  },
  {
    "path": "csharp/meta.json",
    "content": "{\n  \"order\":{\n    \"csharp7\":\"C# 7\",\n    \"csharp6\":\"C# 6\",\n    \"async\":\"Async Await\",\n    \"collections\":\"Collections\",\n    \"linq\":\"Linq\",\n    \"roslyn\":\".NET Compiler Platform (Roslyn)\"\n  }\n}\n"
  },
  {
    "path": "csharp/roslyn/meta.json",
    "content": "{\n  \"order\":{\n    \"roslyn-syntax-trees.workbook\":\"Exploring Roslyn Syntax Trees\"\n  }\n}\n"
  },
  {
    "path": "csharp/roslyn/roslyn-syntax-trees.workbook/index.workbook",
    "content": "﻿---\nuti: com.xamarin.workbook\nplatforms:\n- Console\npackages:\n- id: Microsoft.CodeAnalysis.CSharp\n  version: 1.3.2\n---\n\n# Exploring Roslyn Syntax Trees\n\nA compiler is often visualized as a “black box”: Source code goes in, and machine code comes out.\n\nToday’s compilers, however, need to be much more sophisticated. Programming environments such as Visual Studio make use of the intermediate results of parsing and compilation to display possible errors, to adjust formatting, and to provide suggestions to the programmer. Modern compilers are actually services with a vast infrastructure of APIs.\n\nThe .NET Compiler Platform is Microsoft’s open-source C# and Visual Basic compiler that does indeed expose a rich collection of APIs for source-code analysis and other tasks. Although the official name of the .NET Compiler Platform is descriptive and not too wordy, it is still generally referred to by its original codename, Roslyn, named after the city in Washington state.\n\nThe Roslyn information hub is the Github repository where it resides:\n\n[https://github.com/dotnet/roslyn](https://github.com/dotnet/roslyn \"Roslyn repository on Github\")\n\nThe ReadMe file in the root directory contains links to other resources, including an alternative source-code browser for Roslyn that supports searching and hyperlinks:\n\n[http://source.roslyn.io/](http://source.roslyn.io/ \"Roslyn source code\")\n\nThis workbook explores a few basic concepts of Roslyn. You’ll see how Roslyn translates a C# or Visual Basic source code file or code snippet into a syntax tree, which is a tree of nodes of type `SyntaxNode`. Every syntax node object corresponds to a code element and generally a span of text in the source-code file.\n\nIf you wish to create your own workbooks to use Roslyn to analyze C# code, you’ll need to invoke the **File | Add Package** menu command to add the **Microsoft.CodeAnalysis.CSharp** Nuget package. That’s already been done for this workbook. Adding this package creates the following assembly reference:\n\n```csharp\n#r \"Microsoft.CodeAnalysis.CSharp\"\n```\n\nThe **Microsoft.CodeAnalysis.Common** assembly is automatically included as well.\n\nYou’ll need a few `using` directives:\n\n```csharp\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\n```\n\nHere is a string containing a tiny but complete C# program that performs a little calculation and displays the words “Hello, Roslyn!”:\n\n```csharp\nstring helloRoslyn = \n@\"using System;\n\nnamespace HelloRoslyn\n{\n    class MyProgram\n    {\n        static void Main(string[] args)\n        {\n            double twoPi = 2 * Math.PI;\n            Console.WriteLine(\"\"Hello, Roslyn!\"\");\n        }\n    }\n}\"\n```\n\nWhat you will *not* see in this workbook is this program actually running! The program won’t even be compiled. Instead, this workbook demonstrates how you can use Roslyn tools to parse the code and analyze the program.\n\n## The Tree and its Root\n\nThe static `CSharpSyntaxTree.ParseText` method breaks the code down into a tree of `SyntaxNode` objects:\n\n```csharp\nSyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(helloRoslyn);\n```\n\nThe `ParseText` method is defined as returning an object of type `SyntaxTree`. By default, the workbook displays the `ToString` representation of the `SyntaxTree` object, which is the entire text of the little program. If you choose **Object Members** rather than **ToString()** from the dropdown menu, you’ll see that the object is actually of type `ParsedSyntaxTree`, a private class embedded in (and deriving from) the `CSharpSyntaxTree` class, which derives from `SyntaxTree`.\n\nThe `SyntaxTree` class defines a `GetRoot` method that returns a `SyntaxNode` object that represents the entire code document:\n\n```csharp\nSyntaxNode rootSyntaxNode = syntaxTree.GetRoot();\n```\n\nAgain, the `ToString` representation is the entire program. But as you can see by selecting **Object Members** from the dropdown, the object returned from `GetRoot` is actually of type `CompilationUnitSyntax`, which is a type of `SyntaxNode` that refers to a chunk of code that can be compiled.\n\nThere are 218 classes in the `Microsoft.CodeAnalysis.CSharp.Syntax` namespace that derive from `SyntaxNode` and `CSharpSyntaxNode`, and they all have a `Syntax` suffix. A few of the other classes that derive from `SyntaxNode` are:\n\n* `ClassDeclarationSyntax`\n\n* `StructDeclarationSyntax`\n\n* `MethodDeclarationSyntax`\n\n* `PropertyDeclarationSyntax`\n\n* `LocalDeclarationStatementSyntax`\n\n* `ExpressionStatementSyntax`\n\nIn the **Object Members** listing of `CompilationUnitSyntax`, you can see several properties with the word `Trivia` in their names. This term refers to elements of the source code that are not generally important to the compilation, such as whitespace and comments. These are not syntax nodes in themselves but they are part of syntax nodes. The trivia occurs either at the beginning of the node (referred to as `Leading`) or at the end of the node (`Trailing`). Any embedded whitespace or comments are part of child nodes.\n\nThe `Span` property indicates the starting offset of the text for this node, and the length of the text encompassed by the node. Notice how the `Span` property is displayed with the syntax **\\[num1..num2)**. The square bracket at the beginning and a parenthesis at the end means that the span of text begins at offset **num1** and goes up to but *not* including offset **num2**. The `FullSpan` property includes trivia.\n\nThe `ToString` method of `SyntaxNode` returns the text associated with the syntax node, which is the text encompassed by the `Span` property. `SyntaxNode` also defines a `ToFullString` method that returns the text encompassed by the `FullSpan` property and which includes trivia.\n\nSome of the most important characteristics of a `SyntaxNode` object are not exposed as properties but instead must be accessed through methods. One of these methods is `Kind`:\n\n```csharp\nSyntaxKind kind = rootSyntaxNode.Kind();\n```\n\nThis method returns a member of the `SyntaxKind` enumeration, which has about 480 members. ([Take a look](http://source.roslyn.io/#Microsoft.CodeAnalysis.CSharp/Syntax/SyntaxKind.cs \"SyntaxKind.cs\").) Many of these members correspond to classes that derive from `SyntaxNode`. For example, if the `Kind` method of a `SyntaxNode` object returns `NullableType`, then the `SyntaxNode` object is actually of type `NullableTypeSyntax`. But there are more members of the `SyntaxKind` enumeration than types of `SyntaxNode` derivatives. You’ll see many with the suffix of `Token` and others with a suffix of `Keyword`. You’ll see some of those later in this workbook.\n\n## Child Nodes\n\n`SyntaxNode` also defines a `ChildNodes` method:\n\n```csharp\nIEnumerable<SyntaxNode> rootChildren = rootSyntaxNode.ChildNodes();\n```\n\nWhen you run this code cell you can easily identify the two items in this collection by their `ToString` representations: The first is a collection of `using` directives and the second is the remainder of the program beginning with the `namespace` declaration. By selecting **Object Members** from the dropdown menus for these items, you’ll see that the first is a `SyntaxNode` of type `UsingDirectiveSyntax`, and the second is a `SyntaxNode` of type `NamspaceDeclarationSyntax`, which encompasses the `namespace` declaration and everything in it.\n\nIt’s posible to write a small method that calls the `ChildNodes` method recursively to obtain a full list of all the syntax nodes that make up the compilation unit. The following method first displays the result of the `Kind()` method and the `Span` start and length values. If the node has no children, then the text associated with the node is displayed. Otherwise the method is called recursively for the node’s children:\n\n```csharp\nvoid DisplayNodes(SyntaxNode syntaxNode, int indent = 0)\n{\n    Console.Write(\"{0}{1} {2}\", new string('\\u00A0', 4 * indent), \n                                syntaxNode.Kind(), \n                                syntaxNode.Span);\n\n    IEnumerable<SyntaxNode> childNodes = syntaxNode.ChildNodes();\n\n    if (childNodes.Count() == 0)\n    {\n        Console.WriteLine(\" {0}\", syntaxNode);\n    }\n    else\n    {\n        Console.WriteLine();   // end the line displayed with Write\n        foreach (SyntaxNode childNode in childNodes)\n        {\n            DisplayNodes(childNode, indent + 1);\n        }\n    }\n}\n```\n\nThe `indent` parameter to `DisplayNodes` causes each line to be indented based on the nesting level. You can run this function for the entire little program by passing the root node as an argument:\n\n```csharp\nDisplayNodes(rootSyntaxNode);\n```\n\nKeep in mind that the text that begins each line is a member of the `SyntaxKind` enumeration returned from the `Kind` method, and the type of the `SyntaxNode` is that same name with the word `Syntax` appended. When discussing these nodes you can use either name.\n\nNotice how these nodes correspond to the overall structure of the program. The `NamespaceDeclaration` node includes a `ClassDeclaration`, which includes a `MethodDeclaration`, which includes a method `ParameterList` and a `Block`, which is the method body delimited by curly braces. The `Block` contains two statements: a `LocalDeclarationStatement` for the `twoPi` variable, and an `ExpressionStatement` for the `Console.WriteLine` call.\\\n\\\nThe `DisplayNode` function that creates this listing only displays the text associated with a node if the node has no children. Otherwise, many nodes would encompass multiple lines of text and the display would look like a mess. You’ll see in this list several recognizable portions of the little program, but certainly not all of them. For example, where is the class name of `MyProgram` and the method name of `Main`?\n\n## Syntax Nodes in Detail\n\nThe class name and method name are not themselves `SyntaxNode` objects. They are part of other syntax nodes, and to see them you’ll need to examine the `ClassDeclarationSyntax` and `MethodDeclarationSyntax` objects in more detail.\n\nHere is a little function that recursively enumerates the entire syntax tree and returns a particular `SyntaxNode` corresponding to a criterion that you can set as a parameter to the function:\n\n```csharp\nSyntaxNode FindNode(SyntaxNode syntaxNode, Func<SyntaxNode, bool> criterion)\n{\n    if (criterion(syntaxNode))\n        return syntaxNode;\n\n    foreach (SyntaxNode childNode in syntaxNode.ChildNodes())\n    {\n        SyntaxNode foundNode = FindNode(childNode, criterion);\n\n        if (foundNode != null)\n        {\n            return foundNode;\n        }\n    }\n    return null;        \n}\n```\n\nThe following call returns the first `SyntaxNode` in the tree whose `Kind` method returns `SyntaxKind.ClassDeclaration`:\n\n```csharp\nSyntaxNode classDeclarationSyntax = FindNode(rootSyntaxNode, (syntaxNode) => syntaxNode.Kind() == SyntaxKind.ClassDeclaration);\n```\n\nA `SyntaxNode` of type `ClassDeclarationSyntax` contains information about an entire class. The `Identifier` property is the name of the class. The `Modifiers` property contains information about the class modifiers (such as `public` and `static`), the `BaseList` is a list of the classes this class derives from and the interfaces it implements, and the `Members`property provides information about all the class’s members. The information is similar to what you can obtain from .NET reflection but very differently organized.\n\nSimilarly, you can find the `Main` method like this:\n\n```csharp\nSyntaxNode methodDeclarationSyntax = FindNode(rootSyntaxNode, (syntaxNode) => syntaxNode.Kind() == SyntaxKind.MethodDeclaration);\n```\n\nThe method name is available in the `Identifier` property, and the `Parameters` property contains information about all the parameters to the method.\n\n## Syntax Nodes \\+ Tokens \\+ Keywords\n\nIt’s also possible to display a tree containing the text of the entire program (without trivia) by enumerating not only syntax nodes, but also tokens. Tokens include punctuation characters, string literals, numeric literals, identifiers, and keywords. \n\nYou can rewrite the `DisplayNodes` function to be `DisplayNodesAndTokens` by replacing occurrences of the `SyntaxNode` type with `SyntaxNodeOrToken`, and replacing the `ChildNodes` method call with `ChildNodesAndTokens`:\n\n```csharp\nvoid DisplayNodesAndTokens(SyntaxNodeOrToken syntaxNodeOrToken, int indent = 0)\n{\n    Console.Write(\"{0}{1} [{2}..{3})\", new string('\\u00A0', 4 * indent), \n                                       syntaxNodeOrToken.Kind(),\n                                       syntaxNodeOrToken.Span.Start,\n                                       syntaxNodeOrToken.Span.End);\n\n    IEnumerable<SyntaxNodeOrToken> childNodesOrTokens = syntaxNodeOrToken.ChildNodesAndTokens();\n\n    if (childNodesOrTokens.Count() == 0)\n    {\n        Console.WriteLine(\" {0}\", syntaxNodeOrToken);\n    }\n    else\n    {\n        Console.WriteLine();\n        foreach (SyntaxNodeOrToken childNodeOrToken in childNodesOrTokens)\n        {\n            DisplayNodesAndTokens(childNodeOrToken, indent + 1);\n        }\n    }\n}\n```\n\nNow run this method starting at the root node:\n\n```csharp\nDisplayNodesAndTokens(rootSyntaxNode);\n```\n\nNow you can see every little character that makes up this little program, all identified with members of the `SyntaxKind` enumeration, including members with suffixes of `Token` and `Keyword`.\n\n## Experiment!\n\nOf course, you’ll want to go back to the original string that contains this little program to make changes and see what happens. You’ll also want to introduce errors into the code and see how that is handled.\n\nKeep in mind that this little program has only been parsed for syntax. It has not been compiled. The parser is not trying to resolve the `Math.PI` field or the `Console.WriteLine` methods. The parser clearly recognizes the `void` return value of `Main` as a `VoidKeyword` token, but if you change that return type to something else (for example, `xoid`), it merely becomes an `IdentifierToken` whose meaning is not yet known.\n\nCompilation adds semantics to syntax. But that’s a step for another workbook.\n\n## Bonus Addendum\n\nThe 219 classes that derive from `SyntaxNode` correspond to all the structural elements that potentially comprise a C# program. Wouldn’t it be interesting to see a class hierarchy of these `SyntaxNode` derivatives?\n\nYou could use Roslyn to do that, but you would need to load in the Roslyn source code files. Since this workbook has access to some Roslyn assemblies, it makes more sense to use standard .NET reflection for this job.\n\nThe first step is to define a class to store all the names of the classes that derive from `SyntaxNode` and the base class name of each of those classes:\n\n```csharp\nclass ClassAndBase \n{\n    public ClassAndBase(string name, string baseClass = null)\n    {\n        Name = name;\n        BaseClass = baseClass;\n    }\n    public string Name { private set; get; }\n    public string BaseClass { private set; get; }\n}\n```\n\nThe following code loops through all the types in the **Microsoft.CodeAnalysis.CSharp** assembly, which contains all the classes for C# that derive from `SyntaxNode` but not `Syntax Node` itself. These are accumulated in a `List` object and then sorted:\n\n```csharp\nvar assembly = System.Reflection.Assembly.GetAssembly(typeof(ClassDeclarationSyntax));\nList<ClassAndBase> classList = new List<ClassAndBase>(); \n\nforeach (Type type in assembly.GetExportedTypes())\n{\n    if (type.IsSubclassOf(typeof(SyntaxNode)))\n    {\n        classList.Add(new ClassAndBase(type.Name, type.BaseType.Name));\n    }\n}\n\nclassList.Sort((arg1, arg2) => arg1.Name.CompareTo(arg2.Name));\n```\n\nThe following recursive function displays a class and all of its subclasses:\n\n```csharp\nvoid DisplayClassAndSubclasses(ClassAndBase baseClass, int indent = 0)\n{\n    Console.WriteLine(\"{0}{1}\", new string('\\u00A0', 4 * indent), baseClass.Name);\n\n    foreach (ClassAndBase subclass in classList)\n    {\n        if (subclass.BaseClass == baseClass.Name)\n        {\n            DisplayClassAndSubclasses(subclass, indent + 1);\n        }        \n    }                                \n}\n```\n\nTo kick off the display, simply call the function starting with `SyntaxNode`:\n\n```csharp\nDisplayClassAndSubclasses(new ClassAndBase(\"SyntaxNode\"));\n```\n\nAt first glance, you might think it impossible that you’re familiar with all these many types of syntax structures possible in a C# program. But take a closer look. Probably the most familiar will be the classes that derive from `ExpressionSyntax`, `StatementSyntax` and `MemberDeclarationSyntax`, which also includes the various types supported by C#.  \n\nYou might conclude you know C# better than you thought, but exploring Roslyn is a great way to learn the language in even more depth."
  },
  {
    "path": "graphics/meta.json",
    "content": "{\n  \"order\":{\n    \"skiasharp\":\"SkiaSharp\",\n    \"urhosharp\":\"UrhoSharp\",\n    \"tiny-renderer\":\"TinyRenderer\"\n  }\n}\n"
  },
  {
    "path": "graphics/skiasharp/colors/colors.workbook/index.workbook",
    "content": "---\ntitle: Working with SKColor\nuti: com.xamarin.workbook\nid: a8709e7d-ba63-47a4-8fb3-bed7d3bf9fbb\nplatforms:\n- Console\npackages:\n- id: SkiaSharp\n  version: 1.57.1\n---\n\n```csharp\n// install SkiaSharp\n#r \"SkiaSharp\"\n\nusing SkiaSharp;\n```\n\n# SkiaSharp and colors\n\nIn previous workbooks, we’ve explored the SkiaSharp drawing and image APIs. In this workbook, we’re going to do a quick demo of `SKColor`, used by SkiaSharp to represent colors. We’ve seen `SKColor` before in the canvas-filling APIs, and you can see it in the image filters that create colored lights. Here, we’ll just demonstrate some of the built-in colors and the way they’re presented in Workbooks. First, a SKColor rainbow:\n\n```csharp\nnew [] {\n    new SKColor (255, 0, 0),\n    new SKColor (255, 127, 0),\n    new SKColor (255, 255, 0),\n    new SKColor (0, 255, 0),\n    new SKColor (0, 0, 255),\n    new SKColor (75, 0, 130),\n    new SKColor (143, 0, 255)\n}\n```\n\nSkiaSharp also provides a massive list of named colors—it includes all of the CSS named colors:\n\n```csharp\nnew [] {\n    SKColors.AliceBlue,\n    SKColors.AntiqueWhite,\n    SKColors.Aqua,\n    SKColors.Aquamarine,\n    SKColors.Azure,\n    SKColors.Beige,\n    SKColors.Bisque,\n    SKColors.Black,\n    SKColors.BlanchedAlmond,\n    SKColors.Blue,\n    SKColors.BlueViolet,\n    SKColors.Brown,\n    SKColors.BurlyWood,\n    SKColors.CadetBlue,\n    SKColors.Chartreuse,\n    SKColors.Chocolate,\n    SKColors.Coral,\n    SKColors.CornflowerBlue,\n    SKColors.Cornsilk,\n    SKColors.Crimson,\n    SKColors.Cyan,\n    SKColors.DarkBlue,\n    SKColors.DarkCyan,\n    SKColors.DarkGoldenrod,\n    SKColors.DarkGray,\n    SKColors.DarkGreen,\n    SKColors.DarkKhaki,\n    SKColors.DarkMagenta,\n    SKColors.DarkOliveGreen,\n    SKColors.DarkOrange,\n    SKColors.DarkOrchid,\n    SKColors.DarkRed,\n    SKColors.DarkSalmon,\n    SKColors.DarkSeaGreen,\n    SKColors.DarkSlateBlue,\n    SKColors.DarkSlateGray,\n    SKColors.DarkTurquoise,\n    SKColors.DarkViolet,\n    SKColors.DeepPink,\n    SKColors.DeepSkyBlue,\n    SKColors.DimGray,\n    SKColors.DodgerBlue,\n    SKColors.Firebrick,\n    SKColors.FloralWhite,\n    SKColors.ForestGreen,\n    SKColors.Fuchsia,\n    SKColors.Gainsboro,\n    SKColors.GhostWhite,\n    SKColors.Gold,\n    SKColors.Goldenrod,\n    SKColors.Gray,\n    SKColors.Green,\n    SKColors.GreenYellow,\n    SKColors.Honeydew,\n    SKColors.HotPink,\n    SKColors.IndianRed,\n    SKColors.Indigo,\n    SKColors.Ivory,\n    SKColors.Khaki,\n    SKColors.Lavender,\n    SKColors.LavenderBlush,\n    SKColors.LawnGreen,\n    SKColors.LemonChiffon,\n    SKColors.LightBlue,\n    SKColors.LightCoral,\n    SKColors.LightCyan,\n    SKColors.LightGoldenrodYellow,\n    SKColors.LightGray,\n    SKColors.LightGreen,\n    SKColors.LightPink,\n    SKColors.LightSalmon,\n    SKColors.LightSeaGreen,\n    SKColors.LightSkyBlue,\n    SKColors.LightSlateGray,\n    SKColors.LightSteelBlue,\n    SKColors.LightYellow,\n    SKColors.Lime,\n    SKColors.LimeGreen,\n    SKColors.Linen,\n    SKColors.Magenta,\n    SKColors.Maroon,\n    SKColors.MediumAquamarine,\n    SKColors.MediumBlue,\n    SKColors.MediumOrchid,\n    SKColors.MediumPurple,\n    SKColors.MediumSeaGreen,\n    SKColors.MediumSlateBlue,\n    SKColors.MediumSpringGreen,\n    SKColors.MediumTurquoise,\n    SKColors.MediumVioletRed,\n    SKColors.MidnightBlue,\n    SKColors.MintCream,\n    SKColors.MistyRose,\n    SKColors.Moccasin,\n    SKColors.NavajoWhite,\n    SKColors.Navy,\n    SKColors.OldLace,\n    SKColors.Olive,\n    SKColors.OliveDrab,\n    SKColors.Orange,\n    SKColors.OrangeRed,\n    SKColors.Orchid,\n    SKColors.PaleGoldenrod,\n    SKColors.PaleGreen,\n    SKColors.PaleTurquoise,\n    SKColors.PaleVioletRed,\n    SKColors.PapayaWhip,\n    SKColors.PeachPuff,\n    SKColors.Peru,\n    SKColors.Pink,\n    SKColors.Plum,\n    SKColors.PowderBlue,\n    SKColors.Purple,\n    SKColors.Red,\n    SKColors.RosyBrown,\n    SKColors.RoyalBlue,\n    SKColors.SaddleBrown,\n    SKColors.Salmon,\n    SKColors.SandyBrown,\n    SKColors.SeaGreen,\n    SKColors.SeaShell,\n    SKColors.Sienna,\n    SKColors.Silver,\n    SKColors.SkyBlue,\n    SKColors.SlateBlue,\n    SKColors.SlateGray,\n    SKColors.Snow,\n    SKColors.SpringGreen,\n    SKColors.SteelBlue,\n    SKColors.Tan,\n    SKColors.Teal,\n    SKColors.Thistle,\n    SKColors.Tomato,\n    SKColors.Turquoise,\n    SKColors.Violet,\n    SKColors.Wheat,\n    SKColors.White,\n    SKColors.WhiteSmoke,\n    SKColors.Yellow,\n    SKColors.YellowGreen,\n    SKColors.Transparent\n};\n```\n\nThere are no convenience APIs provided for it, but colors can be darkened or lightened by fiddling with the HSL (hue, saturation, lightness) values:\n\n```csharp\nfloat hue, saturation, luminance;\nSKColors.WhiteSmoke.ToHsl(out hue, out saturation, out luminance);\nSKColors.WhiteSmoke;\n```\n\nHere we’ve converted `SKColors.WhiteSmoke` into HSL via the `ToHsl` method. We want to make it 20% darker, so we’ll reduce its luminance by 20%—i.e., we’ll multiply by 0.8.\n\n```csharp\nvar newLuma = luminance * 0.8f;\nvar newColor = SKColor.FromHsl(hue, saturation, newLuma, 0xff);\n```\n\nWe see our new color—it looks approximately 20% darker than the previous one indeed. You can manipulate hue and saturation as well—you can think of hue as the pure color value (that is, the base color), saturation as how much color there is (100% being pure color, 0% being pure grey), and lightness as the change from white to black. See [Wikipedia](https://en.wikipedia.org/wiki/HSL_and_HSV \"HLS and HSV - Wikipedia\") for more information."
  },
  {
    "path": "graphics/skiasharp/images/images.workbook/index.workbook",
    "content": "---\npackages:\n- id: SkiaSharp\n  version: 1.57.1\nuti: com.xamarin.workbook\nid: 42aced37-cff5-4cd5-8cd7-a23c986406f3\ntitle: Exploring SKImage\nplatforms:\n- Console\n---\n\n```csharp\n// install SkiaSharp\n#r \"SkiaSharp\"\n\nusing SkiaSharp;\n```\n\n# Exploring SKImage\n\nIn previous workbooks, we’ve explored the basics of SkiaSharp, and we’ve explored drawing with SkiaSharp, drawing an Archimedes spiral and a Xamagon. In addition to powerful drawing APIs, SkiaSharp also has powerful image manipulation APIs for loading, resizing, and even filtering images.\n\n## Loading an image\n\nWe’ve included an image with this workbook, called `cat.jpeg`. Let’s load it using the `SKBitmap` and `SKImage` classes. `SKImage` doesn’t have any methods for directly loading images, which is why we need to use an `SKBitmap`.\n\n```csharp\nusing System.IO;\n\nSKBitmap bitmap;\nusing (var stream = File.OpenRead (\"cat.jpeg\"))\n    bitmap = SKBitmap.Decode (stream);\nbitmap;\n```\n\nAs you can see, the image is a bit large at 1080x1080. Let’s use `SKBitmap`’s resizing support to scale it down to a more manageable size, like 540x540. We’ll use the Lanczos resizing method, as it tends to produce the most visually pleasing results. We’ll re-assign the new bitmap back to the original variable—we could keep both to compare, but we don’t need them right now.\n\n```csharp\nbitmap = bitmap.Resize (new SKImageInfo (540, 540), SKBitmapResizeMethod.Lanczos3);\n```\n\n## Filtering images\n\nNow that we have our image loaded, we’d like to apply some filters to express our artistic desire—SkiaSharp provides numerous filters via the `SKImageFilter.Create*` static API.\n\nIn particular, we’d like to use the Erode and Dilate filters, which will help us create a new image that’s styled like a painting from our original photo.\n\nSkia’s filtering API lets us chain filters to produce complex effects without having to apply the filters multiple times to an image, and we’ll use that here.\n\n```csharp\n// First, load the image from the bitmap.\nvar image = SKImage.FromBitmap (bitmap);\n\n// Next, set up some rectangles. Since we want to apply our filters to the whole image, we'll create\n// two rectangles that encompass the whole image.\nvar imageRect = SKRect.Create (0, 0, image.Width, image.Height);\nvar cropRect = new SKImageFilter.CropRect (imageRect, SKCropRectFlags.HasAll);\n\n// Next, we need to create our filters. We'll create the dilate filter first, and then\n// the erode filter, passing in the dilate filter as an input.\nvar dilate = SKImageFilter.CreateDilate (radiusX: 6, radiusY: 6, input: null, cropRect: cropRect);\nvar erode = SKImageFilter.CreateErode (radiusX: 12, radiusY: 12, input: dilate, cropRect: cropRect);\n\n// Now we need to create a final rectangle for the filter, and set up some return variables\n// for the applied filter. ApplyImageFilter returns a new image, so we don't need to do anything\n// to have Workbooks display it!\nvar imageRectI = SKRectI.Ceiling (imageRect);\nSKRectI outRect; SKPoint outPoint;\nimage.ApplyImageFilter (erode, imageRectI, imageRectI, out outRect, out outPoint);\n```\n\nAs you can see, our cat now looks like a painting. The filter APIs are incredibly powerful for imagine manipulations—you can use them to tile images, do blends, blurs, and color filtering, or change the lighting in a photo!\n\n### Exercises for image filtering\n\n* Try resizing the image to different sizes or using different resize methods.\n\n* Try going up in size instead of just down to see how the different resize methods affect that.\n\n* Try some other filters, or change the parameters/order of the existing filters."
  },
  {
    "path": "graphics/skiasharp/introduction/introduction.workbook/index.workbook",
    "content": "---\nid: dd45fdd0-cb47-4fa9-ae05-cb7549704db3\ntitle: Introduction to SkiaSharp\nuti: com.xamarin.workbook\nplatforms:\n- Console\npackages:\n- id: SkiaSharp\n  version: 1.57.1\n---\n\n```csharp\n// install SkiaSharp\n#r \"SkiaSharp\"\n```\n\n# SkiaSharp\n\nSkiaSharp is a fully cross-platform, rich 2D graphics drawing API powered by [Google's Skia library](https://skia.org/), the same library that drives Google Chrome, Mozilla Firefox, and Android's graphics stack. Not only is SkiaSharp powerful, it is also very simple to use—all you need to do is install the [SkiaSharp NuGet](https://www.nuget.org/packages/SkiaSharp).\n\nSkiaSharp can be used to render images on many platforms, including iOS, macOS, tvOS, Android, and Universal Windows Platform (UWP). Not only does SkiaSharp support native mobile apps, it also supports .NET Standard 1.3 and .NET Core on macOS and Windows, as well as Classic Windows Desktop and WPF applications.\n\n*This cool introduction is also available as a Xamarin.Forms app for iOS, Android and Windows: [mattleibow/SkiaSharpDemo](https://github.com/mattleibow/SkiaSharpDemo \"SkiaSharpDemo\") Download and try it out on your device.*\n\n## Creating a Surface\n\nBefore we can use SkiaSharp in our app, we need to make sure we add the `using` statement:\n\n```csharp\nusing SkiaSharp;\n```\n\nNow we want to draw something, but we need something to draw on. In this workbook, we are going to draw on a bitmap. As with all bitmaps, we need to have a size:\n\n```csharp\nconst int BitmapWidth = 300;\nconst int BitmapHeight = 300;\n```\n\nNow, we are going to create the bitmap. This is as simple as instantiating `SKBitmap` with the size that we decided on earlier:\n\n```csharp\nvar bitmap = new SKBitmap(BitmapWidth, BitmapHeight);\n```\n\nRight now, the bitmap is very boring and we can't even see it. But, this is where we can start doing interesting things.\n\n*On some platforms, the memory is not cleared before the bitmap is allocated. When this happens, there are artifacts from what was in memory last - which is often just random bits of data.*\n\nBefore we can draw on the bitmap, we need a canvas. And to do this we instantiate `SKCanvas`, and pass it the bitmap we just created:\n\n```csharp\nvar canvas = new SKCanvas(bitmap);\n```\n\nA `SKCanvas` does not appear in the workbook as an image because it doesn't really contain any image data. This is the layer that translates your drawing commands, such as `DrawRect` and `DrawPath`, into the appropriate commands for drawing on the current surface.\n\nNow that we have our canvas created, we can start drawing. The first thing we want to do is to make sure that the canvas is cleared.\n\n```csharp\ncanvas.Clear(SKColors.White);\n\nbitmap\n```\n\nWe can't really see anything yet, as the bitmap is just white, but now we have a clean surface to draw some shapes. To do this we will need to create a `SKPaint`, which is where we control what the drawing looks like. We can call the drawing methods multiple times and by only changing the paint, the rectangle will look totally different.\n\n## Drawing Shapes\n\nHere we are going to draw a blue circle in the top, left corner. So, we set the `IsAntialias` property to make the edges smooth, the `Style` property to indicate that we want to do a fill and finally the `Color`.\n\n```csharp\nvar circleFill = new SKPaint {\n    IsAntialias = true,\n    Style = SKPaintStyle.Fill,\n    Color = SKColors.Blue\n};\n```\n\nWe can now use that paint and draw our circle using `DrawCircle`. We pass the center coordinates, the radius and then the paint to the method:\n\n```csharp\ncanvas.DrawCircle(100, 100, 40, circleFill);\n\nbitmap\n```\n\nIf we want to but a border on that circle, we can just run that same draw command again. But, this time we pass a different paint. We have changed the `Style` to be a stroke and added a `StrokeWidth`:\n\n```csharp\nvar circleBorder = new SKPaint {\n    IsAntialias = true,\n    Style = SKPaintStyle.Stroke,\n    Color = SKColors.Red,\n    StrokeWidth = 5\n};\ncanvas.DrawCircle(100, 100, 40, circleBorder);\n\nbitmap\n```\n\nAll done! We have a nice blue circle with a thick red border.\n\n## Drawing Paths\n\nAlthough we have some simple shapes we can draw, we often want to draw complex geometry. This is done with a path. The `SKPath` type has many methods that allow us to build up any shape that we may want.\n\nHere, we are just going to draw a simple X shape using `MoveTo` and `LineTo`:\n\n```csharp\nvar path = new SKPath();\npath.MoveTo(160, 60);\npath.LineTo(240, 140);\npath.MoveTo(240, 60);\npath.LineTo(160, 140);\n```\n\nCreating a path is pretty straight forward, and so is drawing it. As with all drawing, we need to create a paint - making sure that we set the style to be a stroke, and give it a width. Then, we can draw the path using `DrawPath`:\n\n```csharp\nvar pathStroke = new SKPaint {\n    IsAntialias = true,\n    Style = SKPaintStyle.Stroke,\n    Color = SKColors.Green,\n    StrokeWidth = 5\n};\ncanvas.DrawPath(path, pathStroke);\n\nbitmap\n```\n\n## Drawing Text\n\nJust as it is easy to draw shapes and paths, so is it easy to draw text. Drawing text also uses a paint, and we can draw either an outline with a stroke, of solid text with fill:\n\n```csharp\nvar textSize = 40;\nvar textPaint = new SKPaint {\n    IsAntialias = true,\n    Style = SKPaintStyle.Fill,\n    Color = SKColors.Orange,\n    TextSize = textSize\n};\n```\n\nUnlike other operations in SkiaSharp which draw from the top, left, drawing text occurs from the text baseline. All this means is that we have to “move” the text down by the height of the text:\n\n```csharp\ncanvas.DrawText(\"SkiaSharp\", 60, 160 + textSize, textPaint);\n\nbitmap\n```\n\nAnd, that is all there is to it! SkiaSharp is a simple library, but a powerful library.\n\n## Overview\n\nGetting off the ground with SkiaSharp is easy—all you need is one NuGet: [SkiaSharp](https://www.nuget.org/packages/SkiaSharp). This package provides everything necessary to create and manipulate drawings on any platform.\n\nIf you're looking to display your drawings on-screen, you can check out the [SkiaSharp.Views](https://www.nuget.org/packages/SkiaSharp.Views) NuGet package. This package has a set of views, layers, and controls that get you going with displaying your drawing on-screen. If you have a Xamarin.Forms app, then you can install the [SkiaSharp.Views.Forms](https://www.nuget.org/packages/SkiaSharp.Views.Forms) NuGet package, which provides the same views for Xamarin.Forms.\n\nFinally, we have a lightweight SVG loading library that can be used to load an SVG into a `SKPicture`: [SkiaSharp.Svg](https://www.nuget.org/packages/SkiaSharp.Svg).\n\n## Documentation and Forums\n\nWe've documented all of the APIs of SkiaSharp on the [Xamarin developer site](https://developer.xamarin.com/api/root/SkiaSharp/), along with the [developer guides](https://developer.xamarin.com/guides/cross-platform/drawing/), which provide even more information on using SkiaSharp.\n\nYou can also ask questions on the [Xamarin SkiaSharp forums](https://forums.xamarin.com/categories/skiasharp). If you prefer StackOverflow, [we're there, too](http://stackoverflow.com/questions/tagged/skiasharp)!\n\nIf you want to chat or ask questions, some users also hang out on Gitter.im here: [xamarin/XamarinComponents](https://gitter.im/xamarin/XamarinComponents).\n\n## Code, Issues and Suggestions\n\nThe SkiaSharp codebase is constantly growing and improving. If you want to contribute, you can do so by forking on GitHub: [mono/SkiaSharp](https://github.com/mono/SkiaSharp).\n\nIf you have any questions, bugs or suggestions, we welcome them as [issues](https://github.com/mono/SkiaSharp/issues)."
  },
  {
    "path": "graphics/skiasharp/logo/skialogo-ios.workbook/index.workbook",
    "content": "---\nid: 06a9e50c-6510-47e6-9a31-f0c4e2ba9b1a\ntitle: Exploring Drawing with SkiaSharp\nuti: com.xamarin.workbook\nplatforms:\n- iOS\npackages:\n- id: SkiaSharp\n  version: 1.57.1\n---\n\n```csharp\n// install SkiaSharp\n#r \"SkiaSharp\"\n\nusing SkiaSharp;\n```\n\n# Exploring SkiaSharp\n\nAs we saw in the [Introduction to SkiaSharp](https://developer.xamarin.com/workbooks/graphics/skiasharp/introduction/introduction.workbook \"Introduction to SkiaSharp\") workbook, SkiaSharp provides a powerful C# API for doing 2D graphics. It is powered by [Google’s Skia library](http://skia.org/), the same library that powers Google Chrome, Firefox and Android’s graphic stacks.\n\nIn this Workbook, we’ll do a spiral drawing, and then a Xamarin logo drawing using only the SkiaSharp APIs! We’ve installed the NuGet package into the workbook and already added a `using` statement, and are now ready to go.\n\n## Creating a drawing surface\n\nTo start, we’ll need a surface to draw on—we’ll create an `SKSurface` with size 640x480. You’ll see the surface appear as an image in the Workbook—because we haven’t drawn anything on it yet, it will appear blank!\n\n```csharp\nvar surface = SKSurface.Create (640, 480, SKColorType.Rgba8888, SKAlphaType.Premul);\n```\n\nTo draw on the surface we’ve created, we’ll need to use its canvas—we’ll start by clearing everything to a dim gray color so we can see at least some output.\n\n```csharp\nvar canvas = surface.Canvas;\ncanvas.Clear(SKColors.DimGray);\n\nsurface;\n```\n\nBoth the `surface` and the `canvas` are limited resources, so in application code you should wrap them in `using` statements.\n\nThe `SKCanvas` uses a drawing model similar in spirit to other drawing models that you might be familiar with, it uses colors with an optional transparency channel and can draw lines, arcs, text and images.\n\n## Drawing a spiral\n\nWe want to draw an Archimedean spiral—we’ll approximate it using Bézier curves, following an algorithm from Math.StackExchange.\n\n```csharp\n//Ref. http://math.stackexchange.com/questions/179000/b%C3%A9zier-approximation-of-archimedes-spiral\n\nbool TryGetZELineIntersection (float m1, float b1, float m2, float b2, out float xIntercept, out float yIntercept) {\n    xIntercept = yIntercept = float.NaN;\n\n\tif (Math.Abs (m1 - m2) < float.Epsilon) {\n\t\t//Lines are parallel, so they don't intersect\n\t\treturn false;\n\t}\n\n\txIntercept = (b2 - b1) / (m1 - m2);\n\tyIntercept = m1 * xIntercept + b1;\n\treturn true;\n}\n\nSKPath BuildPath (SKPoint center, float startRadius, float spacePerLoop, float startTheta, float endTheta, float thetaStep) {\n    var path = new SKPath ();\n\n    var oldTheta = startTheta;\n    var newTheta = startTheta;\n    var oldR = startRadius + spacePerLoop * oldTheta;\n    var newR = startRadius + spacePerLoop * newTheta;\n    var oldSlope = float.MaxValue;\n    var newSlope = oldSlope;\n\n    var newPoint = new SKPoint (\n        (float)(center.X + oldR * Math.Cos (oldTheta)), \n        (float)(center.Y + oldR * Math.Sin (oldTheta))\n    );\n\tpath.MoveTo (newPoint.X, newPoint.Y);\n\n    var firstSlope = true;\n    while (oldTheta < endTheta - thetaStep) {\n        oldTheta = newTheta;\n        newTheta += thetaStep;\n\n        oldR = newR;\n        newR = startRadius + spacePerLoop * newTheta;\n\n        newPoint = new SKPoint (\n            (float)(center.X + newR * Math.Cos (newTheta)), \n            (float)(center.Y + newR * Math.Sin (newTheta))\n        );\n\n        // Slope calculation with the formula:\n        // (spacePerLoop * sinΘ + (startRadius + bΘ) * cosΘ) / (spacePerLoop * cosΘ - (startRadius + bΘ) * sinΘ)\n\n        var aPlusBTheta = startRadius + spacePerLoop * newTheta;\n        if (firstSlope) {\n            oldSlope = (float)(\n                (spacePerLoop * Math.Sin (oldTheta) + aPlusBTheta * Math.Cos (oldTheta)) / \n                (spacePerLoop * Math.Cos (oldTheta) - aPlusBTheta * Math.Sin (oldTheta))\n            );\n            firstSlope = false;\n        } else {\n            oldSlope = newSlope;\n        }\n\n        newSlope = (float)(\n            (spacePerLoop * Math.Sin (newTheta) + aPlusBTheta * Math.Cos (newTheta)) / \n            (spacePerLoop * Math.Cos (newTheta) - aPlusBTheta * Math.Sin (newTheta))\n        );\n\n        var oldIntercept = (float) -(oldSlope * oldR * Math.Cos (oldTheta) - oldR * Math.Sin (oldTheta));\n        var newIntercept = (float) -(newSlope * newR * Math.Cos (newTheta) - newR * Math.Sin (newTheta));\n\n        float xIntercept, yIntercept;\n        if (TryGetZELineIntersection (oldSlope, oldIntercept, newSlope, newIntercept, out xIntercept, out yIntercept)) {\n            var controlPoint = new SKPoint (xIntercept + center.X, yIntercept + center.Y);\n            path.LineTo (controlPoint.X, controlPoint.Y);\n        } else {\n            throw new ArgumentException (\"These lines should never be parallel.\");\n        }\n    }\n    return path;\n}\n\nvar path = BuildPath (\n    new SKPoint (320, 240), \n    startRadius: 0, \n    spacePerLoop: 3.3f, \n    startTheta: 0, \n    endTheta: 50, \n    thetaStep: (float) (Math.PI / 16.0)\n);\n```\n\nNow, with a path in hand, we can draw it to the `canvas`:\n\n```csharp\ncanvas.Clear(SKColors.LightGray);\n\nusing (var paint = new SKPaint ()) {\n\tpaint.IsAntialias = true;\n\tpaint.Color = SKColors.Blue;\n\tpaint.StrokeCap = SKStrokeCap.Round;\n    paint.StrokeWidth = 2;\n\tpaint.IsStroke = true;\n\tcanvas.DrawPath (path, paint);\n}\n\nsurface;\n```\n\nAs you can see, our drawing surface now has a spiral drawn in the center of it. You can play with the spiral to produce different results!\n\n### Spiral Exercises\n\n* Change the color or stroke of the `SKPaint` used to actually draw the spiral’s path. How does this change the output?\n\n* Change the parameters to the BuildPath function. How do they change the output’s shape, particularly the `startRadius`, `spacePerLoop`, and `endTheta` parameters.\n\n## Drawing the Xamarin Xamagon\n\nDrawing the Xamagon will use most of the same concepts as we used for drawing the spiral—we’ll even reuse the same canvas and surface for drawing, we just need to clear them again.\n\n```csharp\ncanvas.Clear (SKColors.White);\nsurface;\n```\n\nNext, we’ll create the Xamagon body:\n\n```csharp\nvar xamagonBody = new SKPath();\nxamagonBody.MoveTo(71.4311121f, 56f);\nxamagonBody.CubicTo(68.6763107f, 56.0058575f, 65.9796704f, 57.5737917f, 64.5928855f, 59.965729f);\nxamagonBody.LineTo(43.0238921f, 97.5342563f);\nxamagonBody.CubicTo(41.6587026f, 99.9325978f, 41.6587026f, 103.067402f, 43.0238921f, 105.465744f);\nxamagonBody.LineTo(64.5928855f, 143.034271f);\nxamagonBody.CubicTo(65.9798162f, 145.426228f, 68.6763107f, 146.994582f, 71.4311121f, 147f);\nxamagonBody.LineTo(114.568946f, 147f);\nxamagonBody.CubicTo(117.323748f, 146.994143f, 120.020241f, 145.426228f, 121.407172f, 143.034271f);\nxamagonBody.LineTo(142.976161f, 105.465744f);\nxamagonBody.CubicTo(144.34135f, 103.067402f, 144.341209f, 99.9325978f, 142.976161f, 97.5342563f);\nxamagonBody.LineTo(121.407172f, 59.965729f);\nxamagonBody.CubicTo(120.020241f, 57.5737917f, 117.323748f, 56.0054182f, 114.568946f, 56f);\nxamagonBody.LineTo(71.4311121f, 56f);\nxamagonBody.Close();\n```\n\nAnd then we’ll do the same thing as we did with the spiral, and use an `SKPaint` to draw the Xamagon.\n\n```csharp\nusing (var paint = new SKPaint ()) {\n    paint.IsAntialias = true;\n    paint.Color = new SKColor(0x34, 0x98, 0xdb, 0xff);\n    paint.StrokeCap = SKStrokeCap.Round;\n    canvas.DrawPath(xamagonBody, paint);\n}\n\nsurface;\n```\n\nFinally, we need to path the X body and draw it onto the surface.\n\n```csharp\nvar xBody = new SKPath();\nxBody.MoveTo(71.8225901f, 77.9780432f);\nxBody.CubicTo(71.8818491f, 77.9721857f, 71.9440029f, 77.9721857f, 72.0034464f, 77.9780432f);\nxBody.LineTo(79.444074f, 77.9780432f);\nxBody.CubicTo(79.773437f, 77.9848769f, 80.0929203f, 78.1757336f, 80.2573978f, 78.4623994f);\nxBody.LineTo(92.8795281f, 101.015639f);\nxBody.CubicTo(92.9430615f, 101.127146f, 92.9839987f, 101.251384f, 92.9995323f, 101.378901f);\nxBody.CubicTo(93.0150756f, 101.251354f, 93.055974f, 101.127107f, 93.1195365f, 101.015639f);\nxBody.LineTo(105.711456f, 78.4623994f);\nxBody.CubicTo(105.881153f, 78.167045f, 106.215602f, 77.975134f, 106.554853f, 77.9780432f);\nxBody.LineTo(113.995483f, 77.9780432f);\nxBody.CubicTo(114.654359f, 77.9839007f, 115.147775f, 78.8160066f, 114.839019f, 79.4008677f);\nxBody.LineTo(102.518299f, 101.500005f);\nxBody.LineTo(114.839019f, 123.568869f);\nxBody.CubicTo(115.176999f, 124.157088f, 114.671442f, 125.027775f, 113.995483f, 125.021957f);\nxBody.LineTo(106.554853f, 125.021957f);\nxBody.CubicTo(106.209673f, 125.019028f, 105.873247f, 124.81384f, 105.711456f, 124.507327f);\nxBody.LineTo(93.1195365f, 101.954088f);\nxBody.CubicTo(93.0560031f, 101.84258f, 93.0150659f, 101.718333f, 92.9995323f, 101.590825f);\nxBody.CubicTo(92.983989f, 101.718363f, 92.9430906f, 101.842629f, 92.8795281f, 101.954088f);\nxBody.LineTo(80.2573978f, 124.507327f);\nxBody.CubicTo(80.1004103f, 124.805171f, 79.7792269f, 125.008397f, 79.444074f, 125.021957f);\nxBody.LineTo(72.0034464f, 125.021957f);\nxBody.CubicTo(71.3274867f, 125.027814f, 70.8220664f, 124.157088f, 71.1600463f, 123.568869f);\nxBody.LineTo(83.4807624f, 101.500005f);\nxBody.LineTo(71.1600463f, 79.400867f);\nxBody.CubicTo(70.8647037f, 78.86725f, 71.2250368f, 78.0919422f, 71.8225901f, 77.9780432f);\nxBody.LineTo(71.8225901f, 77.9780432f);\nxBody.Close();\n```\n\nAnd paint it:\n\n```csharp\nusing (var paint = new SKPaint ()) {\n    paint.IsAntialias = true;\n    paint.Color = SKColors.White;\n    paint.StrokeCap = SKStrokeCap.Round;\n    canvas.DrawPath(xBody, paint);\n}\n\nsurface;\n```\n\nTada! We’ve now got ourselves a Xamagon.\n\n### Xamagon Exercises\n\n* You’ll notice that the Xamagon is a bit…small. How can you increase its size, without modifying the paths themselves.\\\n  Explore the APIs on `SKCanvas` and `SKSurface` for anything relevant.\n\n* What happens if you change the `SKPaint` properties?"
  },
  {
    "path": "graphics/skiasharp/meta.json",
    "content": "{\n  \"order\":{\n    \"introduction/introduction.workbook\":\"An Introduction\",\n    \"logo/skialogo-ios.workbook\":\"Logo for iOS\",\n    \"colors/colors.workbook\":\"Working with SKColor\",\n    \"images/images.workbook\":\"Exploring SKImage\",\n    \"pixmap/pixmap.workbook\":\"Working with SKPixmap\"\n  }\n}\n"
  },
  {
    "path": "graphics/skiasharp/pixmap/pixmap.workbook/index.workbook",
    "content": "---\npackages:\n- id: SkiaSharp\n  version: 1.57.1\ntitle: Working with SKPixmap\nuti: com.xamarin.workbook\nid: ab5c4303-8a59-4786-8dca-752524d8445c\nplatforms:\n- Console\n---\n\n```csharp\n// install SkiaSharp\n#r \"SkiaSharp\"\n\nusing SkiaSharp;\n```\n\n# Working with SKPixmap\n\nSkiaSharp exposes the `SKPixmap` type, which is used when you manually want to manage image memory, or color table memory. This is useful if you’re receiving this from another library, or generating pixel data yourself and want to avoid copies. In this case, we’ll demonstrate how to manually decode an image and load it into an `SKPixmap`. We’ll use the same `cat.jpeg` image that we used in the `SKImage` workbook here to demonstrate manual loading.\n\n> ⚠️ `SKPixmap` uses some advanced .NET concepts, such as unsafe code and pinning.\n\n```csharp\nusing System.IO;\n\n// First, load our image data. In other cases, this may be data you\n// received in a web app, or from some other library, or generated pixels.\nvar imageData = File.ReadAllBytes (\"cat.jpeg\");\n// Decode the image data we've loaded into a byte[] of pure pixels.\nvar codec = SKCodec.Create (new SKMemoryStream (imageData));\nvar decoded = codec.Pixels;\n\nSKPixmap pixmap;\nunsafe {\n    // Because SKPixmap wants an IntPtr for data, we have to pin our existing\n    // byte[] so that the garbage collector doesn't move it.\n    fixed (byte* decodedPtr = decoded) {\n        // Create the SKPixmap instance.\n        pixmap = new SKPixmap (\n            new SKImageInfo (codec.Info.Width, codec.Info.Height, codec.Info.ColorType),\n            (IntPtr) decodedPtr\n        );\n    }\n}\n\n// Return it so that we can visualize it in the workbook.\npixmap;\n```"
  },
  {
    "path": "graphics/tiny-renderer/README.md",
    "content": "# TinyRenderer\n\nThese workbooks are a port of an excellent [C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov.\nWe appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\nHopefully, you will find it as fascinating and educational as we did.\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Listings/ListingTexture.cs",
    "content": "﻿using System;\nusing static Renderer.Geometry;\nusing static Renderer.Utils;\n\nnamespace Renderer\n{\n\tstatic class ListingTexture\n\t{\n\t\tstatic int width = 800, height = 800;\n\t\tstatic readonly Vec3f [] world = new Vec3f [3];\n\t\tstatic readonly Vec3f [] screen = new Vec3f [3];\n\t\tstatic readonly Vec3f light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\n\t\tpublic static void Execute (Model model, Image texture)\n\t\t{\n\t\t\tvar image = new Image (width, height, Format.BGR);\n\t\t\tFunc<Vec3f, Vec3f> map = v => new Vec3f {\n\t\t\t\tx = (int)Math.Round ((v.x + 1) * (image.Width - 1) / 2, MidpointRounding.AwayFromZero),\n\t\t\t\ty = (int)Math.Round ((v.y + 1) * (image.Height - 1) / 2, MidpointRounding.AwayFromZero),\n\t\t\t\tz = v.z\n\t\t\t};\n\n\t\t\tFunc<Vec3f, Vec2f> uvMap = v => new Vec2f {\n\t\t\t\tx = v.x * (texture.Width - 1),\n\t\t\t\ty = v.y * (texture.Height - 1)\n\t\t\t};\n\n\t\t\tvar zbuffer = InitZBuffer (image);\n\t\t\tvar uv = new Vec2f [3];\n\t\t\tforeach (var face in model.Faces) {\n\t\t\t\tfor (int i = 0; i < 3; i++) {\n\t\t\t\t\tvar vIndex = face.Vertices [i];\n\t\t\t\t\tworld [i] = model.Vertices [vIndex];\n\t\t\t\t\tscreen [i] = map (world [i]);\n\n\t\t\t\t\tvar tIndex = face.Textures [i];\n\t\t\t\t\tuv [i] = uvMap (model.Textures [tIndex]);\n\t\t\t\t}\n\n\t\t\t\tVec3f n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n\t\t\t\tvar intensivity = Dot (n, light_dir);\n\t\t\t\tif (intensivity > 0)\n\t\t\t\t\tTriangle (image, screen, texture, uv, intensivity, zbuffer);\n\t\t\t}\n\n\t\t\timage.VerticalFlip ();\n\t\t\timage.WriteToFile (\"texture-head.tga\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Listings/ListingZBuffer.cs",
    "content": "﻿using System;\nusing static Renderer.Geometry;\nusing static Renderer.Utils;\n\nnamespace Renderer\n{\n\tstatic class ListingZBuffer\n\t{\n\t\tstatic int width = 800, height = 800;\n\t\tstatic readonly Vec3f[] world = new Vec3f [3];\n\t\tstatic readonly Vec3f[] screen = new Vec3f [3];\n\t\tstatic readonly Vec3f light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\n\t\tpublic static void Execute (Model model)\n\t\t{\n\t\t\tvar image = new Image (width, height, Format.BGR);\n\t\t\tFunc<Vec3f, Vec3f> map = v => new Vec3f {\n\t\t\t\tx = (int)Math.Round ((v.x + 1) * (image.Width - 1) / 2, MidpointRounding.AwayFromZero),\n\t\t\t\ty = (int)Math.Round ((v.y + 1) * (image.Height - 1) / 2, MidpointRounding.AwayFromZero),\n\t\t\t\tz = v.z\n\t\t\t};\n\n\t\t\tvar zbuffer = InitZBuffer (image);\n\t\t\tforeach (var face in model.Faces) {\n\t\t\t\tfor (int i = 0; i < 3; i++) {\n\t\t\t\t\tvar vIndex = face.Vertices [i];\n\t\t\t\t\tworld [i] = model.Vertices [vIndex];\n\t\t\t\t\tscreen [i] = map (world [i]);\n\t\t\t\t}\n\n\t\t\t\tVec3f n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n\t\t\t\tvar intensivity = Dot (n, light_dir);\n\t\t\t\tif (intensivity > 0)\n\t\t\t\t\tTriangle (image, screen, Color.White * intensivity, zbuffer);\n\t\t\t}\n\n\t\t\timage.VerticalFlip ();\n\t\t\timage.WriteToFile (\"gray-head-zbuffer.tga\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Program.cs",
    "content": "﻿using System;\nusing static Renderer.Geometry;\nusing static Renderer.Utils;\nusing static Renderer.MatrixHelpers;\n\nnamespace Renderer\n{\n\tclass MainClass\n\t{\n\t\tstatic int width = 800, height = 800;\n\n\t\tstatic readonly Image gridTexture = Image.Load (\"../../../obj/grid.tga\");\n#region head\n\t\tstatic readonly Model headModel = Model.FromFile (\"../../../obj/african_head.obj\");\n\t\tstatic readonly Image headTexture = Image.Load (\"../../../obj/african_head_diffuse.tga\");\n\t\tstatic readonly Image headNormalMap = Image.Load (\"../../../obj/african_head_nm.tga\");\n\t\tstatic readonly Image headTangentMap = Image.Load (\"../../../obj/african_head_nm_tangent.tga\");\n\t\tstatic readonly Image headSpecularMap = Image.Load (\"../../../obj/african_head_spec.tga\");\n#endregion\n\n#region diablo\n\t\tstatic readonly Model diabloModel = Model.FromFile (\"../../../obj/diablo3_pose.obj\");\n\t\tstatic readonly Image diabloTexture = Image.Load (\"../../../obj/diablo3_pose_diffuse.tga\");\n\t\tstatic readonly Image diabloNormalMap = Image.Load (\"../../../obj/diablo3_pose_nm.tga\");\n\t\tstatic readonly Image diabloTangentMap = Image.Load (\"../../../obj/diablo3_pose_nm_tangent.tga\");\n\t\tstatic readonly Image diabloSpecularMap = Image.Load (\"../../../obj/diablo3_pose_spec.tga\");\n\n\t\t// Lesson 8\n\t\tstatic readonly Image aoTexture = Image.Load (\"../../../obj/diablo3-total-occlusion.tga\");\n#endregion\n\n\t\tstatic readonly Vec3f[] world = new Vec3f [3];\n\t\tstatic readonly Vec3f[] screen = new Vec3f [3];\n\t\tstatic readonly Vec2f[] uv = new Vec2f [3];\n\t\tstatic readonly Vec3f light_dir = new Vec3f { x = 1, y = 1, z = 1 };\n\t\tstatic readonly Vec3f eye = new Vec3f { x = 1, y = 1, z = 3 };\n\t\tstatic readonly Vec3f center = new Vec3f { x = 0, y = 0, z = 0 };\n\t\tstatic readonly Vec3f up = new Vec3f { x = 0, y = 1, z = 0 };\n\n\t\tstatic readonly Matrix4 modelView = LookAt (eye, center, up);\n\t\tstatic readonly Matrix4 viewPort = Viewport (width / 8, height / 8, width * 3 / 4, height * 3 / 4);\n\t\tstatic readonly Matrix4 projection = Projection (-1f / (eye - center).Norm ());\n\n\t\tstatic readonly Func<Vec3f, Vec3f> map = v => {\n\t\t\tvar t = viewPort * projection * modelView;\n\t\t\tvar r = Project3D (Mult (t, Embed4D (v)));\n\t\t\tr.x = (int)Math.Round (r.x, MidpointRounding.AwayFromZero);\n\t\t\tr.y = (int)Math.Round (r.y, MidpointRounding.AwayFromZero);\n\t\t\treturn r;\n\t\t};\n\n\t\tstatic readonly Func<Vec3f, Vec2f> uvMap = v => new Vec2f {\n\t\t\tx = v.x * (headTexture.Width - 1),\n\t\t\ty = v.y * (headTexture.Height - 1)\n\t\t};\n\n\t\tpublic static void Main (string [] args)\n\t\t{\n\t\t\theadTexture.VerticalFlip ();\n\t\t\theadNormalMap.VerticalFlip ();\n\t\t\theadTangentMap.VerticalFlip ();\n\t\t\theadSpecularMap.VerticalFlip ();\n\n\t\t\tdiabloTexture.VerticalFlip ();\n\t\t\tdiabloNormalMap.VerticalFlip ();\n\t\t\tdiabloTangentMap.VerticalFlip ();\n\t\t\tdiabloSpecularMap.VerticalFlip ();\n\n\t\t\t// lesson 8\n\t\t\taoTexture.VerticalFlip ();\n\n\t\t\t//LightListing ();\n\t\t\t//ListingZBuffer.Execute (model);\n\t\t\t//ListingTexture.Execute (model, texture);\n\t\t\t//ProjectionListing ();\n\t\t\t//CameraMoveListing ();\n\t\t\t//GouraudShaderListing ();\n\t\t\t//GouraudShader6Listing ();\n\t\t\t//TextureShaderListing ();\n\t\t\t//NormalMapListing ();\n\t\t\t//SpecularShaderListing ();\n\t\t\t//TangetShaderListing ();\n\n\t\t\tDepthShaderListing ();\n\t\t\t//AmbientListing ();\n\t\t\t//AOShaderListing ();\n\n\t\t\t//ScreenSpaceAOListing ();\n\t\t}\n\n\t\tstatic void ScreenSpaceAOListing ()\n\t\t{\n\t\t\t//var model = headModel;\n\t\t\tvar model = diabloModel;\n\n\t\t\tvar shader = new ZShader2 (model, viewPort, projection, modelView);\n\t\t\tvar result = Render (model, shader);\n\t\t\tvar image = result.Image;\n\t\t\tvar zbuffer = result.ZBuffer;\n\n\t\t\tfor (int x = 0; x < image.Width; x++) {\n\t\t\t\tfor (int y = 0; y < image.Height; y++) {\n\t\t\t\t\tif (zbuffer [x + y * image.Width] < -1e5)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tdouble total = 0;\n\t\t\t\t\tfor (var a = 0.0; a < 2 * Math.PI - 0.001; a += Math.PI / 4) {\n\t\t\t\t\t\ttotal += Math.PI / 2 - MaxElevationAngle (zbuffer,\n\t\t\t\t\t\t                                          new Vec2f { x = x, y = y },\n\t\t\t\t\t\t                                          new Vec2f { x = (float)Math.Cos (a), y = (float)Math.Sin (a) },\n\t\t\t\t\t\t                                          image.Width, image.Height);\n\t\t\t\t\t}\n\t\t\t\t\ttotal /= (Math.PI / 2) * 8;\n\t\t\t\t\tvar v = (byte)(Math.Min (255, total * 255));\n\t\t\t\t\timage [x, y] = new Color (v, v, v);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\timage.VerticalFlip ();\n\t\t\timage.WriteToFile (\"ao-screen-space.tga\");\n\t\t}\n\n\t\tstatic void AOShaderListing ()\n\t\t{\n\t\t\tvar shader = new AOShader (diabloModel, viewPort, projection, modelView, aoTexture);\n\t\t\tRender (diabloModel, shader, \"ao-shader.tga\");\n\t\t}\n\n\t\tstatic void AmbientListing ()\n\t\t{\n\t\t\tvar rnd = new Random ();\n\t\t\tvar screen_coords = new Vec4f [3];\n\n\t\t\tvar frame = new Image (width, height, Format.BGR);\n\t\t\tvar shadowbuffer = InitZBuffer (frame);\n\t\t\tvar zbuffer = InitZBuffer (frame);\n\n\t\t\tvar total = new Image (1024, 1024, Format.BGR);\n\t\t\tvar occl = new Image (1024, 1024, Format.BGR);\n\n\t\t\tconst int nrenders = 1;\n\t\t\tfor (int iter = 1; iter <= nrenders; iter++) {\n\t\t\t\tfor (int i = 0; i < shadowbuffer.Length; i++) {\n\t\t\t\t\tshadowbuffer [i] = 0;\n\t\t\t\t\tzbuffer [i] = 0;\n\t\t\t\t}\n\n\t\t\t\tvar vUp = new Vec3f {\n\t\t\t\t\tx = (float)rnd.NextDouble (),\n\t\t\t\t\ty = (float)rnd.NextDouble (),\n\t\t\t\t\tz = (float)rnd.NextDouble ()\n\t\t\t\t};\n\t\t\t\tvar spLocation = RandPointOnUnitSphere ();\n\t\t\t\tspLocation.y = Math.Abs (spLocation.y);\n\n\t\t\t\tframe.Clear ();\n\t\t\t\tvar mvM = LookAt (spLocation, center, vUp);\n\t\t\t\tvar pM = Projection (0);\n\t\t\t\tvar zshader = new ZShader (diabloModel, viewPort, pM, mvM);\n\t\t\t\tforeach (var face in diabloModel.Faces) {\n\t\t\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\t\t\tscreen_coords [i] = zshader.Vertex (face, i);\n\t\t\t\t\tTriangle (frame, screen_coords, zshader, shadowbuffer);\n\t\t\t\t}\n\t\t\t\t//frame.VerticalFlip ();\n\t\t\t\t//frame.WriteToFile (\"framebuffer.tga\");\n\n\t\t\t\toccl.Clear ();\n\t\t\t\tvar shader = new OcclusionShader (diabloModel, viewPort, pM, mvM, occl, shadowbuffer, frame.Width);\n\t\t\t\tforeach (var face in diabloModel.Faces) {\n\t\t\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\t\t\tscreen_coords [i] = shader.Vertex (face, i);\n\t\t\t\t\tTriangle (frame, screen_coords, shader, zbuffer);\n\t\t\t\t}\n\n\t\t\t\tfor (int i = 0; i < total.Width; i++) {\n\t\t\t\t\tfor (int j = 0; j < total.Height; j++) {\n\t\t\t\t\t\tfloat prev = total [i, j] [0];\n\t\t\t\t\t\tfloat curr = occl [i, j] [0];\n\t\t\t\t\t\tvar val = (byte)((prev * (iter - 1) + curr) / iter + 0.5f);\n\t\t\t\t\t\ttotal [i, j] = new Color (val, val, val);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttotal.VerticalFlip ();\n\t\t\ttotal.WriteToFile (\"total-occlusion.tga\");\n\t\t}\n\n\t\tstatic void DepthShaderListing ()\n\t\t{\n\t\t\tvar model = diabloModel;\n\n\t\t\tvar M = viewPort * Projection (0) * LookAt (light_dir, center, up);\n\t\t\tvar depthShader = new DepthShader (model, M);\n\t\t\tvar step1 = Render (model, depthShader, \"diablo-depth-shader.tga\");\n\n\t\t\tvar shadowM = M * Inverse (viewPort * projection * modelView);\n\t\t\tvar shader = new ShadowShader (model, viewPort, projection, modelView, shadowM, light_dir,\n\t\t\t                               diabloTexture, diabloNormalMap, diabloSpecularMap,\n\t\t\t                               step1.ZBuffer, width);\n\t\t\tRender (model, shader, \"diablo-shadow-shader.tga\");\n\t\t}\n\n\t\tstatic void TangetShaderListing ()\n\t\t{\n\t\t\tvar model = headModel;\n\t\t\tvar shader = new TangentShader (model, viewPort, projection, modelView, light_dir, headTexture /*gridTexture*/, headTangentMap /*normalMap*/);\n\t\t\tRender (model, shader, \"tanget-shader.tga\");\n\t\t}\n\n\t\tstatic void SpecularShaderListing ()\n\t\t{\n\t\t\tRunSpec (headModel, headTexture, headNormalMap, headSpecularMap, \"specular-shader.tga\");\n\t\t\tRunSpec (diabloModel, diabloTexture, diabloNormalMap, diabloSpecularMap, \"diablo-specular-shader.tga\");\n\t\t}\n\n\t\tstatic void RunSpec (Model model, Image texture, Image nm, Image sm, string path)\n\t\t{\n\t\t\tvar shader = new SpecularShader (model, viewPort, projection, modelView, light_dir, texture, nm, sm);\n\t\t\tRender (model, shader, path);\n\t\t}\n\n\t\tstatic void NormalMapListing ()\n\t\t{\n\t\t\tvar shader = new NormalMapShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap);\n\t\t\tRender (headModel, shader, \"normal-map-shader.tga\");\n\t\t}\n\n\t\tstatic void TextureShaderListing ()\n\t\t{\n\t\t\tvar shader = new TextureShader (headModel, viewPort, projection, modelView, light_dir, headTexture);\n\t\t\tRender (headModel, shader, \"texture-shader.tga\");\n\t\t}\n\n\t\tstatic void GouraudShader6Listing ()\n\t\t{\n\t\t\tvar shader = new GouraudShader6 (headModel, viewPort, projection, modelView, light_dir);\n\t\t\tRender (headModel, shader, \"gouraud-shader6.tga\");\n\t\t}\n\n\t\tstatic void GouraudShaderListing ()\n\t\t{\n\t\t\tvar shader = new GouraudShader (headModel, viewPort, projection, modelView, light_dir);\n\t\t\tRender (headModel, shader, \"gouraud-shader.tga\");\n\t\t}\n\n\t\tstatic RenderResult Render (Model model, IShader shader, string path)\n\t\t{\n\t\t\tvar result = Render (model, shader);\n\t\t\tresult.Image.VerticalFlip ();\n\t\t\tresult.Image.WriteToFile (path);\n\n\t\t\treturn result;\n\t\t}\n\n\t\tstatic RenderResult Render (Model model, IShader shader)\n\t\t{\n\t\t\tvar image = new Image (width, height, Format.BGR);\n\t\t\tvar zbuffer = InitZBuffer (image);\n\t\t\tvar screen_coords = new Vec4f [3];\n\n\t\t\tforeach (var face in model.Faces) {\n\t\t\t\tfor (int i = 0; i < 3; i++)\n\t\t\t\t\tscreen_coords [i] = shader.Vertex (face, i);\n\t\t\t\tTriangle (image, screen_coords, shader, zbuffer);\n\t\t\t}\n\n\t\t\treturn new RenderResult {\n\t\t\t\tImage = image,\n\t\t\t\tZBuffer = zbuffer\n\t\t\t};\n\t\t}\n\n\t\tclass RenderResult\n\t\t{\n\t\t\tpublic Image Image { get; set; }\n\t\t\tpublic float [] ZBuffer { get; set; }\n\t\t}\n\n\t\tstatic void CameraMoveListing ()\n\t\t{\n\t\t\tvar image = new Image (width, height, Format.BGR);\n\n\t\t\tvar zbuffer = InitZBuffer (image);\n\t\t\tforeach (var face in headModel.Faces) {\n\t\t\t\tfor (int i = 0; i < 3; i++) {\n\t\t\t\t\tvar vIndex = face.Vertices [i];\n\t\t\t\t\tworld [i] = headModel.Vertices [vIndex];\n\t\t\t\t\tscreen [i] = map (world [i]);\n\n\t\t\t\t\tvar tIndex = face.Textures [i];\n\t\t\t\t\tuv [i] = uvMap (headModel.Textures [tIndex]);\n\t\t\t\t}\n\n\t\t\t\tVec3f n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n\t\t\t\tvar intensivity = Dot (n, light_dir);\n\t\t\t\tif (intensivity > 0)\n\t\t\t\t\tTriangle (image, screen, headTexture, uv, intensivity, zbuffer);\n\t\t\t}\n\n\t\t\timage.VerticalFlip ();\n\t\t\timage.WriteToFile (\"camera-moved.tga\");\n\t\t}\n\n\t\tstatic void ProjectionListing ()\n\t\t{\n\t\t\tvar image = new Image (width, height, Format.BGR);\n\n\t\t\tvar camera = new Vec3f { z = 3 };\n\t\t\tvar projection = Projection (-1 / camera.z);\n\t\t\tvar viewPort = Viewport (width / 8, height / 8, width * 3 / 4, height * 3 / 4);\n\n\t\t\tvar zbuffer = InitZBuffer (image);\n\t\t\tforeach (var face in headModel.Faces) {\n\t\t\t\tfor (int i = 0; i < 3; i++) {\n\t\t\t\t\tvar vIndex = face.Vertices [i];\n\t\t\t\t\tworld [i] = headModel.Vertices [vIndex];\n\t\t\t\t\tscreen [i] = map (world [i]);\n\n\t\t\t\t\tvar tIndex = face.Textures [i];\n\t\t\t\t\tuv [i] = uvMap (headModel.Textures [tIndex]);\n\t\t\t\t}\n\n\t\t\t\tvar n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n\t\t\t\tvar intensivity = Dot (n, light_dir);\n\t\t\t\tif (intensivity > 0)\n\t\t\t\t\tTriangle (image, screen, headTexture, uv, intensivity, zbuffer);\n\t\t\t}\n\n\t\t\timage.VerticalFlip ();\n\t\t\timage.WriteToFile (\"project-head.tga\");\n\t\t}\n\n\t\tstatic void LightListing ()\n\t\t{\n\t\t\tvar image = new Image (width, height, Format.BGR);\n\t\t\tFunc<Vec3f, Vec3f> map = v => new Vec3f { x = (int)((v.x + 1) * image.Width / 2), y = (int)((v.y + 1) * image.Height / 2) };\n\n\t\t\tvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\n\t\t\tforeach (var face in headModel.Faces) {\n\t\t\t\tfor (int i = 0; i < 3; i++) {\n\t\t\t\t\tvar vIndex = face.Vertices [i];\n\t\t\t\t\tworld [i] = headModel.Vertices [vIndex];\n\t\t\t\t\tscreen [i] = map (world [i]);\n\t\t\t\t}\n\n\t\t\t\tvar n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n\t\t\t\tvar intensivity = Dot (n, light_dir);\n\t\t\t\tif (intensivity > 0)\n\t\t\t\t\tTriangle (image, screen, Color.White * intensivity);\n\t\t\t}\n\n\t\t\timage.VerticalFlip ();\n\t\t\timage.WriteToFile (\"gray-head.tga\");\n\t\t}\n\n\t\tstatic void TriangleListing ()\n\t\t{\n\t\t\tvar image = new Image (200, 200, Format.BGR);\n\t\t\tVec3f [] coordinates = {\n\t\t\t\tnew Vec3f {x=10,  y=10},\n\t\t\t\tnew Vec3f {x=100, y=30},\n\t\t\t\tnew Vec3f {x=190, y=160}\n\t\t\t};\n\t\t\tTriangle (image, coordinates, Color.Red);\n\n\t\t\timage.VerticalFlip ();\n\t\t\timage.WriteToFile (\"red-triangle.tga\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n// Information about this assembly is defined by the following attributes. \n// Change them to the values specific to your project.\n\n[assembly: AssemblyTitle (\"Renderer\")]\n[assembly: AssemblyDescription (\"\")]\n[assembly: AssemblyConfiguration (\"\")]\n[assembly: AssemblyCompany (\"\")]\n[assembly: AssemblyProduct (\"\")]\n[assembly: AssemblyCopyright (\"rzaitov\")]\n[assembly: AssemblyTrademark (\"\")]\n[assembly: AssemblyCulture (\"\")]\n\n// The assembly version has the format \"{Major}.{Minor}.{Build}.{Revision}\".\n// The form \"{Major}.{Minor}.*\" will automatically update the build and revision,\n// and \"{Major}.{Minor}.{Build}.*\" will update just the revision.\n\n[assembly: AssemblyVersion (\"1.0.*\")]\n\n// The following attributes are used to specify the signing key for the assembly, \n// if desired. See the Mono documentation for more information about signing.\n\n//[assembly: AssemblyDelaySign(false)]\n//[assembly: AssemblyKeyFile(\"\")]\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Renderer.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\r\n    <ProjectGuid>{E3C10096-CCF5-4853-B868-1C7969DAFDD2}</ProjectGuid>\r\n    <OutputType>Exe</OutputType>\r\n    <RootNamespace>Renderer</RootNamespace>\r\n    <AssemblyName>Renderer</AssemblyName>\r\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug</OutputPath>\r\n    <DefineConstants>DEBUG;</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <ExternalConsole>true</ExternalConsole>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release</OutputPath>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <ExternalConsole>true</ExternalConsole>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"nunit.framework\">\r\n      <HintPath>packages\\NUnit.3.5.0\\lib\\net45\\nunit.framework.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Program.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Tests\\VectorFixture.cs\" />\r\n    <Compile Include=\"WorkbookItems\\Geometry.cs\" />\r\n    <Compile Include=\"WorkbookItems\\Model.cs\" />\r\n    <Compile Include=\"WorkbookItems\\Image.cs\" />\r\n    <Compile Include=\"WorkbookItems\\Utils.cs\" />\r\n    <Compile Include=\"Listings\\ListingZBuffer.cs\" />\r\n    <Compile Include=\"Listings\\ListingTexture.cs\" />\r\n    <Compile Include=\"WorkbookItems\\Matrix.cs\" />\r\n    <Compile Include=\"WorkbookItems\\Shaders.cs\" />\r\n    <Compile Include=\"Tests\\ModelFixture.cs\" />\r\n    <Compile Include=\"Tests\\GouraudShaderFixture.cs\" />\r\n    <Compile Include=\"Tests\\MatrixFixture.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Folder Include=\"Tests\\\" />\r\n    <Folder Include=\"WorkbookItems\\\" />\r\n    <Folder Include=\"Listings\\\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Renderer.sln",
    "content": "\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2012\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Renderer\", \"Renderer.csproj\", \"{E3C10096-CCF5-4853-B868-1C7969DAFDD2}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|x86 = Debug|x86\r\n\t\tRelease|x86 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{E3C10096-CCF5-4853-B868-1C7969DAFDD2}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{E3C10096-CCF5-4853-B868-1C7969DAFDD2}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{E3C10096-CCF5-4853-B868-1C7969DAFDD2}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{E3C10096-CCF5-4853-B868-1C7969DAFDD2}.Release|x86.Build.0 = Release|x86\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Tests/GouraudShaderFixture.cs",
    "content": "﻿using System;\nusing NUnit.Framework;\n\nusing static Renderer.Utils;\nusing static Renderer.MatrixHelpers;\nusing static Renderer.Geometry;\n\nnamespace Renderer\n{\n\t[TestFixture]\n\tpublic class GouraudShaderFixture\n\t{\n\t\tstatic int width = 800, height = 800;\n\t\tstatic readonly Vec3f eye = new Vec3f { x = 1, y = 1, z = 3 };\n\t\tstatic readonly Vec3f center = new Vec3f { x = 0, y = 0, z = 0 };\n\t\tstatic readonly Vec3f up = new Vec3f { x = 0, y = 1, z = 0 };\n\n\t\t[Test]\n\t\tpublic void Vertex ()\n\t\t{\n\t\t\tvar model = ModelUtils.GetModel1 ();\n\n\t\t\tvar ligthdir = new Vec3f { z = 3 };\n\n\t\t\tvar I = Matrix4.Identity ();\n\t\t\t//var viewPort = I;\n\t\t\t//var projection = I;\n\t\t\t//var modelView = I;\n\t\t\tvar modelView = LookAt (eye, center, up);\n\t\t\tvar viewPort = Viewport (width / 8, height / 8, width * 3 / 4, height * 3 / 4);\n\t\t\tvar projection = Projection (-1f / (eye - center).Norm ());\n\n\t\t\tvar shader = new GouraudShader (model, viewPort, projection, modelView, ligthdir);\n\n\t\t\tvar face = model.Faces [0];\n\t\t\tvar sc0 = shader.Vertex (face, 0);\n\t\t\t//sc0 = sc0 / sc0.h;\n\n\t\t\tvar sc1 = shader.Vertex (face, 1);\n\t\t\t//sc1 = sc1 / sc1.h;\n\n\t\t\tvar sc2 = shader.Vertex (face, 2);\n\t\t\t//sc2 = sc2 / sc2.h;\n\n\t\t\tFunc<Vec3f, Vec3f> map = v => {\n\t\t\t\tvar transformation = viewPort * projection * modelView;\n\t\t\t\tvar r = Project3D (Mult (transformation, Embed4D (v)));\n\t\t\t\t//r.x = (int)Math.Round (r.x, MidpointRounding.AwayFromZero);\n\t\t\t\t//r.y = (int)Math.Round (r.y, MidpointRounding.AwayFromZero);\n\t\t\t\treturn r;\n\t\t\t};\n\n\t\t\tvar v0 = model.Vertices [face.Vertices [0]];\n\t\t\tvar v1 = model.Vertices [face.Vertices [1]];\n\t\t\tvar v2 = model.Vertices [face.Vertices [2]];\n\n\t\t\tvar t0 = map (v0);\n\t\t\tvar t1 = map (v1);\n\t\t\tvar t2 = map (v2);\n\n\t\t\tAssert.True (Math.Abs (sc0.x - t0.x) < 0.0001f);\n\t\t\tAssert.True (Math.Abs (sc0.y - t0.y) < 0.0001f);\n\t\t\tAssert.True (Math.Abs (sc0.z - t0.z) < 0.0001f);\n\n\t\t\tAssert.True (Math.Abs (sc1.x - t1.x) < 0.0001f);\n\t\t\tAssert.True (Math.Abs (sc1.y - t1.y) < 0.0001f);\n\t\t\tAssert.True (Math.Abs (sc1.z - t1.z) < 0.0001f);\n\n\t\t\tAssert.True (Math.Abs (sc2.x - t2.x) < 0.0001f);\n\t\t\tAssert.True (Math.Abs (sc2.y - t2.y) < 0.0001f);\n\t\t\tAssert.True (Math.Abs (sc2.z - t2.z) < 0.0001f);\n\n\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Tests/MatrixFixture.cs",
    "content": "﻿using System;\n\nusing NUnit.Framework;\n\nusing static Renderer.MatrixHelpers;\n\nnamespace Renderer\n{\n\t[TestFixture]\n\tpublic class MatrixFixture\n\t{\n\t\t[Test]\n\t\tpublic void InverseIdentity ()\n\t\t{\n\t\t\tvar identity = Matrix4.Identity ();\n\t\t\tvar ti = TransposeInverse (identity);\n\n\t\t\tConsole.WriteLine (ti);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Tests/ModelFixture.cs",
    "content": "﻿using System;\n\nusing NUnit.Framework;\n\nnamespace Renderer\n{\n\tstatic class ModelUtils\n\t{\n\t\tconst string text = @\"\nv 0 0 0\nv 0 1 0\nv 1 0 0\n\nvn 0 0 1\nvn 0 0 2\nvn 0 0 3\n\nf 1/-1/1 2/-1/2 3/-1/3\n\";\n\n\t\tpublic static Model GetModel1 ()\n\t\t{\n\t\t\treturn Model.FromText (text);\n\t\t}\n\t}\n\n\t[TestFixture]\n\tpublic class ModelFixture\n\t{\n\t\t[Test]\n\t\tpublic void Normal ()\n\t\t{\n\t\t\tvar model = ModelUtils.GetModel1 ();\n\t\t\tvar face = model.Faces [0];\n\n\t\t\tvar n1 = model.Normal (face, 0);\n\t\t\tAssert.AreEqual (1, n1.z);\n\n\t\t\tvar n2 = model.Normal (face, 1);\n\t\t\tAssert.AreEqual (2, n2.z);\n\n\t\t\tvar n3 = model.Normal (face, 2);\n\t\t\tAssert.AreEqual (3, n3.z);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/Tests/VectorFixture.cs",
    "content": "﻿using System;\n\nusing NUnit.Framework;\n\nnamespace Renderer\n{\n\t[TestFixture]\n\tpublic class VectorFixture\n\t{\n\t\t[Test]\n\t\tpublic void Project3D ()\n\t\t{\n\t\t\tvar v4 = new Vec4f { x = 10, y = 11, z = 12, h = 13 };\n\t\t\tvar v3 = Geometry.Project3D (v4);\n\n\t\t\tAssert.AreEqual (v4.x, v3.x);\n\t\t\tAssert.AreEqual (v4.y, v3.y);\n\t\t\tAssert.AreEqual (v4.z, v3.z);\n\t\t}\n\n\t\t[Test]\n\t\tpublic void Embed4D_DefaultValue ()\n\t\t{\n\t\t\tvar v3 = new Vec3f { x = 10, y = 11, z = 12 };\n\t\t\tvar v4 = Geometry.Embed4D (v3);\n\n\t\t\tAssert.AreEqual (v3.x, v4.x);\n\t\t\tAssert.AreEqual (v3.y, v4.y);\n\t\t\tAssert.AreEqual (v3.z, v4.z);\n\t\t\tAssert.AreEqual (1, v4.h);\n\t\t}\n\n\t\t[Test]\n\t\tpublic void Embed4D ()\n\t\t{\n\t\t\tvar v3 = new Vec3f { x = 10, y = 11, z = 12 };\n\t\t\tvar v4 = Geometry.Embed4D (v3, 777);\n\n\t\t\tAssert.AreEqual (v3.x, v4.x);\n\t\t\tAssert.AreEqual (v3.y, v4.y);\n\t\t\tAssert.AreEqual (v3.z, v4.z);\n\t\t\tAssert.AreEqual (777, v4.h);\n\t\t}\n\n\t\t[Test]\n\t\tpublic void VectorIndexer ()\n\t\t{\n\t\t\tfloat x = 10f, y = 11f, z = 12f, h = 13f;\n\n\t\t\tvar v4 = new Vec4f ();\n\t\t\tv4 [0] = x;\n\t\t\tv4 [1] = y;\n\t\t\tv4 [2] = z;\n\t\t\tv4 [3] = h;\n\n\t\t\tAssert.AreEqual (x, v4 [0]);\n\t\t\tAssert.AreEqual (y, v4 [1]);\n\t\t\tAssert.AreEqual (z, v4 [2]);\n\t\t\tAssert.AreEqual (h, v4 [3]);\n\n\t\t\tv4 = new Vec4f ();\n\t\t\tv4.x = x;\n\t\t\tv4.y = y;\n\t\t\tv4.z = z;\n\t\t\tv4.h = h;\n\n\t\t\tAssert.AreEqual (x, v4.x);\n\t\t\tAssert.AreEqual (y, v4.y);\n\t\t\tAssert.AreEqual (z, v4.z);\n\t\t\tAssert.AreEqual (h, v4.h);\n\t\t}\n\n\t\t[Test]\n\t\tpublic void Vector4_Divide ()\n\t\t{\n\t\t\tvar v4 = new Vec4f { x = 10, y = 20, z = 30, h = 40 };\n\t\t\tvar r4 = v4 / 10;\n\n\t\t\tAssert.AreEqual (1, r4.x);\n\t\t\tAssert.AreEqual (2, r4.y);\n\t\t\tAssert.AreEqual (3, r4.z);\n\t\t\tAssert.AreEqual (4, r4.h);\n\t\t}\n\n\t\t[Test]\n\t\tpublic void Vector4_Sub ()\n\t\t{\n\t\t\tvar a4 = new Vec4f { x = 10, y = 20, z = 30, h = 40 };\n\t\t\tvar b4 = new Vec4f { x = 1,  y = 2,  z = 3,  h = 4 };\n\n\t\t\tvar r = a4 - b4;\n\t\t\tAssert.AreEqual (9, r.x);\n\t\t\tAssert.AreEqual (18, r.y);\n\t\t\tAssert.AreEqual (27, r.z);\n\t\t\tAssert.AreEqual (36, r.h);\n\t\t}\n\n\t\t[Test]\n\t\tpublic void Vector4_Norm ()\n\t\t{\n\t\t\tvar b4 = new Vec4f { x = 1, y = 2, z = 3, h = 4 };\n\t\t\tvar len = b4.Norm ();\n\t\t\tAssert.True (Math.Abs (Math.Sqrt (30) - len) <= 0.001);\n\t\t}\n\n\t\t[Test]\n\t\tpublic void Vector4_Normalize ()\n\t\t{\n\t\t\tvar b4 = new Vec4f { x = 1, y = 2, z = 3, h = 4 };\n\t\t\tvar len = b4.Norm ();\n\t\t\tvar n = b4.Normalize ();\n\t\t\tAssert.True (Math.Abs (n.x - 1f / len) <= 0.001);\n\t\t\tAssert.True (Math.Abs (n.y - 2f / len) <= 0.001);\n\t\t\tAssert.True (Math.Abs (n.z - 3f / len) <= 0.001);\n\t\t\tAssert.True (Math.Abs (n.h - 4f / len) <= 0.001);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/WorkbookItems/Geometry.cs",
    "content": "﻿using System;\n\nnamespace Renderer\n{\n\tstruct Vec2f\n\t{\n\t\tpublic float x;\n\t\tpublic float y;\n\n\t\tpublic float this [int i] {\n\t\t\tget {\n\t\t\t\tif (i == 0) return x;\n\t\t\t\tif (i == 1) return y;\n\t\t\t\tthrow new InvalidOperationException ();\n\t\t\t}\n\t\t\tset {\n\t\t\t\tif (i == 0) x = value;\n\t\t\t\telse if (i == 1) y = value;\n\t\t\t\telse throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\n\t\tpublic Vec2f Normalize ()\n\t\t{\n\t\t\treturn this / Norm ();\n\t\t}\n\n\t\tpublic float Norm ()\n\t\t{\n\t\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t\t}\n\n\t\tpublic static Vec2f operator / (Vec2f v, float num)\n\t\t{\n\t\t\tv.x /= num;\n\t\t\tv.y /= num;\n\n\t\t\treturn v;\n\t\t}\n\n\t\tpublic static Vec2f operator * (Vec2f v, float num)\n\t\t{\n\t\t\tv.x *= num;\n\t\t\tv.y *= num;\n\n\t\t\treturn v;\n\t\t}\n\n\t\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t\t{\n\t\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t\t}\n\n\t\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t\t{\n\t\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t\t}\n\t}\n\n\tpublic struct Vec3f\n\t{\n\t\tpublic float x;\n\t\tpublic float y;\n\t\tpublic float z;\n\n\t\tpublic float this [int i] {\n\t\t\tget {\n\t\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t\t}\n\t\t\t}\n\t\t\tset {\n\t\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic Vec3f Normalize ()\n\t\t{\n\t\t\treturn this / Norm ();\n\t\t}\n\n\t\tpublic float Norm ()\n\t\t{\n\t\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t\t}\n\n\t\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t\t{\n\t\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t\t}\n\n\t\tpublic static Vec3f operator / (Vec3f v, float num)\n\t\t{\n\t\t\tv.x /= num;\n\t\t\tv.y /= num;\n\t\t\tv.z /= num;\n\n\t\t\treturn v;\n\t\t}\n\n\t\tpublic static Vec3f operator * (Vec3f v, float num)\n\t\t{\n\t\t\tv.x *= num;\n\t\t\tv.y *= num;\n\t\t\tv.z *= num;\n\n\t\t\treturn v;\n\t\t}\n\t}\n\n\tstruct Vec4f\n\t{\n\t\tpublic float x;\n\t\tpublic float y;\n\t\tpublic float z;\n\t\tpublic float h;\n\n\t\tpublic float this [int i] {\n\t\t\tget {\n\t\t\t\tswitch (i) {\n\t\t\t\t\tcase 0: return x;\n\t\t\t\t\tcase 1: return y;\n\t\t\t\t\tcase 2: return z;\n\t\t\t\t\tcase 3: return h;\n\t\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t\t}\n\t\t\t}\n\t\t\tset {\n\t\t\t\tswitch (i) {\n\t\t\t\t\tcase 0: x = value; break;\n\t\t\t\t\tcase 1: y = value; break;\n\t\t\t\t\tcase 2: z = value; break;\n\t\t\t\t\tcase 3: h = value; break;\n\t\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic Vec4f Normalize ()\n\t\t{\n\t\t\tvar len = Norm ();\n\t\t\treturn this / len;\n\t\t}\n\n\t\tpublic float Norm ()\n\t\t{\n\t\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t\t}\n\n\t\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t\t{\n\t\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t\t}\n\n\t\tpublic static Vec4f operator / (Vec4f v, float num)\n\t\t{\n\t\t\tv.x /= num;\n\t\t\tv.y /= num;\n\t\t\tv.z /= num;\n\t\t\tv.h /= num;\n\n\t\t\treturn v;\n\t\t}\n\t}\n\n\tstruct Vec2i\n\t{\n\t\tpublic int x;\n\t\tpublic int y;\n\n\t\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t\t{\n\t\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t\t}\n\t}\n\n\tstruct Vec3i\n\t{\n\t\tpublic int x;\n\t\tpublic int y;\n\t\tpublic int z;\n\n\t\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t\t{\n\t\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t\t}\n\t}\n\n\tstatic class Geometry\n\t{\n\t\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t\t{\n\t\t\treturn new Vec3f {\n\t\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\t\tz = l.x * r.y - l.y * r.x\n\t\t\t};\n\t\t}\n\n\t\tpublic static float Dot (Vec3f l, Vec3f r)\n\t\t{\n\t\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t\t}\n\n\t\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t\t{\n\t\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t\t}\n\n\t\tpublic static Vec2f Project2D (Vec3f v)\n\t\t{\n\t\t\treturn new Vec2f { x = v.x, y = v.y };\n\t\t}\n\n\t\tpublic static Vec2f Project2D (Vec4f v)\n\t\t{\n\t\t\treturn new Vec2f { x = v.x, y = v.y };\n\t\t}\n\n\t\tpublic static Vec3f Project3D (Vec4f v)\n\t\t{\n\t\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/WorkbookItems/Image.cs",
    "content": "﻿using System;\n\nnamespace Renderer\n{\n\tusing System.IO;\n\n\tenum Format\n\t{\n\t\tGRAYSCALE = 1,\n\t\tBGR = 3,\n\t\tBGRA = 4\n\t}\n\n\tstruct Color\n\t{\n\t\t// the value stored as little endian:\n\t\t// ARGB -> BGRA\n\t\t// xRGB -> BGRx\n\t\tpublic readonly int value;\n\t\tpublic readonly Format format;\n\n\t\tpublic byte this [int offset] {\n\t\t\tget {\n\t\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t\t}\n\t\t}\n\n\t\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\t\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\t\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\t\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\t\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\t\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\t\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t\t{\n\t\t}\n\n\t\tpublic Color (byte red, byte green, byte blue)\n\t\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t\t{\n\t\t}\n\n\t\tpublic Color (byte value)\n\t\t\t: this (value, Format.GRAYSCALE)\n\t\t{\n\t\t}\n\n\t\tpublic Color (int value, Format format)\n\t\t{\n\t\t\tthis.value = value;\n\t\t\tthis.format = format;\n\t\t}\n\n\t\tpublic static Color operator * (Color color, float intensivity)\n\t\t{\n\t\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\t\tvar ch3 = color [3];\n\t\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t\t}\n\t}\n\n\tclass Image\n\t{\n\t\tinternal byte [] buffer;\n\n\t\tpublic int Width { get; }\n\t\tpublic int Height { get; }\n\t\tpublic Format Format { get; }\n\n\t\tpublic int BytesPerRow {\n\t\t\tget {\n\t\t\t\treturn Width * (int)Format;\n\t\t\t}\n\t\t}\n\n\t\tpublic Image (int width, int height, Format format)\n\t\t{\n\t\t\tWidth = width;\n\t\t\tHeight = height;\n\t\t\tFormat = format;\n\n\t\t\tbuffer = new byte [height * BytesPerRow];\n\t\t}\n\n\t\tpublic void VerticalFlip ()\n\t\t{\n\t\t\tvar bpp = (int)Format;\n\t\t\tint bytesPerLine = Width * bpp;\n\n\t\t\tvar half = Height >> 1;\n\t\t\tfor (int l = 0; l < half; l++) {\n\t\t\t\tvar l1 = l * bytesPerLine;\n\t\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void Clear ()\n\t\t{\n\t\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\t\tbuffer [i] = 0;\n\t\t}\n\n\t\tpublic Color this [int x, int y] {\n\t\t\tget {\n\t\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\t\tvar offset = GetOffset (x, y);\n\t\t\t\tvar len = (int)Format;\n\t\t\t\tint value = 0;\n\t\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\t\treturn new Color (value, Format);\n\t\t\t}\n\t\t\tset {\n\t\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\t\tvar offset = GetOffset (x, y);\n\t\t\t\tvar v = value.value;\n\t\t\t\tvar len = (int)Format;\n\t\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t\t}\n\t\t}\n\n\t\tint GetOffset (int x, int y)\n\t\t{\n\t\t\treturn y * BytesPerRow + x * (int)Format;\n\t\t}\n\n\t\tpublic bool WriteToFile (string path, bool rle = true)\n\t\t{\n\t\t\tvar bpp = (int)Format;\n\t\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\t\tvar header = new TGAHeader {\n\t\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\t\tWidth = (short)Width,\n\t\t\t\t\tHeight = (short)Height,\n\t\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t\t};\n\t\t\t\tWriteTo (writer, header);\n\t\t\t\tif (!rle)\n\t\t\t\t\twriter.Write (buffer);\n\t\t\t\telse\n\t\t\t\t\tUnloadRleData (writer);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic static Image Load (string path)\n\t\t{\n\t\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\t\tvar header = ReadHeader (reader);\n\n\t\t\t\tvar height = header.Height;\n\t\t\t\tvar width = header.Width;\n\t\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\t\tvar format = (Format)bytespp;\n\n\t\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\t\tvar img = new Image (width, height, format);\n\n\t\t\t\tswitch (header.DataTypeCode) {\n\t\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\t\tbreak;\n\t\t\t\tcase DataType.RleTrueColorImage:\n\t\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\t\timg.LoadRleData (reader);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t\t}\n\n\t\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\t\timg.VerticalFlip ();\n\n\t\t\t\treturn img;\n\t\t\t}\n\t\t}\n\n\t\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t\t{\n\t\t\twriter.Write (header.IdLength);\n\t\t\twriter.Write (header.ColorMapType);\n\t\t\twriter.Write ((byte)header.DataTypeCode);\n\t\t\twriter.Write (header.ColorMapOrigin);\n\t\t\twriter.Write (header.ColorMapLength);\n\t\t\twriter.Write (header.ColorMapDepth);\n\t\t\twriter.Write (header.OriginX);\n\t\t\twriter.Write (header.OriginY);\n\t\t\twriter.Write (header.Width);\n\t\t\twriter.Write (header.Height);\n\t\t\twriter.Write (header.BitsPerPixel);\n\t\t\twriter.Write (header.ImageDescriptor);\n\t\t}\n\n\t\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t\t{\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = reader.ReadByte (),\n\t\t\t\tColorMapType = reader.ReadByte (),\n\t\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\t\tWidth = reader.ReadInt16 (),\n\t\t\t\tHeight = reader.ReadInt16 (),\n\t\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t\t};\n\t\t\treturn header;\n\t\t}\n\n\t\tbool UnloadRleData (BinaryWriter writer)\n\t\t{\n\t\t\tconst int max_chunk_length = 128;\n\t\t\tint npixels = Width * Height;\n\t\t\tint curpix = 0;\n\t\t\tvar bpp = (int)Format;\n\n\t\t\twhile (curpix < npixels) {\n\t\t\t\tint chunkstart = curpix * bpp;\n\t\t\t\tint curbyte = curpix * bpp;\n\t\t\t\tint run_length = 1;\n\t\t\t\tbool literal = true;\n\t\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\t\tbool succ_eq = true;\n\t\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\t\tcurbyte += bpp;\n\t\t\t\t\tif (1 == run_length)\n\t\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\t\trun_length--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\t\tbreak;\n\t\t\t\t\trun_length++;\n\t\t\t\t}\n\t\t\t\tcurpix += run_length;\n\n\t\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tvoid LoadRleData (BinaryReader reader)\n\t\t{\n\t\t\tvar pixelcount = Width * Height;\n\t\t\tvar currentpixel = 0;\n\t\t\tvar currentbyte = 0;\n\n\t\t\tvar bytespp = (int)Format;\n\t\t\tvar color = new byte [4];\n\n\t\t\tdo {\n\t\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\t\tif (chunkheader < 128) {\n\t\t\t\t\tchunkheader++;\n\t\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tchunkheader -= 127;\n\t\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} while (currentpixel < pixelcount);\n\t\t}\n\n\t\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t\t{\n\t\t\tvar format = (Format)bpp;\n\t\t\tif (format == Format.GRAYSCALE)\n\t\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t\t}\n\t}\n\n\tstruct TGAHeader\n\t{\n\t\tpublic byte IdLength;\n\t\tpublic byte ColorMapType;\n\t\tpublic DataType DataTypeCode;\n\n\t\t// field #4. Color map specification\n\t\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\t\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\t\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t\t// field #5. Image specification\n\t\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\t\tpublic short OriginY; // as for X-origin\n\t\tpublic short Width;   // width in pixels\n\t\tpublic short Height;  // height in pixels\n\t\tpublic byte BitsPerPixel;     // pixel depth\n\t\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n\t}\n\n\tpublic enum DataType : byte\n\t{\n\t\tNoImageData = 0, // no image data is present\n\t\tUncompressedColorMappedImage = 1,\n\t\tUncompressedTrueColorImage = 2,\n\t\tUncompressedBlackAndWhiteImage = 3,\n\t\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\t\tRleTrueColorImage = 10, // run-length encoded true-color image\n\t\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/WorkbookItems/Matrix.cs",
    "content": "﻿using System;\n\nnamespace Renderer\n{\n\tpublic struct Matrix4\n\t{\n\t\tpublic const int Len = 4;\n\n\t\tpublic float R0C0, R0C1, R0C2, R0C3;\n\t\tpublic float R1C0, R1C1, R1C2, R1C3;\n\t\tpublic float R2C0, R2C1, R2C2, R2C3;\n\t\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\t\tpublic float this [int row, int column] {\n\t\t\tget {\n\t\t\t\tswitch (row) {\n\t\t\t\tcase 0:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R0C0;\n\t\t\t\t\tcase 1: return R0C1;\n\t\t\t\t\tcase 2: return R0C2;\n\t\t\t\t\tcase 3: return R0C3;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R1C0;\n\t\t\t\t\tcase 1: return R1C1;\n\t\t\t\t\tcase 2: return R1C2;\n\t\t\t\t\tcase 3: return R1C3;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R2C0;\n\t\t\t\t\tcase 1: return R2C1;\n\t\t\t\t\tcase 2: return R2C2;\n\t\t\t\t\tcase 3: return R2C3;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R3C0;\n\t\t\t\t\tcase 1: return R3C1;\n\t\t\t\t\tcase 2: return R3C2;\n\t\t\t\t\tcase 3: return R3C3;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthrow new IndexOutOfRangeException ();\n\t\t\t}\n\t\t\tset {\n\t\t\t\tswitch (row) {\n\t\t\t\tcase 0:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthrow new IndexOutOfRangeException ();\n\t\t\t}\n\t\t}\n\n\t\tpublic Matrix4 Transpose ()\n\t\t{\n\t\t\treturn new Matrix4 {\n\t\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t\t};\n\t\t}\n\n\n\t\tpublic static Matrix4 Identity ()\n\t\t{\n\t\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t\t}\n\n\t\tpublic static Matrix4 Zoom (float scale)\n\t\t{\n\t\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t\t}\n\n\t\tpublic static Matrix4 RotationZ (float angle)\n\t\t{\n\t\t\tvar cosangle = (float)Math.Cos (angle);\n\t\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\t\tvar R = Identity ();\n\t\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\t\tR [0, 1] = -sinangle;\n\t\t\tR [1, 0] = sinangle;\n\n\t\t\treturn R;\n\t\t}\n\n\t\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t\t{\n\t\t\tvar result = new Matrix4 ();\n\t\t\tfor (int i = 0; i < Len; i++) {\n\t\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\t\tresult [i, j] = 0;\n\t\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tpublic override string ToString ()\n\t\t{\n\t\t\tvar sb = new System.Text.StringBuilder ();\n\t\t\tfor (int r = 0; r < Len; r++) {\n\t\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\t\tsb.AppendLine ();\n\t\t\t}\n\t\t\treturn sb.ToString ();\n\t\t}\n\t}\n\n\tpublic struct Matrix3\n\t{\n\t\tpublic const int Len = 3;\n\n\t\tpublic float R0C0, R0C1, R0C2;\n\t\tpublic float R1C0, R1C1, R1C2;\n\t\tpublic float R2C0, R2C1, R2C2;\n\n\t\tpublic float this [int row, int column] {\n\t\t\tget {\n\t\t\t\tswitch (row) {\n\t\t\t\tcase 0:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R0C0;\n\t\t\t\t\tcase 1: return R0C1;\n\t\t\t\t\tcase 2: return R0C2;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R1C0;\n\t\t\t\t\tcase 1: return R1C1;\n\t\t\t\t\tcase 2: return R1C2;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R2C0;\n\t\t\t\t\tcase 1: return R2C1;\n\t\t\t\t\tcase 2: return R2C2;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthrow new IndexOutOfRangeException ();\n\t\t\t}\n\t\t\tset {\n\t\t\t\tswitch (row) {\n\t\t\t\tcase 0:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthrow new IndexOutOfRangeException ();\n\t\t\t}\n\t\t}\n\n\t\tpublic Matrix3 Transpose ()\n\t\t{\n\t\t\treturn new Matrix3 {\n\t\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t\t};\n\t\t}\n\n\t\tpublic void SetColumn (int col, Vec3f v)\n\t\t{\n\t\t\tthis [0, col] = v.x;\n\t\t\tthis [1, col] = v.y;\n\t\t\tthis [2, col] = v.z;\n\t\t}\n\n\t\tpublic void SetRow (int row, Vec3f v)\n\t\t{\n\t\t\tthis [row, 0] = v.x;\n\t\t\tthis [row, 1] = v.y;\n\t\t\tthis [row, 2] = v.z;\n\t\t}\n\n\t\tpublic override string ToString ()\n\t\t{\n\t\t\tvar sb = new System.Text.StringBuilder ();\n\t\t\tfor (int r = 0; r < Len; r++) {\n\t\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\t\tsb.AppendLine ();\n\t\t\t}\n\t\t\treturn sb.ToString ();\n\t\t}\n\t}\n\n\tpublic struct Matrix2\n\t{\n\t\tpublic const int Len = 2;\n\n\t\tpublic float R0C0, R0C1;\n\t\tpublic float R1C0, R1C1;\n\n\t\tpublic float this [int row, int column] {\n\t\t\tget {\n\t\t\t\tswitch (row) {\n\t\t\t\tcase 0:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R0C0;\n\t\t\t\t\tcase 1: return R0C1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: return R1C0;\n\t\t\t\t\tcase 1: return R1C1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthrow new IndexOutOfRangeException ();\n\t\t\t}\n\t\t\tset {\n\t\t\t\tswitch (row) {\n\t\t\t\tcase 0:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t\tswitch (column) {\n\t\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthrow new IndexOutOfRangeException ();\n\t\t\t}\n\t\t}\n\t}\n\n\t// methods from this class should be placed in workbooks\n\t// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\n\tstatic class MatrixHelpers\n\t{\n\t\t/*\n\t\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\t\tpublic static Matrix TransposeInverse (Matrix m)\n\t\t{\n\t\t\t// returns Transpose(Inverse(m))\n\t\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\t\tvar cofactor = Cofactor (m);\n\n\t\t\tfloat det = 0;\n\t\t\tfor (int i = 0; i < m.Rows; i++)\n\t\t\t\tdet += m [0, i] * cofactor[0, i];\n\n\t\t\tfor (int r = 0; r < cofactor.Rows; r++) {\n\t\t\t\tfor (int c = 0; c < cofactor.Cols; c++)\n\t\t\t\t\tcofactor [r, c] /= det;\n\t\t\t}\n\n\t\t\treturn cofactor;\n\t\t}\n\n\t\tstatic Matrix Cofactor (Matrix m)\n\t\t{\n\t\t\tvar r = new Matrix (m.Rows, m.Cols);\n\t\t\tfor (int row = 0; row < m.Rows; row++) {\n\t\t\t\tfor (int col = 0; col < m.Cols; col++)\n\t\t\t\t\tr [row, col] = Cofactor(m, row, col);\n\t\t\t}\n\t\t\treturn r;\n\t\t}\n\n\t\tstatic float Cofactor (Matrix m, int row, int col)\n\t\t{\n\t\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\t\treturn Det (Minor (m, row, col)) * sign;\n\t\t}\n\n\t\tstatic Matrix Minor (Matrix m, int row, int col)\n\t\t{\n\t\t\tvar minor = new Matrix (m.Rows - 1, m.Cols - 1);\n\t\t\tfor (int r = 0; r < minor.Rows; r++) {\n\t\t\t\tfor (int c = 0; c < minor.Cols; c++) {\n\t\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn minor;\n\t\t}\n\n\t\tstatic float Det (Matrix m)\n\t\t{\n\t\t\tif (m.Rows == 1 && m.Cols == 1)\n\t\t\t\treturn m [0, 0];\n\n\t\t\tfloat det = 0;\n\t\t\tfor (int col = 0; col < m.Cols; col++)\n\t\t\t\tdet += m [0, col] * Cofactor (m, 0, col);\n\n\t\t\treturn det;\n\t\t}\n\t\t*/\n\n\t\t// For Matrix4\n\t\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\t\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t\t{\n\t\t\t// returns Transpose(Inverse(m))\n\t\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\t\tvar cofactor = Cofactor (m);\n\n\t\t\tfloat det = 0;\n\t\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\t\tcofactor [r, c] /= det;\n\t\t\t}\n\n\t\t\treturn cofactor;\n\t\t}\n\n\t\tpublic static Matrix4 Inverse (Matrix4 m)\n\t\t{\n\t\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\t\tvar cofactor = Cofactor (m);\n\n\t\t\tint len = Matrix4.Len;\n\t\t\tfloat det = 0;\n\t\t\tfor (int i = 0; i < len; i++)\n\t\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\t\tcofactor = cofactor.Transpose ();\n\n\t\t\tfor (int r = 0; r < len; r++) {\n\t\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\t\tcofactor [r, c] /= det;\n\t\t\t}\n\n\t\t\treturn cofactor;\n\t\t}\n\n\t\tpublic static Matrix3 Inverse (Matrix3 m)\n\t\t{\n\t\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\t\tvar cofactor = Cofactor (m);\n\n\t\t\tint len = Matrix3.Len;\n\t\t\tfloat det = 0;\n\t\t\tfor (int i = 0; i < len; i++)\n\t\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\t\tcofactor = cofactor.Transpose ();\n\n\t\t\tfor (int r = 0; r < len; r++) {\n\t\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\t\tcofactor [r, c] /= det;\n\t\t\t}\n\n\t\t\treturn cofactor;\n\t\t}\n\n\t\tstatic Matrix4 Cofactor (Matrix4 m)\n\t\t{\n\t\t\tvar r = new Matrix4 ();\n\t\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t\t}\n\t\t\treturn r;\n\t\t}\n\n\t\tstatic Matrix3 Cofactor (Matrix3 m)\n\t\t{\n\t\t\tvar r = new Matrix3 ();\n\t\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t\t}\n\t\t\treturn r;\n\t\t}\n\n\t\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t\t{\n\t\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\t\treturn Det (Minor (m, row, col)) * sign;\n\t\t}\n\n\t\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t\t{\n\t\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\t\treturn Det (Minor (m, row, col)) * sign;\n\t\t}\n\n\t\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t\t{\n\t\t\tvar minor = new Matrix3 ();\n\t\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn minor;\n\t\t}\n\n\t\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t\t{\n\t\t\tvar minor = new Matrix2 ();\n\t\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn minor;\n\t\t}\n\n\t\tstatic float Det (Matrix3 m)\n\t\t{\n\t\t\tfloat det = 0;\n\t\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\t\treturn det;\n\t\t}\n\n\t\tstatic float Det (Matrix2 m)\n\t\t{\n\t\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t\t}\n\n\t\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t\t{\n\t\t\treturn new Vec3f {\n\t\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t\t};\n\t\t}\n\n\t\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t\t{\n\t\t\treturn new Vec4f {\n\t\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t\t};\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/WorkbookItems/Model.cs",
    "content": "﻿using System;\n\nnamespace Renderer\n{\n\tusing System.Collections.Generic;\n\tusing System.Linq;\n\n\tstruct Face\n\t{\n\t\tpublic int [] Vertices;\n\t\tpublic int [] Textures;\n\t\tpublic int [] Normals;\n\t}\n\n\tclass Model\n\t{\n\t\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\t\tpublic List<Face> Faces { get; } = new List<Face> ();\n\t\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\t\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\t\tpublic static Model FromFile (string path)\n\t\t{\n\t\t\tvar model = new Model ();\n\n\t\t\tstring line;\n\t\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\t\tmodel.ParseLine (line);\n\t\t\t}\n\n\t\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\t\treturn model;\n\t\t}\n\n\t\tpublic static Model FromText (string text)\n\t\t{\n\t\t\tvar model = new Model ();\n\n\t\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\t\tforeach (var line in lines)\n\t\t\t\tmodel.ParseLine (line);\n\n\t\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\t\treturn model;\n\t\t}\n\n\t\tvoid ParseLine (string line)\n\t\t{\n\t\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\t\tx = float.Parse (strItems [1]),\n\t\t\t\ty = float.Parse (strItems [2]),\n\t\t\t\tz = float.Parse (strItems [3])\n\t\t\t};\n\n\t\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\t\tVertices.Add (parseV3f (items));\n\t\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\t\tTextures.Add (parseV3f (items));\n\t\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\t\tNormals.Add (parseV3f (items));\n\t\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t\t   .ToArray ();\n\t\t\t\tFaces.Add (new Face {\n\t\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tpublic Vec3f Normal (Face face, int nthvert)\n\t\t{\n\t\t\tint idx = face.Normals [nthvert];\n\t\t\treturn Normals [idx];\n\t\t}\n\n\t\tpublic Vec3f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tint idx = face.Vertices [nthvert];\n\t\t\treturn Vertices [idx];\n\t\t}\n\n\t\tpublic Vec3f GetUV (Face face, int nthvert)\n\t\t{\n\t\t\tint idx = face.Textures [nthvert];\n\t\t\treturn Textures [idx];\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/WorkbookItems/Shaders.cs",
    "content": "﻿using System;\nusing static Renderer.Geometry;\nusing static Renderer.MatrixHelpers;\nusing static Renderer.ShaderUtils;\n\nnamespace Renderer\n{\n\t// lesson6\n\tinterface IShader\n\t{\n\t\tVec4f Vertex (Face face, int nthvert);\n\t\tbool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n\t};\n\n\t// lesson6\n\tclass GouraudShader : IShader\n\t{\n\t\treadonly Model model;\n\t\treadonly Vec3f lightDir;\n\n\t\t// written by vertex shader, read by fragment shader\n\t\tprotected Vec3f varyingIntensity = new Vec3f ();\n\n\t\treadonly Matrix4 transformation;\n\n\t\tpublic GouraudShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\ttransformation = viewPort * projection * modelView;\n\t\t\tthis.lightDir = lightDir.Normalize ();\n\t\t}\n\n\t\tpublic virtual Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tvar n = model.Normal (face, nthvert).Normalize ();\n\t\t\tvaryingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n\t\t\treturn TransformFace (model, face, nthvert, transformation);\n\t\t}\n\n\t\tpublic virtual bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar intensity = Dot (varyingIntensity, bar);   // interpolate intensity for the current pixel\n\t\t\tcolor = Color.White * intensity; // well duh\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclass GouraudShader6 : GouraudShader\n\t{\n\t\tpublic GouraudShader6 (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n\t\t\t: base (model, viewPort, projection, modelView, lightDir)\n\t\t{\n\t\t}\n\n\t\tpublic override bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar intensity = Dot (varyingIntensity, bar);\n\t\t\tif (intensity > 0.85f) intensity = 1;\n\t\t\telse if (intensity > 0.60f) intensity = 0.80f;\n\t\t\telse if (intensity > 0.45f) intensity = 0.60f;\n\t\t\telse if (intensity > 0.30f) intensity = 0.45f;\n\t\t\telse if (intensity > 0.15f) intensity = 0.30f;\n\t\t\telse intensity = 0;\n\t\t\tcolor = new Color (255, 155, 0) * intensity;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclass TextureShader : IShader\n\t{\n\t\treadonly Model model;\n\t\treadonly Vec3f lightDir;\n\t\treadonly Matrix4 transformation;\n\t\treadonly Image texture;\n\n\t\t// written by vertex shader, read by fragment shader\n\t\tVec3f varyingIntensity = new Vec3f ();\n\t\tVec3f varyingU = new Vec3f ();\n\t\tVec3f varyingV = new Vec3f ();\n\n\t\tpublic TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\ttransformation = viewPort * projection * modelView;\n\t\t\tthis.lightDir = lightDir.Normalize ();\n\t\t\tthis.texture = texture;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n\t\t\tvar n = model.Normal (face, nthvert).Normalize ();\n\t\t\tvaryingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n\t\t\treturn TransformFace (model, face, nthvert, transformation);\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\t// interpolate intensity for the current pixel\n\t\t\tvar intensity = Dot (varyingIntensity, bar);\n\n\t\t\t// interpolate uv for the current pixel\n\t\t\tvar uvf = CalcUV (varyingU, varyingV, bar);\n\n\t\t\tcolor = GetColor (texture, uvf) * intensity;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclass NormalMapShader : IShader\n\t{\n\t\tVec3f varyingU = new Vec3f ();\n\t\tVec3f varyingV = new Vec3f ();\n\n\t\treadonly Model model;\n\t\treadonly Vec3f lightDir;\n\t\treadonly Matrix4 uniformM;\n\t\treadonly Matrix4 uniformMIT;\n\t\treadonly Matrix4 transformation;\n\n\t\treadonly Image texture;\n\t\treadonly Image normalMap;\n\n\t\tpublic NormalMapShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\tthis.lightDir = lightDir.Normalize ();\n\t\t\tthis.texture = texture;\n\t\t\tthis.normalMap = normalMap;\n\n\t\t\tuniformM = projection * modelView;\n\t\t\tuniformMIT = TransposeInverse (uniformM);\n\t\t\ttransformation = viewport * uniformM;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\t\t\treturn TransformFace (model, face, nthvert, transformation);\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar uv = CalcUV (varyingU, varyingV, bar);\n\t\t\tvar n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n\t\t\tvar l = Transform (uniformM, lightDir).Normalize ();\n\n\t\t\tvar intensity = Math.Max (0f, Dot (n, l));\n\t\t\tcolor = GetColor (texture, uv) * intensity;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclass SpecularShader : IShader\n\t{\n\t\tVec3f varyingU = new Vec3f ();\n\t\tVec3f varyingV = new Vec3f ();\n\n\t\treadonly Model model;\n\t\treadonly Vec3f lightDir;\n\t\treadonly Matrix4 uniformM;\n\t\treadonly Matrix4 uniformMIT;\n\t\treadonly Matrix4 transformation;\n\n\t\treadonly Image texture;\n\t\treadonly Image normalMap;\n\t\treadonly Image specularMap;\n\n\t\tpublic SpecularShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap, Image specularMap)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\tthis.lightDir = lightDir.Normalize ();\n\t\t\tthis.texture = texture;\n\t\t\tthis.normalMap = normalMap;\n\t\t\tthis.specularMap = specularMap;\n\n\t\t\tuniformM = projection * modelView;\n\t\t\tuniformMIT = TransposeInverse (uniformM);\n\t\t\ttransformation = viewport * uniformM;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\t\t\treturn TransformFace (model, face, nthvert, transformation);\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar uv = CalcUV (varyingU, varyingV, bar);\n\t\t\tvar n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n\t\t\tvar l = Transform (uniformM, lightDir).Normalize ();\n\n\t\t\tvar r = (n * (2 * Dot (n, l)) - l).Normalize ();\n\n\t\t\tvar diff = Math.Max (0f, Dot (n, l));\n\t\t\tvar specular = Math.Pow (Math.Max (0f, r.z), Specular (specularMap, uv) + 15);\n\n\t\t\tcolor = GetColor (texture, uv);\n\n\t\t\tint v = 0;\n\t\t\tfor (int i = 0; i < 4; i++)\n\t\t\t\tv = (v << 8) | (byte)Math.Min (255, (int)(5 + color [i] * (diff + 1.3f * specular)));\n\t\t\tcolor = new Color (v, color.format);\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclass TangentShader : IShader\n\t{\n\t\t// triangle uv coordinates, written by the vertex shader, read by the fragment shader\n\t\tVec3f varyingU = new Vec3f ();\n\t\tVec3f varyingV = new Vec3f ();\n\n\t\t// normal per vertex to be interpolated by FS\n\t\tMatrix3 varyingNrm = new Matrix3 ();\n\n\t\treadonly Model model;\n\t\treadonly Vec3f lightDir;\n\t\treadonly Matrix4 uniformM;\n\t\treadonly Matrix4 uniformMIT;\n\n\t\t// do not need for starting poing\n\t\treadonly Matrix4 transformation;\n\t\treadonly Vec3f[] ndcTri = new Vec3f[3];     // triangle in normalized device coordinates\n\n\t\treadonly Image texture;\n\t\t// do not need for starting poing\n\t\treadonly Image normalMap;\n\n\t\t// use this commit for 6bis lesson:\n\t\t// https://github.com/xamarin/private-samples/commit/ddad38f7787d5e9c065afc91547730ad38e51fd1#diff-8603c43660c04f4d430053b29c80ed15R253\n\t\tpublic TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\tthis.lightDir = lightDir.Normalize ();\n\t\t\tthis.texture = texture;\n\n\t\t\t// do not need for starting poing\n\t\t\t this.normalMap = normalMap;\n\t\t\t// this.specularMap = specularMap;\n\n\t\t\tuniformM = projection * modelView;\n\t\t\tuniformMIT = TransposeInverse (uniformM);\n\t\t\ttransformation = viewport * uniformM;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n\t\t\tvar normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n\t\t\tvaryingNrm.SetColumn (nthvert, normal);\n\n\t\t\tvar glVertex = TransformFace (model, face, nthvert, transformation);\n\t\t\tndcTri[nthvert] = Project3D (glVertex / glVertex.h);\n\n\t\t\treturn glVertex;\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar bn = Mult(varyingNrm, bar).Normalize ();\n\t\t\tvar uv = CalcUV (varyingU, varyingV, bar);\n\n\t\t\tvar A = new Matrix3 ();\n\t\t\tA.SetRow (0, ndcTri [1] - ndcTri [0]);\n\t\t\tA.SetRow (1, ndcTri [2] - ndcTri [0]);\n\t\t\tA.SetRow (2, bn);\n\n\t\t\tvar AI = Inverse (A);\n\t\t\tvar i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n\t\t\tvar j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n\n\t\t\tvar B = new Matrix3 ();\n\t\t\tB.SetColumn (0, i.Normalize ());\n\t\t\tB.SetColumn (1, j.Normalize ());\n\t\t\tB.SetColumn (2, bn);\n\n\t\t\tvar n = Mult (B, Normal (normalMap, uv)).Normalize ();\n\n\t\t\tvar l = Transform (uniformM, lightDir).Normalize ();\n\t\t\tvar diff = Math.Max (0f, Dot (n, l));\n\n\t\t\tcolor = GetColor (texture, uv) * diff;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclass DepthShader : IShader\n\t{\n\t\tconst float depth = 255f;\n\n\t\tMatrix3 varyingTri;\n\n\t\treadonly Model model;\n\t\treadonly Matrix4 transformation;\n\n\t\tpublic DepthShader (Model model, Matrix4 transformation)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\tthis.transformation = transformation;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tvar glVertex = TransformFace (model, face, nthvert, transformation);\n\t\t\tvaryingTri.SetColumn (nthvert, Project3D (glVertex / glVertex.h));\n\t\t\treturn glVertex;\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar p = Mult (varyingTri, bar);\n\t\t\tcolor = Color.White * (p.z / depth);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tclass ShadowShader : IShader\n\t{\n\t\tVec3f varyingU = new Vec3f ();\n\t\tVec3f varyingV = new Vec3f ();\n\t\tMatrix3 varyingTri;\n\n\t\treadonly Model model;\n\t\treadonly Vec3f lightDir;\n\t\treadonly Matrix4 uniformM;\n\t\treadonly Matrix4 uniformMIT;\n\t\treadonly Matrix4 uniformShadow; // transform framebuffer screen coordinates to shadowbuffer screen coordinates\n\t\treadonly Matrix4 transformation;\n\n\t\treadonly Image texture;\n\t\treadonly Image normalMap;\n\t\treadonly Image specularMap;\n\n\t\treadonly float[] shadowbuffer;\n\t\treadonly int width;\n\n\t\tpublic ShadowShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Matrix4 uniformShadow, Vec3f lightDir, Image texture, Image normalMap, Image specularMap, float[] shadowbuffer, int width)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\tthis.lightDir = lightDir.Normalize ();\n\t\t\tthis.texture = texture;\n\t\t\tthis.normalMap = normalMap;\n\t\t\tthis.specularMap = specularMap;\n\t\t\tthis.shadowbuffer = shadowbuffer;\n\t\t\tthis.width = width;\n\n\t\t\tuniformM = projection * modelView;\n\t\t\tuniformMIT = TransposeInverse (uniformM);\n\t\t\ttransformation = viewport * uniformM;\n\t\t\tthis.uniformShadow = uniformShadow;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n\t\t\tvar glVertex = TransformFace (model, face, nthvert, transformation);\n\t\t\tvaryingTri.SetColumn (nthvert, Project3D (glVertex / glVertex.h));\n\n\t\t\treturn glVertex; \n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar sb_p = Mult (uniformShadow, Embed4D (Mult (varyingTri, bar))); // corresponding point in the shadow buffer\n\t\t\tsb_p = sb_p / sb_p.h;\n\t\t\tint idx = (int)sb_p.x + (int)sb_p.y * width; // index in the shadowbuffer array\n\t\t\t// z-fighting: sb_p.z + 3.5f\n\t\t\tfloat shadow = 0.3f + 0.7f * (shadowbuffer [idx] < (sb_p.z + 3.5f) ? 1f : 0f);\n\n\t\t\tvar uv = CalcUV (varyingU, varyingV, bar);\n\t\t\tvar n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n\t\t\tvar l = Transform (uniformM, lightDir).Normalize ();\n\t\t\tvar r = (n * (2 * Dot (n, l)) - l).Normalize ();\n\t\t\tvar diff = Math.Max (0f, Dot (n, l));\n\n\t\t\tvar specular = Math.Pow (Math.Max (0f, r.z), Specular (specularMap, uv) + 15);\n\t\t\tcolor = GetColor (texture, uv);\n\n\t\t\tint v = 0;\n\t\t\tfor (int i = 0; i < 4; i++)\n\t\t\t\tv = (v <<= 8) | (byte)Math.Min (255, (int)(5 + color [i] * shadow * (diff + 1.3f * specular)));\n\t\t\tcolor = new Color (v, color.format);\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t#region Lesson9\n\n\tclass ZShader : IShader\n\t{\n\t\tconst float depth = 255f;\n\n\t\treadonly Model model;\n\t\treadonly Matrix4 transformation;\n\n\t\tpublic ZShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\ttransformation = viewport * projection * modelView;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\treturn TransformFace (model, face, nthvert, transformation);\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tcolor = Color.White * (fragment.z / depth);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclass OcclusionShader : IShader\n\t{\n\t\tVec3f varyingU = new Vec3f ();\n\t\tVec3f varyingV = new Vec3f ();\n\n\t\treadonly Model model;\n\t\treadonly Matrix4 transformation;\n\t\treadonly Image occlusion;\n\t\treadonly float [] shadowbuffer;\n\t\treadonly int width;\n\n\t\tpublic OcclusionShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Image occlusion, float [] shadowbuffer, int width)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\tthis.occlusion = occlusion;\n\t\t\tthis.shadowbuffer = shadowbuffer;\n\t\t\tthis.width = width;\n\n\t\t\ttransformation = viewport * projection * modelView;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\t\t\treturn TransformFace (model, face, nthvert, transformation);\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar uvf = CalcUV (varyingU, varyingV, bar);\n\t\t\tvar uvi = CalcXY (occlusion, uvf);\n\n\t\t\tvar index = (int)(fragment.x + fragment.y * width);\n\t\t\tif (Math.Abs(shadowbuffer [index] - (byte)fragment.z) <= 1e-2)\n\t\t\t\tocclusion [uvi.x, uvi.y] = Color.White;\n\n\t\t\tcolor = Color.White;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclass AOShader : IShader\n\t{\n\t\tVec3f varyingU = new Vec3f ();\n\t\tVec3f varyingV = new Vec3f ();\n\n\t\treadonly Model model;\n\t\treadonly Matrix4 transformation;\n\t\treadonly Image aoImage;\n\n\t\tpublic AOShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Image aoImage)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\tthis.aoImage = aoImage;\n\n\t\t\ttransformation = viewport * projection * modelView;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\t\t\treturn TransformFace (model, face, nthvert, transformation);\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tvar uvf = CalcUV (varyingU, varyingV, bar);\n\t\t\tvar uvi = CalcXY (aoImage, uvf);\n\n\t\t\tvar t = aoImage [uvi.x, uvi.y] [0];\n\t\t\tcolor = new Color (t, t, t);\n\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t// Name it ZShader in wb (redefine class)\n\tclass ZShader2 : IShader\n\t{\n\t\treadonly Model model;\n\t\treadonly Matrix4 transformation;\n\n\t\tpublic ZShader2 (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView)\n\t\t{\n\t\t\tthis.model = model;\n\t\t\ttransformation = viewport * projection * modelView;\n\t\t}\n\n\t\tpublic Vec4f Vertex (Face face, int nthvert)\n\t\t{\n\t\t\treturn TransformFace (model, face, nthvert, transformation);\n\t\t}\n\n\t\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t\t{\n\t\t\tcolor = Color.Black;\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t#endregion\n\n\tstatic class ShaderUtils\n\t{\n\t\t// lesson6\n\t\tpublic static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n\t\t{\n\t\t\tvar v = model.Vertex (face, nthvert); // read the vertex from model\n\t\t\tvar glVertex = Embed4D (v);\n\t\t\treturn Mult (t, glVertex); // transform it to screen coordinates\n\t\t}\n\n\t\t// lesson6\n\t\tpublic static void UpdateVarayingUV (Model model, Face face, int nthvert, ref Vec3f varyingU, ref Vec3f varyingV)\n\t\t{\n\t\t\tvar vt = model.GetUV (face, nthvert);\n\t\t\tvaryingU [nthvert] = vt.x;\n\t\t\tvaryingV [nthvert] = vt.y;\n\t\t}\n\n\t\t// lesson6\n\t\tpublic static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n\t\t{\n\t\t\treturn new Vec2f {\n\t\t\t\tx = Dot (varU, bar),\n\t\t\t\ty = Dot (varV, bar)\n\t\t\t};\n\t\t}\n\n\t\t// lesson6\n\t\tpublic static Color GetColor (Image texture, Vec2f uvf)\n\t\t{\n\t\t\tvar uvi = CalcXY(texture, uvf);\n\t\t\treturn texture [uvi.x, uvi.y];\n\t\t}\n\n\t\tpublic static Vec3f Transform (Matrix4 t, Vec3f v)\n\t\t{\n\t\t\tvar v4d = Mult (t, Embed4D (v));\n\t\t\treturn Project3D (v4d);\n\t\t}\n\n\t\t// lesson6\n\t\tpublic static Vec3f Normal (Image normalMap, Vec2f uvf)\n\t\t{\n\t\t\t// RGB values as xyz. But Color stores data as BGR (zyx)\n\t\t\tvar c = GetColor (normalMap, uvf);\n\n\t\t\treturn new Vec3f {\n\t\t\t\tx = (c [2] / 255f) * 2 - 1,\n\t\t\t\ty = (c [1] / 255f) * 2 - 1,\n\t\t\t\tz = (c [0] / 255f) * 2 - 1\n\t\t\t};\n\t\t}\n\n\t\t// lesson6\n\t\tpublic static float Specular (Image specularMap, Vec2f uvf)\n\t\t{\n\t\t\tvar uvi = CalcXY (specularMap, uvf);\n\t\t\tvar color = specularMap [uvi.x, uvi.y];\n\t\t\treturn color[0];\n\t\t}\n\n\t\t// lesson6\n\t\tpublic static Vec2i CalcXY (Image texture, Vec2f uvf)\n\t\t{\n\t\t\treturn new Vec2i {\n\t\t\t\tx = (int)(uvf.x * texture.Width),\n\t\t\t\ty = (int)(uvf.y * texture.Height)\n\t\t\t};\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/WorkbookItems/Utils.cs",
    "content": "﻿using System;\n\nusing static Renderer.Geometry;\n\nnamespace Renderer\n{\n\tstatic class Utils\n\t{\n\t\tpublic static Vec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n\t\t{\n\t\t\tvar pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n\t\t\tvar ab = b - a;\n\t\t\tvar ac = c - a;\n\t\t\tvar pa = a - pixel;\n\n\t\t\tvar r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x }, new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n\t\t\t// triangle is degenerate, in this case return smth with negative coordinates \n\t\t\tif (Math.Abs (r.z) < 1)\n\t\t\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\n\t\t\treturn new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n\t\t}\n\n\t\tpublic static void Triangle (Image image, Vec3f [] coordinates, Color color)\n\t\t{\n\t\t\tvar t0 = coordinates [0];\n\t\t\tvar t1 = coordinates [1];\n\t\t\tvar t2 = coordinates [2];\n\n\t\t\tvar pMax = new Vec2i {\n\t\t\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\t\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t\t\t};\n\t\t\tvar pMin = new Vec2i {\n\t\t\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\t\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t\t\t};\n\n\t\t\tVec2i p;\n\t\t\tfor (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n\t\t\t\tfor (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n\t\t\t\t\tvar bc = Barycentric (t0, t1, t2, p);\n\t\t\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\timage [p.x, p.y] = color;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// lesson 3\n\t\tpublic static Vec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n\t\t{\n\t\t\tvar ab = b - a;\n\t\t\tvar ac = c - a;\n\t\t\tvar pa = a - p;\n\n\t\t\tvar r = Cross (new Vec3f {\n\t\t\t\tx = ab.x,\n\t\t\t\ty = ac.x,\n\t\t\t\tz = pa.x\n\t\t\t}, new Vec3f {\n\t\t\t\tx = ab.y,\n\t\t\t\ty = ac.y,\n\t\t\t\tz = pa.y\n\t\t\t});\n\n\t\t\t// triangle is degenerate, in this case return smth with negative coordinates\n\t\t\t// dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n\t\t\tif ((int)r.z == 0)\n\t\t\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\t\t\treturn new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n\t\t}\n\n\t\t// lesson 3\n\t\tpublic static void Triangle (Image image, Vec3f [] coordinates, Color color, float [] zbuffer)\n\t\t{\n\t\t\tVec3f t0 = coordinates [0];\n\t\t\tVec3f t1 = coordinates [1];\n\t\t\tVec3f t2 = coordinates [2];\n\n\t\t\tvar pMax = new Vec2i {\n\t\t\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\t\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t\t\t};\n\t\t\tvar pMin = new Vec2i {\n\t\t\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\t\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t\t\t};\n\n\t\t\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\t\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\t\t\tx = x + 0.5f,\n\t\t\t\t\t\ty = y + 0.5f\n\t\t\t\t\t};\n\t\t\t\t\tvar bc = Barycentric (Project2D (t0), Project2D (t1), Project2D (t2), pixelCenter);\n\t\t\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\t\t\tvar idx = x + y * image.Width;\n\t\t\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\t\t\tzbuffer [idx] = z;\n\t\t\t\t\t\timage [x, y] = color;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// lesson3\n\t\tpublic static float [] InitZBuffer (Image image)\n\t\t{\n\t\t\tvar zbuffer = new float [image.Width * image.Height];\n\t\t\tfor (int idx = 0; idx < zbuffer.Length; idx++)\n\t\t\t\tzbuffer [idx] = float.NegativeInfinity;\n\t\t\treturn zbuffer;\n\t\t}\n\n\t\t// lesson3\n\t\tpublic static void Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n\t\t{\n\t\t\tVec3f t0 = coordinates [0];\n\t\t\tVec3f t1 = coordinates [1];\n\t\t\tVec3f t2 = coordinates [2];\n\n\t\t\tvar pMax = new Vec2i {\n\t\t\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\t\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t\t\t};\n\t\t\tvar pMin = new Vec2i {\n\t\t\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\t\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t\t\t};\n\n\t\t\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\t\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\t\t\tx = x + 0.5f,\n\t\t\t\t\t\ty = y + 0.5f\n\t\t\t\t\t};\n\t\t\t\t\tvar bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n\t\t\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\t\t\tvar u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n\t\t\t\t\tvar v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n\t\t\t\t\tvar idx = x + y * image.Width;\n\t\t\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\t\t\tzbuffer [idx] = z;\n\n\t\t\t\t\t\tvar color = texture [u, v];\n\t\t\t\t\t\timage [x, y] = color * intensivity;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic static void Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n\t\t{\n\t\t\tpMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n\t\t\tpMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n\t\t\tfor (int i = 0; i < 3; i++) {\n\t\t\t\tpMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n\t\t\t\tpMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n\t\t\t\tpMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n\t\t\t\tpMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n\t\t\t}\n\t\t}\n\n\t\tpublic static void Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n\t\t{\n\t\t\tVec2i pMin, pMax;\n\t\t\tBox (pts, out pMin, out pMax);\n\n\t\t\tColor color;\n\t\t\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\t\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\t\t\tvar pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n\t\t\t\t\tvar bc = Barycentric (Project2D (pts [0] / pts [0].h),\n\t\t\t\t\t                      Project2D (pts [1] / pts [1].h),\n\t\t\t\t\t                      Project2D (pts [2] / pts [2].h),\n\t\t\t\t\t                      pixelCenter);\n\n\t\t\t\t\tvar z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n\t\t\t\t\tvar w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n\t\t\t\t\tvar frag_depth = z / w;\n\n\t\t\t\t\tvar idx = x + y * image.Width;\n\t\t\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n\t\t\t\t\t\tcontinue;\n\n\n\t\t\t\t\tvar discard = shader.Fragment (new Vec3f { x = x, y = y, z = frag_depth }, bc, out color);\n\t\t\t\t\tif (!discard) {\n\t\t\t\t\t\tzbuffer [idx] = frag_depth;\n\t\t\t\t\t\timage [x, y] = color;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// lesson4\n\t\tpublic static float DegToRad (float degAngle)\n\t\t{\n\t\t\treturn degAngle * (float)Math.PI / 180;\n\t\t}\n\n\t\t// lesson4\n\t\tpublic static Matrix4 Viewport (int x, int y, int w, int h)\n\t\t{\n\t\t\tvar depth = 255f;\n\n\t\t\tvar m = Matrix4.Identity ();\n\t\t\tm [0, 3] = x + w / 2f;\n\t\t\tm [1, 3] = y + h / 2f;\n\t\t\tm [2, 3] = depth / 2f;\n\n\t\t\tm [0, 0] = w / 2f;\n\t\t\tm [1, 1] = h / 2f;\n\t\t\tm [2, 2] = depth / 2f;\n\t\t\treturn m;\n\t\t}\n\n\t\t// lesson4\n\t\tpublic static Matrix4 Projection (float coeff)\n\t\t{\n\t\t\tvar projection = Matrix4.Identity ();\n\t\t\tprojection [3, 2] = coeff;\n\t\t\treturn projection;\n\t\t}\n\n\t\t// lesson4\n\t\tpublic static Matrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n\t\t{\n\t\t\tvar z = (eye - center).Normalize ();\n\t\t\tvar x = Cross (up, z).Normalize ();\n\t\t\tvar y = Cross (z, x).Normalize ();\n\n\t\t\tvar Minv = Matrix4.Identity ();\n\t\t\tMinv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n\t\t\tMinv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n\t\t\tMinv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n\t\t\tvar Tr = Matrix4.Identity ();\n\t\t\tTr [0, 3] = -center.x;\n\t\t\tTr [1, 3] = -center.y;\n\t\t\tTr [2, 3] = -center.y;\n\n\t\t\treturn Minv * Tr;\n\t\t}\n\n\t\tpublic static Vec3f RandPointOnUnitSphere ()\n\t\t{\n\t\t\tvar rnd = new Random ();\n\t\t\tvar u = rnd.NextDouble ();\n\t\t\tvar v = rnd.NextDouble ();\n\t\t\tvar theta = 2 * Math.PI * u;\n\t\t\tvar phi = Math.Acos(2 * v - 1);\n\n\t\t\treturn new Vec3f {\n\t\t\t\tx = (float)(Math.Sin (phi) * Math.Cos (theta)),\n\t\t\t\ty = (float)(Math.Sin (phi) * Math.Sin (theta)),\n\t\t\t\tz = (float)Math.Cos (phi)\n\t\t\t};\n\t\t}\n\n\t\tpublic static float MaxElevationAngle (float [] zbuffer, Vec2f p, Vec2f dir, int width, int height)\n\t\t{\n\t\t\tfloat maxangle = 0;\n\t\t\tfor (float t = 0; t < 1000; t += 1) {\n\t\t\t\tVec2f cur = p + dir * t;\n\t\t\t\tif (cur.x >= width || cur.y >= height || cur.x < 0 || cur.y < 0)\n\t\t\t\t\treturn maxangle;\n\n\t\t\t\tvar distance = (p - cur).Norm ();\n\t\t\t\tif (distance < 1)\n\t\t\t\t\tcontinue;\n\n\t\t\t\tfloat elevation = zbuffer [(int)cur.x + (int)cur.y * width] - zbuffer [(int)p.x + (int)p.y * width];\n\t\t\t\tmaxangle = (float)Math.Max (maxangle, Math.Atan (elevation / distance));\n\t\t\t}\n\n\t\t\treturn maxangle;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/Renderer/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"NUnit\" version=\"3.5.0\" targetFramework=\"net45\" />\n</packages>"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1], CultureInfo.InvariantCulture.NumberFormat),\n\t\t\ty = float.Parse (strItems [2], CultureInfo.InvariantCulture.NumberFormat),\n\t\t\tz = float.Parse (strItems [3], CultureInfo.InvariantCulture.NumberFormat)\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson1.workbook/obj/african_head.obj",
    "content": "v -0.000581696 -0.734665 -0.623267\nv 0.000283538 -1 0.286843\nv -0.117277 -0.973564 0.306907\nv -0.382144 -0.890788 0.221243\nv -0.247144 -0.942602 0.276051\nv -0.656078 -0.718512 -0.109025\nv -0.609847 -0.786562 0.0198068\nv -0.66248 -0.632053 -0.244271\nv -0.511812 -0.845392 0.127809\nv -0.609326 -0.569868 -0.41571\nv -0.426949 -0.649767 -0.567143\nv -0.201076 -0.720822 -0.633205\nv 0.117382 -0.973645 0.306766\nv 0.382454 -0.890869 0.221097\nv 0.247512 -0.942667 0.275986\nv 0.656371 -0.718624 -0.109224\nv 0.610273 -0.786562 0.0197893\nv 0.66248 -0.631463 -0.244119\nv 0.511631 -0.845357 0.127832\nv 0.608654 -0.568839 -0.416318\nv 0.424663 -0.649937 -0.567418\nv 0.198972 -0.720968 -0.633141\nv 0.153371 -0.140519 0.477416\nv 0.134781 -0.14723 0.48805\nv 0.131261 -0.132153 0.49872\nv 0.14749 -0.135105 0.489565\nv 0.000686924 -0.0534984 0.505694\nv 0.075062 -0.0473306 0.49955\nv 0.0695841 -0.0997942 0.550277\nv 0.0302569 -0.0971868 0.55389\nv 0.0745124 -0.135953 0.523215\nv 0.0354892 -0.12785 0.535159\nv 0.0389268 -0.109557 0.550558\nv 0.0734835 -0.11538 0.538029\nv 0.106386 -0.125623 0.51513\nv 0.107415 -0.144295 0.5047\nv 0.15968 -0.130861 0.484794\nv 0.156224 -0.123705 0.486735\nv 0.15792 -0.107798 0.4677\nv 0.163784 -0.126996 0.470144\nv 0.154687 -0.134655 0.486373\nv 0.160668 -0.135649 0.476189\nv 0.143433 -0.119034 0.499854\nv 0.131606 -0.0726738 0.476148\nv -0.000260156 -0.124553 0.539058\nv -0.000646004 -0.110651 0.55444\nv 0.100423 -0.10574 0.537643\nv 0.126128 -0.115784 0.515598\nv 0.250944 -0.275583 0.380381\nv 0.221602 -0.335752 0.330174\nv 0.275434 -0.301318 0.24751\nv 0.307699 -0.239869 0.292356\nv 0.332124 -0.0415605 0.412962\nv 0.319444 0.00732526 0.451091\nv 0.28667 -0.025805 0.481549\nv 0.297006 -0.0758717 0.454242\nv 0.357953 -0.159928 -0.223225\nv 0.303981 -0.144611 -0.343644\nv 0.296386 -0.0547553 -0.357792\nv 0.357339 -0.0633433 -0.24278\nv 0.45086 0.331215 0.047962\nv 0.438899 0.336167 0.131147\nv 0.447405 0.226107 0.139349\nv 0.455613 0.205353 0.0827643\nv 0.197493 -0.411308 0.138256\nv 0.204911 -0.353378 0.2082\nv 0.102001 -0.419375 0.24969\nv 0.0995867 -0.475697 0.20834\nv 0.150133 -0.372261 0.431226\nv 0.176423 -0.362054 0.392056\nv 0.196019 -0.326474 0.426929\nv 0.154611 -0.348549 0.463444\nv 0.0892273 -0.391968 0.303592\nv 0.159013 -0.363737 0.305077\nv 0.455712 0.508986 -0.0641442\nv 0.432146 0.648411 -0.0417475\nv 0.417051 0.611568 0.0817295\nv 0.44205 0.483438 0.0478626\nv 0.3446 0.43288 0.398633\nv 0.372358 0.383369 0.353998\nv 0.388341 0.404485 0.306953\nv 0.355059 0.467372 0.356967\nv 0.305162 0.338815 0.458112\nv 0.298579 0.319803 0.456627\nv 0.313422 0.304568 0.427776\nv 0.323711 0.315968 0.429291\nv 0.33161 0.397557 0.430226\nv 0.354427 0.359727 0.390478\nv 0.304162 0.291952 0.432377\nv 0.292662 0.309771 0.452991\nv 0.282934 0.292496 0.4562\nv 0.292025 0.281663 0.435178\nv 0.397344 0.565249 0.192585\nv 0.42257 0.455996 0.145494\nv 0.317848 0.364866 0.448834\nv 0.340595 0.337517 0.417978\nv 0.243227 0.479439 0.494236\nv 0.250155 0.546138 0.465934\nv 0.179019 0.560251 0.511681\nv 0.170173 0.4781 0.536229\nv 0.162386 0.410407 0.547009\nv 0.235031 0.427051 0.517018\nv 0.271745 0.634415 0.42162\nv 0.196896 0.657291 0.472505\nv 0.186589 0.312952 0.511073\nv 0.189518 0.32493 0.514165\nv 0.146286 0.31277 0.509009\nv 0.144959 0.300178 0.501713\nv 0.143965 0.300412 0.49409\nv 0.187203 0.310596 0.506407\nv 0.157744 0.364614 0.528804\nv 0.216697 0.382527 0.516083\nv 0.194441 0.332425 0.515989\nv 0.204286 0.349818 0.516732\nv 0.156254 0.334062 0.519579\nv 0.151565 0.320341 0.513961\nv 0.0431068 0.071791 0.618005\nv 0.0477954 0.0867105 0.593486\nv 0.0780844 0.0816652 0.602518\nv 0.0574124 0.0746147 0.621185\nv 0.448253 0.130656 0.149533\nv 0.431801 0.159355 0.215905\nv 0.422792 0.0771637 0.237185\nv 0.428691 0.0348783 0.166914\nv 0.365073 -0.0526507 0.316126\nv 0.326974 -0.104793 0.373068\nv 0.312773 -0.172965 0.33446\nv 0.368107 -0.126698 0.269222\nv 0.203695 -0.131796 0.523934\nv 0.180463 -0.136479 0.525396\nv 0.182848 -0.14892 0.516989\nv 0.204163 -0.152533 0.514914\nv 0.39379 0.00616771 0.269368\nv 0.40177 -0.0591341 0.209048\nv 0.26083 -0.0996422 0.484274\nv 0.250406 -0.0552171 0.50321\nv 0.15851 -0.136292 0.498474\nv 0.155032 -0.134684 0.502964\nv 0.145006 -0.133819 0.514504\nv 0.171033 -0.12032 0.538263\nv 0.158849 -0.127938 0.534943\nv 0.167969 -0.138075 0.523788\nv 0.232061 -0.151474 0.497024\nv 0.23074 -0.117128 0.507191\nv 0.365798 0.221617 0.362743\nv 0.342501 0.235507 0.392185\nv 0.325951 0.202558 0.415114\nv 0.359268 0.178677 0.383229\nv 0.352369 0.0489033 0.417452\nv 0.322262 0.0907619 0.44953\nv 0.295322 0.04895 0.483251\nv 0.367108 0.00328555 0.369771\nv 0.138972 -0.18796 0.555521\nv 0.161562 -0.177794 0.535913\nv 0.154015 -0.155093 0.536392\nv 0.136131 -0.156414 0.558491\nv 0.220263 -0.08194 0.518603\nv 0.202088 -0.0486753 0.52791\nv 0.17564 -0.0814314 0.545822\nv 0.193131 -0.106435 0.533575\nv 0.199492 -0.169714 0.509722\nv 0.190033 -0.188183 0.514668\nv 0.207302 -0.213011 0.492721\nv 0.222415 -0.183044 0.489617\nv 0.125088 -0.132884 0.551294\nv 0.144497 -0.139192 0.530254\nv 0.135014 0.119128 0.544717\nv 0.119534 0.149685 0.554253\nv 0.096915 0.171211 0.569382\nv 0.112553 0.137432 0.569616\nv 0.0878476 0.217858 0.555667\nv 0.0649773 0.232128 0.568628\nv 0.073466 0.185119 0.584571\nv 0.116359 0.191199 0.548932\nv 0.111419 0.228591 0.524951\nv 0.0858774 0.255408 0.530312\nv 0.301408 0.0368718 -0.387812\nv 0.366839 0.037626 -0.269538\nv 0.272125 -0.199781 0.399533\nv 0.246349 -0.195514 0.453266\nv 0.223339 -0.243049 0.450553\nv 0.364021 -0.197455 0.21335\nv 0.411416 -0.124798 0.140589\nv 0.431568 -0.0028997 0.0907502\nv 0.449346 0.11075 0.0889086\nv 0.0649948 0.777167 0.432594\nv 0.133465 0.770619 0.418569\nv 0.14341 0.869244 0.301253\nv 0.0689586 0.877043 0.315395\nv 0.305372 0.809321 0.22043\nv 0.289307 0.723856 0.335524\nv 0.355187 0.660735 0.264773\nv 0.372264 0.728258 0.148528\nv 0.382308 0.7766 0.0116631\nv 0.0971488 0.470588 0.557912\nv 0.110788 0.565185 0.534317\nv 0.100113 0.277828 0.510938\nv 0.10966 0.248679 0.503771\nv 0.0443988 0.240822 0.58581\nv 0.0522151 0.193614 0.604337\nv 0.052601 0.564735 0.541859\nv 0.123726 0.667896 0.498907\nv 0.0597976 0.671147 0.508711\nv 0.0466729 0.466215 0.561034\nv 0.000423846 0.462807 0.558988\nv -0.00017831 0.388326 0.563478\nv 0.0352086 0.389069 0.560584\nv 0.000833078 0.56384 0.544139\nv 0.295773 0.426823 0.470722\nv 0.301706 0.464689 0.451056\nv 0.189957 0.181465 0.501181\nv 0.186163 0.208931 0.491956\nv 0.141574 0.222722 0.500509\nv 0.146526 0.195338 0.518293\nv 0.111986 0.0116865 0.562811\nv 0.111343 0.0404672 0.565769\nv 0.0577164 0.0420398 0.577988\nv 0.0656438 -0.00796249 0.596918\nv 0.147695 0.0440509 0.537258\nv 0.144778 0.0631738 0.538491\nv 0.0268719 -0.0140834 0.602378\nv 0.0270356 -0.0372401 0.622027\nv 0.0876429 -0.0456996 0.601127\nv 0.183093 0.146552 0.519439\nv 0.148589 0.164593 0.536819\nv 0.147344 0.131095 0.542934\nv 0.176733 0.112264 0.532435\nv -0.000394618 -0.0441035 0.617625\nv -0.000260156 -0.0187662 0.600677\nv 0.165058 0.0770935 0.530856\nv 0.148554 0.0982976 0.535562\nv 0.116476 0.272829 0.494797\nv 0.119084 0.26261 0.493569\nv 0.120873 0.268971 0.480883\nv 0.11761 0.27287 0.484221\nv 0.224695 0.848444 0.271198\nv 0.231324 0.918189 0.121063\nv 0.14614 0.9439 0.150241\nv 0.241894 0.945736 -0.185803\nv 0.156043 0.976475 -0.183418\nv 0.146906 0.980702 -0.0177607\nv 0.23195 0.948285 -0.0402158\nv 0.0684324 0.995189 -0.00981573\nv 0.0682103 0.955014 0.162933\nv 0.0891571 0.383649 0.555118\nv 0.110613 0.336412 0.528863\nv 0.122749 0.310759 0.512914\nv 0.147081 -0.111919 0.55631\nv 0.158656 -0.0994551 0.55786\nv 0.0939743 0.0869969 0.616333\nv 0.101206 0.119326 0.615532\nv 0.0670469 0.122121 0.645885\nv 0.0560853 0.0831385 0.640601\nv 0.0795284 0.0820978 0.567845\nv 0.0337354 0.0564741 0.595059\nv 0.0854448 -0.103577 0.606979\nv 0.0826211 -0.0671141 0.612931\nv 0.0280704 -0.0555854 0.637736\nv 0.0319698 -0.0970874 0.628212\nv 0.0789964 -0.121811 0.579602\nv 0.0327415 -0.116959 0.594106\nv 0.0216981 0.0173339 0.585915\nv -0.00123062 -0.095585 0.625704\nv -0.000511542 -0.0598999 0.637227\nv -0.00157555 -0.115643 0.593966\nv -0.000219233 -0.0988881 0.554498\nv 0.0291929 0.0853015 0.665324\nv 0.0352671 0.124524 0.666125\nv 0.0371846 0.159004 0.648446\nv 0.0654158 0.154462 0.629171\nv 0.0280178 0.19967 0.620548\nv 0.0221015 0.245843 0.59797\nv 0.0432997 0.281499 0.556866\nv 0.0222008 0.28717 0.567459\nv -0.000400465 0.125745 0.673871\nv -0.00057585 0.0822265 0.675105\nv -0.000347849 0.160916 0.656029\nv 0.367195 0.315074 0.363767\nv 0.346658 0.302744 0.393991\nv 0.344389 0.266656 0.384439\nv 0.371726 0.266504 0.352507\nv 0.40246 0.429197 0.234116\nv 0.422126 0.335763 0.207276\nv 0.393316 0.264083 0.313887\nv 0.387102 0.325737 0.325369\nv 0.3274 0.295928 0.408636\nv 0.316392 0.29076 0.418709\nv 0.3085 0.274624 0.423199\nv 0.323636 0.272379 0.406602\nv 0.429381 0.244458 0.204002\nv 0.407084 0.332408 0.277313\nv 0.410597 0.257869 0.266264\nv -0.0012657 -0.456867 0.290093\nv -0.00137093 -0.520579 0.266159\nv 0.154137 -0.304206 0.500479\nv 0.193482 -0.282873 0.473493\nv 0.186367 -0.242201 0.509588\nv 0.148993 -0.26399 0.525367\nv 0.110332 -0.274916 0.545857\nv 0.099347 -0.233134 0.560204\nv 0.0558865 -0.227615 0.569605\nv 0.0659185 -0.270006 0.563817\nv 0.154687 -0.142577 0.51838\nv 0.159498 -0.143009 0.513072\nv 0.154646 -0.138239 0.502496\nv 0.149045 -0.137596 0.50639\nv 0.15958 -0.138174 0.517463\nv 0.161574 -0.141559 0.511657\nv 0.0940387 -0.129288 0.582226\nv 0.109215 -0.12609 0.531844\nv 0.0782715 -0.117578 0.557129\nv 0.264817 0.0151299 0.501573\nv 0.280122 0.127096 0.47057\nv 0.262508 0.0886748 0.494464\nv 0.187613 0.050926 0.529248\nv 0.207829 0.0868157 0.523449\nv 0.231821 -0.0170182 0.518246\nv 0.304138 0.164985 0.443485\nv 0.343004 0.132813 0.418235\nv 0.313621 0.250742 0.418382\nv 0.290815 0.22492 0.444303\nv 0.355269 -0.194146 0.0276407\nv 0.388534 -0.179618 0.0746089\nv 0.336544 -0.25083 0.156379\nv 0.29365 -0.279868 0.104617\nv 0.389288 0.153006 0.345258\nv 0.39155 0.205715 0.320166\nv 0.127262 0.566927 -0.64996\nv 0.000868155 0.562946 -0.661419\nv 0.000850617 0.724441 -0.605705\nv 0.118774 0.725955 -0.596105\nv 0.21095 0.754513 0.387525\nv 0.133734 -0.133188 0.514651\nv 0.131302 -0.13393 0.53047\nv 0.0671053 -0.326445 0.551902\nv 0.0661056 -0.374553 0.504765\nv 0.117289 -0.365439 0.489939\nv 0.116552 -0.318792 0.528974\nv 0.288249 -0.135286 0.424736\nv 0.39393 0.0544045 0.33225\nv 0.374655 0.0965379 0.38044\nv 0.000792155 1 -0.0074948\nv 0.0731795 0.993937 -0.182792\nv 0.000868155 0.999152 -0.181886\nv 0.179405 0.936399 -0.330549\nv 0.0842755 0.953459 -0.338026\nv 0.141767 0.271455 0.486238\nv 0.139978 0.267433 0.490862\nv 0.175908 0.259465 0.501362\nv 0.175312 0.263359 0.495861\nv 0.181597 0.230187 0.495539\nv 0.140253 0.240576 0.495341\nv 0.336982 0.587763 0.356927\nv 0.312043 0.518258 0.416183\nv 0.259971 0.350203 0.495411\nv 0.250763 0.331028 0.496036\nv 0.114179 0.255893 0.495902\nv 0.111069 0.276518 0.499456\nv 0.125433 0.293116 0.500415\nv 0.124965 0.282353 0.489968\nv 0.13906 0.254928 0.497457\nv 0.17737 0.2462 0.50062\nv 0.121796 0.272327 0.47658\nv 0.149548 0.0847578 0.549377\nv 0.142825 -0.226381 0.544992\nv 0.106181 -0.197232 0.576871\nv 0.258193 -0.146669 0.465227\nv 0.2105 0.0188071 0.525711\nv 0.181041 -0.0155508 0.531721\nv 0.173453 -0.168949 0.5218\nv 0.180322 -0.15877 0.514949\nv 0.168554 -0.150118 0.516667\nv 0.163082 -0.153579 0.523344\nv 0.139124 -0.128733 0.545343\nv 0.152348 -0.134468 0.527471\nv 0.416192 -0.0714636 0.0335278\nv 0.0220956 0.0520719 0.640232\nv 0.0361615 0.0619695 0.628476\nv -0.000283541 0.202056 0.62768\nv 0.0869063 -0.0493125 -0.489641\nv 0.192289 -0.0534399 -0.447186\nv 0.192003 -0.134672 -0.429197\nv 0.0851642 -0.130335 -0.46373\nv 0.236434 0.310245 0.495686\nv 0.237714 0.31211 0.497539\nv 0.244636 0.32534 0.496212\nv 0.121253 0.281932 0.477293\nv 0.173149 -0.207241 0.528208\nv -0.000242618 0.247989 0.603612\nv -0.00037708 0.28838 0.571697\nv 0.108496 -0.160507 0.588207\nv 0.0613995 -0.166388 0.620127\nv 0.0634222 -0.199565 0.59462\nv 0.0893734 0.151176 0.600127\nv 0.122124 0.0729427 0.596088\nv 0.0993528 0.072475 0.584781\nv 0.108315 0.0599584 0.583916\nv 0.133524 0.0551528 0.575778\nv 0.13315 0.107517 0.580426\nv 0.274937 0.384257 0.485735\nv 0.170606 -0.145383 0.517205\nv 0.0464391 -0.130399 0.611931\nv 0.0392892 -0.113439 0.575094\nv -0.00161647 -0.112428 0.579865\nv -0.00351648 -0.131685 0.617859\nv 0.0194356 0.03489 0.601858\nv -0.000564158 0.0478802 0.644208\nv -2.04632e-05 0.0350303 0.598835\nv 0.222163 0.246884 0.4972\nv 0.217802 0.257547 0.498129\nv 0.293159 0.278716 0.430419\nv 0.302852 0.281932 0.427367\nv 0.285209 0.277366 0.434932\nv 0.289307 0.275834 0.436551\nv 0.290061 0.280494 0.427963\nv -0.000225079 -0.384287 0.444245\nv 0.0651001 -0.383883 0.440585\nv -0.000891543 -0.364076 0.502426\nv 0.116576 -0.381784 0.436341\nv 0.363734 0.712842 -0.467571\nv 0.32166 0.832542 -0.392653\nv 0.376508 0.821429 -0.265451\nv 0.427095 0.698004 -0.319575\nv 0.27178 0.90956 -0.29643\nv 0.310423 0.901357 -0.210644\nv 0.441869 0.677005 -0.175175\nv 0.389019 0.807076 -0.128411\nv 0.313311 0.894506 -0.0788532\nv 0.12783 -0.376125 0.378248\nv 0.0722266 -0.391483 0.37664\nv 0.125579 0.302411 0.505741\nv 0.101656 0.861358 -0.486525\nv 0.214084 0.849981 -0.463327\nv 0.2467 0.723207 -0.559263\nv 0.104913 0.117397 -0.600268\nv 0.221579 0.117865 -0.555159\nv 0.200848 0.0268164 -0.488992\nv 0.0944011 0.0271204 -0.539134\nv 0.391141 0.144178 -0.303545\nv 0.331241 0.130393 -0.444613\nv 0.360829 0.250357 -0.491155\nv 0.424003 0.258021 -0.333419\nv 0.000868155 0.23912 -0.655479\nv 0.00089154 0.393909 -0.675105\nv 0.125626 0.397949 -0.664716\nv 0.115418 0.240453 -0.645617\nv 0.452175 0.547687 -0.348309\nv 0.450217 0.395605 -0.350776\nv 0.383015 0.40193 -0.511868\nv 0.3854 0.562496 -0.506472\nv 0.464078 0.52881 -0.195929\nv 0.311698 0.866351 0.071908\nv -9.64635e-05 -0.406882 0.376985\nv 0.373883 -0.18312 -0.115123\nv 0.389189 -0.0789467 -0.141776\nv 0.247109 0.197607 0.47589\nv 0.22891 0.231497 0.489717\nv 0.121077 -0.116725 0.574393\nv 0.125626 -0.0895459 0.583057\nv 0.110548 -0.128452 0.555428\nv 0.000710309 0.959638 0.167019\nv 0.000710309 0.881206 0.320973\nv 0.224163 0.124079 0.505215\nv 0.255305 0.260798 0.480649\nv 0.25188 0.263516 0.478322\nv 0.214891 0.26119 0.49413\nv 0.116476 0.273741 0.475423\nv 0.290704 0.283902 0.433377\nv 0.29641 0.299523 0.422813\nv 0.29406 0.288222 0.418078\nv 0.142655 0.263364 0.482467\nv 0.121638 0.267831 0.470296\nv 0.171711 0.256898 0.489693\nv 0.246864 0.257401 0.473821\nv 0.274311 0.271648 0.453301\nv 0.274539 0.26862 0.446654\nv 0.233686 0.331104 0.49074\nv 0.187548 0.326632 0.49682\nv 0.296971 0.273928 0.433476\nv 0.134067 -0.0744861 0.577333\nv 0.237434 0.052867 0.514604\nv 0.0637905 0.27076 0.54346\nv 0.375421 0.514218 0.287328\nv 0.353808 -0.333437 -0.190615\nv 0.349365 -0.276331 -0.333858\nv 0.323337 -0.214946 -0.338453\nv 0.356725 -0.247925 -0.205557\nv -0.000330311 -0.581268 0.237302\nv 0.092922 -0.548418 0.185458\nv 0.394783 -0.0876049 -0.0664009\nv 0.358315 -0.197624 -0.02995\nv 0.292785 -0.321493 0.0377429\nv 0.395175 -0.0904345 -0.0143524\nv 0.243385 0.243183 -0.602957\nv 0.000587539 -0.0451091 -0.498205\nv 0.000751232 0.030862 -0.55154\nv 0.000809694 0.11928 -0.61144\nv 0.000850617 0.862837 -0.491295\nv 0.000868155 0.958527 -0.339277\nv 0.000423846 -0.128189 -0.469085\nv 0.264186 0.56961 -0.608026\nv 0.35127 -0.283317 -0.0863656\nv 0.196201 -0.209591 -0.418785\nv 0.0873097 -0.206341 -0.44839\nv 0.000488154 -0.206259 -0.449945\nv 0.263397 0.402579 -0.621226\nv 0.456683 0.384813 -0.0591516\nv 0.457776 0.372302 -0.191281\nv 0.000850617 0.671351 0.512487\nv 0.000809694 0.77919 0.437668\nv 0.408656 0.116286 0.298547\nv 0.295913 0.259781 0.439334\nv 0.285355 0.265481 0.449775\nv 0.278766 0.270035 0.454663\nv 0.128946 -0.0227065 0.564741\nv 0.16203 0.016989 0.534633\nv 0.0985987 0.0583799 0.58087\nv 0.0538462 0.323165 0.543729\nv 0.0794758 0.301522 0.528465\nv -0.00330601 -0.197759 0.600525\nv -0.000511542 -0.225551 0.572931\nv -0.00456879 -0.164231 0.628277\nv -0.000336157 -0.26392 0.574381\nv -0.000768774 -0.325515 0.55686\nv 0.269921 0.242499 0.464742\nv 0.260573 0.253022 0.476072\nv 0.235066 0.15963 0.493271\nv 0.411369 0.186119 0.273583\nv 0.000178307 0.0131539 0.584682\nv 0.153436 -0.0554568 0.55786\nv 0.0264569 0.331747 0.554112\nv -0.000342003 0.332998 0.557743\nv 0.285589 0.277974 0.428156\nv 0.184795 -0.499655 0.1217\nv 0.332808 -0.386298 -0.0699261\nv 0.20739 -0.274419 -0.415909\nv 0.0927467 -0.274308 -0.43723\nv 0.278029 -0.438791 0.0475586\nv 0.000505693 -0.27722 -0.43768\nv 0.438191 0.12488 -0.0367783\nv 0.460214 0.163208 -0.055258\nv 0.485388 0.177437 -0.0277343\nv 0.472304 0.161641 -0.00367724\nv 0.496244 0.232684 -0.0170708\nv 0.477425 0.247036 0.00446648\nv 0.517015 0.298681 -0.0523876\nv 0.492233 0.31788 -0.0441737\nv 0.53425 0.316407 -0.124009\nv 0.511491 0.332595 -0.129276\nv 0.535904 0.290111 -0.170685\nv 0.511128 0.30365 -0.186838\nv 0.538611 0.228878 -0.193017\nv 0.511286 0.231199 -0.218992\nv 0.520242 0.128838 -0.191421\nv 0.490433 0.122168 -0.208603\nv 0.487562 0.00951757 -0.0819458\nv 0.472286 -0.00658864 -0.0930419\nv 0.47079 0.0399937 -0.154257\nv 0.496437 0.0472722 -0.136917\nv 0.485142 -0.0247586 -0.0238758\nv 0.46129 -0.0429694 -0.0334343\nv 0.474888 0.238927 -0.0419989\nv 0.495232 0.289088 -0.0628581\nv 0.508398 0.299996 -0.11766\nv 0.51311 0.283323 -0.158478\nv 0.514642 0.235303 -0.176531\nv 0.501751 0.136134 -0.181559\nv 0.486025 0.0533522 -0.11859\nv 0.486451 0.0268164 -0.067155\nv 0.482529 0.0136625 -0.0120607\nv 0.464265 0.0280383 0.0249515\nv 0.457519 -0.0185791 0.0196256\nv 0.442769 0.0582571 -0.0293244\nv 0.45632 0.0847169 -0.0600578\nv 0.442465 0.0842785 -0.0209644\nv 0.459612 0.268106 0.0209995\nv 0.458559 0.182857 0.0414318\nv 0.463026 0.318488 -0.0446005\nv 0.470222 0.311835 -0.142898\nv 0.455063 0.232836 -0.195221\nv 0.43839 0.13186 -0.191088\nv 0.424564 0.0473131 -0.148417\nv 0.423447 -0.00471202 -0.0897563\nv 0.425377 -0.0292075 -0.0262143\nv 0.430714 -0.0102191 0.0297161\nv 0.446335 0.0345567 0.0460036\nv 0.475607 0.129364 -0.0864649\nv 0.482611 0.0600636 -0.0525396\nv 0.481517 0.0827175 -0.101349\nv 0.470503 0.0444835 -0.0133527\nv 0.479278 0.0776957 0.00471786\nv 0.504692 0.223938 -0.101723\nv 0.50375 0.131866 -0.1473\nv 0.45452 0.100016 0.0450097\nv 0.403623 0.0251386 -0.16934\nv 0.414719 0.138607 -0.218957\nv 0.435461 0.249632 -0.229924\nv -0.000201695 -0.407876 0.310666\nv 0.000347846 -0.171521 0.505794\nv 0.0884205 -0.186598 0.484028\nv 0.141147 -0.173807 0.465513\nv 0.159878 -0.142255 0.458644\nv 0.152483 -0.116468 0.431278\nv 0.0708352 0.0121893 0.376371\nv 0.128069 -0.116368 0.360528\nv 0.143994 -0.166791 0.41184\nv 0.0748398 -0.218144 0.372349\nv 0.280941 0.292858 0.454897\nv 0.281356 0.319879 0.451494\nv 0.127268 0.269088 0.455435\nv 0.116921 0.284697 0.447653\nv 0.119996 0.274998 0.469126\nv 0.15699 0.254759 0.466326\nv 0.265916 0.273601 0.421176\nv 0.214885 0.253946 0.455259\nv 0.141223 0.313133 0.482117\nv 0.211436 0.255823 0.486852\nv 0.277135 0.302686 0.410799\nv 0.252505 0.333881 0.433599\nv 0.202023 0.342182 0.464578\nv 0.11989 0.295816 0.471196\nv 0.146526 0.322539 0.455943\nv 0.126292 0.301838 0.454973\nv 0.119744 0.284878 0.469419\nv 0.00103185 0.0191579 0.374711\nv 0.000909079 -0.205715 0.379849\nv 0.0536357 -0.100847 0.27211\nv 0.00103185 -0.098929 0.27128\nv 0.255463 -0.398733 -0.446098\nv 0.412907 -0.372688 -0.332858\nv 0.452596 -0.41557 -0.353559\nv 0.293329 -0.465367 -0.476007\nv 0.0815337 -0.637104 0.176286\nv 0.0726358 -0.738524 0.179519\nv 0.174763 -0.714911 0.155526\nv 0.172032 -0.601823 0.129884\nv 0.380782 -0.504069 -0.184377\nv 0.357368 -0.419095 -0.180384\nv 0.337538 -0.494803 -0.0548371\nv 0.372989 -0.619402 -0.0373571\nv 0.453578 -0.652661 -0.0939539\nv 0.452351 -0.545892 -0.196981\nv 0.173576 -0.814197 0.195654\nv 0.0739044 -0.845866 0.20734\nv 0.0964414 -0.904976 0.254455\nv 0.197703 -0.864562 0.243353\nv 0.519564 -0.487407 -0.384801\nv 0.555004 -0.584226 -0.219366\nv 0.451357 -0.731555 -0.0215899\nv 0.382594 -0.74824 0.0443666\nv 0.439805 -0.799196 0.0975376\nv 0.519108 -0.768071 -0.00769357\nv 0.274837 -0.806199 0.115503\nv 0.320508 -0.838061 0.183769\nv 0.354533 -0.544232 -0.525256\nv 0.162503 -0.604343 -0.559076\nv 0.131098 -0.496837 -0.498761\nv 0.115161 -0.410103 -0.457756\nv -0.00017831 -0.492774 -0.504192\nv 2.046e-05 -0.40666 -0.465186\nv -0.000482311 -0.600531 -0.555322\nv 0.546217 -0.696736 -0.117257\nv 0.22746 -0.332063 -0.424345\nv 0.101627 -0.33885 -0.437002\nv 0.280193 -0.554165 0.0658922\nv 0.274843 -0.684891 0.0781517\nv 0.000347846 -0.34199 -0.438165\nv 0.000733693 -0.746364 0.176765\nv 0.000312769 -0.874904 0.179121\nv 0.378648 -0.322586 -0.326994\nv -0.000114002 -0.940246 0.234262\nv 0.000979233 -0.650317 0.207112\nv -0.130513 -0.13217 0.498924\nv -0.133687 -0.14723 0.488109\nv -0.15222 -0.140519 0.477457\nv -0.14666 -0.13514 0.489746\nv -0.0697653 -0.0999404 0.550318\nv -0.0736414 -0.0473131 0.499649\nv -0.0305784 -0.0972511 0.55389\nv -0.0396517 -0.109762 0.550014\nv -0.0358517 -0.127727 0.53534\nv -0.0742493 -0.135994 0.523315\nv -0.0733373 -0.115561 0.537643\nv -0.106766 -0.144336 0.504823\nv -0.106281 -0.125786 0.515779\nv -0.156505 -0.107798 0.467782\nv -0.155611 -0.123682 0.486899\nv -0.159311 -0.130796 0.484958\nv -0.162872 -0.126996 0.470243\nv -0.159919 -0.135625 0.47627\nv -0.154055 -0.134696 0.486513\nv -0.142597 -0.118993 0.499994\nv -0.130051 -0.0726738 0.476189\nv -0.10054 -0.105798 0.538111\nv -0.125684 -0.115824 0.51596\nv -0.274604 -0.301394 0.247527\nv -0.220831 -0.335775 0.330215\nv -0.250102 -0.275554 0.380393\nv -0.3066 -0.239804 0.292309\nv -0.284302 -0.0258401 0.479772\nv -0.319479 0.00809111 0.449577\nv -0.331873 -0.0412272 0.412243\nv -0.293674 -0.0747667 0.452418\nv -0.294668 -0.0547787 -0.357622\nv -0.302063 -0.144319 -0.34334\nv -0.356012 -0.159916 -0.223184\nv -0.355474 -0.0633082 -0.24271\nv -0.447241 0.22613 0.139332\nv -0.437922 0.336149 0.131124\nv -0.449486 0.331215 0.047962\nv -0.454982 0.205353 0.0827818\nv -0.103311 -0.419241 0.249936\nv -0.203701 -0.353384 0.208147\nv -0.196966 -0.411506 0.138841\nv -0.101797 -0.475733 0.208638\nv -0.196499 -0.327216 0.427455\nv -0.176283 -0.362363 0.392138\nv -0.150331 -0.372548 0.431378\nv -0.155575 -0.349484 0.46435\nv -0.0890109 -0.391945 0.303855\nv -0.158306 -0.363848 0.305182\nv -0.415613 0.611627 0.0817705\nv -0.430808 0.648493 -0.0417066\nv -0.45411 0.508986 -0.0641209\nv -0.440308 0.483438 0.0478393\nv -0.389808 0.40462 0.306977\nv -0.375935 0.38348 0.354021\nv -0.34643 0.433026 0.398499\nv -0.354807 0.467378 0.356891\nv -0.317409 0.30382 0.429121\nv -0.30173 0.320499 0.456861\nv -0.309295 0.339493 0.457756\nv -0.328406 0.316144 0.429519\nv -0.358297 0.360101 0.389344\nv -0.335684 0.397733 0.427864\nv -0.285156 0.29304 0.457387\nv -0.294212 0.310695 0.451757\nv -0.307675 0.294425 0.430781\nv -0.29475 0.281949 0.435698\nv -0.421091 0.455996 0.145494\nv -0.395403 0.565208 0.19252\nv -0.321999 0.364421 0.449238\nv -0.345494 0.336792 0.417218\nv -0.178165 0.560672 0.512335\nv -0.249354 0.546354 0.466589\nv -0.243286 0.479638 0.494943\nv -0.170168 0.4781 0.536796\nv -0.164123 0.410647 0.547114\nv -0.236966 0.427297 0.516007\nv -0.270669 0.634748 0.422187\nv -0.195815 0.657882 0.47347\nv -0.14597 0.313039 0.508126\nv -0.18946 0.324971 0.513312\nv -0.186823 0.312829 0.511757\nv -0.144895 0.300213 0.501871\nv -0.186911 0.310514 0.506612\nv -0.143462 0.300341 0.494353\nv -0.160048 0.365076 0.528073\nv -0.219468 0.382854 0.516404\nv -0.15782 0.334506 0.520076\nv -0.205952 0.349935 0.517012\nv -0.195236 0.332495 0.516264\nv -0.151653 0.320785 0.513142\nv -0.0805691 0.0827468 0.603261\nv -0.0493739 0.08878 0.593591\nv -0.0448723 0.0732117 0.617958\nv -0.0594819 0.0761932 0.621314\nv -0.422927 0.0771812 0.237185\nv -0.432205 0.159355 0.215905\nv -0.448112 0.130656 0.149516\nv -0.4282 0.0348607 0.166897\nv -0.311779 -0.172912 0.334378\nv -0.324787 -0.103758 0.371735\nv -0.364851 -0.052639 0.316097\nv -0.367254 -0.126698 0.269146\nv -0.183918 -0.149136 0.51793\nv -0.182024 -0.137865 0.527822\nv -0.205163 -0.131463 0.524127\nv -0.205514 -0.152071 0.514943\nv -0.39379 0.00614433 0.269368\nv -0.400951 -0.0591282 0.208995\nv -0.261011 -0.0993382 0.483865\nv -0.25102 -0.0551177 0.50328\nv -0.158849 -0.136444 0.499199\nv -0.155155 -0.134784 0.503397\nv -0.145304 -0.133848 0.514902\nv -0.160802 -0.128394 0.536919\nv -0.173424 -0.121349 0.541327\nv -0.169156 -0.138478 0.524928\nv -0.232096 -0.116964 0.50767\nv -0.232727 -0.151188 0.49696\nv -0.326085 0.202611 0.415651\nv -0.34094 0.235683 0.392156\nv -0.367727 0.221336 0.359031\nv -0.358829 0.177595 0.3841\nv -0.295603 0.0501836 0.478632\nv -0.32232 0.0902006 0.449922\nv -0.351843 0.04895 0.416686\nv -0.367248 0.00336155 0.369624\nv -0.156137 -0.154941 0.536878\nv -0.165134 -0.177028 0.538193\nv -0.144573 -0.187364 0.558725\nv -0.140533 -0.155882 0.559046\nv -0.17761 -0.0804258 0.547933\nv -0.201667 -0.0484356 0.526945\nv -0.22024 -0.0817529 0.517585\nv -0.195826 -0.106131 0.536439\nv -0.207794 -0.213087 0.493049\nv -0.191711 -0.188305 0.515551\nv -0.201111 -0.170071 0.510745\nv -0.223385 -0.183243 0.490178\nv -0.128595 -0.132761 0.551212\nv -0.145777 -0.139513 0.530605\nv -0.0971664 0.171538 0.569909\nv -0.120048 0.150182 0.555387\nv -0.13557 0.119437 0.545004\nv -0.113103 0.137432 0.569453\nv -0.0653573 0.232432 0.569575\nv -0.08745 0.217992 0.556468\nv -0.0739395 0.185388 0.584933\nv -0.0855266 0.255554 0.53095\nv -0.110583 0.228714 0.525501\nv -0.115915 0.191404 0.5495\nv -0.300099 0.0366964 -0.387999\nv -0.364734 0.0377897 -0.269357\nv -0.223181 -0.243207 0.45081\nv -0.246139 -0.195666 0.45347\nv -0.271201 -0.199869 0.399446\nv -0.362846 -0.197443 0.213286\nv -0.410176 -0.124757 0.140565\nv -0.430404 -0.00290555 0.0907385\nv -0.448779 0.11075 0.0889086\nv -0.142135 0.869847 0.301633\nv -0.132167 0.771303 0.419317\nv -0.0633989 0.777407 0.43288\nv -0.0675789 0.877324 0.315577\nv -0.353469 0.660735 0.264732\nv -0.2875 0.723792 0.335465\nv -0.30353 0.809117 0.220313\nv -0.37099 0.728422 0.148627\nv -0.381016 0.776764 0.0117274\nv -0.0996744 0.472587 0.557146\nv -0.109525 0.565325 0.53475\nv -0.100294 0.277787 0.511248\nv -0.108689 0.248457 0.503268\nv -0.0528874 0.193947 0.604898\nv -0.0453926 0.241125 0.586705\nv -0.12255 0.668732 0.500514\nv -0.0511336 0.564922 0.542589\nv -0.0582191 0.671655 0.50974\nv -0.0440363 0.465776 0.561151\nv -0.0361966 0.388923 0.562367\nv -0.301894 0.466338 0.448542\nv -0.295831 0.424807 0.472166\nv -0.140867 0.22264 0.499754\nv -0.185742 0.209381 0.492394\nv -0.186338 0.179495 0.502724\nv -0.145859 0.19535 0.519018\nv -0.0600022 0.0437294 0.578309\nv -0.113337 0.0407946 0.564875\nv -0.114196 0.0121659 0.564255\nv -0.0686019 -0.00676987 0.598064\nv -0.143661 0.0637116 0.537807\nv -0.147607 0.0440217 0.535469\nv -0.0907706 -0.0459919 0.600525\nv -0.0300113 -0.0346152 0.623594\nv -0.028047 -0.0138554 0.603173\nv -0.148028 0.131527 0.5437\nv -0.148519 0.164868 0.537322\nv -0.183164 0.146873 0.520193\nv -0.176978 0.112363 0.532908\nv -0.147823 0.0979234 0.535574\nv -0.165064 0.0766492 0.532955\nv -0.120107 0.268649 0.480825\nv -0.118558 0.262394 0.493353\nv -0.115979 0.27287 0.494434\nv -0.116476 0.272952 0.483859\nv -0.229115 0.916634 0.120496\nv -0.223379 0.848952 0.271461\nv -0.145146 0.945128 0.150709\nv -0.145409 0.980883 -0.0176788\nv -0.154278 0.976311 -0.1834\nv -0.240088 0.945514 -0.185786\nv -0.230512 0.948548 -0.0401515\nv -0.0669533 0.995411 -0.00979819\nv -0.0669124 0.955581 0.163097\nv -0.0891746 0.383199 0.554861\nv -0.112226 0.336757 0.527307\nv -0.123381 0.311174 0.513382\nv -0.149484 -0.111966 0.558549\nv -0.160264 -0.0991219 0.559216\nv -0.0695139 0.122828 0.646821\nv -0.103574 0.1197 0.616608\nv -0.0967747 0.0873945 0.617683\nv -0.0583127 0.0845006 0.640951\nv -0.0810075 0.0824603 0.567973\nv -0.0347818 0.058339 0.594989\nv -0.031812 -0.0520134 0.636181\nv -0.0876079 -0.0656701 0.61341\nv -0.0905251 -0.101683 0.607529\nv -0.0378686 -0.0937434 0.629054\nv -0.0836617 -0.122507 0.579642\nv -0.0385351 -0.11728 0.594673\nv -0.0223295 0.0177081 0.586652\nv -0.0307538 0.0864766 0.665646\nv -0.0369098 0.125196 0.667078\nv -0.0659946 0.154643 0.629212\nv -0.0379446 0.159028 0.648136\nv -0.0287544 0.19984 0.620642\nv -0.0228205 0.245931 0.598298\nv -0.0444456 0.281523 0.558544\nv -0.0233467 0.287164 0.569581\nv -0.348774 0.267521 0.384632\nv -0.352083 0.30296 0.39367\nv -0.371253 0.315308 0.363077\nv -0.374871 0.266369 0.352501\nv -0.422202 0.335746 0.207253\nv -0.401928 0.429197 0.234116\nv -0.395345 0.264083 0.313998\nv -0.391071 0.32586 0.325679\nv -0.312703 0.275793 0.421661\nv -0.320315 0.291642 0.417107\nv -0.332077 0.295173 0.409057\nv -0.327599 0.271742 0.406824\nv -0.429802 0.244434 0.203979\nv -0.409282 0.332454 0.277442\nv -0.411848 0.257886 0.266369\nv -0.187414 -0.242265 0.510307\nv -0.193763 -0.283183 0.474066\nv -0.155254 -0.304954 0.501777\nv -0.149998 -0.264183 0.526518\nv -0.0567108 -0.227311 0.569523\nv -0.101124 -0.233508 0.561461\nv -0.11039 -0.27508 0.546021\nv -0.066205 -0.270351 0.564711\nv -0.154225 -0.138052 0.502391\nv -0.159867 -0.142787 0.513271\nv -0.15533 -0.142366 0.518626\nv -0.148566 -0.137426 0.506285\nv -0.160416 -0.138344 0.518258\nv -0.161965 -0.141513 0.511996\nv -0.110811 -0.126394 0.533276\nv -0.10089 -0.129879 0.583501\nv -0.0809374 -0.117865 0.558397\nv -0.263876 0.014785 0.500935\nv -0.26083 0.088932 0.49537\nv -0.279702 0.127055 0.470506\nv -0.207764 0.0867397 0.523776\nv -0.187729 0.0509786 0.529558\nv -0.232096 -0.0167025 0.518065\nv -0.344056 0.133304 0.417078\nv -0.302046 0.166376 0.445239\nv -0.292551 0.225429 0.44414\nv -0.316041 0.250468 0.418475\nv -0.335386 -0.250836 0.156385\nv -0.387207 -0.179618 0.074568\nv -0.353755 -0.194151 0.0276524\nv -0.292388 -0.279891 0.104617\nv -0.392211 0.205733 0.320201\nv -0.386651 0.150025 0.344942\nv -0.126064 0.567371 -0.651942\nv -0.117096 0.725914 -0.596082\nv -0.209068 0.754227 0.387245\nv -0.134091 -0.133281 0.515294\nv -0.132384 -0.133778 0.530774\nv -0.118289 -0.366228 0.490722\nv -0.0673742 -0.375085 0.505343\nv -0.0685259 -0.327012 0.553422\nv -0.117722 -0.319453 0.530388\nv -0.287793 -0.13528 0.424643\nv -0.375234 0.0965671 0.380457\nv -0.394351 0.054463 0.33218\nv -0.0714373 0.993797 -0.182751\nv -0.0825568 0.953558 -0.338084\nv -0.177458 0.935674 -0.330221\nv -0.176961 0.259482 0.501637\nv -0.139651 0.267463 0.490903\nv -0.141176 0.271537 0.486156\nv -0.175792 0.263446 0.495797\nv -0.139621 0.240295 0.49489\nv -0.181918 0.230053 0.49499\nv -0.335299 0.587722 0.356851\nv -0.311189 0.51838 0.416464\nv -0.263028 0.350391 0.495528\nv -0.252435 0.331198 0.496568\nv -0.111168 0.276448 0.500608\nv -0.113553 0.255671 0.49582\nv -0.124754 0.293525 0.500263\nv -0.124275 0.282616 0.489933\nv -0.138587 0.254671 0.496603\nv -0.17851 0.246346 0.500783\nv -0.120744 0.272286 0.476557\nv -0.150635 0.0843194 0.549231\nv -0.110981 -0.197039 0.578654\nv -0.145877 -0.226522 0.547184\nv -0.257825 -0.146365 0.464946\nv -0.181813 -0.015013 0.533586\nv -0.21057 0.0188715 0.525811\nv -0.169226 -0.14996 0.516989\nv -0.181743 -0.1588 0.515902\nv -0.175376 -0.168545 0.522911\nv -0.163813 -0.153415 0.52335\nv -0.140253 -0.128364 0.545887\nv -0.153091 -0.134363 0.527834\nv -0.414608 -0.0714286 0.0335337\nv -0.0376523 0.063203 0.628721\nv -0.0232707 0.0530365 0.640016\nv -0.190483 -0.134521 -0.42891\nv -0.190425 -0.0530365 -0.446291\nv -0.0856669 -0.0492716 -0.489617\nv -0.0841703 -0.13027 -0.463549\nv -0.238743 0.312729 0.498784\nv -0.236568 0.310718 0.495914\nv -0.245034 0.325784 0.495083\nv -0.120311 0.281967 0.47734\nv -0.176107 -0.207054 0.530523\nv -0.114635 -0.15994 0.588938\nv -0.0702155 -0.19877 0.595006\nv -0.0735478 -0.165324 0.619338\nv -0.0899814 0.151661 0.600396\nv -0.111016 0.0572925 0.58557\nv -0.101867 0.0715163 0.586237\nv -0.127064 0.0733753 0.597824\nv -0.136833 0.0543987 0.574241\nv -0.135833 0.107312 0.581379\nv -0.278287 0.38386 0.485911\nv -0.171226 -0.145371 0.517737\nv -0.0426215 -0.114106 0.575498\nv -0.0575293 -0.131258 0.610721\nv -0.0203535 0.0339429 0.602828\nv -0.224215 0.246978 0.496697\nv -0.219644 0.257664 0.498129\nv -0.308126 0.284604 0.426215\nv -0.296275 0.279026 0.430641\nv -0.291721 0.275554 0.437358\nv -0.286612 0.276705 0.435172\nv -0.291949 0.280143 0.428238\nv -0.065825 -0.384532 0.440825\nv -0.11702 -0.382428 0.436651\nv -0.374667 0.821265 -0.265393\nv -0.3198 0.831958 -0.392208\nv -0.362179 0.712818 -0.467507\nv -0.425879 0.698185 -0.319692\nv -0.269938 0.909215 -0.296313\nv -0.308015 0.900609 -0.210562\nv -0.440407 0.677046 -0.175192\nv -0.387417 0.807117 -0.128411\nv -0.312037 0.894728 -0.0788123\nv -0.0720161 -0.391612 0.376675\nv -0.127765 -0.376523 0.378341\nv -0.124801 0.303066 0.504835\nv -0.0997913 0.860855 -0.486022\nv -0.212687 0.850449 -0.463771\nv -0.245244 0.723306 -0.559461\nv -0.199083 0.0271847 -0.488407\nv -0.21986 0.118005 -0.554936\nv -0.10327 0.117479 -0.600127\nv -0.0928636 0.0273016 -0.53883\nv -0.389259 0.144254 -0.303446\nv -0.329178 0.130557 -0.444432\nv -0.359227 0.250316 -0.491237\nv -0.422325 0.258021 -0.333419\nv -0.123907 0.397932 -0.664658\nv -0.113699 0.240517 -0.645459\nv -0.381641 0.401913 -0.512072\nv -0.448592 0.395605 -0.3508\nv -0.450574 0.547705 -0.348333\nv -0.384366 0.562601 -0.506817\nv -0.462722 0.528827 -0.195952\nv -0.310604 0.866976 0.0721301\nv -0.372013 -0.183143 -0.115123\nv -0.387686 -0.0789994 -0.141781\nv -0.2476 0.197566 0.475487\nv -0.230342 0.231532 0.488372\nv -0.129238 -0.0890256 0.584927\nv -0.123544 -0.115971 0.574872\nv -0.114588 -0.128867 0.557082\nv -0.221702 0.122764 0.506442\nv -0.216107 0.26119 0.49413\nv -0.253242 0.263207 0.478422\nv -0.256568 0.260547 0.479737\nv -0.115342 0.273619 0.475323\nv -0.298743 0.299903 0.422953\nv -0.291698 0.283732 0.432722\nv -0.295854 0.288181 0.418253\nv -0.142059 0.263388 0.482491\nv -0.120428 0.267802 0.470325\nv -0.172108 0.256934 0.489641\nv -0.275083 0.271584 0.453242\nv -0.248582 0.25684 0.473757\nv -0.275001 0.268573 0.446274\nv -0.234253 0.331396 0.490634\nv -0.187624 0.326819 0.49717\nv -0.300292 0.274694 0.432944\nv -0.135658 -0.0739483 0.577444\nv -0.237428 0.052791 0.514919\nv -0.0645564 0.270789 0.544612\nv -0.373819 0.514195 0.287264\nv -0.321852 -0.214718 -0.338184\nv -0.348166 -0.27584 -0.333396\nv -0.352171 -0.333378 -0.190533\nv -0.354936 -0.247872 -0.205511\nv -0.0936937 -0.549137 0.186785\nv -0.35669 -0.197653 -0.0299733\nv -0.393228 -0.0876225 -0.0664009\nv -0.29161 -0.321499 0.0380294\nv -0.393638 -0.0904403 -0.014329\nv -0.241608 0.243201 -0.602916\nv -0.263209 0.569914 -0.609242\nv -0.349441 -0.283282 -0.0863831\nv -0.194821 -0.209504 -0.418674\nv -0.0862925 -0.206323 -0.448413\nv -0.261795 0.402579 -0.621448\nv -0.456233 0.372302 -0.191263\nv -0.455245 0.384813 -0.0591282\nv -0.408072 0.116608 0.297155\nv -0.298661 0.260278 0.439147\nv -0.287606 0.265861 0.450068\nv -0.279696 0.270216 0.454289\nv -0.162731 0.0172638 0.536515\nv -0.13087 -0.0222973 0.565699\nv -0.101475 0.0572691 0.580946\nv -0.0809198 0.301049 0.528407\nv -0.0556351 0.322972 0.54498\nv -0.272306 0.242932 0.464508\nv -0.262964 0.253017 0.476001\nv -0.233067 0.158607 0.487893\nv -0.412053 0.186142 0.273695\nv -0.154815 -0.0532762 0.55793\nv -0.0277489 0.331782 0.556427\nv -0.286179 0.277611 0.427928\nv -0.183941 -0.499632 0.122144\nv -0.331493 -0.386257 -0.0698735\nv -0.206238 -0.274279 -0.416026\nv -0.0915482 -0.274332 -0.437317\nv -0.277193 -0.438779 0.0481257\nv -0.484037 0.177414 -0.0276816\nv -0.458618 0.163319 -0.0553633\nv -0.437233 0.124752 -0.0367315\nv -0.471526 0.1616 -0.00366555\nv -0.476232 0.247018 0.00445479\nv -0.494987 0.232631 -0.0169773\nv -0.491035 0.317921 -0.0441971\nv -0.515688 0.298728 -0.0523583\nv -0.510175 0.332513 -0.1293\nv -0.532917 0.316524 -0.12405\nv -0.50993 0.303592 -0.186815\nv -0.534671 0.290233 -0.170849\nv -0.510152 0.231181 -0.21891\nv -0.537459 0.228895 -0.193058\nv -0.48934 0.122068 -0.20872\nv -0.519208 0.128879 -0.191363\nv -0.469632 0.0399528 -0.15424\nv -0.470766 -0.00661202 -0.0930419\nv -0.486142 0.00947665 -0.0819458\nv -0.495221 0.0472722 -0.1369\nv -0.459705 -0.0431682 -0.033446\nv -0.483546 -0.0248521 -0.0238816\nv -0.494011 0.289082 -0.0628932\nv -0.473502 0.238904 -0.0420457\nv -0.507246 0.300137 -0.117724\nv -0.512134 0.2833 -0.158502\nv -0.513712 0.235303 -0.176549\nv -0.50102 0.136093 -0.181582\nv -0.485095 0.0532704 -0.118549\nv -0.485253 0.0267755 -0.0671726\nv -0.481172 0.0136801 -0.012201\nv -0.456127 -0.0187428 0.0196958\nv -0.462909 0.027933 0.024969\nv -0.454923 0.0845591 -0.060163\nv -0.441284 0.0577602 -0.0294063\nv -0.440921 0.0840388 -0.0210813\nv -0.457712 0.18288 0.0414318\nv -0.458378 0.268123 0.0210228\nv -0.461588 0.318505 -0.044618\nv -0.468843 0.311858 -0.142898\nv -0.453707 0.232836 -0.195204\nv -0.436969 0.13182 -0.191047\nv -0.423167 0.0473306 -0.148288\nv -0.421945 -0.00467109 -0.089692\nv -0.423991 -0.0291198 -0.0260915\nv -0.429434 -0.0102776 0.0297746\nv -0.445242 0.0345158 0.0460211\nv -0.481617 0.0602039 -0.0524227\nv -0.474104 0.129276 -0.0866754\nv -0.480325 0.0824545 -0.101285\nv -0.469474 0.0446648 -0.013376\nv -0.478167 0.0776431 0.00467109\nv -0.503592 0.223961 -0.101887\nv -0.502575 0.131983 -0.147242\nv -0.453707 0.0999988 0.0450097\nv -0.413357 0.138549 -0.218945\nv -0.402232 0.0251035 -0.169299\nv -0.434023 0.249632 -0.229901\nv -0.0871226 -0.186639 0.484069\nv -0.139686 -0.173807 0.465537\nv -0.158481 -0.142278 0.458685\nv -0.0688299 0.0121893 0.376371\nv -0.150805 -0.116468 0.431278\nv -0.126228 -0.116368 0.360528\nv -0.142316 -0.166791 0.41184\nv -0.0730392 -0.218144 0.372349\nv -0.282087 0.293548 0.454716\nv -0.283513 0.320341 0.45129\nv -0.124398 0.285323 0.452968\nv -0.126795 0.269175 0.455978\nv -0.119353 0.275057 0.469524\nv -0.156265 0.2548 0.466332\nv -0.265074 0.27356 0.421036\nv -0.214762 0.253899 0.455218\nv -0.141855 0.312577 0.484315\nv -0.212745 0.255776 0.486875\nv -0.277117 0.302621 0.410811\nv -0.252014 0.333887 0.433371\nv -0.20141 0.342405 0.464461\nv -0.120767 0.295565 0.473184\nv -0.145333 0.322832 0.456154\nv -0.126041 0.301873 0.455785\nv -0.119879 0.284837 0.470541\nv -0.0516539 -0.100847 0.27211\nv -0.454245 -0.41571 -0.353027\nv -0.413392 -0.372097 -0.332203\nv -0.255785 -0.398019 -0.4467\nv -0.294685 -0.464338 -0.476902\nv -0.174388 -0.714777 0.156607\nv -0.0715543 -0.738454 0.180284\nv -0.0798266 -0.636725 0.177765\nv -0.171536 -0.601788 0.131147\nv -0.337345 -0.494639 -0.0546091\nv -0.355094 -0.419334 -0.180442\nv -0.379665 -0.504905 -0.184915\nv -0.373053 -0.619338 -0.0373044\nv -0.45328 -0.545816 -0.197379\nv -0.454128 -0.653065 -0.0942754\nv -0.0965876 -0.904778 0.254759\nv -0.0736004 -0.845567 0.20775\nv -0.172974 -0.81408 0.195975\nv -0.1973 -0.864375 0.243622\nv -0.520961 -0.488138 -0.3841\nv -0.556272 -0.584635 -0.21946\nv -0.439238 -0.799155 0.0975785\nv -0.381694 -0.748264 0.0442672\nv -0.45103 -0.731883 -0.0219173\nv -0.519067 -0.768135 -0.0077988\nv -0.273785 -0.806328 0.115322\nv -0.319391 -0.83802 0.183769\nv -0.163088 -0.604103 -0.559421\nv -0.356672 -0.543712 -0.525361\nv -0.131226 -0.496761 -0.498854\nv -0.114629 -0.410074 -0.45775\nv -0.546533 -0.697291 -0.117619\nv -0.100633 -0.33885 -0.437013\nv -0.22677 -0.331835 -0.424707\nv -0.274931 -0.684651 0.0790578\nv -0.28021 -0.553908 0.0669913\nv -0.378028 -0.321668 -0.326088\nv 0.172833 0.300014 0.41564\nv -0.171097 0.299996 0.415616\n# 1258 vertices\n\nvt  0.532 0.923 0.000\nvt  0.535 0.917 0.000\nvt  0.542 0.923 0.000\nvt  0.541 0.929 0.000\nvt  0.521 0.984 0.000\nvt  0.521 0.996 0.000\nvt  0.505 0.998 0.000\nvt  0.500 0.985 0.000\nvt  0.504 0.917 0.000\nvt  0.507 0.910 0.000\nvt  0.516 0.910 0.000\nvt  0.515 0.918 0.000\nvt  0.523 0.921 0.000\nvt  0.525 0.913 0.000\nvt  0.549 0.958 0.000\nvt  0.538 0.954 0.000\nvt  0.544 0.942 0.000\nvt  0.550 0.946 0.000\nvt  0.545 0.935 0.000\nvt  0.550 0.932 0.000\nvt  0.547 0.974 0.000\nvt  0.533 0.967 0.000\nvt  0.500 0.917 0.000\nvt  0.500 0.910 0.000\nvt  0.542 0.987 0.000\nvt  0.533 0.994 0.000\nvt  0.616 0.254 0.000\nvt  0.653 0.261 0.000\nvt  0.658 0.307 0.000\nvt  0.619 0.292 0.000\nvt  0.636 0.438 0.000\nvt  0.620 0.419 0.000\nvt  0.627 0.396 0.000\nvt  0.647 0.414 0.000\nvt  0.886 0.312 0.000\nvt  0.897 0.370 0.000\nvt  0.860 0.369 0.000\nvt  0.844 0.308 0.000\nvt  0.740 0.593 0.000\nvt  0.741 0.542 0.000\nvt  0.759 0.541 0.000\nvt  0.768 0.598 0.000\nvt  0.644 0.213 0.000\nvt  0.561 0.175 0.000\nvt  0.566 0.146 0.000\nvt  0.644 0.174 0.000\nvt  0.580 0.254 0.000\nvt  0.585 0.277 0.000\nvt  0.565 0.268 0.000\nvt  0.565 0.256 0.000\nvt  0.590 0.217 0.000\nvt  0.544 0.195 0.000\nvt  0.771 0.721 0.000\nvt  0.736 0.712 0.000\nvt  0.758 0.653 0.000\nvt  0.794 0.663 0.000\nvt  0.669 0.622 0.000\nvt  0.685 0.632 0.000\nvt  0.665 0.669 0.000\nvt  0.652 0.651 0.000\nvt  0.623 0.588 0.000\nvt  0.632 0.582 0.000\nvt  0.639 0.590 0.000\nvt  0.627 0.599 0.000\nvt  0.641 0.632 0.000\nvt  0.657 0.612 0.000\nvt  0.619 0.580 0.000\nvt  0.617 0.575 0.000\nvt  0.623 0.573 0.000\nvt  0.627 0.576 0.000\nvt  0.708 0.702 0.000\nvt  0.729 0.646 0.000\nvt  0.633 0.614 0.000\nvt  0.647 0.601 0.000\nvt  0.604 0.718 0.000\nvt  0.574 0.725 0.000\nvt  0.567 0.686 0.000\nvt  0.596 0.682 0.000\nvt  0.562 0.648 0.000\nvt  0.590 0.649 0.000\nvt  0.618 0.756 0.000\nvt  0.584 0.769 0.000\nvt  0.586 0.587 0.000\nvt  0.566 0.586 0.000\nvt  0.568 0.579 0.000\nvt  0.586 0.580 0.000\nvt  0.569 0.574 0.000\nvt  0.586 0.573 0.000\nvt  0.562 0.627 0.000\nvt  0.587 0.627 0.000\nvt  0.587 0.610 0.000\nvt  0.563 0.608 0.000\nvt  0.565 0.595 0.000\nvt  0.587 0.596 0.000\nvt  0.521 0.441 0.000\nvt  0.526 0.450 0.000\nvt  0.520 0.450 0.000\nvt  0.517 0.445 0.000\nvt  0.720 0.504 0.000\nvt  0.709 0.467 0.000\nvt  0.727 0.446 0.000\nvt  0.738 0.494 0.000\nvt  0.656 0.383 0.000\nvt  0.660 0.348 0.000\nvt  0.684 0.368 0.000\nvt  0.673 0.403 0.000\nvt  0.572 0.371 0.000\nvt  0.573 0.365 0.000\nvt  0.581 0.364 0.000\nvt  0.581 0.374 0.000\nvt  0.708 0.400 0.000\nvt  0.693 0.431 0.000\nvt  0.604 0.401 0.000\nvt  0.609 0.383 0.000\nvt  0.557 0.364 0.000\nvt  0.559 0.365 0.000\nvt  0.557 0.366 0.000\nvt  0.556 0.364 0.000\nvt  0.552 0.367 0.000\nvt  0.552 0.364 0.000\nvt  0.568 0.377 0.000\nvt  0.561 0.374 0.000\nvt  0.566 0.370 0.000\nvt  0.594 0.377 0.000\nvt  0.594 0.363 0.000\nvt  0.653 0.551 0.000\nvt  0.644 0.534 0.000\nvt  0.658 0.523 0.000\nvt  0.666 0.545 0.000\nvt  0.637 0.480 0.000\nvt  0.625 0.458 0.000\nvt  0.649 0.459 0.000\nvt  0.662 0.434 0.000\nvt  0.557 0.345 0.000\nvt  0.553 0.353 0.000\nvt  0.543 0.349 0.000\nvt  0.546 0.337 0.000\nvt  0.586 0.403 0.000\nvt  0.573 0.392 0.000\nvt  0.579 0.382 0.000\nvt  0.591 0.389 0.000\nvt  0.572 0.343 0.000\nvt  0.584 0.331 0.000\nvt  0.590 0.347 0.000\nvt  0.578 0.353 0.000\nvt  0.553 0.358 0.000\nvt  0.543 0.355 0.000\nvt  0.553 0.499 0.000\nvt  0.541 0.507 0.000\nvt  0.542 0.484 0.000\nvt  0.553 0.477 0.000\nvt  0.539 0.532 0.000\nvt  0.529 0.541 0.000\nvt  0.531 0.513 0.000\nvt  0.551 0.538 0.000\nvt  0.538 0.552 0.000\nvt  0.552 0.521 0.000\nvt  0.908 0.437 0.000\nvt  0.876 0.429 0.000\nvt  0.608 0.340 0.000\nvt  0.599 0.314 0.000\nvt  0.629 0.336 0.000\nvt  0.691 0.326 0.000\nvt  0.723 0.365 0.000\nvt  0.748 0.426 0.000\nvt  0.755 0.489 0.000\nvt  0.564 0.825 0.000\nvt  0.590 0.868 0.000\nvt  0.558 0.886 0.000\nvt  0.533 0.834 0.000\nvt  0.637 0.789 0.000\nvt  0.673 0.755 0.000\nvt  0.702 0.774 0.000\nvt  0.665 0.817 0.000\nvt  0.740 0.787 0.000\nvt  0.545 0.727 0.000\nvt  0.540 0.686 0.000\nvt  0.551 0.550 0.000\nvt  0.538 0.572 0.000\nvt  0.520 0.546 0.000\nvt  0.522 0.517 0.000\nvt  0.552 0.775 0.000\nvt  0.524 0.777 0.000\nvt  0.521 0.728 0.000\nvt  0.500 0.687 0.000\nvt  0.500 0.651 0.000\nvt  0.515 0.650 0.000\nvt  0.518 0.687 0.000\nvt  0.500 0.727 0.000\nvt  0.625 0.671 0.000\nvt  0.618 0.644 0.000\nvt  0.591 0.533 0.000\nvt  0.571 0.539 0.000\nvt  0.569 0.527 0.000\nvt  0.589 0.518 0.000\nvt  0.545 0.436 0.000\nvt  0.525 0.427 0.000\nvt  0.528 0.413 0.000\nvt  0.549 0.425 0.000\nvt  0.556 0.449 0.000\nvt  0.563 0.439 0.000\nvt  0.514 0.395 0.000\nvt  0.532 0.396 0.000\nvt  0.513 0.409 0.000\nvt  0.566 0.511 0.000\nvt  0.564 0.490 0.000\nvt  0.577 0.478 0.000\nvt  0.584 0.500 0.000\nvt  0.500 0.408 0.000\nvt  0.500 0.394 0.000\nvt  0.571 0.457 0.000\nvt  0.561 0.468 0.000\nvt  0.554 0.561 0.000\nvt  0.557 0.563 0.000\nvt  0.552 0.569 0.000\nvt  0.548 0.569 0.000\nvt  0.627 0.847 0.000\nvt  0.674 0.871 0.000\nvt  0.645 0.898 0.000\nvt  0.776 0.920 0.000\nvt  0.709 0.921 0.000\nvt  0.729 0.888 0.000\nvt  0.783 0.887 0.000\nvt  0.693 0.947 0.000\nvt  0.621 0.920 0.000\nvt  0.535 0.642 0.000\nvt  0.542 0.618 0.000\nvt  0.545 0.599 0.000\nvt  0.559 0.383 0.000\nvt  0.552 0.377 0.000\nvt  0.531 0.470 0.000\nvt  0.520 0.472 0.000\nvt  0.517 0.456 0.000\nvt  0.528 0.457 0.000\nvt  0.530 0.438 0.000\nvt  0.517 0.436 0.000\nvt  0.528 0.383 0.000\nvt  0.513 0.384 0.000\nvt  0.512 0.374 0.000\nvt  0.526 0.374 0.000\nvt  0.512 0.367 0.000\nvt  0.526 0.366 0.000\nvt  0.512 0.362 0.000\nvt  0.526 0.362 0.000\nvt  0.511 0.422 0.000\nvt  0.500 0.384 0.000\nvt  0.500 0.375 0.000\nvt  0.500 0.362 0.000\nvt  0.500 0.367 0.000\nvt  0.511 0.472 0.000\nvt  0.508 0.457 0.000\nvt  0.521 0.491 0.000\nvt  0.512 0.519 0.000\nvt  0.512 0.491 0.000\nvt  0.511 0.550 0.000\nvt  0.520 0.576 0.000\nvt  0.510 0.583 0.000\nvt  0.500 0.457 0.000\nvt  0.500 0.472 0.000\nvt  0.500 0.491 0.000\nvt  0.654 0.584 0.000\nvt  0.656 0.568 0.000\nvt  0.669 0.567 0.000\nvt  0.666 0.589 0.000\nvt  0.705 0.639 0.000\nvt  0.718 0.591 0.000\nvt  0.684 0.563 0.000\nvt  0.680 0.592 0.000\nvt  0.637 0.575 0.000\nvt  0.636 0.566 0.000\nvt  0.645 0.567 0.000\nvt  0.645 0.579 0.000\nvt  0.723 0.546 0.000\nvt  0.697 0.592 0.000\nvt  0.702 0.554 0.000\nvt  0.500 0.163 0.000\nvt  0.500 0.137 0.000\nvt  0.579 0.298 0.000\nvt  0.570 0.317 0.000\nvt  0.554 0.307 0.000\nvt  0.560 0.287 0.000\nvt  0.534 0.318 0.000\nvt  0.517 0.314 0.000\nvt  0.519 0.296 0.000\nvt  0.538 0.300 0.000\nvt  0.562 0.362 0.000\nvt  0.559 0.363 0.000\nvt  0.557 0.362 0.000\nvt  0.559 0.360 0.000\nvt  0.563 0.365 0.000\nvt  0.561 0.368 0.000\nvt  0.543 0.360 0.000\nvt  0.531 0.358 0.000\nvt  0.531 0.351 0.000\nvt  0.611 0.437 0.000\nvt  0.613 0.475 0.000\nvt  0.624 0.497 0.000\nvt  0.580 0.445 0.000\nvt  0.590 0.466 0.000\nvt  0.598 0.418 0.000\nvt  0.648 0.501 0.000\nvt  0.633 0.516 0.000\nvt  0.641 0.554 0.000\nvt  0.630 0.541 0.000\nvt  0.733 0.331 0.000\nvt  0.696 0.288 0.000\nvt  0.706 0.252 0.000\nvt  0.751 0.313 0.000\nvt  0.683 0.535 0.000\nvt  0.674 0.508 0.000\nvt  0.999 0.696 0.000\nvt  0.986 0.778 0.000\nvt  0.950 0.772 0.000\nvt  0.967 0.695 0.000\nvt  0.600 0.811 0.000\nvt  0.552 0.361 0.000\nvt  0.547 0.367 0.000\nvt  0.546 0.364 0.000\nvt  0.525 0.254 0.000\nvt  0.546 0.261 0.000\nvt  0.542 0.280 0.000\nvt  0.522 0.274 0.000\nvt  0.631 0.369 0.000\nvt  0.678 0.460 0.000\nvt  0.662 0.482 0.000\nvt  0.770 0.948 0.000\nvt  0.762 0.981 0.000\nvt  0.676 0.977 0.000\nvt  0.845 0.915 0.000\nvt  0.835 0.891 0.000\nvt  0.569 0.560 0.000\nvt  0.582 0.558 0.000\nvt  0.580 0.563 0.000\nvt  0.569 0.564 0.000\nvt  0.590 0.544 0.000\nvt  0.571 0.548 0.000\nvt  0.635 0.701 0.000\nvt  0.651 0.731 0.000\nvt  0.607 0.593 0.000\nvt  0.609 0.606 0.000\nvt  0.543 0.570 0.000\nvt  0.553 0.556 0.000\nvt  0.552 0.580 0.000\nvt  0.556 0.574 0.000\nvt  0.569 0.554 0.000\nvt  0.585 0.551 0.000\nvt  0.559 0.566 0.000\nvt  0.550 0.458 0.000\nvt  0.532 0.330 0.000\nvt  0.549 0.325 0.000\nvt  0.610 0.364 0.000\nvt  0.589 0.432 0.000\nvt  0.578 0.417 0.000\nvt  0.570 0.357 0.000\nvt  0.565 0.360 0.000\nvt  0.562 0.356 0.000\nvt  0.565 0.351 0.000\nvt  0.557 0.364 0.000\nvt  0.556 0.364 0.000\nvt  0.548 0.371 0.000\nvt  0.557 0.371 0.000\nvt  0.762 0.385 0.000\nvt  0.513 0.445 0.000\nvt  0.508 0.444 0.000\nvt  0.500 0.520 0.000\nvt  0.939 0.378 0.000\nvt  0.932 0.316 0.000\nvt  0.972 0.321 0.000\nvt  0.974 0.384 0.000\nvt  0.605 0.572 0.000\nvt  0.605 0.578 0.000\nvt  0.605 0.584 0.000\nvt  0.559 0.571 0.000\nvt  0.562 0.333 0.000\nvt  0.500 0.552 0.000\nvt  0.500 0.585 0.000\nvt  0.531 0.343 0.000\nvt  0.514 0.338 0.000\nvt  0.516 0.324 0.000\nvt  0.532 0.488 0.000\nvt  0.534 0.448 0.000\nvt  0.540 0.446 0.000\nvt  0.545 0.448 0.000\nvt  0.538 0.455 0.000\nvt  0.541 0.466 0.000\nvt  0.612 0.623 0.000\nvt  0.567 0.366 0.000\nvt  0.513 0.356 0.000\nvt  0.500 0.355 0.000\nvt  0.500 0.346 0.000\nvt  0.514 0.348 0.000\nvt  0.543 0.363 0.000\nvt  0.552 0.364 0.000\nvt  0.531 0.362 0.000\nvt  0.512 0.361 0.000\nvt  0.509 0.433 0.000\nvt  0.500 0.444 0.000\nvt  0.500 0.432 0.000\nvt  0.603 0.551 0.000\nvt  0.599 0.557 0.000\nvt  0.627 0.570 0.000\nvt  0.631 0.571 0.000\nvt  0.625 0.566 0.000\nvt  0.622 0.569 0.000\nvt  0.621 0.567 0.000\nvt  0.529 0.234 0.000\nvt  0.500 0.249 0.000\nvt  0.500 0.227 0.000\nvt  0.550 0.245 0.000\nvt  0.857 0.816 0.000\nvt  0.825 0.804 0.000\nvt  0.851 0.737 0.000\nvt  0.886 0.748 0.000\nvt  0.821 0.866 0.000\nvt  0.798 0.856 0.000\nvt  0.783 0.797 0.000\nvt  0.810 0.729 0.000\nvt  0.755 0.848 0.000\nvt  0.534 0.215 0.000\nvt  0.563 0.233 0.000\nvt  0.548 0.588 0.000\nvt  0.884 0.835 0.000\nvt  0.908 0.854 0.000\nvt  0.919 0.761 0.000\nvt  0.947 0.512 0.000\nvt  0.944 0.446 0.000\nvt  0.974 0.452 0.000\nvt  0.974 0.519 0.000\nvt  0.915 0.504 0.000\nvt  0.887 0.498 0.000\nvt  0.917 0.564 0.000\nvt  0.890 0.556 0.000\nvt  0.999 0.634 0.000\nvt  0.973 0.633 0.000\nvt  0.975 0.577 0.000\nvt  0.999 0.579 0.000\nvt  0.882 0.614 0.000\nvt  0.911 0.622 0.000\nvt  0.901 0.679 0.000\nvt  0.868 0.671 0.000\nvt  0.833 0.667 0.000\nvt  0.708 0.836 0.000\nvt  0.500 0.205 0.000\nvt  0.826 0.364 0.000\nvt  0.801 0.303 0.000\nvt  0.613 0.529 0.000\nvt  0.607 0.544 0.000\nvt  0.541 0.380 0.000\nvt  0.538 0.372 0.000\nvt  0.537 0.366 0.000\nvt  0.537 0.363 0.000\nvt  0.598 0.945 0.000\nvt  0.524 0.902 0.000\nvt  0.599 0.489 0.000\nvt  0.609 0.563 0.000\nvt  0.596 0.563 0.000\nvt  0.612 0.559 0.000\nvt  0.557 0.569 0.000\nvt  0.620 0.571 0.000\nvt  0.616 0.569 0.000\nvt  0.618 0.569 0.000\nvt  0.569 0.568 0.000\nvt  0.561 0.568 0.000\nvt  0.579 0.567 0.000\nvt  0.616 0.564 0.000\nvt  0.613 0.567 0.000\nvt  0.607 0.567 0.000\nvt  0.587 0.568 0.000\nvt  0.606 0.568 0.000\nvt  0.630 0.565 0.000\nvt  0.548 0.389 0.000\nvt  0.601 0.452 0.000\nvt  0.529 0.566 0.000\nvt  0.684 0.686 0.000\nvt  0.872 0.222 0.000\nvt  0.876 0.265 0.000\nvt  0.825 0.258 0.000\nvt  0.821 0.214 0.000\nvt  0.561 0.119 0.000\nvt  0.500 0.114 0.000\nvt  0.771 0.304 0.000\nvt  0.797 0.363 0.000\nvt  0.726 0.227 0.000\nvt  0.777 0.371 0.000\nvt  0.947 0.571 0.000\nvt  0.999 0.388 0.000\nvt  0.999 0.456 0.000\nvt  0.999 0.524 0.000\nvt  0.936 0.877 0.000\nvt  0.856 0.945 0.000\nvt  0.999 0.323 0.000\nvt  0.935 0.689 0.000\nvt  0.776 0.240 0.000\nvt  0.928 0.265 0.000\nvt  0.969 0.264 0.000\nvt  0.999 0.267 0.000\nvt  0.943 0.628 0.000\nvt  0.806 0.622 0.000\nvt  0.851 0.611 0.000\nvt  0.500 0.777 0.000\nvt  0.500 0.839 0.000\nvt  0.692 0.489 0.000\nvt  0.631 0.558 0.000\nvt  0.622 0.562 0.000\nvt  0.626 0.560 0.000\nvt  0.555 0.413 0.000\nvt  0.570 0.429 0.000\nvt  0.539 0.440 0.000\nvt  0.524 0.607 0.000\nvt  0.531 0.591 0.000\nvt  0.500 0.361 0.000\nvt  0.500 0.321 0.000\nvt  0.500 0.312 0.000\nvt  0.500 0.336 0.000\nvt  0.500 0.294 0.000\nvt  0.500 0.273 0.000\nvt  0.622 0.549 0.000\nvt  0.616 0.554 0.000\nvt  0.607 0.509 0.000\nvt  0.701 0.520 0.000\nvt  0.500 0.421 0.000\nvt  0.564 0.403 0.000\nvt  0.511 0.615 0.000\nvt  0.500 0.618 0.000\nvt  0.617 0.568 0.000\nvt  0.636 0.139 0.000\nvt  0.764 0.192 0.000\nvt  0.921 0.220 0.000\nvt  0.967 0.219 0.000\nvt  0.708 0.168 0.000\nvt  0.999 0.218 0.000\nvt  0.803 0.523 0.000\nvt  0.794 0.535 0.000\nvt  0.783 0.527 0.000\nvt  0.791 0.508 0.000\nvt  0.789 0.571 0.000\nvt  0.797 0.562 0.000\nvt  0.813 0.591 0.000\nvt  0.815 0.578 0.000\nvt  0.839 0.583 0.000\nvt  0.835 0.574 0.000\nvt  0.850 0.569 0.000\nvt  0.845 0.560 0.000\nvt  0.855 0.539 0.000\nvt  0.847 0.535 0.000\nvt  0.850 0.501 0.000\nvt  0.841 0.502 0.000\nvt  0.814 0.438 0.000\nvt  0.836 0.464 0.000\nvt  0.828 0.472 0.000\nvt  0.809 0.452 0.000\nvt  0.792 0.427 0.000\nvt  0.790 0.441 0.000\nvt  0.818 0.567 0.000\nvt  0.807 0.550 0.000\nvt  0.831 0.561 0.000\nvt  0.839 0.553 0.000\nvt  0.837 0.534 0.000\nvt  0.831 0.505 0.000\nvt  0.820 0.479 0.000\nvt  0.804 0.465 0.000\nvt  0.786 0.460 0.000\nvt  0.773 0.456 0.000\nvt  0.779 0.433 0.000\nvt  0.797 0.489 0.000\nvt  0.785 0.495 0.000\nvt  0.789 0.486 0.000\nvt  0.772 0.537 0.000\nvt  0.781 0.583 0.000\nvt  0.812 0.602 0.000\nvt  0.848 0.587 0.000\nvt  0.862 0.546 0.000\nvt  0.859 0.500 0.000\nvt  0.820 0.412 0.000\nvt  0.843 0.450 0.000\nvt  0.791 0.404 0.000\nvt  0.773 0.417 0.000\nvt  0.764 0.447 0.000\nvt  0.801 0.477 0.000\nvt  0.813 0.487 0.000\nvt  0.806 0.496 0.000\nvt  0.787 0.478 0.000\nvt  0.778 0.489 0.000\nvt  0.822 0.538 0.000\nvt  0.822 0.510 0.000\nvt  0.767 0.492 0.000\nvt  0.870 0.496 0.000\nvt  0.851 0.425 0.000\nvt  0.872 0.552 0.000\nvt  0.500 0.183 0.000\nvt  0.516 0.930 0.000\nvt  0.500 0.928 0.000\nvt  0.528 0.934 0.000\nvt  0.537 0.938 0.000\nvt  0.516 0.970 0.000\nvt  0.520 0.955 0.000\nvt  0.530 0.952 0.000\nvt  0.522 0.944 0.000\nvt  0.512 0.942 0.000\nvt  0.615 0.572 0.000\nvt  0.612 0.569 0.000\nvt  0.576 0.968 0.000\nvt  0.573 0.973 0.000\nvt  0.562 0.969 0.000\nvt  0.563 0.961 0.000\nvt  0.571 0.956 0.000\nvt  0.582 0.961 0.000\nvt  0.611 0.961 0.000\nvt  0.606 0.967 0.000\nvt  0.595 0.960 0.000\nvt  0.601 0.955 0.000\nvt  0.570 0.569 0.000\nvt  0.595 0.566 0.000\nvt  0.616 0.967 0.000\nvt  0.617 0.975 0.000\nvt  0.607 0.978 0.000\nvt  0.614 0.982 0.000\nvt  0.605 0.991 0.000\nvt  0.599 0.986 0.000\nvt  0.593 0.996 0.000\nvt  0.589 0.989 0.000\nvt  0.562 0.570 0.000\nvt  0.573 0.994 0.000\nvt  0.579 0.987 0.000\nvt  0.584 0.996 0.000\nvt  0.581 0.953 0.000\nvt  0.592 0.953 0.000\nvt  0.561 0.988 0.000\nvt  0.572 0.981 0.000\nvt  0.563 0.978 0.000\nvt  0.500 0.970 0.000\nvt  0.500 0.943 0.000\nvt  0.511 0.956 0.000\nvt  0.500 0.956 0.000\nvt  0.868 0.132 0.000\nvt  0.867 0.090 0.000\nvt  0.916 0.092 0.000\nvt  0.918 0.133 0.000\nvt  0.554 0.066 0.000\nvt  0.612 0.070 0.000\nvt  0.619 0.103 0.000\nvt  0.558 0.095 0.000\nvt  0.815 0.169 0.000\nvt  0.758 0.148 0.000\nvt  0.747 0.102 0.000\nvt  0.814 0.126 0.000\nvt  0.770 0.072 0.000\nvt  0.817 0.087 0.000\nvt  0.552 0.038 0.000\nvt  0.551 0.020 0.000\nvt  0.602 0.021 0.000\nvt  0.605 0.039 0.000\nvt  0.821 0.050 0.000\nvt  0.867 0.055 0.000\nvt  0.712 0.053 0.000\nvt  0.700 0.022 0.000\nvt  0.739 0.023 0.000\nvt  0.740 0.052 0.000\nvt  0.652 0.022 0.000\nvt  0.659 0.043 0.000\nvt  0.913 0.055 0.000\nvt  0.959 0.055 0.000\nvt  0.960 0.091 0.000\nvt  0.999 0.089 0.000\nvt  0.999 0.131 0.000\nvt  0.962 0.133 0.000\nvt  0.999 0.053 0.000\nvt  0.778 0.038 0.000\nvt  0.917 0.177 0.000\nvt  0.965 0.178 0.000\nvt  0.674 0.083 0.000\nvt  0.685 0.124 0.000\nvt  0.999 0.175 0.000\nvt  0.500 0.037 0.000\nvt  0.500 0.066 0.000\nvt  0.871 0.175 0.000\nvt  0.500 0.019 0.000\nvt  0.500 0.092 0.000\nvt  0.999 0.002 0.000\nvt  0.958 0.002 0.000\nvt  0.867 0.002 0.000\nvt  0.823 0.002 0.000\nvt  0.908 0.002 0.000\nvt  0.601 0.002 0.000\nvt  0.550 0.002 0.000\nvt  0.697 0.002 0.000\nvt  0.650 0.002 0.000\nvt  0.782 0.002 0.000\nvt  0.740 0.002 0.000\nvt  0.500 0.002 0.000\nvt  0.468 0.923 0.000\nvt  0.459 0.929 0.000\nvt  0.458 0.923 0.000\nvt  0.465 0.917 0.000\nvt  0.479 0.984 0.000\nvt  0.495 0.998 0.000\nvt  0.479 0.996 0.000\nvt  0.496 0.917 0.000\nvt  0.485 0.918 0.000\nvt  0.484 0.910 0.000\nvt  0.493 0.910 0.000\nvt  0.477 0.921 0.000\nvt  0.475 0.913 0.000\nvt  0.451 0.958 0.000\nvt  0.450 0.946 0.000\nvt  0.456 0.942 0.000\nvt  0.462 0.954 0.000\nvt  0.455 0.935 0.000\nvt  0.450 0.932 0.000\nvt  0.467 0.967 0.000\nvt  0.453 0.974 0.000\nvt  0.467 0.994 0.000\nvt  0.458 0.987 0.000\nvt  0.384 0.254 0.000\nvt  0.381 0.292 0.000\nvt  0.342 0.307 0.000\nvt  0.347 0.261 0.000\nvt  0.364 0.438 0.000\nvt  0.353 0.414 0.000\nvt  0.373 0.396 0.000\nvt  0.380 0.419 0.000\nvt  0.114 0.312 0.000\nvt  0.156 0.308 0.000\nvt  0.140 0.369 0.000\nvt  0.103 0.370 0.000\nvt  0.260 0.593 0.000\nvt  0.232 0.598 0.000\nvt  0.241 0.541 0.000\nvt  0.259 0.542 0.000\nvt  0.356 0.213 0.000\nvt  0.356 0.174 0.000\nvt  0.434 0.146 0.000\nvt  0.439 0.175 0.000\nvt  0.420 0.254 0.000\nvt  0.435 0.256 0.000\nvt  0.435 0.268 0.000\nvt  0.415 0.277 0.000\nvt  0.456 0.195 0.000\nvt  0.410 0.217 0.000\nvt  0.229 0.721 0.000\nvt  0.206 0.663 0.000\nvt  0.242 0.653 0.000\nvt  0.264 0.712 0.000\nvt  0.331 0.622 0.000\nvt  0.348 0.651 0.000\nvt  0.335 0.669 0.000\nvt  0.315 0.632 0.000\nvt  0.377 0.588 0.000\nvt  0.373 0.599 0.000\nvt  0.361 0.590 0.000\nvt  0.368 0.582 0.000\nvt  0.359 0.632 0.000\nvt  0.343 0.612 0.000\nvt  0.381 0.580 0.000\nvt  0.373 0.576 0.000\nvt  0.377 0.573 0.000\nvt  0.383 0.575 0.000\nvt  0.292 0.702 0.000\nvt  0.271 0.646 0.000\nvt  0.353 0.601 0.000\nvt  0.367 0.614 0.000\nvt  0.396 0.718 0.000\nvt  0.404 0.682 0.000\nvt  0.433 0.686 0.000\nvt  0.426 0.725 0.000\nvt  0.410 0.649 0.000\nvt  0.438 0.648 0.000\nvt  0.416 0.769 0.000\nvt  0.382 0.756 0.000\nvt  0.414 0.587 0.000\nvt  0.414 0.580 0.000\nvt  0.432 0.579 0.000\nvt  0.434 0.586 0.000\nvt  0.431 0.574 0.000\nvt  0.414 0.573 0.000\nvt  0.413 0.627 0.000\nvt  0.438 0.627 0.000\nvt  0.413 0.610 0.000\nvt  0.413 0.596 0.000\nvt  0.435 0.595 0.000\nvt  0.437 0.608 0.000\nvt  0.479 0.441 0.000\nvt  0.483 0.445 0.000\nvt  0.480 0.450 0.000\nvt  0.474 0.450 0.000\nvt  0.280 0.504 0.000\nvt  0.262 0.494 0.000\nvt  0.273 0.446 0.000\nvt  0.291 0.467 0.000\nvt  0.344 0.383 0.000\nvt  0.327 0.403 0.000\nvt  0.316 0.368 0.000\nvt  0.340 0.348 0.000\nvt  0.428 0.371 0.000\nvt  0.419 0.374 0.000\nvt  0.419 0.364 0.000\nvt  0.427 0.365 0.000\nvt  0.307 0.431 0.000\nvt  0.292 0.400 0.000\nvt  0.391 0.383 0.000\nvt  0.396 0.401 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.366 0.000\nvt  0.441 0.365 0.000\nvt  0.448 0.367 0.000\nvt  0.448 0.364 0.000\nvt  0.432 0.377 0.000\nvt  0.434 0.370 0.000\nvt  0.439 0.374 0.000\nvt  0.406 0.377 0.000\nvt  0.406 0.363 0.000\nvt  0.347 0.551 0.000\nvt  0.334 0.545 0.000\nvt  0.342 0.523 0.000\nvt  0.356 0.534 0.000\nvt  0.363 0.480 0.000\nvt  0.351 0.459 0.000\nvt  0.375 0.458 0.000\nvt  0.338 0.434 0.000\nvt  0.443 0.345 0.000\nvt  0.454 0.337 0.000\nvt  0.457 0.349 0.000\nvt  0.447 0.353 0.000\nvt  0.414 0.403 0.000\nvt  0.409 0.389 0.000\nvt  0.421 0.382 0.000\nvt  0.427 0.392 0.000\nvt  0.428 0.343 0.000\nvt  0.422 0.353 0.000\nvt  0.410 0.347 0.000\nvt  0.416 0.331 0.000\nvt  0.457 0.355 0.000\nvt  0.447 0.358 0.000\nvt  0.447 0.499 0.000\nvt  0.447 0.477 0.000\nvt  0.458 0.484 0.000\nvt  0.459 0.507 0.000\nvt  0.461 0.532 0.000\nvt  0.469 0.513 0.000\nvt  0.471 0.541 0.000\nvt  0.449 0.538 0.000\nvt  0.448 0.521 0.000\nvt  0.462 0.552 0.000\nvt  0.124 0.429 0.000\nvt  0.092 0.437 0.000\nvt  0.392 0.340 0.000\nvt  0.371 0.336 0.000\nvt  0.401 0.314 0.000\nvt  0.309 0.326 0.000\nvt  0.252 0.426 0.000\nvt  0.277 0.365 0.000\nvt  0.245 0.489 0.000\nvt  0.436 0.825 0.000\nvt  0.467 0.834 0.000\nvt  0.442 0.886 0.000\nvt  0.410 0.868 0.000\nvt  0.363 0.789 0.000\nvt  0.335 0.817 0.000\nvt  0.298 0.774 0.000\nvt  0.327 0.755 0.000\nvt  0.260 0.787 0.000\nvt  0.460 0.686 0.000\nvt  0.455 0.727 0.000\nvt  0.462 0.572 0.000\nvt  0.449 0.550 0.000\nvt  0.480 0.546 0.000\nvt  0.478 0.517 0.000\nvt  0.479 0.728 0.000\nvt  0.476 0.777 0.000\nvt  0.448 0.775 0.000\nvt  0.482 0.687 0.000\nvt  0.485 0.650 0.000\nvt  0.375 0.671 0.000\nvt  0.382 0.644 0.000\nvt  0.409 0.533 0.000\nvt  0.411 0.518 0.000\nvt  0.431 0.527 0.000\nvt  0.429 0.539 0.000\nvt  0.455 0.436 0.000\nvt  0.451 0.425 0.000\nvt  0.472 0.413 0.000\nvt  0.475 0.427 0.000\nvt  0.444 0.449 0.000\nvt  0.437 0.439 0.000\nvt  0.486 0.395 0.000\nvt  0.487 0.409 0.000\nvt  0.468 0.396 0.000\nvt  0.434 0.511 0.000\nvt  0.416 0.500 0.000\nvt  0.423 0.478 0.000\nvt  0.436 0.490 0.000\nvt  0.429 0.457 0.000\nvt  0.439 0.468 0.000\nvt  0.446 0.561 0.000\nvt  0.452 0.569 0.000\nvt  0.448 0.569 0.000\nvt  0.443 0.563 0.000\nvt  0.373 0.847 0.000\nvt  0.355 0.898 0.000\nvt  0.326 0.871 0.000\nvt  0.224 0.920 0.000\nvt  0.217 0.887 0.000\nvt  0.271 0.888 0.000\nvt  0.291 0.921 0.000\nvt  0.379 0.920 0.000\nvt  0.307 0.947 0.000\nvt  0.465 0.642 0.000\nvt  0.455 0.599 0.000\nvt  0.458 0.618 0.000\nvt  0.448 0.377 0.000\nvt  0.441 0.383 0.000\nvt  0.469 0.470 0.000\nvt  0.472 0.457 0.000\nvt  0.483 0.456 0.000\nvt  0.480 0.472 0.000\nvt  0.470 0.438 0.000\nvt  0.483 0.436 0.000\nvt  0.472 0.383 0.000\nvt  0.474 0.374 0.000\nvt  0.488 0.374 0.000\nvt  0.487 0.384 0.000\nvt  0.474 0.366 0.000\nvt  0.488 0.367 0.000\nvt  0.474 0.362 0.000\nvt  0.488 0.362 0.000\nvt  0.489 0.422 0.000\nvt  0.492 0.457 0.000\nvt  0.489 0.472 0.000\nvt  0.479 0.491 0.000\nvt  0.488 0.491 0.000\nvt  0.488 0.519 0.000\nvt  0.489 0.550 0.000\nvt  0.490 0.583 0.000\nvt  0.480 0.576 0.000\nvt  0.346 0.584 0.000\nvt  0.334 0.589 0.000\nvt  0.331 0.567 0.000\nvt  0.344 0.568 0.000\nvt  0.295 0.639 0.000\nvt  0.282 0.591 0.000\nvt  0.320 0.592 0.000\nvt  0.316 0.563 0.000\nvt  0.363 0.575 0.000\nvt  0.355 0.579 0.000\nvt  0.355 0.567 0.000\nvt  0.364 0.566 0.000\nvt  0.277 0.546 0.000\nvt  0.298 0.554 0.000\nvt  0.303 0.592 0.000\nvt  0.421 0.298 0.000\nvt  0.440 0.287 0.000\nvt  0.446 0.307 0.000\nvt  0.430 0.317 0.000\nvt  0.466 0.318 0.000\nvt  0.462 0.300 0.000\nvt  0.481 0.296 0.000\nvt  0.483 0.314 0.000\nvt  0.438 0.362 0.000\nvt  0.441 0.360 0.000\nvt  0.443 0.362 0.000\nvt  0.441 0.363 0.000\nvt  0.439 0.368 0.000\nvt  0.437 0.365 0.000\nvt  0.469 0.351 0.000\nvt  0.469 0.358 0.000\nvt  0.457 0.360 0.000\nvt  0.389 0.437 0.000\nvt  0.387 0.475 0.000\nvt  0.376 0.497 0.000\nvt  0.420 0.445 0.000\nvt  0.410 0.466 0.000\nvt  0.402 0.418 0.000\nvt  0.352 0.501 0.000\nvt  0.367 0.516 0.000\nvt  0.359 0.554 0.000\nvt  0.370 0.541 0.000\nvt  0.267 0.331 0.000\nvt  0.249 0.313 0.000\nvt  0.294 0.252 0.000\nvt  0.304 0.288 0.000\nvt  0.317 0.535 0.000\nvt  0.326 0.508 0.000\nvt  0.001 0.696 0.000\nvt  0.033 0.695 0.000\nvt  0.050 0.772 0.000\nvt  0.014 0.778 0.000\nvt  0.400 0.811 0.000\nvt  0.448 0.361 0.000\nvt  0.454 0.364 0.000\nvt  0.453 0.367 0.000\nvt  0.475 0.254 0.000\nvt  0.478 0.274 0.000\nvt  0.458 0.280 0.000\nvt  0.454 0.261 0.000\nvt  0.369 0.369 0.000\nvt  0.322 0.460 0.000\nvt  0.338 0.482 0.000\nvt  0.324 0.977 0.000\nvt  0.238 0.981 0.000\nvt  0.230 0.948 0.000\nvt  0.155 0.915 0.000\nvt  0.165 0.891 0.000\nvt  0.431 0.560 0.000\nvt  0.431 0.564 0.000\nvt  0.420 0.563 0.000\nvt  0.418 0.558 0.000\nvt  0.410 0.544 0.000\nvt  0.429 0.548 0.000\nvt  0.349 0.731 0.000\nvt  0.365 0.701 0.000\nvt  0.391 0.606 0.000\nvt  0.393 0.593 0.000\nvt  0.457 0.570 0.000\nvt  0.447 0.556 0.000\nvt  0.444 0.574 0.000\nvt  0.448 0.580 0.000\nvt  0.415 0.551 0.000\nvt  0.431 0.554 0.000\nvt  0.441 0.566 0.000\nvt  0.450 0.458 0.000\nvt  0.451 0.325 0.000\nvt  0.468 0.330 0.000\nvt  0.390 0.364 0.000\nvt  0.411 0.432 0.000\nvt  0.422 0.417 0.000\nvt  0.430 0.357 0.000\nvt  0.435 0.351 0.000\nvt  0.438 0.356 0.000\nvt  0.435 0.360 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.371 0.000\nvt  0.452 0.371 0.000\nvt  0.238 0.385 0.000\nvt  0.487 0.445 0.000\nvt  0.492 0.444 0.000\nvt  0.061 0.378 0.000\nvt  0.026 0.384 0.000\nvt  0.028 0.321 0.000\nvt  0.068 0.316 0.000\nvt  0.395 0.572 0.000\nvt  0.395 0.578 0.000\nvt  0.395 0.584 0.000\nvt  0.441 0.571 0.000\nvt  0.438 0.333 0.000\nvt  0.469 0.343 0.000\nvt  0.486 0.338 0.000\nvt  0.484 0.324 0.000\nvt  0.468 0.488 0.000\nvt  0.466 0.448 0.000\nvt  0.462 0.455 0.000\nvt  0.455 0.448 0.000\nvt  0.460 0.446 0.000\nvt  0.459 0.466 0.000\nvt  0.388 0.623 0.000\nvt  0.433 0.366 0.000\nvt  0.487 0.356 0.000\nvt  0.486 0.348 0.000\nvt  0.457 0.363 0.000\nvt  0.448 0.364 0.000\nvt  0.469 0.362 0.000\nvt  0.488 0.361 0.000\nvt  0.491 0.433 0.000\nvt  0.401 0.557 0.000\nvt  0.397 0.551 0.000\nvt  0.373 0.570 0.000\nvt  0.369 0.571 0.000\nvt  0.375 0.566 0.000\nvt  0.379 0.567 0.000\nvt  0.378 0.569 0.000\nvt  0.471 0.234 0.000\nvt  0.450 0.245 0.000\nvt  0.143 0.816 0.000\nvt  0.114 0.748 0.000\nvt  0.149 0.737 0.000\nvt  0.175 0.804 0.000\nvt  0.202 0.856 0.000\nvt  0.179 0.866 0.000\nvt  0.190 0.729 0.000\nvt  0.217 0.797 0.000\nvt  0.245 0.848 0.000\nvt  0.466 0.215 0.000\nvt  0.437 0.233 0.000\nvt  0.452 0.588 0.000\nvt  0.092 0.854 0.000\nvt  0.116 0.835 0.000\nvt  0.081 0.761 0.000\nvt  0.053 0.512 0.000\nvt  0.026 0.519 0.000\nvt  0.026 0.452 0.000\nvt  0.056 0.446 0.000\nvt  0.113 0.498 0.000\nvt  0.085 0.504 0.000\nvt  0.110 0.556 0.000\nvt  0.083 0.564 0.000\nvt  0.001 0.634 0.000\nvt  0.001 0.579 0.000\nvt  0.025 0.577 0.000\nvt  0.027 0.633 0.000\nvt  0.118 0.614 0.000\nvt  0.132 0.671 0.000\nvt  0.099 0.679 0.000\nvt  0.089 0.622 0.000\nvt  0.167 0.667 0.000\nvt  0.292 0.836 0.000\nvt  0.199 0.303 0.000\nvt  0.174 0.364 0.000\nvt  0.393 0.544 0.000\nvt  0.387 0.529 0.000\nvt  0.459 0.380 0.000\nvt  0.462 0.372 0.000\nvt  0.463 0.366 0.000\nvt  0.463 0.363 0.000\nvt  0.402 0.945 0.000\nvt  0.476 0.902 0.000\nvt  0.401 0.489 0.000\nvt  0.391 0.563 0.000\nvt  0.388 0.559 0.000\nvt  0.404 0.563 0.000\nvt  0.443 0.569 0.000\nvt  0.380 0.571 0.000\nvt  0.382 0.569 0.000\nvt  0.384 0.569 0.000\nvt  0.439 0.568 0.000\nvt  0.431 0.568 0.000\nvt  0.421 0.567 0.000\nvt  0.393 0.567 0.000\nvt  0.387 0.567 0.000\nvt  0.384 0.564 0.000\nvt  0.394 0.568 0.000\nvt  0.413 0.568 0.000\nvt  0.370 0.565 0.000\nvt  0.452 0.389 0.000\nvt  0.399 0.452 0.000\nvt  0.471 0.566 0.000\nvt  0.316 0.686 0.000\nvt  0.128 0.222 0.000\nvt  0.179 0.214 0.000\nvt  0.175 0.258 0.000\nvt  0.124 0.265 0.000\nvt  0.439 0.119 0.000\nvt  0.229 0.304 0.000\nvt  0.203 0.363 0.000\nvt  0.274 0.227 0.000\nvt  0.223 0.371 0.000\nvt  0.053 0.571 0.000\nvt  0.001 0.388 0.000\nvt  0.001 0.456 0.000\nvt  0.001 0.524 0.000\nvt  0.064 0.877 0.000\nvt  0.144 0.945 0.000\nvt  0.001 0.323 0.000\nvt  0.065 0.689 0.000\nvt  0.224 0.240 0.000\nvt  0.072 0.265 0.000\nvt  0.001 0.267 0.000\nvt  0.031 0.264 0.000\nvt  0.057 0.628 0.000\nvt  0.194 0.622 0.000\nvt  0.149 0.611 0.000\nvt  0.308 0.489 0.000\nvt  0.369 0.558 0.000\nvt  0.374 0.560 0.000\nvt  0.378 0.562 0.000\nvt  0.445 0.413 0.000\nvt  0.430 0.429 0.000\nvt  0.461 0.440 0.000\nvt  0.476 0.607 0.000\nvt  0.469 0.591 0.000\nvt  0.378 0.549 0.000\nvt  0.384 0.554 0.000\nvt  0.393 0.509 0.000\nvt  0.299 0.520 0.000\nvt  0.436 0.403 0.000\nvt  0.489 0.615 0.000\nvt  0.383 0.568 0.000\nvt  0.364 0.139 0.000\nvt  0.236 0.192 0.000\nvt  0.033 0.219 0.000\nvt  0.079 0.220 0.000\nvt  0.292 0.168 0.000\nvt  0.001 0.218 0.000\nvt  0.197 0.523 0.000\nvt  0.209 0.508 0.000\nvt  0.217 0.527 0.000\nvt  0.206 0.535 0.000\nvt  0.211 0.571 0.000\nvt  0.203 0.562 0.000\nvt  0.187 0.591 0.000\nvt  0.185 0.578 0.000\nvt  0.161 0.583 0.000\nvt  0.165 0.574 0.000\nvt  0.150 0.569 0.000\nvt  0.155 0.560 0.000\nvt  0.145 0.539 0.000\nvt  0.153 0.535 0.000\nvt  0.150 0.501 0.000\nvt  0.159 0.502 0.000\nvt  0.186 0.438 0.000\nvt  0.191 0.452 0.000\nvt  0.172 0.472 0.000\nvt  0.164 0.464 0.000\nvt  0.208 0.427 0.000\nvt  0.210 0.441 0.000\nvt  0.182 0.567 0.000\nvt  0.193 0.550 0.000\nvt  0.169 0.561 0.000\nvt  0.161 0.553 0.000\nvt  0.163 0.534 0.000\nvt  0.169 0.505 0.000\nvt  0.196 0.465 0.000\nvt  0.180 0.479 0.000\nvt  0.214 0.460 0.000\nvt  0.227 0.456 0.000\nvt  0.221 0.433 0.000\nvt  0.203 0.489 0.000\nvt  0.211 0.486 0.000\nvt  0.215 0.495 0.000\nvt  0.228 0.537 0.000\nvt  0.219 0.583 0.000\nvt  0.188 0.602 0.000\nvt  0.152 0.587 0.000\nvt  0.138 0.546 0.000\nvt  0.141 0.500 0.000\nvt  0.157 0.450 0.000\nvt  0.180 0.412 0.000\nvt  0.209 0.404 0.000\nvt  0.227 0.417 0.000\nvt  0.236 0.447 0.000\nvt  0.194 0.496 0.000\nvt  0.187 0.487 0.000\nvt  0.199 0.477 0.000\nvt  0.213 0.478 0.000\nvt  0.222 0.489 0.000\nvt  0.178 0.538 0.000\nvt  0.178 0.510 0.000\nvt  0.233 0.492 0.000\nvt  0.130 0.496 0.000\nvt  0.149 0.425 0.000\nvt  0.128 0.552 0.000\nvt  0.484 0.930 0.000\nvt  0.472 0.934 0.000\nvt  0.463 0.938 0.000\nvt  0.470 0.952 0.000\nvt  0.480 0.955 0.000\nvt  0.484 0.970 0.000\nvt  0.488 0.942 0.000\nvt  0.478 0.944 0.000\nvt  0.388 0.569 0.000\nvt  0.385 0.572 0.000\nvt  0.424 0.968 0.000\nvt  0.437 0.961 0.000\nvt  0.438 0.969 0.000\nvt  0.427 0.973 0.000\nvt  0.418 0.961 0.000\nvt  0.429 0.956 0.000\nvt  0.389 0.961 0.000\nvt  0.399 0.955 0.000\nvt  0.405 0.960 0.000\nvt  0.394 0.967 0.000\nvt  0.429 0.569 0.000\nvt  0.405 0.566 0.000\nvt  0.393 0.978 0.000\nvt  0.383 0.975 0.000\nvt  0.384 0.967 0.000\nvt  0.401 0.986 0.000\nvt  0.395 0.991 0.000\nvt  0.386 0.982 0.000\nvt  0.411 0.989 0.000\nvt  0.407 0.996 0.000\nvt  0.438 0.570 0.000\nvt  0.427 0.994 0.000\nvt  0.416 0.996 0.000\nvt  0.421 0.987 0.000\nvt  0.419 0.953 0.000\nvt  0.408 0.953 0.000\nvt  0.439 0.988 0.000\nvt  0.428 0.981 0.000\nvt  0.437 0.978 0.000\nvt  0.489 0.956 0.000\nvt  0.132 0.132 0.000\nvt  0.082 0.133 0.000\nvt  0.084 0.092 0.000\nvt  0.133 0.090 0.000\nvt  0.446 0.066 0.000\nvt  0.442 0.095 0.000\nvt  0.381 0.103 0.000\nvt  0.388 0.070 0.000\nvt  0.185 0.169 0.000\nvt  0.186 0.126 0.000\nvt  0.253 0.102 0.000\nvt  0.242 0.148 0.000\nvt  0.230 0.072 0.000\nvt  0.183 0.087 0.000\nvt  0.448 0.038 0.000\nvt  0.395 0.039 0.000\nvt  0.398 0.021 0.000\nvt  0.449 0.020 0.000\nvt  0.133 0.055 0.000\nvt  0.179 0.050 0.000\nvt  0.288 0.053 0.000\nvt  0.260 0.052 0.000\nvt  0.261 0.023 0.000\nvt  0.300 0.022 0.000\nvt  0.341 0.043 0.000\nvt  0.348 0.022 0.000\nvt  0.087 0.055 0.000\nvt  0.040 0.091 0.000\nvt  0.041 0.055 0.000\nvt  0.038 0.133 0.000\nvt  0.001 0.131 0.000\nvt  0.001 0.089 0.000\nvt  0.001 0.053 0.000\nvt  0.222 0.038 0.000\nvt  0.083 0.177 0.000\nvt  0.035 0.178 0.000\nvt  0.326 0.083 0.000\nvt  0.315 0.124 0.000\nvt  0.001 0.175 0.000\nvt  0.129 0.175 0.000\nvt  0.001 0.002 0.000\nvt  0.042 0.002 0.000\nvt  0.133 0.002 0.000\nvt  0.177 0.002 0.000\nvt  0.092 0.002 0.000\nvt  0.399 0.002 0.000\nvt  0.450 0.002 0.000\nvt  0.303 0.002 0.000\nvt  0.350 0.002 0.000\nvt  0.218 0.002 0.000\nvt  0.260 0.002 0.000\nvt  0.558 0.967 0.000\nvt  0.557 0.976 0.000\nvt  0.500 0.997 0.000\nvt  0.588 0.975 0.000\nvt  0.442 0.967 0.000\nvt  0.443 0.976 0.000\nvt  0.412 0.975 0.000\n# 1339 texture vertices\n\nvn  0.001 0.482 -0.876\nvn  -0.001 0.661 0.751\nvn  0.136 0.595 0.792\nvn  -0.203 0.679 0.706\nvn  -0.092 0.474 0.876\nvn  -0.184 0.792 0.581\nvn  -0.098 0.863 0.495\nvn  -0.449 0.820 0.356\nvn  -0.220 0.748 0.626\nvn  -0.560 0.798 -0.222\nvn  -0.233 0.531 -0.815\nvn  0.001 0.534 -0.845\nvn  -0.135 0.596 0.791\nvn  0.203 0.676 0.708\nvn  0.091 0.476 0.875\nvn  0.189 0.792 0.581\nvn  0.099 0.862 0.496\nvn  0.444 0.821 0.360\nvn  0.221 0.747 0.627\nvn  0.556 0.801 -0.221\nvn  0.228 0.532 -0.815\nvn  -0.002 0.536 -0.844\nvn  -0.574 0.744 -0.343\nvn  -0.485 0.523 -0.701\nvn  -0.121 0.869 -0.480\nvn  -0.215 0.930 -0.298\nvn  -0.000 -0.806 -0.591\nvn  -0.277 -0.779 -0.562\nvn  -0.258 -0.731 -0.632\nvn  -0.046 -0.809 -0.586\nvn  -0.210 0.565 -0.798\nvn  -0.094 0.624 -0.775\nvn  0.015 0.952 -0.307\nvn  0.045 0.919 -0.392\nvn  -0.099 0.857 -0.505\nvn  -0.379 0.493 -0.783\nvn  -0.947 0.285 -0.149\nvn  -0.809 -0.421 -0.411\nvn  -0.895 -0.443 -0.043\nvn  -0.999 -0.020 0.035\nvn  -0.359 0.933 -0.019\nvn  -0.809 0.586 0.047\nvn  -0.667 -0.516 -0.538\nvn  -0.726 -0.626 -0.285\nvn  -0.001 0.671 -0.741\nvn  -0.001 0.945 -0.327\nvn  -0.531 -0.632 -0.565\nvn  -0.618 -0.566 -0.546\nvn  0.800 -0.473 0.369\nvn  0.618 -0.771 0.151\nvn  0.693 -0.711 0.116\nvn  0.818 -0.467 0.335\nvn  0.849 -0.259 0.460\nvn  0.775 -0.130 0.619\nvn  0.667 -0.132 0.733\nvn  0.775 -0.270 0.571\nvn  0.958 -0.057 -0.280\nvn  0.763 0.033 -0.646\nvn  0.763 -0.153 -0.628\nvn  0.911 -0.129 -0.391\nvn  0.990 0.067 0.126\nvn  0.979 0.090 0.185\nvn  0.981 0.057 0.184\nvn  0.996 0.020 0.090\nvn  0.770 -0.392 0.504\nvn  0.657 -0.721 0.219\nvn  0.478 -0.656 0.584\nvn  0.599 -0.389 0.700\nvn  0.498 -0.846 0.192\nvn  0.537 -0.840 0.082\nvn  0.740 -0.557 0.378\nvn  0.668 -0.570 0.479\nvn  0.280 -0.914 0.294\nvn  0.421 -0.898 0.126\nvn  0.991 0.084 0.103\nvn  0.964 0.223 0.143\nvn  0.960 0.189 0.207\nvn  0.979 0.103 0.175\nvn  0.868 0.172 0.465\nvn  0.907 0.085 0.413\nvn  0.938 0.144 0.316\nvn  0.897 0.178 0.405\nvn  0.662 -0.174 0.729\nvn  0.583 -0.417 0.697\nvn  0.627 -0.449 0.637\nvn  0.685 -0.405 0.605\nvn  0.827 0.091 0.555\nvn  0.890 0.018 0.455\nvn  0.663 -0.395 0.636\nvn  0.606 -0.428 0.671\nvn  0.313 -0.735 0.602\nvn  -0.136 -0.864 0.485\nvn  0.951 0.158 0.267\nvn  0.964 0.113 0.241\nvn  0.731 -0.036 0.681\nvn  0.819 -0.134 0.558\nvn  0.546 0.270 0.793\nvn  0.602 0.237 0.763\nvn  0.444 0.233 0.865\nvn  0.353 0.173 0.920\nvn  0.240 -0.093 0.966\nvn  0.498 0.051 0.866\nvn  0.675 0.338 0.656\nvn  0.480 0.400 0.780\nvn  0.064 -0.572 0.818\nvn  0.126 -0.313 0.941\nvn  0.207 -0.613 0.763\nvn  0.221 -0.810 0.544\nvn  0.598 -0.694 -0.401\nvn  0.124 -0.977 -0.175\nvn  0.218 -0.333 0.917\nvn  0.377 -0.161 0.912\nvn  0.142 -0.210 0.967\nvn  0.256 -0.155 0.954\nvn  0.111 -0.351 0.930\nvn  0.107 -0.480 0.871\nvn  0.675 -0.732 -0.096\nvn  0.496 -0.844 0.206\nvn  -0.016 -0.986 0.167\nvn  0.304 -0.948 0.097\nvn  0.982 -0.082 0.171\nvn  0.963 -0.002 0.269\nvn  0.967 -0.134 0.216\nvn  0.969 -0.177 0.175\nvn  0.916 -0.244 0.319\nvn  0.853 -0.341 0.394\nvn  0.837 -0.365 0.407\nvn  0.886 -0.281 0.368\nvn  0.422 -0.292 0.858\nvn  0.039 -0.571 0.820\nvn  -0.011 -0.399 0.917\nvn  0.333 -0.349 0.876\nvn  0.935 -0.237 0.263\nvn  0.949 -0.159 0.273\nvn  0.697 -0.213 0.685\nvn  0.568 -0.123 0.814\nvn  -0.938 0.322 0.130\nvn  -0.609 -0.738 -0.291\nvn  -0.447 -0.857 -0.258\nvn  0.259 -0.528 0.809\nvn  0.137 -0.704 0.697\nvn  -0.107 -0.741 0.663\nvn  0.647 -0.296 0.703\nvn  0.603 -0.168 0.780\nvn  0.836 0.072 0.545\nvn  0.744 0.114 0.659\nvn  0.701 0.149 0.698\nvn  0.802 0.157 0.577\nvn  0.823 -0.080 0.562\nvn  0.690 0.142 0.710\nvn  0.628 0.036 0.778\nvn  0.894 -0.247 0.373\nvn  0.624 -0.153 0.766\nvn  0.661 0.110 0.742\nvn  0.712 0.424 0.559\nvn  0.701 0.284 0.654\nvn  0.504 -0.050 0.862\nvn  0.413 0.027 0.910\nvn  0.569 0.046 0.821\nvn  0.488 -0.134 0.862\nvn  0.411 -0.180 0.894\nvn  0.610 -0.024 0.792\nvn  0.747 -0.250 0.616\nvn  0.672 -0.313 0.671\nvn  0.536 0.762 0.363\nvn  0.559 0.768 0.312\nvn  0.802 0.272 0.531\nvn  0.618 0.206 0.759\nvn  0.717 0.383 0.583\nvn  0.780 0.464 0.420\nvn  0.617 0.401 0.678\nvn  0.658 0.397 0.640\nvn  0.672 0.440 0.596\nvn  0.501 0.314 0.807\nvn  0.612 0.527 0.589\nvn  0.679 0.320 0.661\nvn  0.732 -0.406 -0.547\nvn  0.885 -0.261 -0.386\nvn  0.842 -0.347 0.414\nvn  0.782 -0.349 0.517\nvn  0.784 -0.368 0.500\nvn  0.858 -0.453 0.244\nvn  0.953 -0.279 0.118\nvn  0.977 -0.189 0.104\nvn  0.989 -0.110 0.102\nvn  0.142 0.669 0.730\nvn  0.300 0.652 0.696\nvn  0.291 0.792 0.536\nvn  0.143 0.821 0.553\nvn  0.737 0.561 0.378\nvn  0.716 0.470 0.515\nvn  0.884 0.306 0.353\nvn  0.898 0.354 0.263\nvn  0.890 0.423 0.171\nvn  0.174 0.078 0.982\nvn  0.219 0.254 0.942\nvn  0.665 -0.104 0.739\nvn  0.671 0.390 0.631\nvn  0.596 0.435 0.675\nvn  0.636 0.467 0.614\nvn  0.076 0.244 0.967\nvn  0.261 0.437 0.861\nvn  0.107 0.440 0.892\nvn  0.011 0.082 0.997\nvn  0.005 0.082 0.997\nvn  0.028 -0.027 0.999\nvn  0.073 -0.057 0.996\nvn  0.006 0.228 0.974\nvn  0.683 0.140 0.717\nvn  0.724 0.233 0.650\nvn  0.400 0.338 0.852\nvn  0.270 0.126 0.955\nvn  0.357 0.433 0.828\nvn  0.503 0.485 0.716\nvn  0.536 0.133 0.834\nvn  0.416 -0.306 0.856\nvn  0.337 0.097 0.937\nvn  0.262 0.372 0.891\nvn  0.425 0.075 0.902\nvn  0.701 -0.147 0.698\nvn  -0.056 0.558 0.828\nvn  0.005 0.605 0.796\nvn  0.483 0.327 0.812\nvn  0.497 0.276 0.823\nvn  0.505 0.283 0.815\nvn  0.340 -0.030 0.940\nvn  0.332 0.066 0.941\nvn  0.026 0.644 0.765\nvn  0.021 0.538 0.843\nvn  0.170 -0.012 0.985\nvn  0.365 -0.067 0.929\nvn  0.826 -0.173 0.537\nvn  0.320 0.415 0.852\nvn  0.384 0.739 0.554\nvn  0.987 -0.013 0.160\nvn  0.495 0.720 0.487\nvn  0.490 0.830 0.268\nvn  0.279 0.906 0.317\nvn  0.431 0.899 -0.074\nvn  0.267 0.957 -0.112\nvn  0.283 0.953 0.107\nvn  0.471 0.877 0.092\nvn  0.132 0.985 0.113\nvn  0.135 0.931 0.339\nvn  0.190 -0.184 0.964\nvn  0.292 -0.372 0.881\nvn  0.307 -0.447 0.840\nvn  0.393 -0.580 0.713\nvn  0.524 -0.286 0.802\nvn  0.380 -0.582 0.719\nvn  0.697 0.212 0.685\nvn  0.603 0.070 0.795\nvn  0.558 -0.571 0.602\nvn  -0.089 -0.701 0.707\nvn  0.794 -0.345 0.500\nvn  0.345 -0.517 0.783\nvn  0.481 0.101 0.871\nvn  0.134 0.283 0.950\nvn  0.113 -0.558 0.822\nvn  -0.073 -0.993 0.089\nvn  -0.041 -0.994 0.103\nvn  0.084 -0.038 0.996\nvn  -0.012 -0.622 0.783\nvn  -0.002 0.254 0.967\nvn  0.004 -0.997 0.079\nvn  0.001 -0.832 -0.555\nvn  0.477 -0.363 0.801\nvn  0.414 0.160 0.896\nvn  0.395 0.485 0.780\nvn  0.611 0.484 0.627\nvn  0.406 0.510 0.758\nvn  0.375 0.498 0.782\nvn  0.555 0.314 0.770\nvn  0.349 0.411 0.842\nvn  0.012 0.247 0.969\nvn  0.002 -0.369 0.930\nvn  -0.003 0.509 0.861\nvn  0.876 -0.041 0.481\nvn  0.757 -0.214 0.618\nvn  0.737 -0.048 0.674\nvn  0.840 -0.012 0.542\nvn  0.960 0.137 0.243\nvn  0.969 0.103 0.226\nvn  0.909 0.015 0.417\nvn  0.906 0.015 0.423\nvn  0.676 -0.276 0.683\nvn  0.688 -0.223 0.691\nvn  0.691 0.035 0.722\nvn  0.719 -0.082 0.691\nvn  0.964 0.062 0.260\nvn  0.956 0.070 0.286\nvn  0.953 0.037 0.300\nvn  -0.003 -0.415 0.910\nvn  -0.001 -0.380 0.925\nvn  0.658 -0.419 0.625\nvn  0.735 -0.421 0.532\nvn  0.663 -0.303 0.685\nvn  0.550 -0.321 0.771\nvn  0.423 -0.236 0.875\nvn  0.326 -0.294 0.899\nvn  0.124 -0.396 0.910\nvn  0.218 -0.177 0.960\nvn  0.530 0.781 0.331\nvn  0.167 0.827 0.537\nvn  0.094 0.948 0.303\nvn  0.313 0.934 0.171\nvn  -0.406 -0.892 0.201\nvn  -0.743 0.107 0.661\nvn  0.455 0.704 0.546\nvn  0.288 0.957 0.025\nvn  0.245 0.958 0.150\nvn  0.532 -0.027 0.846\nvn  0.566 0.213 0.796\nvn  0.508 0.208 0.836\nvn  0.173 0.028 0.984\nvn  0.371 0.122 0.921\nvn  0.429 -0.045 0.902\nvn  0.614 0.165 0.772\nvn  0.737 0.157 0.657\nvn  0.726 0.057 0.685\nvn  0.662 0.061 0.747\nvn  0.845 -0.523 -0.112\nvn  0.845 -0.501 -0.185\nvn  0.744 -0.668 0.009\nvn  0.773 -0.630 0.079\nvn  0.889 0.108 0.445\nvn  0.899 0.077 0.430\nvn  0.184 0.204 -0.961\nvn  0.005 0.202 -0.979\nvn  -0.000 0.485 -0.875\nvn  0.159 0.484 -0.861\nvn  0.499 0.592 0.633\nvn  0.305 0.950 0.065\nvn  -0.274 -0.953 -0.127\nvn  0.245 -0.456 0.856\nvn  0.083 -0.881 0.465\nvn  0.435 -0.739 0.515\nvn  0.504 -0.429 0.750\nvn  0.818 -0.367 0.443\nvn  0.933 -0.162 0.322\nvn  0.872 0.029 0.489\nvn  0.002 0.994 0.113\nvn  0.133 0.983 -0.126\nvn  -0.001 0.992 -0.127\nvn  0.280 0.892 -0.356\nvn  0.126 0.916 -0.381\nvn  0.210 0.974 -0.083\nvn  -0.082 0.663 0.745\nvn  -0.059 0.391 0.919\nvn  0.111 0.992 -0.055\nvn  0.081 -0.190 0.978\nvn  0.035 0.076 0.996\nvn  0.852 0.236 0.467\nvn  0.775 0.219 0.593\nvn  0.505 -0.109 0.856\nvn  0.446 -0.314 0.838\nvn  0.511 0.200 0.836\nvn  0.623 -0.242 0.744\nvn  0.436 -0.554 0.709\nvn  0.599 -0.742 0.300\nvn  -0.036 0.177 0.984\nvn  -0.039 -0.159 0.987\nvn  0.308 0.942 -0.135\nvn  0.989 0.093 -0.111\nvn  0.477 -0.259 0.840\nvn  0.473 -0.423 0.773\nvn  0.774 -0.329 0.541\nvn  0.285 0.019 0.958\nvn  0.350 0.101 0.931\nvn  0.579 0.261 0.773\nvn  0.298 0.015 0.954\nvn  0.165 0.336 0.927\nvn  0.577 0.511 0.636\nvn  0.254 -0.834 0.490\nvn  -0.114 -0.925 0.363\nvn  0.941 -0.280 -0.188\nvn  0.460 -0.738 0.493\nvn  0.740 -0.635 0.221\nvn  0.003 0.529 0.849\nvn  0.206 -0.427 -0.881\nvn  0.497 -0.316 -0.808\nvn  0.457 -0.144 -0.878\nvn  0.179 -0.244 -0.953\nvn  -0.182 -0.980 -0.078\nvn  0.342 -0.427 0.837\nvn  0.424 -0.296 0.856\nvn  0.896 -0.357 -0.264\nvn  0.594 -0.104 0.798\nvn  0.012 0.528 0.849\nvn  0.042 0.469 0.882\nvn  0.624 0.102 0.775\nvn  0.324 -0.123 0.938\nvn  0.202 -0.638 0.743\nvn  0.714 0.512 0.477\nvn  0.433 -0.511 0.742\nvn  -0.350 -0.708 0.613\nvn  0.095 -0.410 0.907\nvn  0.622 -0.593 0.512\nvn  0.846 0.304 0.437\nvn  0.582 -0.043 0.812\nvn  -0.226 -0.380 0.897\nvn  0.215 0.644 0.734\nvn  0.123 0.952 0.280\nvn  -0.004 0.956 0.293\nvn  -0.005 0.635 0.772\nvn  0.325 -0.730 0.601\nvn  -0.017 -0.840 0.543\nvn  0.017 -0.788 0.616\nvn  0.294 -0.138 0.946\nvn  0.214 0.401 0.891\nvn  -0.150 0.490 0.859\nvn  0.573 -0.125 0.810\nvn  -0.134 0.957 0.258\nvn  0.252 0.828 0.501\nvn  -0.673 0.643 0.364\nvn  0.004 -0.960 0.279\nvn  0.032 -0.991 0.133\nvn  0.006 -0.908 0.419\nvn  0.180 -0.980 0.086\nvn  0.740 0.403 -0.538\nvn  0.627 0.652 -0.426\nvn  0.814 0.561 -0.149\nvn  0.925 0.321 -0.206\nvn  0.492 0.825 -0.280\nvn  0.649 0.757 -0.076\nvn  0.966 0.258 0.022\nvn  0.864 0.501 0.053\nvn  0.680 0.729 0.077\nvn  0.272 -0.962 -0.032\nvn  0.225 -0.968 0.111\nvn  0.288 -0.510 0.810\nvn  0.126 0.748 -0.651\nvn  0.340 0.725 -0.598\nvn  0.421 0.466 -0.778\nvn  0.205 -0.458 -0.865\nvn  0.489 -0.479 -0.729\nvn  0.500 -0.523 -0.690\nvn  0.210 -0.566 -0.798\nvn  0.895 -0.322 -0.309\nvn  0.759 -0.434 -0.485\nvn  0.797 -0.287 -0.532\nvn  0.937 -0.248 -0.245\nvn  -0.001 -0.238 -0.971\nvn  -0.000 -0.025 -1.000\nvn  0.194 -0.025 -0.981\nvn  0.201 -0.248 -0.948\nvn  0.969 0.094 -0.229\nvn  0.968 -0.101 -0.228\nvn  0.814 -0.088 -0.575\nvn  0.800 0.142 -0.583\nvn  0.998 0.061 -0.010\nvn  0.726 0.657 0.205\nvn  0.000 -0.985 0.174\nvn  0.985 -0.166 0.038\nvn  0.955 -0.220 -0.200\nvn  0.472 0.076 0.879\nvn  0.343 -0.235 0.909\nvn  0.464 -0.641 0.612\nvn  0.578 -0.186 0.795\nvn  -0.189 -0.982 0.010\nvn  0.004 0.938 0.345\nvn  0.002 0.829 0.559\nvn  0.445 0.232 0.865\nvn  0.463 0.340 0.818\nvn  -0.116 0.983 0.143\nvn  0.004 0.995 0.102\nvn  0.978 0.204 0.044\nvn  -0.967 -0.216 -0.137\nvn  -0.911 -0.347 0.224\nvn  -0.728 0.350 0.590\nvn  0.426 0.738 -0.523\nvn  0.618 0.786 0.011\nvn  0.151 0.857 -0.493\nvn  -0.333 0.912 -0.241\nvn  -0.277 0.956 0.095\nvn  -0.569 0.822 -0.032\nvn  -0.341 -0.671 -0.658\nvn  0.161 -0.736 -0.657\nvn  0.528 0.432 0.731\nvn  0.586 0.105 0.803\nvn  0.436 0.074 0.897\nvn  0.621 0.267 0.737\nvn  0.936 0.153 0.316\nvn  0.999 -0.010 0.042\nvn  0.826 0.281 -0.489\nvn  0.775 0.178 -0.606\nvn  0.995 -0.039 -0.095\nvn  0.005 -0.414 0.910\nvn  0.580 -0.243 0.778\nvn  0.938 -0.339 -0.068\nvn  0.925 -0.371 0.080\nvn  0.888 -0.269 0.373\nvn  0.923 -0.371 -0.106\nvn  0.494 -0.274 -0.825\nvn  -0.001 -0.456 -0.890\nvn  -0.002 -0.569 -0.822\nvn  -0.001 -0.452 -0.892\nvn  -0.003 0.749 -0.663\nvn  -0.000 0.920 -0.391\nvn  -0.001 -0.280 -0.960\nvn  0.470 0.194 -0.861\nvn  0.965 -0.123 0.234\nvn  0.400 -0.039 -0.916\nvn  0.142 -0.166 -0.976\nvn  -0.000 -0.194 -0.981\nvn  0.497 -0.049 -0.867\nvn  0.998 0.042 0.045\nvn  0.996 -0.037 -0.082\nvn  0.009 0.433 0.901\nvn  0.004 0.669 0.743\nvn  0.955 0.004 0.296\nvn  0.737 -0.001 0.675\nvn  0.707 0.177 0.684\nvn  0.484 0.627 0.610\nvn  0.515 0.250 0.820\nvn  0.360 0.121 0.925\nvn  -0.544 -0.573 0.613\nvn  0.382 -0.114 0.917\nvn  0.489 -0.108 0.866\nvn  -0.002 -0.670 0.742\nvn  0.002 -0.394 0.919\nvn  -0.004 -0.168 0.986\nvn  0.007 -0.109 0.994\nvn  0.009 -0.519 0.855\nvn  0.660 -0.118 0.742\nvn  0.621 -0.127 0.774\nvn  0.416 0.220 0.882\nvn  0.946 0.046 0.322\nvn  0.014 0.006 1.000\nvn  0.569 0.184 0.802\nvn  0.218 0.013 0.976\nvn  0.044 0.087 0.995\nvn  -0.419 0.862 0.284\nvn  0.647 -0.120 0.753\nvn  0.954 -0.017 0.301\nvn  0.352 0.140 -0.926\nvn  0.095 -0.050 -0.994\nvn  0.770 0.025 0.638\nvn  0.000 -0.078 -0.997\nvn  0.985 -0.172 0.009\nvn  0.920 -0.340 0.195\nvn  0.929 -0.331 -0.163\nvn  0.969 -0.237 0.074\nvn  0.969 -0.183 0.165\nvn  0.801 0.160 0.577\nvn  0.954 -0.021 0.301\nvn  0.293 0.803 0.520\nvn  0.977 0.170 0.129\nvn  0.134 0.985 -0.104\nvn  0.994 0.106 -0.036\nvn  0.099 0.675 -0.731\nvn  0.997 -0.079 -0.000\nvn  0.197 0.126 -0.972\nvn  0.978 -0.175 -0.110\nvn  0.110 -0.321 -0.941\nvn  0.939 -0.332 -0.089\nvn  0.400 -0.789 -0.467\nvn  0.171 -0.673 -0.720\nvn  0.931 -0.336 -0.144\nvn  0.854 -0.500 0.146\nvn  0.161 -0.985 -0.069\nvn  0.931 -0.304 -0.200\nvn  0.813 -0.565 -0.143\nvn  0.823 -0.546 0.154\nvn  0.795 -0.387 0.467\nvn  0.809 -0.168 0.563\nvn  0.826 0.053 0.562\nvn  0.925 0.261 0.275\nvn  0.990 0.071 0.119\nvn  0.951 0.129 0.281\nvn  0.810 -0.147 0.568\nvn  0.383 -0.603 0.699\nvn  0.769 0.635 0.079\nvn  0.786 0.352 0.508\nvn  0.919 0.082 -0.386\nvn  0.937 0.163 0.310\nvn  0.974 -0.026 0.224\nvn  0.787 0.550 0.279\nvn  0.517 0.758 -0.397\nvn  0.337 0.112 -0.935\nvn  0.221 -0.300 -0.928\nvn  0.395 -0.578 -0.714\nvn  0.521 -0.711 -0.472\nvn  0.432 -0.901 -0.043\nvn  0.826 -0.520 0.218\nvn  0.885 -0.217 0.412\nvn  0.786 -0.107 0.609\nvn  0.864 0.400 0.304\nvn  0.954 0.061 0.293\nvn  0.949 0.313 0.046\nvn  0.991 0.028 -0.131\nvn  0.945 -0.116 0.305\nvn  0.970 -0.241 0.032\nvn  0.946 -0.038 0.322\nvn  0.886 -0.270 -0.376\nvn  0.855 -0.272 -0.441\nvn  0.952 -0.122 -0.281\nvn  0.002 -0.883 0.469\nvn  -0.001 0.792 -0.611\nvn  -0.180 0.823 -0.539\nvn  -0.642 0.677 -0.360\nvn  -0.957 0.288 -0.031\nvn  -0.912 -0.300 0.281\nvn  -0.454 -0.866 0.207\nvn  -0.855 -0.043 0.517\nvn  -0.834 0.460 0.305\nvn  -0.242 0.911 0.334\nvn  -0.720 -0.667 -0.192\nvn  -0.762 -0.580 -0.288\nvn  0.452 0.774 0.444\nvn  0.857 0.048 0.513\nvn  0.966 0.131 0.225\nvn  0.211 0.953 0.219\nvn  -0.108 0.726 0.679\nvn  0.021 0.946 0.324\nvn  0.566 -0.691 -0.450\nvn  -0.068 0.939 -0.338\nvn  -0.261 -0.298 0.918\nvn  -0.200 -0.891 0.407\nvn  0.124 -0.991 0.059\nvn  0.913 -0.350 -0.211\nvn  0.488 -0.838 0.244\nvn  0.738 -0.593 0.322\nvn  0.994 -0.060 -0.087\nvn  -0.000 -0.981 0.193\nvn  0.000 0.974 0.227\nvn  -0.350 -0.016 0.936\nvn  0.000 -0.017 1.000\nvn  0.252 0.455 -0.854\nvn  0.774 0.620 -0.127\nvn  0.634 0.759 -0.148\nvn  0.192 0.569 -0.800\nvn  0.405 -0.094 0.909\nvn  0.031 0.149 0.988\nvn  0.360 0.283 0.889\nvn  0.469 0.080 0.880\nvn  0.769 0.452 0.452\nvn  0.946 0.185 0.266\nvn  0.893 0.181 0.413\nvn  0.654 0.429 0.623\nvn  0.506 0.610 0.610\nvn  0.436 0.659 0.613\nvn  0.160 0.558 0.814\nvn  -0.285 0.396 0.873\nvn  -0.223 0.539 0.812\nvn  0.037 0.570 0.821\nvn  0.623 0.727 -0.289\nvn  0.456 0.738 0.497\nvn  0.382 0.656 0.651\nvn  0.278 0.687 0.671\nvn  0.213 0.798 0.563\nvn  0.171 0.844 0.508\nvn  0.300 0.690 0.659\nvn  0.144 0.793 0.591\nvn  0.204 0.541 -0.816\nvn  -0.001 0.494 -0.870\nvn  0.029 0.458 -0.888\nvn  0.060 0.366 -0.929\nvn  0.000 0.421 -0.907\nvn  0.000 0.386 -0.922\nvn  0.001 0.455 -0.891\nvn  0.264 0.718 0.644\nvn  0.307 0.317 -0.897\nvn  0.056 0.164 -0.985\nvn  0.717 0.079 0.693\nvn  0.638 0.188 0.746\nvn  0.000 0.202 -0.979\nvn  0.006 -0.044 0.999\nvn  0.001 0.405 0.914\nvn  0.805 0.560 -0.194\nvn  0.002 0.627 0.779\nvn  0.010 -0.298 0.954\nvn  0.124 0.870 -0.477\nvn  0.488 0.530 -0.693\nvn  0.566 0.756 -0.329\nvn  0.213 0.932 -0.294\nvn  0.245 -0.741 -0.626\nvn  0.275 -0.782 -0.559\nvn  0.044 -0.811 -0.584\nvn  -0.012 0.949 -0.315\nvn  0.097 0.621 -0.778\nvn  0.215 0.561 -0.799\nvn  -0.030 0.913 -0.407\nvn  0.378 0.505 -0.776\nvn  0.084 0.865 -0.495\nvn  0.892 -0.451 -0.026\nvn  0.803 -0.447 -0.394\nvn  0.954 0.274 -0.123\nvn  0.998 -0.024 0.066\nvn  0.806 0.588 0.057\nvn  0.351 0.936 -0.012\nvn  0.662 -0.536 -0.524\nvn  0.725 -0.630 -0.278\nvn  0.524 -0.662 -0.536\nvn  0.620 -0.585 -0.522\nvn  -0.694 -0.711 0.115\nvn  -0.621 -0.770 0.148\nvn  -0.805 -0.470 0.362\nvn  -0.819 -0.465 0.335\nvn  -0.680 -0.145 0.719\nvn  -0.763 -0.140 0.631\nvn  -0.840 -0.272 0.470\nvn  -0.773 -0.256 0.580\nvn  -0.763 -0.155 -0.627\nvn  -0.763 0.034 -0.645\nvn  -0.958 -0.057 -0.281\nvn  -0.910 -0.129 -0.393\nvn  -0.983 0.060 0.175\nvn  -0.980 0.096 0.177\nvn  -0.990 0.069 0.123\nvn  -0.996 0.023 0.083\nvn  -0.484 -0.649 0.587\nvn  -0.662 -0.717 0.220\nvn  -0.775 -0.388 0.499\nvn  -0.606 -0.384 0.697\nvn  -0.748 -0.556 0.363\nvn  -0.539 -0.840 0.071\nvn  -0.496 -0.849 0.183\nvn  -0.668 -0.580 0.467\nvn  -0.280 -0.913 0.296\nvn  -0.424 -0.897 0.125\nvn  -0.960 0.187 0.209\nvn  -0.965 0.222 0.143\nvn  -0.991 0.084 0.104\nvn  -0.979 0.104 0.175\nvn  -0.940 0.170 0.295\nvn  -0.909 0.107 0.404\nvn  -0.862 0.204 0.464\nvn  -0.896 0.204 0.395\nvn  -0.570 -0.493 0.658\nvn  -0.531 -0.465 0.709\nvn  -0.651 -0.181 0.737\nvn  -0.688 -0.376 0.620\nvn  -0.892 0.030 0.452\nvn  -0.827 0.122 0.549\nvn  -0.345 -0.706 0.619\nvn  -0.566 -0.461 0.684\nvn  -0.543 -0.393 0.742\nvn  -0.097 -0.841 0.533\nvn  -0.964 0.119 0.237\nvn  -0.950 0.158 0.268\nvn  -0.733 -0.024 0.679\nvn  -0.825 -0.117 0.552\nvn  -0.442 0.232 0.866\nvn  -0.605 0.237 0.760\nvn  -0.556 0.267 0.787\nvn  -0.350 0.172 0.921\nvn  -0.239 -0.096 0.966\nvn  -0.501 0.068 0.863\nvn  -0.679 0.342 0.650\nvn  -0.486 0.403 0.776\nvn  -0.211 -0.600 0.772\nvn  -0.123 -0.334 0.934\nvn  -0.052 -0.530 0.847\nvn  -0.176 -0.798 0.577\nvn  -0.131 -0.968 -0.212\nvn  -0.598 -0.684 -0.418\nvn  -0.205 -0.329 0.922\nvn  -0.374 -0.151 0.915\nvn  -0.117 -0.376 0.919\nvn  -0.246 -0.160 0.956\nvn  -0.126 -0.268 0.955\nvn  -0.137 -0.531 0.837\nvn  0.062 -0.980 0.190\nvn  -0.478 -0.855 0.203\nvn  -0.669 -0.734 -0.114\nvn  -0.286 -0.955 0.083\nvn  -0.967 -0.136 0.215\nvn  -0.965 -0.005 0.263\nvn  -0.983 -0.085 0.164\nvn  -0.969 -0.182 0.170\nvn  -0.840 -0.358 0.408\nvn  -0.857 -0.341 0.386\nvn  -0.910 -0.256 0.326\nvn  -0.884 -0.284 0.371\nvn  0.022 -0.449 0.893\nvn  -0.046 -0.611 0.791\nvn  -0.478 -0.294 0.827\nvn  -0.375 -0.338 0.863\nvn  -0.935 -0.243 0.259\nvn  -0.949 -0.164 0.269\nvn  -0.736 -0.207 0.645\nvn  -0.587 -0.108 0.802\nvn  0.945 0.284 0.163\nvn  0.592 -0.756 -0.279\nvn  0.442 -0.866 -0.236\nvn  -0.053 -0.740 0.670\nvn  -0.228 -0.529 0.817\nvn  0.170 -0.772 0.613\nvn  -0.609 -0.162 0.777\nvn  -0.663 -0.292 0.690\nvn  -0.713 0.145 0.686\nvn  -0.759 0.059 0.648\nvn  -0.825 0.047 0.564\nvn  -0.809 0.158 0.566\nvn  -0.637 0.025 0.770\nvn  -0.687 0.129 0.715\nvn  -0.821 -0.086 0.564\nvn  -0.891 -0.252 0.378\nvn  -0.721 0.489 0.490\nvn  -0.698 0.164 0.697\nvn  -0.646 -0.143 0.750\nvn  -0.712 0.352 0.608\nvn  -0.567 0.074 0.821\nvn  -0.464 0.032 0.885\nvn  -0.518 -0.023 0.855\nvn  -0.550 -0.128 0.825\nvn  -0.756 -0.260 0.601\nvn  -0.645 -0.025 0.764\nvn  -0.437 -0.158 0.885\nvn  -0.687 -0.310 0.657\nvn  -0.541 0.781 0.313\nvn  -0.565 0.780 0.270\nvn  -0.712 0.385 0.587\nvn  -0.611 0.201 0.765\nvn  -0.859 0.335 0.388\nvn  -0.775 0.474 0.417\nvn  -0.673 0.387 0.630\nvn  -0.628 0.400 0.668\nvn  -0.676 0.438 0.592\nvn  -0.698 0.309 0.646\nvn  -0.622 0.535 0.573\nvn  -0.511 0.327 0.795\nvn  -0.733 -0.405 -0.547\nvn  -0.884 -0.261 -0.388\nvn  -0.791 -0.366 0.490\nvn  -0.793 -0.344 0.502\nvn  -0.844 -0.347 0.408\nvn  -0.858 -0.453 0.243\nvn  -0.953 -0.280 0.116\nvn  -0.976 -0.193 0.100\nvn  -0.989 -0.113 0.096\nvn  -0.289 0.792 0.537\nvn  -0.301 0.654 0.693\nvn  -0.134 0.672 0.728\nvn  -0.137 0.821 0.554\nvn  -0.884 0.305 0.354\nvn  -0.716 0.471 0.515\nvn  -0.736 0.562 0.377\nvn  -0.897 0.355 0.265\nvn  -0.890 0.422 0.171\nvn  -0.179 0.082 0.981\nvn  -0.216 0.250 0.944\nvn  -0.661 -0.125 0.740\nvn  -0.679 0.371 0.633\nvn  -0.636 0.460 0.620\nvn  -0.594 0.426 0.682\nvn  -0.258 0.436 0.862\nvn  -0.070 0.240 0.968\nvn  -0.095 0.440 0.893\nvn  -0.011 0.089 0.996\nvn  -0.069 -0.049 0.996\nvn  -0.719 0.247 0.649\nvn  -0.673 0.172 0.719\nvn  -0.353 0.447 0.822\nvn  -0.270 0.134 0.954\nvn  -0.440 0.328 0.836\nvn  -0.511 0.490 0.706\nvn  -0.342 0.114 0.933\nvn  -0.435 -0.298 0.849\nvn  -0.552 0.158 0.818\nvn  -0.273 0.369 0.888\nvn  -0.705 -0.192 0.683\nvn  -0.357 0.088 0.930\nvn  -0.499 0.346 0.795\nvn  0.009 0.585 0.811\nvn  0.086 0.584 0.807\nvn  -0.348 -0.035 0.937\nvn  -0.516 0.299 0.803\nvn  -0.512 0.295 0.806\nvn  -0.339 0.070 0.938\nvn  -0.348 -0.070 0.935\nvn  -0.148 -0.003 0.989\nvn  -0.349 0.750 0.561\nvn  -0.322 0.418 0.849\nvn  -0.890 -0.163 0.425\nvn  -0.990 -0.001 0.144\nvn  -0.500 0.824 0.267\nvn  -0.501 0.717 0.484\nvn  -0.285 0.905 0.315\nvn  -0.282 0.954 0.103\nvn  -0.268 0.957 -0.114\nvn  -0.433 0.898 -0.078\nvn  -0.473 0.876 0.093\nvn  -0.131 0.985 0.111\nvn  -0.127 0.932 0.339\nvn  -0.211 -0.186 0.960\nvn  -0.293 -0.359 0.886\nvn  -0.344 -0.465 0.816\nvn  -0.382 -0.591 0.710\nvn  -0.525 -0.255 0.812\nvn  -0.598 0.089 0.796\nvn  -0.688 0.244 0.683\nvn  -0.344 -0.576 0.742\nvn  -0.544 -0.583 0.603\nvn  0.098 -0.695 0.712\nvn  -0.805 -0.326 0.496\nvn  -0.132 0.306 0.943\nvn  -0.485 0.160 0.860\nvn  -0.351 -0.498 0.793\nvn  -0.141 -0.499 0.855\nvn  0.065 -0.990 0.123\nvn  0.037 -0.989 0.143\nvn  -0.065 -0.055 0.996\nvn  -0.473 -0.369 0.800\nvn  -0.396 0.179 0.900\nvn  -0.600 0.505 0.620\nvn  -0.387 0.499 0.776\nvn  -0.398 0.505 0.766\nvn  -0.358 0.488 0.796\nvn  -0.570 0.304 0.763\nvn  -0.317 0.412 0.854\nvn  -0.742 -0.129 0.658\nvn  -0.771 -0.207 0.602\nvn  -0.881 -0.036 0.472\nvn  -0.841 -0.052 0.538\nvn  -0.972 0.111 0.208\nvn  -0.961 0.151 0.230\nvn  -0.916 -0.004 0.402\nvn  -0.913 0.013 0.408\nvn  -0.689 0.026 0.724\nvn  -0.641 -0.316 0.699\nvn  -0.647 -0.304 0.699\nvn  -0.697 -0.094 0.711\nvn  -0.966 0.063 0.249\nvn  -0.963 0.075 0.259\nvn  -0.958 0.031 0.287\nvn  -0.681 -0.315 0.661\nvn  -0.745 -0.412 0.525\nvn  -0.666 -0.413 0.621\nvn  -0.548 -0.335 0.767\nvn  -0.107 -0.395 0.913\nvn  -0.299 -0.320 0.899\nvn  -0.418 -0.236 0.877\nvn  -0.210 -0.169 0.963\nvn  -0.090 0.952 0.291\nvn  -0.166 0.838 0.520\nvn  -0.523 0.797 0.302\nvn  -0.302 0.941 0.154\nvn  0.408 -0.888 0.211\nvn  0.735 0.117 0.668\nvn  -0.279 0.960 0.001\nvn  -0.468 0.706 0.531\nvn  -0.232 0.964 0.131\nvn  -0.555 -0.033 0.831\nvn  -0.517 0.199 0.833\nvn  -0.549 0.222 0.806\nvn  -0.376 0.125 0.918\nvn  -0.210 0.031 0.977\nvn  -0.435 -0.045 0.899\nvn  -0.739 0.154 0.656\nvn  -0.610 0.153 0.777\nvn  -0.663 0.041 0.748\nvn  -0.733 0.013 0.681\nvn  -0.744 -0.668 0.007\nvn  -0.845 -0.501 -0.187\nvn  -0.845 -0.522 -0.114\nvn  -0.774 -0.629 0.079\nvn  -0.897 0.040 0.440\nvn  -0.896 0.094 0.434\nvn  -0.179 0.204 -0.962\nvn  -0.157 0.488 -0.858\nvn  -0.506 0.590 0.630\nvn  -0.305 0.951 0.047\nvn  0.267 -0.958 -0.102\nvn  -0.432 -0.745 0.509\nvn  -0.075 -0.883 0.463\nvn  -0.236 -0.454 0.859\nvn  -0.504 -0.423 0.753\nvn  -0.821 -0.351 0.449\nvn  -0.876 0.033 0.481\nvn  -0.934 -0.155 0.322\nvn  -0.134 0.983 -0.126\nvn  -0.128 0.916 -0.381\nvn  -0.284 0.891 -0.353\nvn  0.055 0.396 0.917\nvn  0.092 0.644 0.760\nvn  -0.199 0.976 -0.093\nvn  -0.109 0.991 -0.072\nvn  -0.039 0.079 0.996\nvn  -0.081 -0.191 0.978\nvn  -0.854 0.239 0.462\nvn  -0.774 0.223 0.593\nvn  -0.502 -0.119 0.856\nvn  -0.403 -0.420 0.813\nvn  -0.680 -0.255 0.687\nvn  -0.525 0.172 0.834\nvn  -0.376 -0.531 0.759\nvn  -0.576 -0.754 0.316\nvn  0.040 0.159 0.986\nvn  0.036 -0.180 0.983\nvn  -0.308 0.943 -0.129\nvn  -0.983 0.074 -0.170\nvn  -0.456 -0.445 0.771\nvn  -0.476 -0.297 0.828\nvn  -0.788 -0.316 0.528\nvn  -0.393 0.095 0.915\nvn  -0.308 0.018 0.951\nvn  -0.125 0.331 0.935\nvn  -0.283 0.033 0.959\nvn  -0.598 0.322 0.734\nvn  -0.575 0.559 0.598\nvn  -0.216 -0.852 0.476\nvn  0.156 -0.927 0.342\nvn  -0.941 -0.282 -0.189\nvn  -0.739 -0.637 0.221\nvn  -0.469 -0.731 0.495\nvn  -0.458 -0.139 -0.878\nvn  -0.498 -0.315 -0.808\nvn  -0.210 -0.426 -0.880\nvn  -0.182 -0.243 -0.953\nvn  -0.334 -0.402 0.853\nvn  0.221 -0.960 -0.173\nvn  -0.414 -0.366 0.834\nvn  -0.902 -0.373 -0.218\nvn  -0.632 -0.114 0.767\nvn  -0.642 0.122 0.757\nvn  -0.194 -0.651 0.734\nvn  -0.351 -0.095 0.931\nvn  -0.707 0.530 0.467\nvn  -0.087 -0.550 0.831\nvn  0.352 -0.710 0.610\nvn  -0.500 -0.482 0.720\nvn  -0.653 -0.626 0.427\nvn  -0.856 0.328 0.399\nvn  -0.578 -0.029 0.816\nvn  0.275 -0.432 0.859\nvn  -0.123 0.953 0.277\nvn  -0.228 0.657 0.719\nvn  -0.298 -0.735 0.609\nvn  -0.300 -0.179 0.937\nvn  -0.219 0.400 0.890\nvn  -0.587 -0.175 0.791\nvn  0.175 0.460 0.870\nvn  -0.179 0.856 0.485\nvn  0.114 0.959 0.259\nvn  0.664 0.620 0.418\nvn  -0.026 -0.991 0.129\nvn  -0.184 -0.979 0.082\nvn  -0.810 0.566 -0.151\nvn  -0.628 0.654 -0.422\nvn  -0.741 0.405 -0.536\nvn  -0.924 0.322 -0.207\nvn  -0.493 0.823 -0.280\nvn  -0.648 0.758 -0.080\nvn  -0.966 0.258 0.022\nvn  -0.864 0.501 0.051\nvn  -0.679 0.730 0.075\nvn  -0.221 -0.970 0.105\nvn  -0.271 -0.962 -0.038\nvn  -0.376 -0.516 0.769\nvn  -0.124 0.748 -0.652\nvn  -0.339 0.727 -0.598\nvn  -0.420 0.469 -0.777\nvn  -0.500 -0.524 -0.690\nvn  -0.489 -0.481 -0.728\nvn  -0.206 -0.458 -0.865\nvn  -0.212 -0.565 -0.797\nvn  -0.893 -0.325 -0.312\nvn  -0.759 -0.435 -0.485\nvn  -0.796 -0.289 -0.532\nvn  -0.937 -0.249 -0.246\nvn  -0.193 -0.029 -0.981\nvn  -0.202 -0.249 -0.947\nvn  -0.814 -0.090 -0.574\nvn  -0.969 -0.102 -0.227\nvn  -0.969 0.093 -0.229\nvn  -0.801 0.142 -0.581\nvn  -0.998 0.061 -0.010\nvn  -0.718 0.664 0.209\nvn  -0.985 -0.168 0.036\nvn  -0.954 -0.222 -0.201\nvn  -0.451 0.039 0.891\nvn  -0.341 -0.253 0.905\nvn  -0.604 -0.144 0.784\nvn  -0.472 -0.641 0.606\nvn  0.107 -0.991 0.080\nvn  -0.463 0.274 0.843\nvn  -0.002 0.997 0.081\nvn  0.083 0.977 0.195\nvn  -0.466 0.366 0.805\nvn  -0.977 0.200 0.072\nvn  0.916 -0.331 0.226\nvn  0.929 -0.364 -0.067\nvn  0.728 0.359 0.584\nvn  -0.419 0.737 -0.531\nvn  -0.638 0.769 0.043\nvn  -0.146 0.857 -0.494\nvn  0.280 0.954 0.105\nvn  0.343 0.909 -0.237\nvn  0.546 0.838 -0.008\nvn  0.342 -0.678 -0.651\nvn  -0.159 -0.734 -0.660\nvn  -0.545 0.363 0.756\nvn  -0.599 0.165 0.783\nvn  -0.447 0.066 0.892\nvn  -0.645 0.255 0.721\nvn  -0.936 0.164 0.311\nvn  -0.776 0.182 -0.604\nvn  -0.827 0.285 -0.485\nvn  -0.999 -0.012 0.041\nvn  -0.995 -0.037 -0.093\nvn  -0.586 -0.252 0.770\nvn  -0.926 -0.370 0.079\nvn  -0.938 -0.339 -0.067\nvn  -0.889 -0.266 0.372\nvn  -0.922 -0.372 -0.106\nvn  -0.493 -0.275 -0.825\nvn  -0.473 0.194 -0.860\nvn  -0.965 -0.122 0.231\nvn  -0.401 -0.036 -0.915\nvn  -0.143 -0.164 -0.976\nvn  -0.496 -0.052 -0.867\nvn  -0.996 -0.037 -0.083\nvn  -0.998 0.042 0.045\nvn  -0.950 0.012 0.313\nvn  -0.733 -0.008 0.681\nvn  -0.670 0.247 0.700\nvn  -0.408 0.697 0.589\nvn  -0.330 0.155 0.931\nvn  -0.517 0.244 0.821\nvn  0.568 -0.625 0.535\nvn  -0.512 -0.108 0.852\nvn  -0.414 -0.112 0.903\nvn  -0.654 -0.140 0.743\nvn  -0.608 -0.086 0.789\nvn  -0.422 0.215 0.881\nvn  -0.943 0.031 0.332\nvn  -0.549 0.190 0.814\nvn  -0.193 0.018 0.981\nvn  0.358 0.872 0.335\nvn  -0.651 -0.118 0.750\nvn  -0.954 -0.010 0.300\nvn  -0.352 0.145 -0.925\nvn  -0.095 -0.049 -0.994\nvn  -0.769 0.031 0.639\nvn  -0.929 -0.329 -0.171\nvn  -0.923 -0.336 0.190\nvn  -0.985 -0.174 0.005\nvn  -0.970 -0.234 0.068\nvn  -0.801 0.162 0.576\nvn  -0.969 -0.184 0.166\nvn  -0.293 0.803 0.519\nvn  -0.954 -0.019 0.300\nvn  -0.133 0.986 -0.105\nvn  -0.976 0.175 0.130\nvn  -0.098 0.675 -0.732\nvn  -0.993 0.112 -0.041\nvn  -0.197 0.127 -0.972\nvn  -0.997 -0.077 -0.003\nvn  -0.112 -0.322 -0.940\nvn  -0.978 -0.176 -0.109\nvn  -0.171 -0.674 -0.719\nvn  -0.397 -0.789 -0.468\nvn  -0.937 -0.337 -0.091\nvn  -0.929 -0.341 -0.146\nvn  -0.158 -0.985 -0.070\nvn  -0.854 -0.500 0.145\nvn  -0.814 -0.564 -0.141\nvn  -0.931 -0.306 -0.199\nvn  -0.824 -0.545 0.156\nvn  -0.797 -0.383 0.466\nvn  -0.811 -0.165 0.562\nvn  -0.824 0.053 0.564\nvn  -0.926 0.257 0.275\nvn  -0.991 0.062 0.118\nvn  -0.952 0.122 0.281\nvn  -0.383 -0.604 0.699\nvn  -0.810 -0.150 0.567\nvn  -0.784 0.355 0.509\nvn  -0.761 0.645 0.076\nvn  -0.920 0.079 -0.385\nvn  -0.975 -0.023 0.222\nvn  -0.937 0.166 0.308\nvn  -0.787 0.551 0.279\nvn  -0.517 0.758 -0.396\nvn  -0.337 0.112 -0.935\nvn  -0.221 -0.301 -0.928\nvn  -0.395 -0.579 -0.714\nvn  -0.520 -0.711 -0.473\nvn  -0.426 -0.904 -0.044\nvn  -0.824 -0.523 0.219\nvn  -0.886 -0.220 0.409\nvn  -0.863 0.404 0.303\nvn  -0.782 -0.104 0.615\nvn  -0.953 0.066 0.297\nvn  -0.949 0.312 0.046\nvn  -0.991 0.025 -0.134\nvn  -0.944 -0.116 0.308\nvn  -0.971 -0.237 0.041\nvn  -0.947 -0.041 0.318\nvn  -0.854 -0.274 -0.443\nvn  -0.885 -0.271 -0.378\nvn  -0.952 -0.121 -0.282\nvn  0.180 0.824 -0.537\nvn  0.642 0.679 -0.355\nvn  0.956 0.291 -0.021\nvn  0.453 -0.867 0.208\nvn  0.910 -0.301 0.285\nvn  0.854 -0.043 0.518\nvn  0.833 0.459 0.308\nvn  0.241 0.911 0.334\nvn  0.731 -0.650 -0.206\nvn  0.760 -0.585 -0.282\nvn  -0.814 0.019 0.580\nvn  -0.563 0.638 0.526\nvn  -0.925 -0.012 0.381\nvn  -0.214 0.952 0.217\nvn  0.096 0.721 0.686\nvn  -0.027 0.945 0.325\nvn  -0.555 -0.678 -0.481\nvn  0.062 0.937 -0.343\nvn  0.240 -0.291 0.926\nvn  0.184 -0.889 0.419\nvn  -0.126 -0.990 0.061\nvn  -0.889 -0.369 -0.271\nvn  -0.506 -0.832 0.229\nvn  -0.808 -0.443 0.388\nvn  -0.993 -0.084 0.087\nvn  0.350 -0.016 0.937\nvn  -0.636 0.759 -0.140\nvn  -0.771 0.626 -0.115\nvn  -0.250 0.462 -0.851\nvn  -0.192 0.568 -0.801\nvn  -0.359 0.279 0.891\nvn  -0.026 0.144 0.989\nvn  -0.398 -0.100 0.912\nvn  -0.465 0.084 0.881\nvn  -0.895 0.186 0.405\nvn  -0.947 0.184 0.264\nvn  -0.761 0.459 0.458\nvn  -0.657 0.429 0.620\nvn  -0.426 0.660 0.618\nvn  -0.505 0.610 0.611\nvn  0.223 0.536 0.814\nvn  0.285 0.393 0.874\nvn  -0.163 0.555 0.815\nvn  -0.038 0.570 0.821\nvn  -0.628 0.723 -0.288\nvn  -0.458 0.737 0.497\nvn  -0.212 0.799 0.563\nvn  -0.278 0.687 0.672\nvn  -0.380 0.657 0.651\nvn  -0.170 0.846 0.506\nvn  -0.305 0.687 0.660\nvn  -0.144 0.795 0.589\nvn  0.001 0.494 -0.870\nvn  -0.208 0.539 -0.816\nvn  -0.027 0.458 -0.888\nvn  -0.057 0.367 -0.929\nvn  -0.262 0.718 0.645\nvn  -0.054 0.163 -0.985\nvn  -0.306 0.325 -0.895\nvn  -0.643 0.181 0.744\nvn  -0.717 0.083 0.692\nvn  -0.800 0.573 -0.178\nvn  0.296 -0.070 0.953\nvn  -0.319 -0.065 0.946\n# 1258 vertex normals\n\ng head\ns 1\nf 24/1/24 25/2/25 26/3/26\nf 24/1/24 26/3/26 23/4/23\nf 28/5/28 29/6/29 30/7/30\nf 28/5/28 30/7/30 27/8/27\nf 32/9/32 33/10/33 34/11/34\nf 32/9/32 34/11/34 31/12/31\nf 36/13/36 31/12/31 34/11/34\nf 36/13/36 34/11/34 35/14/35\nf 36/13/36 35/14/35 25/2/25\nf 36/13/36 25/2/25 24/1/24\nf 38/15/38 39/16/39 40/17/40\nf 38/15/38 40/17/40 37/18/37\nf 42/19/42 23/4/23 26/3/26\nf 42/19/42 26/3/26 41/20/41\nf 40/17/40 42/19/42 41/20/41\nf 40/17/40 41/20/41 37/18/37\nf 38/15/38 43/21/43 44/22/44\nf 38/15/38 44/22/44 39/16/39\nf 32/9/32 45/23/45 46/24/46\nf 32/9/32 46/24/46 33/10/33\nf 28/5/28 44/22/44 48/25/48\nf 28/5/28 48/25/48 47/26/47\nf 50/27/50 51/28/51 52/29/52\nf 50/27/50 52/29/52 49/30/49\nf 54/31/54 55/32/55 56/33/56\nf 54/31/54 56/33/56 53/34/53\nf 58/35/58 59/36/59 60/37/60\nf 58/35/58 60/37/60 57/38/57\nf 62/39/62 63/40/63 64/41/64\nf 62/39/62 64/41/64 61/42/61\nf 66/43/66 67/44/67 68/45/68\nf 66/43/66 68/45/68 65/46/65\nf 70/47/70 71/48/71 72/49/72\nf 70/47/70 72/49/72 69/50/69\nf 67/44/67 66/43/66 74/51/74\nf 67/44/67 74/51/74 73/52/73\nf 66/43/66 51/28/51 50/27/50\nf 66/43/66 50/27/50 74/51/74\nf 76/53/76 77/54/77 78/55/78\nf 76/53/76 78/55/78 75/56/75\nf 80/57/80 81/58/81 82/59/82\nf 80/57/80 82/59/82 79/60/79\nf 84/61/84 85/62/85 86/63/86\nf 84/61/84 86/63/86 83/64/83\nf 87/65/87 88/66/88 80/57/80\nf 87/65/87 80/57/80 79/60/79\nf 90/67/90 91/68/91 92/69/92\nf 90/67/90 92/69/92 89/70/89\nf 93/71/93 94/72/94 78/55/78\nf 93/71/93 78/55/78 77/54/77\nf 87/65/87 95/73/95 96/74/96\nf 87/65/87 96/74/96 88/66/88\nf 98/75/98 99/76/99 100/77/100\nf 98/75/98 100/77/100 97/78/97\nf 100/77/100 101/79/101 102/80/102\nf 100/77/100 102/80/102 97/78/97\nf 98/75/98 103/81/103 104/82/104\nf 98/75/98 104/82/104 99/76/99\nf 106/83/106 107/84/107 108/85/108\nf 106/83/106 108/85/108 105/86/105\nf 109/87/109 110/88/110 105/86/105\nf 109/87/109 105/86/105 108/85/108\nf 101/79/101 111/89/111 112/90/112\nf 101/79/101 112/90/112 102/80/102\nf 114/91/114 115/92/115 116/93/116\nf 114/91/114 116/93/116 113/94/113\nf 118/95/118 119/96/119 120/97/120\nf 118/95/118 120/97/120 117/98/117\nf 122/99/122 123/100/123 124/101/124\nf 122/99/122 124/101/124 121/102/121\nf 126/103/126 127/104/127 128/105/128\nf 126/103/126 128/105/128 125/106/125\nf 130/107/130 131/108/131 132/109/132\nf 130/107/130 132/109/132 129/110/129\nf 125/106/125 128/105/128 134/111/134\nf 125/106/125 134/111/134 133/112/133\nf 56/33/56 55/32/55 136/113/136\nf 56/33/56 136/113/136 135/114/135\nf 37/115/37 137/116/137 138/117/138\nf 37/115/37 138/117/138 38/118/38\nf 139/119/139 43/120/43 38/118/38\nf 139/119/139 38/118/38 138/117/138\nf 140/121/140 141/122/141 142/123/142\nf 140/121/140 142/123/142 130/107/130\nf 144/124/144 129/110/129 132/109/132\nf 144/124/144 132/109/132 143/125/143\nf 146/126/146 147/127/147 148/128/148\nf 146/126/146 148/128/148 145/129/145\nf 150/130/150 151/131/151 54/31/54\nf 150/130/150 54/31/54 149/132/149\nf 54/31/54 53/34/53 152/133/152\nf 54/31/54 152/133/152 149/132/149\nf 154/134/154 155/135/155 156/136/156\nf 154/134/154 156/136/156 153/137/153\nf 158/138/158 159/139/159 160/140/160\nf 158/138/158 160/140/160 157/141/157\nf 162/142/162 163/143/163 164/144/164\nf 162/142/162 164/144/164 161/145/161\nf 129/110/129 144/124/144 157/141/157\nf 129/110/129 157/141/157 160/140/160\nf 156/136/156 155/135/155 166/146/166\nf 156/136/156 166/146/166 165/147/165\nf 168/148/168 169/149/169 170/150/170\nf 168/148/168 170/150/170 167/151/167\nf 171/152/171 172/153/172 173/154/173\nf 171/152/171 173/154/173 169/149/169\nf 175/155/175 176/156/176 171/152/171\nf 175/155/175 171/152/171 174/157/174\nf 59/36/59 177/158/177 178/159/178\nf 59/36/59 178/159/178 60/37/60\nf 180/160/180 181/161/181 49/30/49\nf 180/160/180 49/30/49 179/162/179\nf 127/104/127 52/29/52 182/163/182\nf 127/104/127 182/163/182 128/105/128\nf 134/111/134 183/164/183 184/165/184\nf 134/111/134 184/165/184 124/101/124\nf 185/166/185 121/102/121 124/101/124\nf 185/166/185 124/101/124 184/165/184\nf 187/167/187 188/168/188 189/169/189\nf 187/167/187 189/169/189 186/170/186\nf 191/171/191 192/172/192 193/173/193\nf 191/171/191 193/173/193 190/174/190\nf 76/53/76 194/175/194 193/173/193\nf 76/53/76 193/173/193 77/54/77\nf 100/77/100 99/76/99 196/176/196\nf 100/77/100 196/176/196 195/177/195\nf 176/156/176 175/155/175 198/178/198\nf 176/156/176 198/178/198 197/179/197\nf 199/180/199 200/181/200 173/154/173\nf 199/180/199 173/154/173 172/153/172\nf 196/176/196 202/182/202 203/183/203\nf 196/176/196 203/183/203 201/184/201\nf 205/185/205 206/186/206 207/187/207\nf 205/185/205 207/187/207 204/188/204\nf 208/189/208 205/185/205 204/188/204\nf 208/189/208 204/188/204 201/184/201\nf 210/190/210 97/78/97 102/80/102\nf 210/190/210 102/80/102 209/191/209\nf 79/60/79 210/190/210 209/191/209\nf 79/60/79 209/191/209 87/65/87\nf 212/192/212 213/193/213 214/194/214\nf 212/192/212 214/194/214 211/195/211\nf 216/196/216 217/197/217 218/198/218\nf 216/196/216 218/198/218 215/199/215\nf 220/200/220 216/196/216 215/199/215\nf 220/200/220 215/199/215 219/201/219\nf 222/202/222 223/203/223 218/198/218\nf 222/202/222 218/198/218 221/204/221\nf 225/205/225 226/206/226 227/207/227\nf 225/205/225 227/207/227 224/208/224\nf 222/202/222 221/204/221 229/209/229\nf 222/202/222 229/209/229 228/210/228\nf 230/211/230 231/212/231 220/200/220\nf 230/211/230 220/200/220 219/201/219\nf 227/207/227 226/206/226 231/212/231\nf 227/207/227 231/212/231 230/211/230\nf 233/213/233 234/214/234 235/215/235\nf 233/213/233 235/215/235 232/216/232\nf 186/170/186 203/183/203 202/182/202\nf 186/170/186 202/182/202 187/167/187\nf 236/217/236 237/218/237 238/219/238\nf 236/217/236 238/219/238 188/168/188\nf 240/220/240 241/221/241 242/222/242\nf 240/220/240 242/222/242 239/223/239\nf 241/221/241 243/224/243 244/225/244\nf 241/221/241 244/225/244 238/219/238\nf 245/226/245 101/79/101 100/77/100\nf 245/226/245 100/77/100 195/177/195\nf 195/177/195 204/188/204 207/187/207\nf 195/177/195 207/187/207 245/226/245\nf 111/89/111 246/227/246 247/228/247\nf 111/89/111 247/228/247 115/92/115\nf 141/122/141 140/121/140 249/229/249\nf 141/122/141 249/229/249 248/230/248\nf 251/231/251 252/232/252 253/233/253\nf 251/231/251 253/233/253 250/234/250\nf 254/235/254 118/95/118 255/236/255\nf 254/235/254 255/236/255 217/197/217\nf 257/237/257 258/238/258 259/239/259\nf 257/237/257 259/239/259 256/240/256\nf 256/240/256 259/239/259 261/241/261\nf 256/240/256 261/241/261 260/242/260\nf 260/242/260 261/241/261 30/243/30\nf 260/242/260 30/243/30 29/244/29\nf 218/198/218 217/197/217 262/245/262\nf 218/198/218 262/245/262 221/204/221\nf 259/239/259 258/238/258 264/246/264\nf 259/239/259 264/246/264 263/247/263\nf 266/248/266 30/243/30 261/241/261\nf 266/248/266 261/241/261 265/249/265\nf 253/233/253 252/232/252 268/250/268\nf 253/233/253 268/250/268 267/251/267\nf 270/252/270 200/181/200 271/253/271\nf 270/252/270 271/253/271 269/254/269\nf 199/180/199 272/255/272 271/253/271\nf 199/180/199 271/253/271 200/181/200\nf 199/180/199 273/256/273 274/257/274\nf 199/180/199 274/257/274 272/255/272\nf 276/258/276 267/251/267 268/250/268\nf 276/258/276 268/250/268 275/259/275\nf 275/259/275 268/250/268 269/254/269\nf 275/259/275 269/254/269 277/260/277\nf 93/71/93 77/54/77 193/173/193\nf 93/71/93 193/173/193 192/172/192\nf 279/261/279 280/262/280 281/263/281\nf 279/261/279 281/263/281 278/264/278\nf 278/264/278 88/66/88 96/74/96\nf 278/264/278 96/74/96 279/261/279\nf 282/265/282 283/266/283 62/39/62\nf 282/265/282 62/39/62 94/72/94\nf 281/263/281 284/267/284 285/268/285\nf 281/263/281 285/268/285 278/264/278\nf 287/269/287 288/270/288 289/271/289\nf 287/269/287 289/271/289 286/272/286\nf 63/40/63 62/39/62 283/266/283\nf 63/40/63 283/266/283 290/273/290\nf 283/266/283 291/274/291 292/275/292\nf 283/266/283 292/275/292 290/273/290\nf 293/276/293 294/277/294 68/45/68\nf 293/276/293 68/45/68 67/44/67\nf 296/278/296 297/279/297 298/280/298\nf 296/278/296 298/280/298 295/281/295\nf 300/282/300 301/283/301 302/284/302\nf 300/282/300 302/284/302 299/285/299\nf 304/286/304 305/287/305 306/288/306\nf 304/286/304 306/288/306 303/289/303\nf 138/117/138 137/116/137 308/290/308\nf 138/117/138 308/290/308 307/291/307\nf 165/147/165 310/292/310 311/293/311\nf 165/147/165 311/293/311 309/294/309\nf 312/295/312 55/32/55 54/31/54\nf 312/295/312 54/31/54 151/131/151\nf 314/296/314 151/131/151 150/130/150\nf 314/296/314 150/130/150 313/297/313\nf 315/298/315 316/299/316 227/207/227\nf 315/298/315 227/207/227 230/211/230\nf 136/113/136 317/300/317 158/138/158\nf 136/113/136 158/138/158 157/141/157\nf 319/301/319 148/128/148 147/127/147\nf 319/301/319 147/127/147 318/302/318\nf 320/303/320 321/304/321 147/127/147\nf 320/303/320 147/127/147 146/126/146\nf 323/305/323 324/306/324 325/307/325\nf 323/305/323 325/307/325 322/308/322\nf 80/57/80 88/66/88 278/264/278\nf 80/57/80 278/264/278 285/268/285\nf 327/309/327 145/129/145 148/128/148\nf 327/309/327 148/128/148 326/310/326\nf 279/261/279 286/272/286 289/271/289\nf 279/261/279 289/271/289 280/262/280\nf 329/311/329 330/312/330 331/313/331\nf 329/311/329 331/313/331 328/314/328\nf 187/167/187 202/182/202 104/82/104\nf 187/167/187 104/82/104 332/315/332\nf 236/217/236 332/315/332 191/171/191\nf 236/217/236 191/171/191 190/174/190\nf 165/147/165 166/146/166 333/316/333\nf 165/147/165 333/316/333 310/292/310\nf 139/119/139 334/317/334 48/318/48\nf 139/119/139 48/318/48 43/120/43\nf 336/319/336 337/320/337 338/321/338\nf 336/319/336 338/321/338 335/322/335\nf 51/28/51 324/306/324 182/163/182\nf 51/28/51 182/163/182 52/29/52\nf 339/323/339 126/103/126 53/34/53\nf 339/323/339 53/34/53 56/33/56\nf 340/324/340 341/325/341 149/132/149\nf 340/324/340 149/132/149 152/133/152\nf 243/224/243 343/326/343 344/327/344\nf 243/224/243 344/327/344 342/328/342\nf 346/329/346 343/326/343 240/220/240\nf 346/329/346 240/220/240 345/330/345\nf 348/331/348 349/332/349 350/333/350\nf 348/331/348 350/333/350 347/334/347\nf 351/335/351 352/336/352 213/193/213\nf 351/335/351 213/193/213 212/192/212\nf 128/105/128 182/163/182 183/164/183\nf 128/105/128 183/164/183 134/111/134\nf 103/81/103 98/75/98 354/337/354\nf 103/81/103 354/337/354 353/338/353\nf 114/91/114 113/94/113 356/339/356\nf 114/91/114 356/339/356 355/340/355\nf 358/341/358 197/179/197 198/178/198\nf 358/341/358 198/178/198 357/342/357\nf 107/84/107 359/343/359 360/344/360\nf 107/84/107 360/344/360 108/85/108\nf 348/331/348 361/345/361 362/346/362\nf 348/331/348 362/346/362 349/332/349\nf 347/334/347 363/347/363 234/214/234\nf 347/334/347 234/214/234 348/331/348\nf 220/200/220 231/212/231 167/151/167\nf 220/200/220 167/151/167 364/348/364\nf 153/137/153 366/349/366 300/282/300\nf 153/137/153 300/282/300 365/350/365\nf 295/281/295 72/49/72 71/48/71\nf 295/281/295 71/48/71 296/278/296\nf 179/162/179 339/323/339 367/351/367\nf 179/162/179 367/351/367 180/160/180\nf 368/352/368 369/353/369 158/138/158\nf 368/352/368 158/138/158 317/300/317\nf 317/300/317 136/113/136 55/32/55\nf 317/300/317 55/32/55 312/295/312\nf 371/354/371 372/355/372 373/356/373\nf 371/354/371 373/356/373 370/357/370\nf 41/358/41 26/359/26 306/288/306\nf 41/358/41 306/288/306 305/287/305\nf 305/287/305 137/116/137 37/115/37\nf 305/287/305 37/115/37 41/358/41\nf 248/230/248 374/360/374 375/361/375\nf 248/230/248 375/361/375 141/122/141\nf 66/43/66 325/307/325 324/306/324\nf 66/43/66 324/306/324 51/28/51\nf 183/164/183 323/305/323 376/362/376\nf 183/164/183 376/362/376 184/165/184\nf 378/363/378 253/233/253 267/251/267\nf 378/363/378 267/251/267 377/364/377\nf 269/254/269 271/253/271 379/365/379\nf 269/254/269 379/365/379 277/260/277\nf 381/366/381 382/367/382 383/368/383\nf 381/366/381 383/368/383 380/369/380\nf 384/370/384 385/371/385 105/86/105\nf 384/370/384 105/86/105 110/88/110\nf 105/86/105 385/371/385 386/372/386\nf 105/86/105 386/372/386 106/83/106\nf 360/344/360 387/373/387 109/87/109\nf 360/344/360 109/87/109 108/85/108\nf 181/161/181 180/160/180 164/144/164\nf 181/161/181 164/144/164 163/143/163\nf 365/350/365 388/374/388 154/134/154\nf 365/350/365 154/134/154 153/137/153\nf 168/148/168 167/151/167 231/212/231\nf 168/148/168 231/212/231 226/206/226\nf 81/58/81 291/274/291 283/266/283\nf 81/58/81 283/266/283 282/265/282\nf 272/255/272 389/375/389 379/365/379\nf 272/255/272 379/365/379 271/253/271\nf 274/257/274 390/376/390 389/375/389\nf 274/257/274 389/375/389 272/255/272\nf 139/119/139 375/361/375 374/360/374\nf 139/119/139 374/360/374 334/317/334\nf 391/377/391 366/349/366 153/137/153\nf 391/377/391 153/137/153 156/136/156\nf 392/378/392 393/379/393 366/349/366\nf 392/378/392 366/349/366 391/377/391\nf 173/154/173 200/181/200 270/252/270\nf 173/154/173 270/252/270 394/380/394\nf 301/283/301 300/282/300 366/349/366\nf 301/283/301 366/349/366 393/379/393\nf 396/381/396 397/382/397 398/383/398\nf 396/381/396 398/383/398 395/384/395\nf 399/385/399 364/348/364 167/151/167\nf 399/385/399 167/151/167 170/150/170\nf 394/380/394 251/231/251 399/385/399\nf 394/380/394 399/385/399 170/150/170\nf 270/252/270 252/232/252 251/231/251\nf 270/252/270 251/231/251 394/380/394\nf 102/80/102 112/90/112 400/386/400\nf 102/80/102 400/386/400 209/191/209\nf 131/108/131 401/387/401 372/355/372\nf 131/108/131 372/355/372 371/354/371\nf 391/377/391 156/136/156 165/147/165\nf 391/377/391 165/147/165 309/294/309\nf 403/388/403 404/389/404 405/390/405\nf 403/388/403 405/390/405 402/391/402\nf 402/391/402 392/378/392 391/377/391\nf 402/391/402 391/377/391 309/294/309\nf 35/392/35 310/292/310 333/316/333\nf 35/392/35 333/316/333 25/393/25\nf 35/392/35 34/394/34 311/293/311\nf 35/392/35 311/293/311 310/292/310\nf 34/394/34 33/395/33 403/388/403\nf 34/394/34 403/388/403 311/293/311\nf 406/396/406 262/245/262 217/197/217\nf 406/396/406 217/197/217 255/236/255\nf 377/364/377 407/397/407 408/398/408\nf 377/364/377 408/398/408 406/396/406\nf 117/98/117 378/363/378 255/236/255\nf 117/98/117 255/236/255 118/95/118\nf 270/252/270 269/254/269 268/250/268\nf 270/252/270 268/250/268 252/232/252\nf 304/286/304 303/289/303 373/356/373\nf 304/286/304 373/356/373 372/355/372\nf 362/346/362 409/399/409 410/400/410\nf 362/346/362 410/400/410 349/332/349\nf 411/401/411 412/402/412 89/70/89\nf 411/401/411 89/70/89 92/69/92\nf 414/403/414 411/401/411 415/404/415\nf 414/403/414 415/404/415 413/405/413\nf 417/406/417 336/319/336 418/407/418\nf 417/406/417 418/407/418 416/408/416\nf 337/320/337 419/409/419 69/50/69\nf 337/320/337 69/50/69 72/49/72\nf 421/410/421 422/411/422 423/412/423\nf 421/410/421 423/412/423 420/413/420\nf 421/410/421 424/414/424 425/415/425\nf 421/410/421 425/415/425 422/411/422\nf 423/412/423 422/411/422 427/416/427\nf 423/412/423 427/416/427 426/417/426\nf 239/223/239 242/222/242 428/418/428\nf 239/223/239 428/418/428 425/415/425\nf 430/419/430 73/52/73 74/51/74\nf 430/419/430 74/51/74 429/420/429\nf 70/47/70 69/50/69 419/409/419\nf 70/47/70 419/409/419 429/420/429\nf 247/228/247 431/421/431 116/93/116\nf 247/228/247 116/93/116 115/92/115\nf 346/329/346 345/330/345 433/422/433\nf 346/329/346 433/422/433 432/423/432\nf 433/422/433 421/410/421 420/413/420\nf 433/422/433 420/413/420 434/424/434\nf 436/425/436 437/426/437 438/427/438\nf 436/425/436 438/427/438 435/428/435\nf 437/426/437 381/366/381 380/369/380\nf 437/426/437 380/369/380 438/427/438\nf 178/159/178 177/158/177 440/429/440\nf 178/159/178 440/429/440 439/430/439\nf 440/429/440 441/431/441 442/432/442\nf 440/429/440 442/432/442 439/430/439\nf 444/433/444 445/434/445 446/435/446\nf 444/433/444 446/435/446 443/436/443\nf 324/306/324 323/305/323 183/164/183\nf 324/306/324 183/164/183 182/163/182\nf 213/193/213 352/336/352 357/342/357\nf 213/193/213 357/342/357 198/178/198\nf 214/194/214 175/155/175 174/157/174\nf 214/194/214 174/157/174 225/205/225\nf 448/437/448 449/438/449 450/439/450\nf 448/437/448 450/439/450 447/440/447\nf 423/412/423 426/417/426 451/441/451\nf 423/412/423 451/441/451 447/440/447\nf 75/56/75 451/441/451 426/417/426\nf 75/56/75 426/417/426 76/53/76\nf 78/55/78 94/72/94 62/39/62\nf 78/55/78 62/39/62 61/42/61\nf 286/272/286 86/63/86 85/62/85\nf 286/272/286 85/62/85 287/269/287\nf 95/73/95 87/65/87 209/191/209\nf 95/73/95 209/191/209 400/386/400\nf 237/218/237 452/442/452 428/418/428\nf 237/218/237 428/418/428 242/222/242\nf 190/174/190 193/173/193 194/175/194\nf 190/174/190 194/175/194 452/442/452\nf 237/218/237 236/217/236 190/174/190\nf 237/218/237 190/174/190 452/442/452\nf 79/60/79 82/59/82 354/337/354\nf 79/60/79 354/337/354 210/190/210\nf 286/272/286 279/261/279 96/74/96\nf 286/272/286 96/74/96 86/63/86\nf 430/419/430 417/406/417 416/408/416\nf 430/419/430 416/408/416 453/443/453\nf 338/321/338 295/281/295 298/280/298\nf 338/321/338 298/280/298 299/285/299\nf 57/38/57 60/37/60 455/444/455\nf 57/38/57 455/444/455 454/445/454\nf 212/192/212 456/446/456 457/447/457\nf 212/192/212 457/447/457 351/335/351\nf 83/64/83 355/340/355 356/339/356\nf 83/64/83 356/339/356 84/61/84\nf 142/123/142 141/122/141 375/361/375\nf 142/123/142 375/361/375 307/291/307\nf 401/387/401 142/123/142 307/291/307\nf 401/387/401 307/291/307 308/290/308\nf 459/448/459 257/237/257 256/240/256\nf 459/448/459 256/240/256 458/449/458\nf 228/210/228 264/246/264 258/238/258\nf 228/210/228 258/238/258 222/202/222\nf 256/240/256 260/242/260 460/450/460\nf 256/240/256 460/450/460 458/449/458\nf 460/450/460 260/242/260 29/244/29\nf 460/450/460 29/244/29 47/451/47\nf 263/247/263 265/249/265 261/241/261\nf 263/247/263 261/241/261 259/239/259\nf 461/452/461 462/453/462 189/169/189\nf 461/452/461 189/169/189 244/225/244\nf 227/207/227 316/299/316 463/454/463\nf 227/207/227 463/454/463 224/208/224\nf 465/455/465 466/456/466 410/400/410\nf 465/455/465 410/400/410 464/457/464\nf 90/67/90 386/372/386 385/371/385\nf 90/67/90 385/371/385 91/68/91\nf 233/213/233 361/345/361 348/331/348\nf 233/213/233 348/331/348 234/214/234\nf 235/215/235 234/214/234 363/347/363\nf 235/215/235 363/347/363 467/458/467\nf 338/321/338 337/320/337 72/49/72\nf 338/321/338 72/49/72 295/281/295\nf 338/321/338 299/285/299 302/284/302\nf 338/321/338 302/284/302 335/322/335\nf 468/459/468 469/460/469 470/461/470\nf 468/459/468 470/461/470 415/404/415\nf 347/334/347 471/462/471 472/463/472\nf 347/334/347 472/463/472 363/347/363\nf 471/462/471 347/334/347 350/333/350\nf 471/462/471 350/333/350 473/464/473\nf 465/455/465 475/465/475 476/466/476\nf 465/455/465 476/466/476 474/467/474\nf 384/370/384 110/88/110 478/468/478\nf 384/370/384 478/468/478 477/469/477\nf 414/403/414 479/470/479 412/402/412\nf 414/403/414 412/402/412 411/401/411\nf 288/270/288 287/269/287 412/402/412\nf 288/270/288 412/402/412 479/470/479\nf 85/62/85 84/61/84 90/67/90\nf 85/62/85 90/67/90 89/70/89\nf 386/372/386 356/339/356 113/94/113\nf 386/372/386 113/94/113 106/83/106\nf 232/216/232 358/341/358 357/342/357\nf 232/216/232 357/342/357 233/213/233\nf 297/279/297 296/278/296 181/161/181\nf 297/279/297 181/161/181 163/143/163\nf 419/409/419 337/320/337 336/319/336\nf 419/409/419 336/319/336 417/406/417\nf 49/30/49 52/29/52 127/104/127\nf 49/30/49 127/104/127 179/162/179\nf 26/359/26 25/393/25 333/316/333\nf 26/359/26 333/316/333 306/288/306\nf 371/354/371 370/357/370 162/142/162\nf 371/354/371 162/142/162 161/145/161\nf 258/238/258 257/237/257 223/203/223\nf 258/238/258 223/203/223 222/202/222\nf 257/237/257 459/448/459 480/471/480\nf 257/237/257 480/471/480 223/203/223\nf 211/195/211 214/194/214 225/205/225\nf 211/195/211 225/205/225 224/208/224\nf 316/299/316 481/472/481 314/296/314\nf 316/299/316 314/296/314 463/454/463\nf 171/152/171 169/149/169 168/148/168\nf 171/152/171 168/148/168 174/157/174\nf 273/256/273 199/180/199 172/153/172\nf 273/256/273 172/153/172 482/473/482\nf 168/148/168 226/206/226 225/205/225\nf 168/148/168 225/205/225 174/157/174\nf 245/226/245 246/227/246 111/89/111\nf 245/226/245 111/89/111 101/79/101\nf 114/91/114 112/90/112 111/89/111\nf 114/91/114 111/89/111 115/92/115\nf 210/190/210 354/337/354 98/75/98\nf 210/190/210 98/75/98 97/78/97\nf 431/421/431 358/341/358 232/216/232\nf 431/421/431 232/216/232 359/343/359\nf 235/215/235 360/344/360 359/343/359\nf 235/215/235 359/343/359 232/216/232\nf 360/344/360 235/215/235 467/458/467\nf 360/344/360 467/458/467 387/373/387\nf 81/58/81 282/265/282 483/474/483\nf 81/58/81 483/474/483 82/59/82\nf 485/475/485 486/476/486 487/477/487\nf 485/475/485 487/477/487 484/478/484\nf 489/479/489 68/45/68 294/277/294\nf 489/479/489 294/277/294 488/480/488\nf 491/481/491 454/445/454 455/444/455\nf 491/481/491 455/444/455 490/482/490\nf 154/134/154 370/357/370 373/356/373\nf 154/134/154 373/356/373 155/135/155\nf 491/481/491 322/308/322 325/307/325\nf 491/481/491 325/307/325 492/483/492\nf 491/481/491 490/482/490 493/484/493\nf 491/481/491 493/484/493 322/308/322\nf 436/425/436 435/428/435 446/435/446\nf 436/425/436 446/435/446 494/485/494\nf 495/486/495 496/487/496 438/427/438\nf 495/486/495 438/427/438 380/369/380\nf 496/487/496 497/488/497 435/428/435\nf 496/487/496 435/428/435 438/427/438\nf 331/313/331 330/312/330 498/489/498\nf 331/313/331 498/489/498 432/423/432\nf 499/490/499 346/329/346 432/423/432\nf 499/490/499 432/423/432 498/489/498\nf 380/369/380 383/368/383 500/491/500\nf 380/369/380 500/491/500 495/486/495\nf 501/492/501 328/314/328 331/313/331\nf 501/492/501 331/313/331 434/424/434\nf 499/490/499 344/327/344 343/326/343\nf 499/490/499 343/326/343 346/329/346\nf 492/483/492 502/493/502 454/445/454\nf 492/483/492 454/445/454 491/481/491\nf 454/445/454 502/493/502 487/477/487\nf 454/445/454 487/477/487 57/38/57\nf 486/476/486 58/35/58 57/38/57\nf 486/476/486 57/38/57 487/477/487\nf 58/35/58 486/476/486 503/494/503\nf 58/35/58 503/494/503 382/367/382\nf 383/368/383 504/495/504 505/496/505\nf 383/368/383 505/496/505 500/491/500\nf 447/440/447 450/439/450 420/413/420\nf 447/440/447 420/413/420 423/412/423\nf 329/311/329 328/314/328 445/434/445\nf 329/311/329 445/434/445 444/433/444\nf 450/439/450 449/438/449 506/497/506\nf 450/439/450 506/497/506 501/492/501\nf 507/498/507 508/499/508 451/441/451\nf 507/498/507 451/441/451 75/56/75\nf 99/76/99 104/82/104 202/182/202\nf 99/76/99 202/182/202 196/176/196\nf 509/500/509 208/189/208 201/184/201\nf 509/500/509 201/184/201 203/183/203\nf 201/184/201 204/188/204 195/177/195\nf 201/184/201 195/177/195 196/176/196\nf 462/453/462 510/501/510 186/170/186\nf 462/453/462 186/170/186 189/169/189\nf 203/183/203 186/170/186 510/501/510\nf 203/183/203 510/501/510 509/500/509\nf 148/128/148 319/301/319 341/325/341\nf 148/128/148 341/325/341 326/310/326\nf 326/310/326 341/325/341 340/324/340\nf 326/310/326 340/324/340 511/502/511\nf 123/100/123 511/502/511 340/324/340\nf 123/100/123 340/324/340 133/112/133\nf 71/48/71 49/30/49 181/161/181\nf 71/48/71 181/161/181 296/278/296\nf 154/134/154 388/374/388 162/142/162\nf 154/134/154 162/142/162 370/357/370\nf 155/135/155 373/356/373 303/289/303\nf 155/135/155 303/289/303 166/146/166\nf 166/146/166 303/289/303 306/288/306\nf 166/146/166 306/288/306 333/316/333\nf 512/503/512 320/303/320 289/271/289\nf 512/503/512 289/271/289 288/270/288\nf 479/470/479 414/403/414 514/504/514\nf 479/470/479 514/504/514 513/505/513\nf 414/403/414 413/405/413 475/465/475\nf 414/403/414 475/465/475 514/504/514\nf 513/505/513 512/503/512 288/270/288\nf 513/505/513 288/270/288 479/470/479\nf 191/171/191 103/81/103 353/338/353\nf 191/171/191 353/338/353 192/172/192\nf 332/315/332 104/82/104 103/81/103\nf 332/315/332 103/81/103 191/171/191\nf 82/59/82 483/474/483 353/338/353\nf 82/59/82 353/338/353 354/337/354\nf 83/64/83 86/63/86 96/74/96\nf 83/64/83 96/74/96 95/73/95\nf 83/64/83 95/73/95 400/386/400\nf 83/64/83 400/386/400 355/340/355\nf 355/340/355 400/386/400 112/90/112\nf 355/340/355 112/90/112 114/91/114\nf 144/124/144 135/114/135 136/113/136\nf 144/124/144 136/113/136 157/141/157\nf 298/280/298 365/350/365 300/282/300\nf 298/280/298 300/282/300 299/285/299\nf 298/280/298 297/279/297 388/374/388\nf 298/280/298 388/374/388 365/350/365\nf 367/351/367 143/125/143 164/144/164\nf 367/351/367 164/144/164 180/160/180\nf 515/506/515 516/507/516 219/201/219\nf 515/506/515 219/201/219 215/199/215\nf 254/235/254 217/197/217 216/196/216\nf 254/235/254 216/196/216 517/508/517\nf 398/383/398 364/348/364 399/385/399\nf 398/383/398 399/385/399 395/384/395\nf 398/383/398 397/382/397 517/508/517\nf 398/383/398 517/508/517 216/196/216\nf 518/509/518 519/510/519 246/227/246\nf 518/509/518 246/227/246 245/226/245\nf 319/301/319 150/130/150 149/132/149\nf 319/301/319 149/132/149 341/325/341\nf 429/420/429 419/409/419 417/406/417\nf 429/420/429 417/406/417 430/419/430\nf 33/395/33 46/511/46 404/389/404\nf 33/395/33 404/389/404 403/388/403\nf 403/388/403 402/391/402 309/294/309\nf 403/388/403 309/294/309 311/293/311\nf 393/379/393 520/512/520 521/513/521\nf 393/379/393 521/513/521 301/283/301\nf 522/514/522 520/512/520 393/379/393\nf 522/514/522 393/379/393 392/378/392\nf 302/284/302 301/283/301 521/513/521\nf 302/284/302 521/513/521 523/515/523\nf 302/284/302 523/515/523 524/516/524\nf 302/284/302 524/516/524 335/322/335\nf 321/304/321 456/446/456 318/302/318\nf 321/304/321 318/302/318 147/127/147\nf 456/446/456 321/304/321 525/517/525\nf 456/446/456 525/517/525 457/447/457\nf 410/400/410 409/399/409 526/518/526\nf 410/400/410 526/518/526 464/457/464\nf 410/400/410 466/456/466 350/333/350\nf 410/400/410 350/333/350 349/332/349\nf 456/446/456 212/192/212 211/195/211\nf 456/446/456 211/195/211 527/519/527\nf 211/195/211 224/208/224 463/454/463\nf 211/195/211 463/454/463 527/519/527\nf 407/397/407 377/364/377 267/251/267\nf 407/397/407 267/251/267 276/258/276\nf 378/363/378 377/364/377 406/396/406\nf 378/363/378 406/396/406 255/236/255\nf 175/155/175 214/194/214 213/193/213\nf 175/155/175 213/193/213 198/178/198\nf 386/372/386 90/67/90 84/61/84\nf 386/372/386 84/61/84 356/339/356\nf 409/399/409 362/346/362 351/335/351\nf 409/399/409 351/335/351 457/447/457\nf 85/62/85 89/70/89 412/402/412\nf 85/62/85 412/402/412 287/269/287\nf 361/345/361 233/213/233 357/342/357\nf 361/345/361 357/342/357 352/336/352\nf 116/93/116 431/421/431 359/343/359\nf 116/93/116 359/343/359 107/84/107\nf 116/93/116 107/84/107 106/83/106\nf 116/93/116 106/83/106 113/94/113\nf 352/336/352 351/335/351 362/346/362\nf 352/336/352 362/346/362 361/345/361\nf 513/505/513 514/504/514 464/457/464\nf 513/505/513 464/457/464 526/518/526\nf 526/518/526 409/399/409 457/447/457\nf 526/518/526 457/447/457 525/517/525\nf 514/504/514 475/465/475 465/455/465\nf 514/504/514 465/455/465 464/457/464\nf 358/341/358 431/421/431 247/228/247\nf 358/341/358 247/228/247 197/179/197\nf 176/156/176 482/473/482 172/153/172\nf 176/156/176 172/153/172 171/152/171\nf 396/381/396 395/384/395 250/234/250\nf 396/381/396 250/234/250 119/96/119\nf 395/384/395 399/385/399 251/231/251\nf 395/384/395 251/231/251 250/234/250\nf 291/274/291 81/58/81 80/57/80\nf 291/274/291 80/57/80 285/268/285\nf 284/267/284 292/275/292 291/274/291\nf 284/267/284 291/274/291 285/268/285\nf 528/520/528 327/309/327 326/310/326\nf 528/520/528 326/310/326 511/502/511\nf 126/103/126 125/106/125 152/133/152\nf 126/103/126 152/133/152 53/34/53\nf 152/133/152 125/106/125 133/112/133\nf 152/133/152 133/112/133 340/324/340\nf 127/104/127 126/103/126 339/323/339\nf 127/104/127 339/323/339 179/162/179\nf 56/33/56 135/114/135 367/351/367\nf 56/33/56 367/351/367 339/323/339\nf 124/101/124 123/100/123 133/112/133\nf 124/101/124 133/112/133 134/111/134\nf 143/125/143 367/351/367 135/114/135\nf 143/125/143 135/114/135 144/124/144\nf 164/144/164 143/125/143 132/109/132\nf 164/144/164 132/109/132 161/145/161\nf 401/387/401 131/108/131 130/107/130\nf 401/387/401 130/107/130 142/123/142\nf 292/275/292 528/520/528 122/99/122\nf 292/275/292 122/99/122 290/273/290\nf 61/42/61 507/498/507 75/56/75\nf 61/42/61 75/56/75 78/55/78\nf 320/303/320 512/503/512 525/517/525\nf 320/303/320 525/517/525 321/304/321\nf 512/503/512 513/505/513 526/518/526\nf 512/503/512 526/518/526 525/517/525\nf 123/100/123 122/99/122 528/520/528\nf 123/100/123 528/520/528 511/502/511\nf 262/245/262 529/521/529 229/209/229\nf 262/245/262 229/209/229 221/204/221\nf 316/299/316 315/298/315 368/352/368\nf 316/299/316 368/352/368 481/472/481\nf 516/507/516 315/298/315 230/211/230\nf 516/507/516 230/211/230 219/201/219\nf 515/506/515 530/522/530 369/353/369\nf 515/506/515 369/353/369 516/507/516\nf 530/522/530 515/506/515 223/203/223\nf 530/522/530 223/203/223 480/471/480\nf 215/199/215 218/198/218 223/203/223\nf 215/199/215 223/203/223 515/506/515\nf 459/448/459 458/449/458 374/360/374\nf 459/448/459 374/360/374 248/230/248\nf 458/449/458 460/450/460 334/317/334\nf 458/449/458 334/317/334 374/360/374\nf 334/317/334 460/450/460 47/451/47\nf 334/317/334 47/451/47 48/318/48\nf 459/448/459 248/230/248 249/229/249\nf 459/448/459 249/229/249 480/471/480\nf 253/233/253 120/97/120 119/96/119\nf 253/233/253 119/96/119 250/234/250\nf 394/380/394 170/150/170 169/149/169\nf 394/380/394 169/149/169 173/154/173\nf 519/510/519 482/473/482 176/156/176\nf 519/510/519 176/156/176 197/179/197\nf 518/509/518 273/256/273 482/473/482\nf 518/509/518 482/473/482 519/510/519\nf 531/523/531 274/257/274 273/256/273\nf 531/523/531 273/256/273 518/509/518\nf 532/524/532 390/376/390 274/257/274\nf 532/524/532 274/257/274 531/523/531\nf 343/326/343 243/224/243 241/221/241\nf 343/326/343 241/221/241 240/220/240\nf 188/168/188 238/219/238 244/225/244\nf 188/168/188 244/225/244 189/169/189\nf 187/167/187 332/315/332 236/217/236\nf 187/167/187 236/217/236 188/168/188\nf 447/440/447 451/441/451 508/499/508\nf 447/440/447 508/499/508 448/437/448\nf 162/142/162 388/374/388 297/279/297\nf 162/142/162 297/279/297 163/143/163\nf 392/378/392 402/391/402 405/390/405\nf 392/378/392 405/390/405 522/514/522\nf 533/525/533 413/405/413 415/404/415\nf 533/525/533 415/404/415 470/461/470\nf 534/526/534 65/46/65 68/45/68\nf 534/526/534 68/45/68 489/479/489\nf 502/493/502 535/527/535 484/478/484\nf 502/493/502 484/478/484 487/477/487\nf 503/494/503 536/528/536 537/529/537\nf 503/494/503 537/529/537 504/495/504\nf 492/483/492 538/530/538 535/527/535\nf 492/483/492 535/527/535 502/493/502\nf 492/483/492 325/307/325 66/43/66\nf 492/483/492 66/43/66 65/46/65\nf 504/495/504 537/529/537 539/531/539\nf 504/495/504 539/531/539 505/496/505\nf 239/223/239 424/414/424 345/330/345\nf 239/223/239 345/330/345 240/220/240\nf 59/36/59 58/35/58 382/367/382\nf 59/36/59 382/367/382 381/366/381\nf 432/423/432 433/422/433 434/424/434\nf 432/423/432 434/424/434 331/313/331\nf 437/426/437 436/425/436 440/429/440\nf 437/426/437 440/429/440 177/158/177\nf 381/366/381 437/426/437 177/158/177\nf 381/366/381 177/158/177 59/36/59\nf 449/438/449 441/431/441 494/485/494\nf 449/438/449 494/485/494 506/497/506\nf 450/439/450 501/492/501 434/424/434\nf 450/439/450 434/424/434 420/413/420\nf 382/367/382 503/494/503 504/495/504\nf 382/367/382 504/495/504 383/368/383\nf 501/492/501 506/497/506 445/434/445\nf 501/492/501 445/434/445 328/314/328\nf 536/528/536 503/494/503 486/476/486\nf 536/528/536 486/476/486 485/475/485\nf 313/297/313 150/130/150 319/301/319\nf 313/297/313 319/301/319 318/302/318\nf 327/309/327 284/267/284 281/263/281\nf 327/309/327 281/263/281 145/129/145\nf 483/474/483 93/71/93 192/172/192\nf 483/474/483 192/172/192 353/338/353\nf 483/474/483 282/265/282 94/72/94\nf 483/474/483 94/72/94 93/71/93\nf 422/411/422 425/415/425 428/418/428\nf 422/411/422 428/418/428 427/416/427\nf 421/410/421 433/422/433 345/330/345\nf 421/410/421 345/330/345 424/414/424\nf 463/454/463 314/296/314 313/297/313\nf 463/454/463 313/297/313 527/519/527\nf 315/298/315 516/507/516 369/353/369\nf 315/298/315 369/353/369 368/352/368\nf 314/296/314 481/472/481 312/295/312\nf 314/296/314 312/295/312 151/131/151\nf 368/352/368 317/300/317 312/295/312\nf 368/352/368 312/295/312 481/472/481\nf 369/353/369 530/522/530 159/139/159\nf 369/353/369 159/139/159 158/138/158\nf 480/471/480 249/229/249 159/139/159\nf 480/471/480 159/139/159 530/522/530\nf 262/245/262 406/396/406 408/398/408\nf 262/245/262 408/398/408 529/521/529\nf 398/383/398 216/196/216 220/200/220\nf 398/383/398 220/200/220 364/348/364\nf 541/532/541 542/533/542 543/534/543\nf 541/532/541 543/534/543 540/535/540\nf 545/536/545 543/534/543 542/533/542\nf 545/536/545 542/533/542 544/537/544\nf 547/538/547 545/536/545 544/537/544\nf 547/538/547 544/537/544 546/539/546\nf 549/540/549 547/538/547 546/539/546\nf 549/540/549 546/539/546 548/541/548\nf 551/542/551 549/540/549 548/541/548\nf 551/542/551 548/541/548 550/543/550\nf 553/544/553 551/542/551 550/543/550\nf 553/544/553 550/543/550 552/545/552\nf 555/546/555 553/544/553 552/545/552\nf 555/546/555 552/545/552 554/547/554\nf 557/548/557 558/549/558 559/550/559\nf 557/548/557 559/550/559 556/551/556\nf 561/552/561 557/548/557 556/551/556\nf 561/552/561 556/551/556 560/553/560\nf 563/554/563 546/539/546 544/537/544\nf 563/554/563 544/537/544 562/555/562\nf 564/556/564 548/541/548 546/539/546\nf 564/556/564 546/539/546 563/554/563\nf 565/557/565 550/543/550 548/541/548\nf 565/557/565 548/541/548 564/556/564\nf 566/558/566 552/545/552 550/543/550\nf 566/558/566 550/543/550 565/557/565\nf 552/545/552 566/558/566 567/559/567\nf 552/545/552 567/559/567 554/547/554\nf 559/550/559 568/560/568 569/561/569\nf 559/550/559 569/561/569 556/551/556\nf 570/562/570 560/553/560 556/551/556\nf 570/562/570 556/551/556 569/561/569\nf 571/563/571 572/564/572 560/553/560\nf 571/563/571 560/553/560 570/562/570\nf 574/565/574 540/535/540 575/566/575\nf 574/565/574 575/566/575 573/567/573\nf 577/568/577 543/534/543 545/536/545\nf 577/568/577 545/536/545 576/569/576\nf 545/536/545 547/538/547 578/570/578\nf 545/536/545 578/570/578 576/569/576\nf 579/571/579 578/570/578 547/538/547\nf 579/571/579 547/538/547 549/540/549\nf 580/572/580 579/571/579 551/542/551\nf 580/572/580 551/542/551 553/544/553\nf 580/572/580 553/544/553 555/546/555\nf 580/572/580 555/546/555 581/573/581\nf 558/549/558 557/548/557 583/574/583\nf 558/549/558 583/574/583 582/575/582\nf 561/552/561 584/576/584 583/574/583\nf 561/552/561 583/574/583 557/548/557\nf 561/552/561 572/564/572 585/577/585\nf 561/552/561 585/577/585 584/576/584\nf 571/563/571 586/578/586 585/577/585\nf 571/563/571 585/577/585 572/564/572\nf 544/537/544 542/533/542 541/532/541\nf 544/537/544 541/532/541 562/555/562\nf 574/565/574 588/579/588 589/580/589\nf 574/565/574 589/580/589 587/581/587\nf 574/565/574 573/567/573 590/582/590\nf 574/565/574 590/582/590 588/579/588\nf 590/582/590 573/567/573 575/566/575\nf 590/582/590 575/566/575 591/583/591\nf 575/566/575 540/535/540 543/534/543\nf 575/566/575 543/534/543 591/583/591\nf 564/556/564 592/584/592 566/558/566\nf 564/556/564 566/558/566 565/557/565\nf 592/584/592 593/585/593 567/559/567\nf 592/584/592 567/559/567 566/558/566\nf 568/560/568 559/550/559 554/547/554\nf 568/560/568 554/547/554 567/559/567\nf 554/547/554 559/550/559 558/549/558\nf 554/547/554 558/549/558 555/546/555\nf 582/575/582 581/573/581 555/546/555\nf 582/575/582 555/546/555 558/549/558\nf 592/584/592 564/556/564 563/554/563\nf 592/584/592 563/554/563 562/555/562\nf 589/580/589 568/560/568 567/559/567\nf 589/580/589 567/559/567 593/585/593\nf 540/535/540 574/565/574 587/581/587\nf 540/535/540 587/581/587 541/532/541\nf 571/563/571 570/562/570 590/582/590\nf 571/563/571 590/582/590 591/583/591\nf 589/580/589 588/579/588 569/561/569\nf 589/580/589 569/561/569 568/560/568\nf 543/534/543 577/568/577 594/586/594\nf 543/534/543 594/586/594 591/583/591\nf 594/586/594 586/578/586 571/563/571\nf 594/586/594 571/563/571 591/583/591\nf 596/587/596 581/573/581 582/575/582\nf 596/587/596 582/575/582 595/588/595\nf 596/587/596 597/589/597 580/572/580\nf 596/587/596 580/572/580 581/573/581\nf 583/574/583 490/482/490 455/444/455\nf 583/574/583 455/444/455 595/588/595\nf 583/574/583 584/576/584 493/484/493\nf 583/574/583 493/484/493 490/482/490\nf 597/589/597 508/499/508 579/571/579\nf 597/589/597 579/571/579 580/572/580\nf 442/432/442 448/437/448 508/499/508\nf 442/432/442 508/499/508 597/589/597\nf 60/37/60 178/159/178 595/588/595\nf 60/37/60 595/588/595 455/444/455\nf 178/159/178 439/430/439 596/587/596\nf 178/159/178 596/587/596 595/588/595\nf 577/568/577 64/41/64 185/166/185\nf 577/568/577 185/166/185 594/586/594\nf 586/578/586 184/165/184 376/362/376\nf 586/578/586 376/362/376 585/577/585\nf 590/582/590 570/562/570 569/561/569\nf 590/582/590 569/561/569 588/579/588\nf 61/42/61 576/569/576 578/570/578\nf 61/42/61 578/570/578 507/498/507\nf 585/577/585 376/362/376 493/484/493\nf 585/577/585 493/484/493 584/576/584\nf 453/443/453 598/590/598 73/52/73\nf 453/443/453 73/52/73 430/419/430\nf 519/510/519 197/179/197 247/228/247\nf 519/510/519 247/228/247 246/227/246\nf 281/263/281 280/262/280 146/126/146\nf 281/263/281 146/126/146 145/129/145\nf 64/41/64 63/40/63 121/102/121\nf 64/41/64 121/102/121 185/166/185\nf 284/267/284 327/309/327 528/520/528\nf 284/267/284 528/520/528 292/275/292\nf 290/273/290 122/99/122 121/102/121\nf 290/273/290 121/102/121 63/40/63\nf 280/262/280 289/271/289 320/303/320\nf 280/262/280 320/303/320 146/126/146\nf 184/165/184 586/578/586 594/586/594\nf 184/165/184 594/586/594 185/166/185\nf 253/233/253 378/363/378 117/98/117\nf 253/233/253 117/98/117 120/97/120\nf 249/229/249 140/121/140 160/140/160\nf 249/229/249 160/140/160 159/139/159\nf 129/110/129 160/140/160 140/121/140\nf 129/110/129 140/121/140 130/107/130\nf 161/145/161 132/109/132 131/108/131\nf 161/145/161 131/108/131 371/354/371\nf 313/297/313 318/302/318 456/446/456\nf 313/297/313 456/446/456 527/519/527\nf 492/483/492 65/46/65 534/526/534\nf 492/483/492 534/526/534 538/530/538\nf 441/431/441 449/438/449 448/437/448\nf 441/431/441 448/437/448 442/432/442\nf 443/436/443 446/435/446 435/428/435\nf 443/436/443 435/428/435 497/488/497\nf 446/435/446 445/434/445 506/497/506\nf 446/435/446 506/497/506 494/485/494\nf 441/431/441 440/429/440 436/425/436\nf 441/431/441 436/425/436 494/485/494\nf 596/587/596 439/430/439 442/432/442\nf 596/587/596 442/432/442 597/589/597\nf 577/568/577 576/569/576 61/42/61\nf 577/568/577 61/42/61 64/41/64\nf 238/219/238 237/218/237 242/222/242\nf 238/219/238 242/222/242 241/221/241\nf 194/175/194 76/53/76 426/417/426\nf 194/175/194 426/417/426 427/416/427\nf 452/442/452 194/175/194 427/416/427\nf 452/442/452 427/416/427 428/418/428\nf 461/452/461 244/225/244 243/224/243\nf 461/452/461 243/224/243 342/328/342\nf 508/499/508 507/498/507 578/570/578\nf 508/499/508 578/570/578 579/571/579\nf 245/226/245 207/187/207 531/523/531\nf 245/226/245 531/523/531 518/509/518\nf 206/186/206 532/524/532 531/523/531\nf 206/186/206 531/523/531 207/187/207\nf 32/9/32 31/12/31 600/591/600\nf 32/9/32 600/591/600 599/592/599\nf 601/593/601 600/591/600 36/13/36\nf 601/593/601 36/13/36 24/1/24\nf 602/594/602 601/593/601 24/1/24\nf 602/594/602 24/1/24 23/4/23\nf 40/17/40 602/594/602 23/4/23\nf 40/17/40 23/4/23 42/19/42\nf 44/22/44 604/595/604 605/596/605\nf 44/22/44 605/596/605 603/597/603\nf 39/16/39 603/597/603 602/594/602\nf 39/16/39 602/594/602 40/17/40\nf 601/593/601 606/598/606 607/599/607\nf 601/593/601 607/599/607 600/591/600\nf 468/459/468 608/600/608 609/601/609\nf 468/459/468 609/601/609 469/460/469\nf 477/469/477 609/601/609 608/600/608\nf 477/469/477 608/600/608 384/370/384\nf 610/602/610 611/603/611 612/604/612\nf 610/602/610 612/604/612 472/605/472\nf 610/602/610 472/605/472 471/606/471\nf 610/602/610 471/606/471 613/607/613\nf 476/608/476 614/609/614 615/610/615\nf 476/608/476 615/610/615 474/611/474\nf 478/468/478 110/88/110 109/87/109\nf 478/468/478 109/87/109 616/612/616\nf 466/456/466 465/455/465 474/467/474\nf 466/456/466 474/467/474 617/613/617\nf 466/456/466 617/613/617 473/464/473\nf 466/456/466 473/464/473 350/333/350\nf 614/609/614 533/614/533 470/615/470\nf 614/609/614 470/615/470 618/616/618\nf 475/465/475 413/405/413 533/525/533\nf 475/465/475 533/525/533 476/466/476\nf 618/616/618 469/617/469 609/618/609\nf 618/616/618 609/618/609 619/619/619\nf 619/619/619 609/618/609 477/620/477\nf 619/619/619 477/620/477 620/621/620\nf 387/373/387 621/622/621 616/612/616\nf 387/373/387 616/612/616 109/87/109\nf 616/623/616 622/624/622 620/621/620\nf 616/623/616 620/621/620 478/625/478\nf 473/626/473 617/627/617 615/610/615\nf 473/626/473 615/610/615 613/607/613\nf 621/628/621 623/629/623 622/624/622\nf 621/628/621 622/624/622 616/623/616\nf 624/630/624 612/604/612 611/603/611\nf 624/630/624 611/603/611 623/629/623\nf 49/30/49 71/48/71 70/47/70\nf 49/30/49 70/47/70 50/27/50\nf 336/319/336 335/322/335 524/516/524\nf 336/319/336 524/516/524 418/407/418\nf 598/590/598 293/276/293 67/44/67\nf 598/590/598 67/44/67 73/52/73\nf 50/27/50 70/47/70 429/420/429\nf 50/27/50 429/420/429 74/51/74\nf 322/308/322 493/484/493 376/362/376\nf 322/308/322 376/362/376 323/305/323\nf 589/580/589 593/585/593 592/584/592\nf 589/580/589 592/584/592 587/581/587\nf 396/381/396 119/96/119 118/95/118\nf 396/381/396 118/95/118 254/235/254\nf 517/508/517 397/382/397 396/381/396\nf 517/508/517 396/381/396 254/235/254\nf 28/5/28 27/8/27 625/631/625\nf 28/5/28 625/631/625 604/595/604\nf 600/591/600 607/599/607 626/632/626\nf 600/591/600 626/632/626 599/592/599\nf 607/599/607 627/633/627 628/634/628\nf 607/599/607 628/634/628 626/632/626\nf 604/595/604 625/631/625 628/634/628\nf 604/595/604 628/634/628 627/633/627\nf 630/635/630 631/636/631 632/637/632\nf 630/635/630 632/637/632 629/638/629\nf 634/639/634 635/640/635 636/641/636\nf 634/639/634 636/641/636 633/642/633\nf 638/643/638 639/644/639 640/645/640\nf 638/643/638 640/645/640 637/646/637\nf 641/647/641 642/648/642 637/646/637\nf 641/647/641 637/646/637 640/645/640\nf 644/649/644 645/650/645 646/651/646\nf 644/649/644 646/651/646 643/652/643\nf 631/636/631 642/648/642 648/653/648\nf 631/636/631 648/653/648 647/654/647\nf 650/655/650 651/656/651 652/657/652\nf 650/655/650 652/657/652 649/658/649\nf 643/652/643 646/651/646 654/659/654\nf 643/652/643 654/659/654 653/660/653\nf 654/659/654 651/656/651 650/655/650\nf 654/659/654 650/655/650 653/660/653\nf 655/661/655 656/662/656 657/663/657\nf 655/661/655 657/663/657 632/637/632\nf 657/663/657 659/664/659 660/665/660\nf 657/663/657 660/665/660 658/666/658\nf 661/667/661 659/664/659 657/663/657\nf 661/667/661 657/663/657 656/662/656\nf 631/636/631 647/654/647 655/661/655\nf 631/636/631 655/661/655 632/637/632\nf 637/646/637 642/648/642 631/636/631\nf 637/646/637 631/636/631 630/635/630\nf 640/645/640 650/655/650 649/658/649\nf 640/645/640 649/658/649 641/647/641\nf 652/657/652 662/668/662 641/647/641\nf 652/657/652 641/647/641 649/658/649\nf 648/653/648 642/648/642 641/647/641\nf 648/653/648 641/647/641 662/668/662\nf 663/669/663 664/670/664 537/529/537\nf 663/669/663 537/529/537 536/528/536\nf 666/671/666 640/645/640 639/644/639\nf 666/671/666 639/644/639 665/672/665\nf 666/671/666 665/672/665 636/641/636\nf 666/671/666 636/641/636 635/640/635\nf 667/673/667 539/531/539 537/529/537\nf 667/673/667 537/529/537 664/670/664\nf 634/639/634 644/649/644 643/652/643\nf 634/639/634 643/652/643 635/640/635\nf 653/660/653 650/655/650 640/645/640\nf 653/660/653 640/645/640 666/671/666\nf 666/671/666 635/640/635 643/652/643\nf 666/671/666 643/652/643 653/660/653\nf 669/674/669 644/649/644 634/639/634\nf 669/674/669 634/639/634 668/675/668\nf 638/643/638 637/646/637 630/635/630\nf 638/643/638 630/635/630 670/676/670\nf 645/650/645 644/649/644 669/674/669\nf 645/650/645 669/674/669 671/677/671\nf 638/643/638 670/676/670 485/475/485\nf 638/643/638 485/475/485 484/478/484\nf 672/678/672 633/642/633 489/479/489\nf 672/678/672 489/479/489 488/480/488\nf 632/637/632 657/663/657 658/666/658\nf 632/637/632 658/666/658 629/638/629\nf 670/676/670 663/669/663 536/528/536\nf 670/676/670 536/528/536 485/475/485\nf 633/642/633 636/641/636 534/526/534\nf 633/642/633 534/526/534 489/479/489\nf 484/478/484 535/527/535 639/644/639\nf 484/478/484 639/644/639 638/643/638\nf 629/638/629 658/666/658 664/670/664\nf 629/638/629 664/670/664 663/669/663\nf 665/672/665 639/644/639 535/527/535\nf 665/672/665 535/527/535 538/530/538\nf 636/641/636 665/672/665 538/530/538\nf 636/641/636 538/530/538 534/526/534\nf 660/665/660 667/673/667 664/670/664\nf 660/665/660 664/670/664 658/666/658\nf 668/675/668 634/639/634 633/642/633\nf 668/675/668 633/642/633 672/678/672\nf 630/635/630 629/638/629 663/669/663\nf 630/635/630 663/669/663 670/676/670\nf 1/679/1 661/667/661 656/662/656\nf 1/679/1 656/662/656 22/680/22\nf 20/681/20 647/654/647 648/653/648\nf 20/681/20 648/653/648 18/682/18\nf 647/654/647 20/681/20 21/683/21\nf 647/654/647 21/683/21 655/661/655\nf 15/684/15 646/651/646 645/650/645\nf 15/684/15 645/650/645 13/685/13\nf 19/686/19 651/656/651 654/659/654\nf 19/686/19 654/659/654 14/687/14\nf 648/653/648 662/668/662 16/688/16\nf 648/653/648 16/688/16 18/682/18\nf 17/689/17 652/657/652 651/656/651\nf 17/689/17 651/656/651 19/686/19\nf 21/683/21 22/680/22 656/662/656\nf 21/683/21 656/662/656 655/661/655\nf 13/685/13 645/650/645 671/677/671\nf 13/685/13 671/677/671 2/690/2\nf 646/651/646 15/684/15 14/687/14\nf 646/651/646 14/687/14 654/659/654\nf 17/689/17 16/688/16 662/668/662\nf 17/689/17 662/668/662 652/657/652\nf 608/600/608 91/68/91 385/371/385\nf 608/600/608 385/371/385 384/370/384\nf 304/286/304 372/355/372 401/387/401\nf 304/286/304 401/387/401 308/290/308\nf 468/459/468 415/404/415 411/401/411\nf 468/459/468 411/401/411 92/69/92\nf 602/594/602 603/597/603 606/598/606\nf 602/594/602 606/598/606 601/593/601\nf 608/600/608 468/459/468 92/69/92\nf 608/600/608 92/69/92 91/68/91\nf 305/287/305 304/286/304 308/290/308\nf 305/287/305 308/290/308 137/116/137\nf 139/119/139 138/117/138 307/291/307\nf 139/119/139 307/291/307 375/361/375\nf 674/691/674 675/692/675 676/693/676\nf 674/691/674 676/693/676 673/694/673\nf 678/695/678 27/8/27 679/696/679\nf 678/695/678 679/696/679 677/697/677\nf 681/698/681 682/699/682 683/700/683\nf 681/698/681 683/700/683 680/701/680\nf 684/702/684 685/703/685 683/700/683\nf 684/702/684 683/700/683 682/699/682\nf 684/702/684 674/691/674 673/694/673\nf 684/702/684 673/694/673 685/703/685\nf 687/704/687 688/705/688 689/706/689\nf 687/704/687 689/706/689 686/707/686\nf 690/708/690 691/709/691 676/693/676\nf 690/708/690 676/693/676 675/692/675\nf 689/706/689 688/705/688 691/709/691\nf 689/706/689 691/709/691 690/708/690\nf 687/704/687 686/707/686 693/710/693\nf 687/704/687 693/710/693 692/711/692\nf 681/698/681 680/701/680 46/24/46\nf 681/698/681 46/24/46 45/23/45\nf 678/695/678 694/712/694 695/713/695\nf 678/695/678 695/713/695 693/710/693\nf 697/714/697 698/715/698 699/716/699\nf 697/714/697 699/716/699 696/717/696\nf 701/718/701 702/719/702 703/720/703\nf 701/718/701 703/720/703 700/721/700\nf 705/722/705 706/723/706 707/724/707\nf 705/722/705 707/724/707 704/725/704\nf 709/726/709 710/727/710 711/728/711\nf 709/726/709 711/728/711 708/729/708\nf 713/730/713 714/731/714 715/732/715\nf 713/730/713 715/732/715 712/733/712\nf 717/734/717 718/735/718 719/736/719\nf 717/734/717 719/736/719 716/737/716\nf 712/733/712 720/738/720 721/739/721\nf 712/733/712 721/739/721 713/730/713\nf 713/730/713 721/739/721 697/714/697\nf 713/730/713 697/714/697 696/717/696\nf 723/740/723 724/741/724 725/742/725\nf 723/740/723 725/742/725 722/743/722\nf 727/744/727 728/745/728 729/746/729\nf 727/744/727 729/746/729 726/747/726\nf 731/748/731 732/749/732 733/750/733\nf 731/748/731 733/750/733 730/751/730\nf 735/752/735 728/745/728 727/744/727\nf 735/752/735 727/744/727 734/753/734\nf 737/754/737 738/755/738 739/756/739\nf 737/754/737 739/756/739 736/757/736\nf 741/758/741 722/743/722 725/742/725\nf 741/758/741 725/742/725 740/759/740\nf 735/752/735 734/753/734 743/760/743\nf 735/752/735 743/760/743 742/761/742\nf 745/762/745 746/763/746 747/764/747\nf 745/762/745 747/764/747 744/765/744\nf 747/764/747 746/763/746 749/766/749\nf 747/764/747 749/766/749 748/767/748\nf 745/762/745 744/765/744 751/768/751\nf 745/762/745 751/768/751 750/769/750\nf 753/770/753 754/771/754 755/772/755\nf 753/770/753 755/772/755 752/773/752\nf 757/774/757 755/772/755 754/771/754\nf 757/774/757 754/771/754 756/775/756\nf 748/767/748 749/766/749 759/776/759\nf 748/767/748 759/776/759 758/777/758\nf 761/778/761 762/779/762 763/780/763\nf 761/778/761 763/780/763 760/781/760\nf 765/782/765 766/783/766 767/784/767\nf 765/782/765 767/784/767 764/785/764\nf 769/786/769 770/787/770 771/788/771\nf 769/786/769 771/788/771 768/789/768\nf 773/790/773 774/791/774 775/792/775\nf 773/790/773 775/792/775 772/793/772\nf 777/794/777 778/795/778 779/796/779\nf 777/794/777 779/796/779 776/797/776\nf 774/791/774 780/798/780 781/799/781\nf 774/791/774 781/799/781 775/792/775\nf 703/720/703 782/800/782 783/801/783\nf 703/720/703 783/801/783 700/721/700\nf 688/802/688 687/803/687 785/804/785\nf 688/802/688 785/804/785 784/805/784\nf 786/806/786 785/804/785 687/803/687\nf 786/806/786 687/803/687 692/807/692\nf 788/808/788 777/794/777 789/809/789\nf 788/808/788 789/809/789 787/810/787\nf 790/811/790 791/812/791 779/796/779\nf 790/811/790 779/796/779 778/795/778\nf 793/813/793 794/814/794 795/815/795\nf 793/813/793 795/815/795 792/816/792\nf 797/817/797 798/818/798 701/718/701\nf 797/817/797 701/718/701 796/819/796\nf 701/718/701 798/818/798 799/820/799\nf 701/718/701 799/820/799 702/719/702\nf 801/821/801 802/822/802 803/823/803\nf 801/821/801 803/823/803 800/824/800\nf 805/825/805 806/826/806 807/827/807\nf 805/825/805 807/827/807 804/828/804\nf 809/829/809 810/830/810 811/831/811\nf 809/829/809 811/831/811 808/832/808\nf 778/795/778 807/827/807 806/826/806\nf 778/795/778 806/826/806 790/811/790\nf 803/823/803 812/833/812 813/834/813\nf 803/823/803 813/834/813 800/824/800\nf 815/835/815 816/836/816 817/837/817\nf 815/835/815 817/837/817 814/838/814\nf 819/839/819 814/838/814 820/840/820\nf 819/839/819 820/840/820 818/841/818\nf 822/842/822 823/843/823 819/839/819\nf 822/842/822 819/839/819 821/844/821\nf 704/725/704 707/724/707 825/845/825\nf 704/725/704 825/845/825 824/846/824\nf 827/847/827 828/848/828 698/715/698\nf 827/847/827 698/715/698 826/849/826\nf 772/793/772 775/792/775 829/850/829\nf 772/793/772 829/850/829 699/716/699\nf 781/799/781 771/788/771 831/851/831\nf 781/799/781 831/851/831 830/852/830\nf 832/853/832 831/851/831 771/788/771\nf 832/853/832 771/788/771 770/787/770\nf 834/854/834 835/855/835 836/856/836\nf 834/854/834 836/856/836 833/857/833\nf 838/858/838 839/859/839 840/860/840\nf 838/858/838 840/860/840 837/861/837\nf 723/740/723 722/743/722 840/860/840\nf 723/740/723 840/860/840 841/862/841\nf 747/764/747 842/863/842 843/864/843\nf 747/764/747 843/864/843 744/765/744\nf 821/844/821 844/865/844 845/866/845\nf 821/844/821 845/866/845 822/842/822\nf 847/867/847 818/841/818 820/840/820\nf 847/867/847 820/840/820 846/868/846\nf 843/864/843 849/869/849 850/870/850\nf 843/864/843 850/870/850 848/871/848\nf 205/185/205 851/872/851 852/873/852\nf 205/185/205 852/873/852 206/186/206\nf 208/189/208 849/869/849 851/872/851\nf 208/189/208 851/872/851 205/185/205\nf 853/874/853 854/875/854 749/766/749\nf 853/874/853 749/766/749 746/763/746\nf 728/745/728 735/752/735 854/875/854\nf 728/745/728 854/875/854 853/874/853\nf 856/876/856 857/877/857 858/878/858\nf 856/876/856 858/878/858 855/879/855\nf 860/880/860 861/881/861 862/882/862\nf 860/880/860 862/882/862 859/883/859\nf 863/884/863 864/885/864 861/881/861\nf 863/884/863 861/881/861 860/880/860\nf 866/886/866 867/887/867 862/882/862\nf 866/886/866 862/882/862 865/888/865\nf 869/889/869 870/890/870 871/891/871\nf 869/889/869 871/891/871 868/892/868\nf 866/886/866 228/210/228 229/209/229\nf 866/886/866 229/209/229 867/887/867\nf 873/893/873 864/885/864 863/884/863\nf 873/893/873 863/884/863 872/894/872\nf 871/891/871 873/893/873 872/894/872\nf 871/891/871 872/894/872 868/892/868\nf 875/895/875 876/896/876 877/897/877\nf 875/895/875 877/897/877 874/898/874\nf 835/855/835 834/854/834 848/871/848\nf 835/855/835 848/871/848 850/870/850\nf 879/899/879 833/857/833 880/900/880\nf 879/899/879 880/900/880 878/901/878\nf 882/902/882 883/903/883 884/904/884\nf 882/902/882 884/904/884 881/905/881\nf 881/905/881 880/900/880 886/906/886\nf 881/905/881 886/906/886 885/907/885\nf 887/908/887 842/863/842 747/764/747\nf 887/908/887 747/764/747 748/767/748\nf 842/863/842 887/908/887 852/873/852\nf 842/863/842 852/873/852 851/872/851\nf 758/777/758 760/781/760 889/909/889\nf 758/777/758 889/909/889 888/910/888\nf 787/810/787 890/911/890 891/912/891\nf 787/810/787 891/912/891 788/808/788\nf 893/913/893 894/914/894 895/915/895\nf 893/913/893 895/915/895 892/916/892\nf 896/917/896 859/883/859 897/918/897\nf 896/917/896 897/918/897 765/782/765\nf 899/919/899 900/920/900 901/921/901\nf 899/919/899 901/921/901 898/922/898\nf 900/920/900 902/923/902 903/924/903\nf 900/920/900 903/924/903 901/921/901\nf 902/923/902 677/925/677 679/926/679\nf 902/923/902 679/926/679 903/924/903\nf 862/882/862 867/887/867 904/927/904\nf 862/882/862 904/927/904 859/883/859\nf 901/921/901 263/247/263 264/246/264\nf 901/921/901 264/246/264 898/922/898\nf 266/248/266 265/249/265 903/924/903\nf 266/248/266 903/924/903 679/926/679\nf 895/915/895 905/928/905 906/929/906\nf 895/915/895 906/929/906 892/916/892\nf 907/930/907 908/931/908 909/932/909\nf 907/930/907 909/932/909 846/868/846\nf 847/867/847 846/868/846 909/932/909\nf 847/867/847 909/932/909 910/933/910\nf 847/867/847 910/933/910 912/934/912\nf 847/867/847 912/934/912 911/935/911\nf 276/258/276 275/259/275 906/929/906\nf 276/258/276 906/929/906 905/928/905\nf 275/259/275 277/260/277 908/931/908\nf 275/259/275 908/931/908 906/929/906\nf 741/758/741 837/861/837 840/860/840\nf 741/758/741 840/860/840 722/743/722\nf 914/936/914 915/937/915 916/938/916\nf 914/936/914 916/938/916 913/939/913\nf 915/937/915 914/936/914 743/760/743\nf 915/937/915 743/760/743 734/753/734\nf 918/940/918 740/759/740 709/726/709\nf 918/940/918 709/726/709 917/941/917\nf 916/938/916 915/937/915 920/942/920\nf 916/938/916 920/942/920 919/943/919\nf 922/944/922 923/945/923 924/946/924\nf 922/944/922 924/946/924 921/947/921\nf 708/729/708 925/948/925 917/941/917\nf 708/729/708 917/941/917 709/726/709\nf 917/941/917 925/948/925 927/949/927\nf 917/941/917 927/949/927 926/950/926\nf 293/276/293 712/733/712 715/732/715\nf 293/276/293 715/732/715 294/277/294\nf 929/951/929 930/952/930 931/953/931\nf 929/951/929 931/953/931 928/954/928\nf 933/955/933 934/956/934 935/957/935\nf 933/955/933 935/957/935 932/958/932\nf 937/959/937 938/960/938 939/961/939\nf 937/959/937 939/961/939 936/962/936\nf 785/804/785 940/963/940 941/964/941\nf 785/804/785 941/964/941 784/805/784\nf 812/833/812 943/965/943 944/966/944\nf 812/833/812 944/966/944 942/967/942\nf 945/968/945 796/819/796 701/718/701\nf 945/968/945 701/718/701 700/721/700\nf 946/969/946 947/970/947 797/817/797\nf 946/969/946 797/817/797 796/819/796\nf 949/971/949 873/893/873 871/891/871\nf 949/971/949 871/891/871 948/972/948\nf 783/801/783 806/826/806 805/825/805\nf 783/801/783 805/825/805 950/973/950\nf 951/974/951 952/975/952 792/816/792\nf 951/974/951 792/816/792 795/815/795\nf 954/976/954 793/813/793 792/816/792\nf 954/976/954 792/816/792 953/977/953\nf 956/978/956 957/979/957 958/980/958\nf 956/978/956 958/980/958 955/981/955\nf 727/744/727 920/942/920 915/937/915\nf 727/744/727 915/937/915 734/753/734\nf 959/982/959 960/983/960 795/815/795\nf 959/982/959 795/815/795 794/814/794\nf 914/936/914 913/939/913 924/946/924\nf 914/936/914 924/946/924 923/945/923\nf 329/984/329 961/985/961 962/986/962\nf 329/984/329 962/986/962 330/987/330\nf 834/854/834 963/988/963 751/768/751\nf 834/854/834 751/768/751 848/871/848\nf 879/899/879 839/859/839 838/858/838\nf 879/899/879 838/858/838 963/988/963\nf 812/833/812 942/967/942 964/989/964\nf 812/833/812 964/989/964 813/834/813\nf 786/806/786 692/807/692 695/990/695\nf 786/806/786 695/990/695 965/991/965\nf 967/992/967 968/993/968 969/994/969\nf 967/992/967 969/994/969 966/995/966\nf 696/717/696 699/716/699 829/850/829\nf 696/717/696 829/850/829 955/981/955\nf 970/996/970 703/720/703 702/719/702\nf 970/996/970 702/719/702 773/790/773\nf 972/997/972 799/820/799 798/818/798\nf 972/997/972 798/818/798 971/998/971\nf 885/907/885 342/999/342 344/1000/344\nf 885/907/885 344/1000/344 973/1001/973\nf 974/1002/974 975/1003/975 882/902/882\nf 974/1002/974 882/902/882 973/1001/973\nf 977/1004/977 978/1005/978 979/1006/979\nf 977/1004/977 979/1006/979 976/1007/976\nf 981/1008/981 856/876/856 855/879/855\nf 981/1008/981 855/879/855 980/1009/980\nf 775/792/775 781/799/781 830/852/830\nf 775/792/775 830/852/830 829/850/829\nf 750/769/750 982/1010/982 983/1011/983\nf 750/769/750 983/1011/983 745/762/745\nf 761/778/761 984/1012/984 985/1013/985\nf 761/778/761 985/1013/985 762/779/762\nf 986/1014/986 987/1015/987 845/866/845\nf 986/1014/986 845/866/845 844/865/844\nf 752/773/752 755/772/755 989/1016/989\nf 752/773/752 989/1016/989 988/1017/988\nf 977/1004/977 976/1007/976 991/1018/991\nf 977/1004/977 991/1018/991 990/1019/990\nf 978/1005/978 977/1004/977 874/898/874\nf 978/1005/978 874/898/874 992/1020/992\nf 863/884/863 993/1021/993 816/836/816\nf 863/884/863 816/836/816 872/894/872\nf 802/822/802 995/1022/995 933/955/933\nf 802/822/802 933/955/933 994/1023/994\nf 930/952/930 929/951/929 716/737/716\nf 930/952/930 716/737/716 719/736/719\nf 828/848/828 827/847/827 996/1024/996\nf 828/848/828 996/1024/996 970/996/970\nf 998/1025/998 950/973/950 805/825/805\nf 998/1025/998 805/825/805 997/1026/997\nf 950/973/950 945/968/945 700/721/700\nf 950/973/950 700/721/700 783/801/783\nf 1000/1027/1000 1001/1028/1001 1002/1029/1002\nf 1000/1027/1000 1002/1029/1002 999/1030/999\nf 691/1031/691 936/962/936 939/961/939\nf 691/1031/691 939/961/939 676/1032/676\nf 936/962/936 691/1031/691 688/802/688\nf 936/962/936 688/802/688 784/805/784\nf 890/911/890 787/810/787 1004/1033/1004\nf 890/911/890 1004/1033/1004 1003/1034/1003\nf 713/730/713 696/717/696 955/981/955\nf 713/730/713 955/981/955 958/980/958\nf 830/852/830 831/851/831 1005/1035/1005\nf 830/852/830 1005/1035/1005 956/978/956\nf 1006/1036/1006 1007/1037/1007 905/928/905\nf 1006/1036/1006 905/928/905 895/915/895\nf 908/931/908 277/260/277 379/365/379\nf 908/931/908 379/365/379 909/932/909\nf 1009/1038/1009 1010/1039/1010 1011/1040/1011\nf 1009/1038/1009 1011/1040/1011 1008/1041/1008\nf 1013/1042/1013 756/775/756 754/771/754\nf 1013/1042/1013 754/771/754 1012/1043/1012\nf 754/771/754 753/770/753 1014/1044/1014\nf 754/771/754 1014/1044/1014 1012/1043/1012\nf 989/1016/989 755/772/755 757/774/757\nf 989/1016/989 757/774/757 1015/1045/1015\nf 826/849/826 808/832/808 811/831/811\nf 826/849/826 811/831/811 827/847/827\nf 995/1022/995 802/822/802 801/821/801\nf 995/1022/995 801/821/801 1016/1046/1016\nf 815/835/815 868/892/868 872/894/872\nf 815/835/815 872/894/872 816/836/816\nf 726/747/726 918/940/918 917/941/917\nf 726/747/726 917/941/917 926/950/926\nf 910/933/910 909/932/909 379/365/379\nf 910/933/910 379/365/379 389/375/389\nf 912/934/912 910/933/910 389/375/389\nf 912/934/912 389/375/389 390/376/390\nf 786/806/786 965/991/965 1003/1034/1003\nf 786/806/786 1003/1034/1003 1004/1033/1004\nf 1017/1047/1017 803/823/803 802/822/802\nf 1017/1047/1017 802/822/802 994/1023/994\nf 1019/1048/1019 1017/1047/1017 994/1023/994\nf 1019/1048/1019 994/1023/994 1018/1049/1018\nf 820/840/820 1020/1050/1020 907/930/907\nf 820/840/820 907/930/907 846/868/846\nf 932/958/932 1018/1049/1018 994/1023/994\nf 932/958/932 994/1023/994 933/955/933\nf 1022/1051/1022 1023/1052/1023 1024/1053/1024\nf 1022/1051/1022 1024/1053/1024 1021/1054/1021\nf 1025/1055/1025 817/837/817 816/836/816\nf 1025/1055/1025 816/836/816 993/1021/993\nf 1020/1050/1020 817/837/817 1025/1055/1025\nf 1020/1050/1020 1025/1055/1025 893/913/893\nf 907/930/907 1020/1050/1020 893/913/893\nf 907/930/907 893/913/893 892/916/892\nf 749/766/749 854/875/854 1026/1056/1026\nf 749/766/749 1026/1056/1026 759/776/759\nf 776/797/776 1000/1027/1000 999/1030/999\nf 776/797/776 999/1030/999 1027/1057/1027\nf 1017/1047/1017 943/965/943 812/833/812\nf 1017/1047/1017 812/833/812 803/823/803\nf 1028/1058/1028 1029/1059/1029 405/390/405\nf 1028/1058/1028 405/390/405 404/389/404\nf 1029/1059/1029 943/965/943 1017/1047/1017\nf 1029/1059/1029 1017/1047/1017 1019/1048/1019\nf 685/1060/685 673/1061/673 964/989/964\nf 685/1060/685 964/989/964 942/967/942\nf 685/1060/685 942/967/942 944/966/944\nf 685/1060/685 944/966/944 683/1062/683\nf 683/1062/683 944/966/944 1028/1058/1028\nf 683/1062/683 1028/1058/1028 680/1063/680\nf 1030/1064/1030 897/918/897 859/883/859\nf 1030/1064/1030 859/883/859 904/927/904\nf 1007/1037/1007 1030/1064/1030 408/398/408\nf 1007/1037/1007 408/398/408 407/397/407\nf 766/783/766 765/782/765 897/918/897\nf 766/783/766 897/918/897 1006/1036/1006\nf 907/930/907 892/916/892 906/929/906\nf 907/930/907 906/929/906 908/931/908\nf 937/959/937 999/1030/999 1002/1029/1002\nf 937/959/937 1002/1029/1002 938/960/938\nf 991/1018/991 976/1007/976 1032/1065/1032\nf 991/1018/991 1032/1065/1032 1031/1066/1031\nf 1034/1067/1034 739/756/739 738/755/738\nf 1034/1067/1034 738/755/738 1033/1068/1033\nf 1035/1069/1035 1036/1070/1036 1037/1071/1037\nf 1035/1069/1035 1037/1071/1037 1034/1067/1034\nf 1038/1072/1038 416/408/416 418/407/418\nf 1038/1072/1038 418/407/418 967/992/967\nf 966/995/966 719/736/719 718/735/718\nf 966/995/966 718/735/718 1039/1073/1039\nf 1041/1074/1041 1042/1075/1042 1043/1076/1043\nf 1041/1074/1041 1043/1076/1043 1040/1077/1040\nf 1041/1074/1041 1040/1077/1040 1045/1078/1045\nf 1041/1074/1041 1045/1078/1045 1044/1079/1044\nf 1043/1076/1043 1046/1080/1046 1047/1081/1047\nf 1043/1076/1043 1047/1081/1047 1040/1077/1040\nf 883/903/883 1045/1078/1045 1048/1082/1048\nf 883/903/883 1048/1082/1048 884/904/884\nf 1049/1083/1049 1050/1084/1050 721/739/721\nf 1049/1083/1049 721/739/721 720/738/720\nf 717/734/717 1050/1084/1050 1039/1073/1039\nf 717/734/717 1039/1073/1039 718/735/718\nf 889/909/889 760/781/760 763/780/763\nf 889/909/889 763/780/763 1051/1085/1051\nf 974/1002/974 1052/1086/1052 1053/1087/1053\nf 974/1002/974 1053/1087/1053 975/1003/975\nf 1053/1087/1053 1054/1088/1054 1042/1075/1042\nf 1053/1087/1053 1042/1075/1042 1041/1074/1041\nf 1056/1089/1056 1057/1090/1057 1058/1091/1058\nf 1056/1089/1056 1058/1091/1058 1055/1092/1055\nf 1055/1092/1055 1058/1091/1058 1010/1039/1010\nf 1055/1092/1055 1010/1039/1010 1009/1038/1009\nf 825/845/825 1059/1093/1059 1060/1094/1060\nf 825/845/825 1060/1094/1060 824/846/824\nf 1060/1094/1060 1059/1093/1059 1062/1095/1062\nf 1060/1094/1060 1062/1095/1062 1061/1096/1061\nf 444/1097/444 443/1098/443 1064/1099/1064\nf 444/1097/444 1064/1099/1064 1063/1100/1063\nf 955/981/955 829/850/829 830/852/830\nf 955/981/955 830/852/830 956/978/956\nf 855/879/855 845/866/845 987/1015/987\nf 855/879/855 987/1015/987 980/1009/980\nf 858/878/858 869/889/869 823/843/823\nf 858/878/858 823/843/823 822/842/822\nf 1066/1101/1066 1067/1102/1067 1068/1103/1068\nf 1066/1101/1066 1068/1103/1068 1065/1104/1065\nf 1043/1076/1043 1067/1102/1067 1069/1105/1069\nf 1043/1076/1043 1069/1105/1069 1046/1080/1046\nf 724/741/724 723/740/723 1046/1080/1046\nf 724/741/724 1046/1080/1046 1069/1105/1069\nf 725/742/725 710/727/710 709/726/709\nf 725/742/725 709/726/709 740/759/740\nf 923/945/923 922/944/922 730/751/730\nf 923/945/923 730/751/730 733/750/733\nf 742/761/742 1026/1056/1026 854/875/854\nf 742/761/742 854/875/854 735/752/735\nf 878/901/878 884/904/884 1048/1082/1048\nf 878/901/878 1048/1082/1048 1070/1106/1070\nf 839/859/839 1070/1106/1070 841/862/841\nf 839/859/839 841/862/841 840/860/840\nf 878/901/878 1070/1106/1070 839/859/839\nf 878/901/878 839/859/839 879/899/879\nf 728/745/728 853/874/853 983/1011/983\nf 728/745/728 983/1011/983 729/746/729\nf 923/945/923 733/750/733 743/760/743\nf 923/945/923 743/760/743 914/936/914\nf 1049/1083/1049 453/443/453 416/408/416\nf 1049/1083/1049 416/408/416 1038/1072/1038\nf 969/994/969 934/956/934 931/953/931\nf 969/994/969 931/953/931 930/952/930\nf 706/723/706 1071/1107/1071 1072/1108/1072\nf 706/723/706 1072/1108/1072 707/724/707\nf 856/876/856 981/1008/981 1074/1109/1074\nf 856/876/856 1074/1109/1074 1073/1110/1073\nf 732/749/732 731/748/731 985/1013/985\nf 732/749/732 985/1013/985 984/1012/984\nf 789/809/789 940/963/940 1004/1033/1004\nf 789/809/789 1004/1033/1004 787/810/787\nf 1027/1057/1027 941/964/941 940/963/940\nf 1027/1057/1027 940/963/940 789/809/789\nf 1075/1111/1075 1076/1112/1076 900/920/900\nf 1075/1111/1075 900/920/900 899/919/899\nf 228/210/228 866/886/866 898/922/898\nf 228/210/228 898/922/898 264/246/264\nf 900/920/900 1076/1112/1076 1077/1113/1077\nf 900/920/900 1077/1113/1077 902/923/902\nf 1077/1113/1077 694/1114/694 677/925/677\nf 1077/1113/1077 677/925/677 902/923/902\nf 263/247/263 901/921/901 903/924/903\nf 263/247/263 903/924/903 265/249/265\nf 461/1115/461 886/906/886 836/856/836\nf 461/1115/461 836/856/836 462/1116/462\nf 871/891/871 870/890/870 1078/1117/1078\nf 871/891/871 1078/1117/1078 948/972/948\nf 1080/1118/1080 1081/1119/1081 1032/1065/1032\nf 1080/1118/1080 1032/1065/1032 1079/1120/1079\nf 737/754/737 736/757/736 1012/1043/1012\nf 737/754/737 1012/1043/1012 1014/1044/1014\nf 875/895/875 874/898/874 977/1004/977\nf 875/895/875 977/1004/977 990/1019/990\nf 877/897/877 1082/1121/1082 992/1020/992\nf 877/897/877 992/1020/992 874/898/874\nf 969/994/969 930/952/930 719/736/719\nf 969/994/969 719/736/719 966/995/966\nf 969/994/969 968/993/968 935/957/935\nf 969/994/969 935/957/935 934/956/934\nf 1084/1122/1084 1037/1071/1037 1085/1123/1085\nf 1084/1122/1084 1085/1123/1085 1083/1124/1083\nf 978/1005/978 992/1020/992 1087/1125/1087\nf 978/1005/978 1087/1125/1087 1086/1126/1086\nf 1086/1126/1086 1088/1127/1088 979/1006/979\nf 1086/1126/1086 979/1006/979 978/1005/978\nf 1080/1118/1080 1090/1128/1090 1091/1129/1091\nf 1080/1118/1080 1091/1129/1091 1089/1130/1089\nf 1013/1042/1013 1092/1131/1092 1093/1132/1093\nf 1013/1042/1013 1093/1132/1093 756/775/756\nf 1035/1069/1035 1034/1067/1034 1033/1068/1033\nf 1035/1069/1035 1033/1068/1033 1094/1133/1094\nf 921/947/921 1094/1133/1094 1033/1068/1033\nf 921/947/921 1033/1068/1033 922/944/922\nf 730/751/730 738/755/738 737/754/737\nf 730/751/730 737/754/737 731/748/731\nf 1014/1044/1014 753/770/753 762/779/762\nf 1014/1044/1014 762/779/762 985/1013/985\nf 876/896/876 875/895/875 987/1015/987\nf 876/896/876 987/1015/987 986/1014/986\nf 928/954/928 808/832/808 826/849/826\nf 928/954/928 826/849/826 929/951/929\nf 1039/1073/1039 1038/1072/1038 967/992/967\nf 1039/1073/1039 967/992/967 966/995/966\nf 698/715/698 828/848/828 772/793/772\nf 698/715/698 772/793/772 699/716/699\nf 676/1032/676 939/961/939 964/989/964\nf 676/1032/676 964/989/964 673/1061/673\nf 1000/1027/1000 810/830/810 809/829/809\nf 1000/1027/1000 809/829/809 1001/1028/1001\nf 898/922/898 866/886/866 865/888/865\nf 898/922/898 865/888/865 899/919/899\nf 899/919/899 865/888/865 1095/1134/1095\nf 899/919/899 1095/1134/1095 1075/1111/1075\nf 857/877/857 870/890/870 869/889/869\nf 857/877/857 869/889/869 858/878/858\nf 948/972/948 1078/1117/1078 946/969/946\nf 948/972/948 946/969/946 1096/1135/1096\nf 819/839/819 823/843/823 815/835/815\nf 819/839/819 815/835/815 814/838/814\nf 911/935/911 1097/1136/1097 818/841/818\nf 911/935/911 818/841/818 847/867/847\nf 815/835/815 823/843/823 869/889/869\nf 815/835/815 869/889/869 868/892/868\nf 887/908/887 748/767/748 758/777/758\nf 887/908/887 758/777/758 888/910/888\nf 761/778/761 760/781/760 758/777/758\nf 761/778/761 758/777/758 759/776/759\nf 853/874/853 746/763/746 745/762/745\nf 853/874/853 745/762/745 983/1011/983\nf 1051/1085/1051 988/1017/988 876/896/876\nf 1051/1085/1051 876/896/876 986/1014/986\nf 877/897/877 876/896/876 988/1017/988\nf 877/897/877 988/1017/988 989/1016/989\nf 989/1016/989 1015/1045/1015 1082/1121/1082\nf 989/1016/989 1082/1121/1082 877/897/877\nf 726/747/726 729/746/729 1098/1137/1098\nf 726/747/726 1098/1137/1098 918/940/918\nf 1100/1138/1100 1101/1139/1101 1102/1140/1102\nf 1100/1138/1100 1102/1140/1102 1099/1141/1099\nf 1103/1142/1103 488/480/488 294/277/294\nf 1103/1142/1103 294/277/294 715/732/715\nf 1104/1143/1104 1105/1144/1105 1072/1108/1072\nf 1104/1143/1104 1072/1108/1072 1071/1107/1071\nf 801/821/801 800/824/800 1002/1029/1002\nf 801/821/801 1002/1029/1002 1001/1028/1001\nf 1104/1143/1104 1106/1145/1106 958/980/958\nf 1104/1143/1104 958/980/958 957/979/957\nf 1104/1143/1104 957/979/957 1107/1146/1107\nf 1104/1143/1104 1107/1146/1107 1105/1144/1105\nf 1056/1089/1056 1108/1147/1108 1064/1099/1064\nf 1056/1089/1056 1064/1099/1064 1057/1090/1057\nf 495/1148/495 1010/1039/1010 1058/1091/1058\nf 495/1148/495 1058/1091/1058 496/1149/496\nf 496/1149/496 1058/1091/1058 1057/1090/1057\nf 496/1149/496 1057/1090/1057 497/1150/497\nf 962/986/962 1052/1086/1052 498/1151/498\nf 962/986/962 498/1151/498 330/987/330\nf 499/1152/499 498/1151/498 1052/1086/1052\nf 499/1152/499 1052/1086/1052 974/1002/974\nf 1010/1039/1010 495/1148/495 500/1153/500\nf 1010/1039/1010 500/1153/500 1011/1040/1011\nf 1109/1154/1109 1054/1088/1054 962/986/962\nf 1109/1154/1109 962/986/962 961/985/961\nf 499/1152/499 974/1002/974 973/1001/973\nf 499/1152/499 973/1001/973 344/1000/344\nf 1106/1145/1106 1104/1143/1104 1071/1107/1071\nf 1106/1145/1106 1071/1107/1071 1110/1155/1110\nf 1071/1107/1071 706/723/706 1102/1140/1102\nf 1071/1107/1071 1102/1140/1102 1110/1155/1110\nf 1099/1141/1099 1102/1140/1102 706/723/706\nf 1099/1141/1099 706/723/706 705/722/705\nf 705/722/705 1008/1041/1008 1111/1156/1111\nf 705/722/705 1111/1156/1111 1099/1141/1099\nf 1011/1040/1011 500/1153/500 505/1157/505\nf 1011/1040/1011 505/1157/505 1112/1158/1112\nf 1067/1102/1067 1043/1076/1043 1042/1075/1042\nf 1067/1102/1067 1042/1075/1042 1068/1103/1068\nf 329/984/329 444/1097/444 1063/1100/1063\nf 329/984/329 1063/1100/1063 961/985/961\nf 1068/1103/1068 1109/1154/1109 1113/1159/1113\nf 1068/1103/1068 1113/1159/1113 1065/1104/1065\nf 1115/1160/1115 724/741/724 1069/1105/1069\nf 1115/1160/1115 1069/1105/1069 1114/1161/1114\nf 744/765/744 843/864/843 848/871/848\nf 744/765/744 848/871/848 751/768/751\nf 509/500/509 850/870/850 849/869/849\nf 509/500/509 849/869/849 208/189/208\nf 849/869/849 843/864/843 842/863/842\nf 849/869/849 842/863/842 851/872/851\nf 462/1116/462 836/856/836 835/855/835\nf 462/1116/462 835/855/835 510/501/510\nf 850/870/850 509/500/509 510/501/510\nf 850/870/850 510/501/510 835/855/835\nf 795/815/795 960/983/960 971/998/971\nf 795/815/795 971/998/971 951/974/951\nf 960/983/960 1116/1162/1116 972/997/972\nf 960/983/960 972/997/972 971/998/971\nf 768/789/768 780/798/780 972/997/972\nf 768/789/768 972/997/972 1116/1162/1116\nf 716/737/716 929/951/929 826/849/826\nf 716/737/716 826/849/826 698/715/698\nf 801/821/801 1001/1028/1001 809/829/809\nf 801/821/801 809/829/809 1016/1046/1016\nf 800/824/800 813/834/813 938/960/938\nf 800/824/800 938/960/938 1002/1029/1002\nf 813/834/813 964/989/964 939/961/939\nf 813/834/813 939/961/939 938/960/938\nf 1117/1163/1117 921/947/921 924/946/924\nf 1117/1163/1117 924/946/924 954/976/954\nf 1094/1133/1094 1118/1164/1118 1119/1165/1119\nf 1094/1133/1094 1119/1165/1119 1035/1069/1035\nf 1035/1069/1035 1119/1165/1119 1089/1130/1089\nf 1035/1069/1035 1089/1130/1089 1036/1070/1036\nf 1118/1164/1118 1094/1133/1094 921/947/921\nf 1118/1164/1118 921/947/921 1117/1163/1117\nf 838/858/838 837/861/837 982/1010/982\nf 838/858/838 982/1010/982 750/769/750\nf 963/988/963 838/858/838 750/769/750\nf 963/988/963 750/769/750 751/768/751\nf 729/746/729 983/1011/983 982/1010/982\nf 729/746/729 982/1010/982 1098/1137/1098\nf 732/749/732 742/761/742 743/760/743\nf 732/749/732 743/760/743 733/750/733\nf 732/749/732 984/1012/984 1026/1056/1026\nf 732/749/732 1026/1056/1026 742/761/742\nf 984/1012/984 761/778/761 759/776/759\nf 984/1012/984 759/776/759 1026/1056/1026\nf 790/811/790 806/826/806 783/801/783\nf 790/811/790 783/801/783 782/800/782\nf 931/953/931 934/956/934 933/955/933\nf 931/953/931 933/955/933 995/1022/995\nf 931/953/931 995/1022/995 1016/1046/1016\nf 931/953/931 1016/1046/1016 928/954/928\nf 996/1024/996 827/847/827 811/831/811\nf 996/1024/996 811/831/811 791/812/791\nf 1121/1166/1121 861/881/861 864/885/864\nf 1121/1166/1121 864/885/864 1120/1167/1120\nf 896/917/896 1122/1168/1122 860/880/860\nf 896/917/896 860/880/860 859/883/859\nf 1024/1053/1024 1023/1052/1023 1025/1055/1025\nf 1024/1053/1024 1025/1055/1025 993/1021/993\nf 1024/1053/1024 860/880/860 1122/1168/1122\nf 1024/1053/1024 1122/1168/1122 1021/1054/1021\nf 1124/1169/1124 887/908/887 888/910/888\nf 1124/1169/1124 888/910/888 1123/1170/1123\nf 951/974/951 971/998/971 798/818/798\nf 951/974/951 798/818/798 797/817/797\nf 1050/1084/1050 1049/1083/1049 1038/1072/1038\nf 1050/1084/1050 1038/1072/1038 1039/1073/1039\nf 680/1063/680 1028/1058/1028 404/389/404\nf 680/1063/680 404/389/404 46/511/46\nf 1028/1058/1028 944/966/944 943/965/943\nf 1028/1058/1028 943/965/943 1029/1059/1029\nf 1018/1049/1018 932/958/932 521/513/521\nf 1018/1049/1018 521/513/521 520/512/520\nf 522/514/522 1019/1048/1019 1018/1049/1018\nf 522/514/522 1018/1049/1018 520/512/520\nf 935/957/935 523/515/523 521/513/521\nf 935/957/935 521/513/521 932/958/932\nf 935/957/935 968/993/968 524/516/524\nf 935/957/935 524/516/524 523/515/523\nf 953/977/953 792/816/792 952/975/952\nf 953/977/953 952/975/952 1073/1110/1073\nf 1073/1110/1073 1074/1109/1074 1125/1171/1125\nf 1073/1110/1073 1125/1171/1125 953/977/953\nf 1032/1065/1032 1081/1119/1081 1126/1172/1126\nf 1032/1065/1032 1126/1172/1126 1031/1066/1031\nf 1032/1065/1032 976/1007/976 979/1006/979\nf 1032/1065/1032 979/1006/979 1079/1120/1079\nf 1073/1110/1073 1127/1173/1127 857/877/857\nf 1073/1110/1073 857/877/857 856/876/856\nf 857/877/857 1127/1173/1127 1078/1117/1078\nf 857/877/857 1078/1117/1078 870/890/870\nf 407/397/407 276/258/276 905/928/905\nf 407/397/407 905/928/905 1007/1037/1007\nf 1006/1036/1006 897/918/897 1030/1064/1030\nf 1006/1036/1006 1030/1064/1030 1007/1037/1007\nf 822/842/822 845/866/845 855/879/855\nf 822/842/822 855/879/855 858/878/858\nf 1014/1044/1014 985/1013/985 731/748/731\nf 1014/1044/1014 731/748/731 737/754/737\nf 1031/1066/1031 1074/1109/1074 981/1008/981\nf 1031/1066/1031 981/1008/981 991/1018/991\nf 730/751/730 922/944/922 1033/1068/1033\nf 730/751/730 1033/1068/1033 738/755/738\nf 990/1019/990 980/1009/980 987/1015/987\nf 990/1019/990 987/1015/987 875/895/875\nf 763/780/763 752/773/752 988/1017/988\nf 763/780/763 988/1017/988 1051/1085/1051\nf 763/780/763 762/779/762 753/770/753\nf 763/780/763 753/770/753 752/773/752\nf 980/1009/980 990/1019/990 991/1018/991\nf 980/1009/980 991/1018/991 981/1008/981\nf 1118/1164/1118 1126/1172/1126 1081/1119/1081\nf 1118/1164/1118 1081/1119/1081 1119/1165/1119\nf 1126/1172/1126 1125/1171/1125 1074/1109/1074\nf 1126/1172/1126 1074/1109/1074 1031/1066/1031\nf 1119/1165/1119 1081/1119/1081 1080/1118/1080\nf 1119/1165/1119 1080/1118/1080 1089/1130/1089\nf 986/1014/986 844/865/844 889/909/889\nf 986/1014/986 889/909/889 1051/1085/1051\nf 821/844/821 819/839/819 818/841/818\nf 821/844/821 818/841/818 1097/1136/1097\nf 1022/1051/1022 764/785/764 894/914/894\nf 1022/1051/1022 894/914/894 1023/1052/1023\nf 1023/1052/1023 894/914/894 893/913/893\nf 1023/1052/1023 893/913/893 1025/1055/1025\nf 926/950/926 920/942/920 727/744/727\nf 926/950/926 727/744/727 726/747/726\nf 919/943/919 920/942/920 926/950/926\nf 919/943/919 926/950/926 927/949/927\nf 1128/1174/1128 1116/1162/1116 960/983/960\nf 1128/1174/1128 960/983/960 959/982/959\nf 773/790/773 702/719/702 799/820/799\nf 773/790/773 799/820/799 774/791/774\nf 799/820/799 972/997/972 780/798/780\nf 799/820/799 780/798/780 774/791/774\nf 772/793/772 828/848/828 970/996/970\nf 772/793/772 970/996/970 773/790/773\nf 703/720/703 970/996/970 996/1024/996\nf 703/720/703 996/1024/996 782/800/782\nf 771/788/771 781/799/781 780/798/780\nf 771/788/771 780/798/780 768/789/768\nf 791/812/791 790/811/790 782/800/782\nf 791/812/791 782/800/782 996/1024/996\nf 811/831/811 810/830/810 779/796/779\nf 811/831/811 779/796/779 791/812/791\nf 1027/1057/1027 789/809/789 777/794/777\nf 1027/1057/1027 777/794/777 776/797/776\nf 927/949/927 925/948/925 769/786/769\nf 927/949/927 769/786/769 1128/1174/1128\nf 710/727/710 725/742/725 724/741/724\nf 710/727/710 724/741/724 1115/1160/1115\nf 954/976/954 953/977/953 1125/1171/1125\nf 954/976/954 1125/1171/1125 1117/1163/1117\nf 1117/1163/1117 1125/1171/1125 1126/1172/1126\nf 1117/1163/1117 1126/1172/1126 1118/1164/1118\nf 768/789/768 1116/1162/1116 1128/1174/1128\nf 768/789/768 1128/1174/1128 769/786/769\nf 904/927/904 867/887/867 229/209/229\nf 904/927/904 229/209/229 529/521/529\nf 948/972/948 1096/1135/1096 998/1025/998\nf 948/972/948 998/1025/998 949/971/949\nf 1120/1167/1120 864/885/864 873/893/873\nf 1120/1167/1120 873/893/873 949/971/949\nf 1121/1166/1121 1120/1167/1120 997/1026/997\nf 1121/1166/1121 997/1026/997 1129/1175/1129\nf 1129/1175/1129 1095/1134/1095 865/888/865\nf 1129/1175/1129 865/888/865 1121/1166/1121\nf 861/881/861 1121/1166/1121 865/888/865\nf 861/881/861 865/888/865 862/882/862\nf 1075/1111/1075 890/911/890 1003/1034/1003\nf 1075/1111/1075 1003/1034/1003 1076/1112/1076\nf 1076/1112/1076 1003/1034/1003 965/991/965\nf 1076/1112/1076 965/991/965 1077/1113/1077\nf 965/991/965 695/990/695 694/1114/694\nf 965/991/965 694/1114/694 1077/1113/1077\nf 1075/1111/1075 1095/1134/1095 891/912/891\nf 1075/1111/1075 891/912/891 890/911/890\nf 895/915/895 894/914/894 764/785/764\nf 895/915/895 764/785/764 767/784/767\nf 1020/1050/1020 820/840/820 814/838/814\nf 1020/1050/1020 814/838/814 817/837/817\nf 1123/1170/1123 844/865/844 821/844/821\nf 1123/1170/1123 821/844/821 1097/1136/1097\nf 1124/1169/1124 1123/1170/1123 1097/1136/1097\nf 1124/1169/1124 1097/1136/1097 911/935/911\nf 1130/1176/1130 1124/1169/1124 911/935/911\nf 1130/1176/1130 911/935/911 912/934/912\nf 532/524/532 1130/1176/1130 912/934/912\nf 532/524/532 912/934/912 390/376/390\nf 973/1001/973 882/902/882 881/905/881\nf 973/1001/973 881/905/881 885/907/885\nf 833/857/833 836/856/836 886/906/886\nf 833/857/833 886/906/886 880/900/880\nf 834/854/834 833/857/833 879/899/879\nf 834/854/834 879/899/879 963/988/963\nf 1067/1102/1067 1066/1101/1066 1114/1161/1114\nf 1067/1102/1067 1114/1161/1114 1069/1105/1069\nf 809/829/809 808/832/808 928/954/928\nf 809/829/809 928/954/928 1016/1046/1016\nf 1019/1048/1019 522/514/522 405/390/405\nf 1019/1048/1019 405/390/405 1029/1059/1029\nf 1131/1177/1131 1085/1123/1085 1037/1071/1037\nf 1131/1177/1131 1037/1071/1037 1036/1070/1036\nf 1132/1178/1132 1103/1142/1103 715/732/715\nf 1132/1178/1132 715/732/715 714/731/714\nf 1110/1155/1110 1102/1140/1102 1101/1139/1101\nf 1110/1155/1110 1101/1139/1101 1133/1179/1133\nf 1111/1156/1111 1112/1158/1112 1135/1180/1135\nf 1111/1156/1111 1135/1180/1135 1134/1181/1134\nf 1106/1145/1106 1110/1155/1110 1133/1179/1133\nf 1106/1145/1106 1133/1179/1133 1136/1182/1136\nf 1106/1145/1106 714/731/714 713/730/713\nf 1106/1145/1106 713/730/713 958/980/958\nf 1112/1158/1112 505/1157/505 539/1183/539\nf 1112/1158/1112 539/1183/539 1135/1180/1135\nf 883/903/883 882/902/882 975/1003/975\nf 883/903/883 975/1003/975 1044/1079/1044\nf 704/725/704 1009/1038/1009 1008/1041/1008\nf 704/725/704 1008/1041/1008 705/722/705\nf 1052/1086/1052 962/986/962 1054/1088/1054\nf 1052/1086/1052 1054/1088/1054 1053/1087/1053\nf 1055/1092/1055 824/846/824 1060/1094/1060\nf 1055/1092/1055 1060/1094/1060 1056/1089/1056\nf 1009/1038/1009 704/725/704 824/846/824\nf 1009/1038/1009 824/846/824 1055/1092/1055\nf 1065/1104/1065 1113/1159/1113 1108/1147/1108\nf 1065/1104/1065 1108/1147/1108 1061/1096/1061\nf 1068/1103/1068 1042/1075/1042 1054/1088/1054\nf 1068/1103/1068 1054/1088/1054 1109/1154/1109\nf 1008/1041/1008 1011/1040/1011 1112/1158/1112\nf 1008/1041/1008 1112/1158/1112 1111/1156/1111\nf 1109/1154/1109 961/985/961 1063/1100/1063\nf 1109/1154/1109 1063/1100/1063 1113/1159/1113\nf 1134/1181/1134 1100/1138/1100 1099/1141/1099\nf 1134/1181/1134 1099/1141/1099 1111/1156/1111\nf 947/970/947 952/975/952 951/974/951\nf 947/970/947 951/974/951 797/817/797\nf 959/982/959 794/814/794 916/938/916\nf 959/982/959 916/938/916 919/943/919\nf 1098/1137/1098 982/1010/982 837/861/837\nf 1098/1137/1098 837/861/837 741/758/741\nf 1098/1137/1098 741/758/741 740/759/740\nf 1098/1137/1098 740/759/740 918/940/918\nf 1040/1077/1040 1047/1081/1047 1048/1082/1048\nf 1040/1077/1040 1048/1082/1048 1045/1078/1045\nf 1041/1074/1041 1044/1079/1044 975/1003/975\nf 1041/1074/1041 975/1003/975 1053/1087/1053\nf 1078/1117/1078 1127/1173/1127 947/970/947\nf 1078/1117/1078 947/970/947 946/969/946\nf 949/971/949 998/1025/998 997/1026/997\nf 949/971/949 997/1026/997 1120/1167/1120\nf 946/969/946 796/819/796 945/968/945\nf 946/969/946 945/968/945 1096/1135/1096\nf 998/1025/998 1096/1135/1096 945/968/945\nf 998/1025/998 945/968/945 950/973/950\nf 997/1026/997 805/825/805 804/828/804\nf 997/1026/997 804/828/804 1129/1175/1129\nf 1095/1134/1095 1129/1175/1129 804/828/804\nf 1095/1134/1095 804/828/804 891/912/891\nf 904/927/904 529/521/529 408/398/408\nf 904/927/904 408/398/408 1030/1064/1030\nf 1024/1053/1024 993/1021/993 863/884/863\nf 1024/1053/1024 863/884/863 860/880/860\nf 1138/1184/1138 1139/1185/1139 1140/1186/1140\nf 1138/1184/1138 1140/1186/1140 1137/1187/1137\nf 1141/1188/1141 1142/1189/1142 1137/1187/1137\nf 1141/1188/1141 1137/1187/1137 1140/1186/1140\nf 1143/1190/1143 1144/1191/1144 1142/1189/1142\nf 1143/1190/1143 1142/1189/1142 1141/1188/1141\nf 1145/1192/1145 1146/1193/1146 1144/1191/1144\nf 1145/1192/1145 1144/1191/1144 1143/1190/1143\nf 1147/1194/1147 1148/1195/1148 1146/1193/1146\nf 1147/1194/1147 1146/1193/1146 1145/1192/1145\nf 1149/1196/1149 1150/1197/1150 1148/1195/1148\nf 1149/1196/1149 1148/1195/1148 1147/1194/1147\nf 1151/1198/1151 1152/1199/1152 1150/1197/1150\nf 1151/1198/1151 1150/1197/1150 1149/1196/1149\nf 1154/1200/1154 1155/1201/1155 1156/1202/1156\nf 1154/1200/1154 1156/1202/1156 1153/1203/1153\nf 1157/1204/1157 1158/1205/1158 1155/1201/1155\nf 1157/1204/1157 1155/1201/1155 1154/1200/1154\nf 1159/1206/1159 1160/1207/1160 1142/1189/1142\nf 1159/1206/1159 1142/1189/1142 1144/1191/1144\nf 1161/1208/1161 1159/1206/1159 1144/1191/1144\nf 1161/1208/1161 1144/1191/1144 1146/1193/1146\nf 1162/1209/1162 1161/1208/1161 1146/1193/1146\nf 1162/1209/1162 1146/1193/1146 1148/1195/1148\nf 1163/1210/1163 1162/1209/1162 1148/1195/1148\nf 1163/1210/1163 1148/1195/1148 1150/1197/1150\nf 1150/1197/1150 1152/1199/1152 1164/1211/1164\nf 1150/1197/1150 1164/1211/1164 1163/1210/1163\nf 1156/1202/1156 1155/1201/1155 1166/1212/1166\nf 1156/1202/1156 1166/1212/1166 1165/1213/1165\nf 1167/1214/1167 1166/1212/1166 1155/1201/1155\nf 1167/1214/1167 1155/1201/1155 1158/1205/1158\nf 1169/1215/1169 1167/1214/1167 1158/1205/1158\nf 1169/1215/1169 1158/1205/1158 1168/1216/1168\nf 1170/1217/1170 1171/1218/1171 1172/1219/1172\nf 1170/1217/1170 1172/1219/1172 1139/1185/1139\nf 1173/1220/1173 1174/1221/1174 1141/1188/1141\nf 1173/1220/1173 1141/1188/1141 1140/1186/1140\nf 1141/1188/1141 1174/1221/1174 1175/1222/1175\nf 1141/1188/1141 1175/1222/1175 1143/1190/1143\nf 1176/1223/1176 1145/1192/1145 1143/1190/1143\nf 1176/1223/1176 1143/1190/1143 1175/1222/1175\nf 1177/1224/1177 1149/1196/1149 1147/1194/1147\nf 1177/1224/1177 1147/1194/1147 1176/1223/1176\nf 1177/1224/1177 1178/1225/1178 1151/1198/1151\nf 1177/1224/1177 1151/1198/1151 1149/1196/1149\nf 1153/1203/1153 1179/1226/1179 1180/1227/1180\nf 1153/1203/1153 1180/1227/1180 1154/1200/1154\nf 1157/1204/1157 1154/1200/1154 1180/1227/1180\nf 1157/1204/1157 1180/1227/1180 1181/1228/1181\nf 1157/1204/1157 1181/1228/1181 1182/1229/1182\nf 1157/1204/1157 1182/1229/1182 1168/1216/1168\nf 1169/1215/1169 1168/1216/1168 1182/1229/1182\nf 1169/1215/1169 1182/1229/1182 1183/1230/1183\nf 1142/1189/1142 1160/1207/1160 1138/1184/1138\nf 1142/1189/1142 1138/1184/1138 1137/1187/1137\nf 1170/1217/1170 1185/1231/1185 1186/1232/1186\nf 1170/1217/1170 1186/1232/1186 1184/1233/1184\nf 1170/1217/1170 1184/1233/1184 1187/1234/1187\nf 1170/1217/1170 1187/1234/1187 1171/1218/1171\nf 1187/1234/1187 1188/1235/1188 1172/1219/1172\nf 1187/1234/1187 1172/1219/1172 1171/1218/1171\nf 1172/1219/1172 1188/1235/1188 1140/1186/1140\nf 1172/1219/1172 1140/1186/1140 1139/1185/1139\nf 1161/1208/1161 1162/1209/1162 1163/1210/1163\nf 1161/1208/1161 1163/1210/1163 1189/1236/1189\nf 1189/1236/1189 1163/1210/1163 1164/1211/1164\nf 1189/1236/1189 1164/1211/1164 1190/1237/1190\nf 1165/1213/1165 1164/1211/1164 1152/1199/1152\nf 1165/1213/1165 1152/1199/1152 1156/1202/1156\nf 1152/1199/1152 1151/1198/1151 1153/1203/1153\nf 1152/1199/1152 1153/1203/1153 1156/1202/1156\nf 1179/1226/1179 1153/1203/1153 1151/1198/1151\nf 1179/1226/1179 1151/1198/1151 1178/1225/1178\nf 1189/1236/1189 1160/1207/1160 1159/1206/1159\nf 1189/1236/1189 1159/1206/1159 1161/1208/1161\nf 1186/1232/1186 1190/1237/1190 1164/1211/1164\nf 1186/1232/1186 1164/1211/1164 1165/1213/1165\nf 1139/1185/1139 1138/1184/1138 1185/1231/1185\nf 1139/1185/1139 1185/1231/1185 1170/1217/1170\nf 1169/1215/1169 1188/1235/1188 1187/1234/1187\nf 1169/1215/1169 1187/1234/1187 1167/1214/1167\nf 1186/1232/1186 1165/1213/1165 1166/1212/1166\nf 1186/1232/1186 1166/1212/1166 1184/1233/1184\nf 1140/1186/1140 1188/1235/1188 1191/1238/1191\nf 1140/1186/1140 1191/1238/1191 1173/1220/1173\nf 1191/1238/1191 1188/1235/1188 1169/1215/1169\nf 1191/1238/1191 1169/1215/1169 1183/1230/1183\nf 1192/1239/1192 1193/1240/1193 1179/1226/1179\nf 1192/1239/1192 1179/1226/1179 1178/1225/1178\nf 1192/1239/1192 1178/1225/1178 1177/1224/1177\nf 1192/1239/1192 1177/1224/1177 1194/1241/1194\nf 1180/1227/1180 1193/1240/1193 1072/1108/1072\nf 1180/1227/1180 1072/1108/1072 1105/1144/1105\nf 1180/1227/1180 1105/1144/1105 1107/1146/1107\nf 1180/1227/1180 1107/1146/1107 1181/1228/1181\nf 1194/1241/1194 1177/1224/1177 1176/1223/1176\nf 1194/1241/1194 1176/1223/1176 1114/1161/1114\nf 1062/1095/1062 1194/1241/1194 1114/1161/1114\nf 1062/1095/1062 1114/1161/1114 1066/1101/1066\nf 707/724/707 1072/1108/1072 1193/1240/1193\nf 707/724/707 1193/1240/1193 825/845/825\nf 825/845/825 1193/1240/1193 1192/1239/1192\nf 825/845/825 1192/1239/1192 1059/1093/1059\nf 1173/1220/1173 1191/1238/1191 832/853/832\nf 1173/1220/1173 832/853/832 711/728/711\nf 1183/1230/1183 1182/1229/1182 1005/1035/1005\nf 1183/1230/1183 1005/1035/1005 831/851/831\nf 1187/1234/1187 1184/1233/1184 1166/1212/1166\nf 1187/1234/1187 1166/1212/1166 1167/1214/1167\nf 710/727/710 1115/1160/1115 1175/1222/1175\nf 710/727/710 1175/1222/1175 1174/1221/1174\nf 1182/1229/1182 1181/1228/1181 1107/1146/1107\nf 1182/1229/1182 1107/1146/1107 1005/1035/1005\nf 453/443/453 1049/1083/1049 720/738/720\nf 453/443/453 720/738/720 598/590/598\nf 1123/1170/1123 888/910/888 889/909/889\nf 1123/1170/1123 889/909/889 844/865/844\nf 916/938/916 794/814/794 793/813/793\nf 916/938/916 793/813/793 913/939/913\nf 711/728/711 832/853/832 770/787/770\nf 711/728/711 770/787/770 708/729/708\nf 919/943/919 927/949/927 1128/1174/1128\nf 919/943/919 1128/1174/1128 959/982/959\nf 925/948/925 708/729/708 770/787/770\nf 925/948/925 770/787/770 769/786/769\nf 913/939/913 793/813/793 954/976/954\nf 913/939/913 954/976/954 924/946/924\nf 831/851/831 832/853/832 1191/1238/1191\nf 831/851/831 1191/1238/1191 1183/1230/1183\nf 895/915/895 767/784/767 766/783/766\nf 895/915/895 766/783/766 1006/1036/1006\nf 891/912/891 804/828/804 807/827/807\nf 891/912/891 807/827/807 788/808/788\nf 778/795/778 777/794/777 788/808/788\nf 778/795/778 788/808/788 807/827/807\nf 810/830/810 1000/1027/1000 776/797/776\nf 810/830/810 776/797/776 779/796/779\nf 947/970/947 1127/1173/1127 1073/1110/1073\nf 947/970/947 1073/1110/1073 952/975/952\nf 1106/1145/1106 1136/1182/1136 1132/1178/1132\nf 1106/1145/1106 1132/1178/1132 714/731/714\nf 1061/1096/1061 1062/1095/1062 1066/1101/1066\nf 1061/1096/1061 1066/1101/1066 1065/1104/1065\nf 443/1098/443 497/1150/497 1057/1090/1057\nf 443/1098/443 1057/1090/1057 1064/1099/1064\nf 1064/1099/1064 1108/1147/1108 1113/1159/1113\nf 1064/1099/1064 1113/1159/1113 1063/1100/1063\nf 1061/1096/1061 1108/1147/1108 1056/1089/1056\nf 1061/1096/1061 1056/1089/1056 1060/1094/1060\nf 1192/1239/1192 1194/1241/1194 1062/1095/1062\nf 1192/1239/1192 1062/1095/1062 1059/1093/1059\nf 1173/1220/1173 711/728/711 710/727/710\nf 1173/1220/1173 710/727/710 1174/1221/1174\nf 880/900/880 881/905/881 884/904/884\nf 880/900/880 884/904/884 878/901/878\nf 841/862/841 1047/1081/1047 1046/1080/1046\nf 841/862/841 1046/1080/1046 723/740/723\nf 1070/1106/1070 1048/1082/1048 1047/1081/1047\nf 1070/1106/1070 1047/1081/1047 841/862/841\nf 461/1115/461 342/999/342 885/907/885\nf 461/1115/461 885/907/885 886/906/886\nf 1114/1161/1114 1176/1223/1176 1175/1222/1175\nf 1114/1161/1114 1175/1222/1175 1115/1160/1115\nf 887/908/887 1124/1169/1124 1130/1176/1130\nf 887/908/887 1130/1176/1130 852/873/852\nf 206/186/206 852/873/852 1130/1176/1130\nf 206/186/206 1130/1176/1130 532/524/532\nf 681/698/681 599/592/599 1195/1242/1195\nf 681/698/681 1195/1242/1195 682/699/682\nf 1196/1243/1196 674/691/674 684/702/684\nf 1196/1243/1196 684/702/684 1195/1242/1195\nf 1197/1244/1197 675/692/675 674/691/674\nf 1197/1244/1197 674/691/674 1196/1243/1196\nf 689/706/689 690/708/690 675/692/675\nf 689/706/689 675/692/675 1197/1244/1197\nf 693/710/693 1199/1245/1199 1200/1246/1200\nf 693/710/693 1200/1246/1200 1198/1247/1198\nf 686/707/686 689/706/689 1197/1244/1197\nf 686/707/686 1197/1244/1197 1199/1245/1199\nf 1196/1243/1196 1195/1242/1195 1202/1248/1202\nf 1196/1243/1196 1202/1248/1202 1201/1249/1201\nf 1084/1122/1084 1083/1124/1083 1204/1250/1204\nf 1084/1122/1084 1204/1250/1204 1203/1251/1203\nf 1092/1131/1092 1013/1042/1013 1203/1251/1203\nf 1092/1131/1092 1203/1251/1203 1204/1250/1204\nf 1206/1252/1206 1087/1253/1087 1207/1254/1207\nf 1206/1252/1206 1207/1254/1207 1205/1255/1205\nf 1206/1252/1206 1208/1256/1208 1086/1257/1086\nf 1206/1252/1206 1086/1257/1086 1087/1253/1087\nf 1091/1258/1091 1090/1259/1090 1210/1260/1210\nf 1091/1258/1091 1210/1260/1210 1209/1261/1209\nf 1093/1132/1093 1211/1262/1211 757/774/757\nf 1093/1132/1093 757/774/757 756/775/756\nf 1079/1120/1079 1212/1263/1212 1090/1128/1090\nf 1079/1120/1079 1090/1128/1090 1080/1118/1080\nf 1079/1120/1079 979/1006/979 1088/1127/1088\nf 1079/1120/1079 1088/1127/1088 1212/1263/1212\nf 1209/1261/1209 1213/1264/1213 1085/1265/1085\nf 1209/1261/1209 1085/1265/1085 1131/1266/1131\nf 1089/1130/1089 1091/1129/1091 1131/1177/1131\nf 1089/1130/1089 1131/1177/1131 1036/1070/1036\nf 1213/1264/1213 1214/1267/1214 1204/1268/1204\nf 1213/1264/1213 1204/1268/1204 1083/1269/1083\nf 1214/1267/1214 1215/1270/1215 1092/1271/1092\nf 1214/1267/1214 1092/1271/1092 1204/1268/1204\nf 1015/1045/1015 757/774/757 1211/1262/1211\nf 1015/1045/1015 1211/1262/1211 1216/1272/1216\nf 1211/1273/1211 1093/1274/1093 1215/1270/1215\nf 1211/1273/1211 1215/1270/1215 1217/1275/1217\nf 1088/1276/1088 1208/1256/1208 1210/1260/1210\nf 1088/1276/1088 1210/1260/1210 1212/1277/1212\nf 1216/1278/1216 1211/1273/1211 1217/1275/1217\nf 1216/1278/1216 1217/1275/1217 1218/1279/1218\nf 1219/1280/1219 1218/1279/1218 1205/1255/1205\nf 1219/1280/1219 1205/1255/1205 1207/1254/1207\nf 698/715/698 697/714/697 717/734/717\nf 698/715/698 717/734/717 716/737/716\nf 967/992/967 418/407/418 524/516/524\nf 967/992/967 524/516/524 968/993/968\nf 598/590/598 720/738/720 712/733/712\nf 598/590/598 712/733/712 293/276/293\nf 697/714/697 721/739/721 1050/1084/1050\nf 697/714/697 1050/1084/1050 717/734/717\nf 957/979/957 956/978/956 1005/1035/1005\nf 957/979/957 1005/1035/1005 1107/1146/1107\nf 1186/1232/1186 1185/1231/1185 1189/1236/1189\nf 1186/1232/1186 1189/1236/1189 1190/1237/1190\nf 1022/1051/1022 896/917/896 765/782/765\nf 1022/1051/1022 765/782/765 764/785/764\nf 1122/1168/1122 896/917/896 1022/1051/1022\nf 1122/1168/1122 1022/1051/1022 1021/1054/1021\nf 678/695/678 1198/1247/1198 625/631/625\nf 678/695/678 625/631/625 27/8/27\nf 1195/1242/1195 599/592/599 626/632/626\nf 1195/1242/1195 626/632/626 1202/1248/1202\nf 1202/1248/1202 626/632/626 628/634/628\nf 1202/1248/1202 628/634/628 1220/1281/1220\nf 1198/1247/1198 1220/1281/1220 628/634/628\nf 1198/1247/1198 628/634/628 625/631/625\nf 1222/1282/1222 1223/1283/1223 1224/1284/1224\nf 1222/1282/1222 1224/1284/1224 1221/1285/1221\nf 1226/1286/1226 1227/1287/1227 1228/1288/1228\nf 1226/1286/1226 1228/1288/1228 1225/1289/1225\nf 1230/1290/1230 1231/1291/1231 1232/1292/1232\nf 1230/1290/1230 1232/1292/1232 1229/1293/1229\nf 1234/1294/1234 1232/1292/1232 1231/1291/1231\nf 1234/1294/1234 1231/1291/1231 1233/1295/1233\nf 1236/1296/1236 1237/1297/1237 1238/1298/1238\nf 1236/1296/1236 1238/1298/1238 1235/1299/1235\nf 1221/1285/1221 1239/1300/1239 1240/1301/1240\nf 1221/1285/1221 1240/1301/1240 1233/1295/1233\nf 1242/1302/1242 1243/1303/1243 1244/1304/1244\nf 1242/1302/1242 1244/1304/1244 1241/1305/1241\nf 1237/1297/1237 1245/1306/1245 1246/1307/1246\nf 1237/1297/1237 1246/1307/1246 1238/1298/1238\nf 1246/1307/1246 1245/1306/1245 1242/1302/1242\nf 1246/1307/1246 1242/1302/1242 1241/1305/1241\nf 1248/1308/1248 1224/1284/1224 1249/1309/1249\nf 1248/1308/1248 1249/1309/1249 1247/1310/1247\nf 1249/1309/1249 1250/1311/1250 660/1312/660\nf 1249/1309/1249 660/1312/660 659/1313/659\nf 661/1314/661 1247/1310/1247 1249/1309/1249\nf 661/1314/661 1249/1309/1249 659/1313/659\nf 1221/1285/1221 1224/1284/1224 1248/1308/1248\nf 1221/1285/1221 1248/1308/1248 1239/1300/1239\nf 1231/1291/1231 1222/1282/1222 1221/1285/1221\nf 1231/1291/1231 1221/1285/1221 1233/1295/1233\nf 1232/1292/1232 1234/1294/1234 1243/1303/1243\nf 1232/1292/1232 1243/1303/1243 1242/1302/1242\nf 1244/1304/1244 1243/1303/1243 1234/1294/1234\nf 1244/1304/1244 1234/1294/1234 1251/1315/1251\nf 1240/1301/1240 1251/1315/1251 1234/1294/1234\nf 1240/1301/1240 1234/1294/1234 1233/1295/1233\nf 1253/1316/1253 1134/1181/1134 1135/1180/1135\nf 1253/1316/1253 1135/1180/1135 1252/1317/1252\nf 1254/1318/1254 1255/1319/1255 1229/1293/1229\nf 1254/1318/1254 1229/1293/1229 1232/1292/1232\nf 1254/1318/1254 1225/1289/1225 1228/1288/1228\nf 1254/1318/1254 1228/1288/1228 1255/1319/1255\nf 667/1320/667 1252/1317/1252 1135/1180/1135\nf 667/1320/667 1135/1180/1135 539/1183/539\nf 1226/1286/1226 1225/1289/1225 1237/1297/1237\nf 1226/1286/1226 1237/1297/1237 1236/1296/1236\nf 1245/1306/1245 1254/1318/1254 1232/1292/1232\nf 1245/1306/1245 1232/1292/1232 1242/1302/1242\nf 1254/1318/1254 1245/1306/1245 1237/1297/1237\nf 1254/1318/1254 1237/1297/1237 1225/1289/1225\nf 669/674/669 668/675/668 1226/1286/1226\nf 669/674/669 1226/1286/1226 1236/1296/1236\nf 1230/1290/1230 1256/1321/1256 1222/1282/1222\nf 1230/1290/1230 1222/1282/1222 1231/1291/1231\nf 1235/1299/1235 671/677/671 669/674/669\nf 1235/1299/1235 669/674/669 1236/1296/1236\nf 1230/1290/1230 1101/1139/1101 1100/1138/1100\nf 1230/1290/1230 1100/1138/1100 1256/1321/1256\nf 672/678/672 488/480/488 1103/1142/1103\nf 672/678/672 1103/1142/1103 1227/1287/1227\nf 1224/1284/1224 1223/1283/1223 1250/1311/1250\nf 1224/1284/1224 1250/1311/1250 1249/1309/1249\nf 1256/1321/1256 1100/1138/1100 1134/1181/1134\nf 1256/1321/1256 1134/1181/1134 1253/1316/1253\nf 1227/1287/1227 1103/1142/1103 1132/1178/1132\nf 1227/1287/1227 1132/1178/1132 1228/1288/1228\nf 1101/1139/1101 1230/1290/1230 1229/1293/1229\nf 1101/1139/1101 1229/1293/1229 1133/1179/1133\nf 1223/1283/1223 1253/1316/1253 1252/1317/1252\nf 1223/1283/1223 1252/1317/1252 1250/1311/1250\nf 1255/1319/1255 1136/1182/1136 1133/1179/1133\nf 1255/1319/1255 1133/1179/1133 1229/1293/1229\nf 1228/1288/1228 1132/1178/1132 1136/1182/1136\nf 1228/1288/1228 1136/1182/1136 1255/1319/1255\nf 660/1312/660 1250/1311/1250 1252/1317/1252\nf 660/1312/660 1252/1317/1252 667/1320/667\nf 668/675/668 672/678/672 1227/1287/1227\nf 668/675/668 1227/1287/1227 1226/1286/1226\nf 1222/1282/1222 1256/1321/1256 1253/1316/1253\nf 1222/1282/1222 1253/1316/1253 1223/1283/1223\nf 1/1322/1 12/1323/12 1247/1310/1247\nf 1/1322/1 1247/1310/1247 661/1314/661\nf 10/1324/10 8/1325/8 1240/1301/1240\nf 10/1324/10 1240/1301/1240 1239/1300/1239\nf 1239/1300/1239 1248/1308/1248 11/1326/11\nf 1239/1300/1239 11/1326/11 10/1324/10\nf 5/1327/5 3/1328/3 1235/1299/1235\nf 5/1327/5 1235/1299/1235 1238/1298/1238\nf 9/1329/9 4/1330/4 1246/1307/1246\nf 9/1329/9 1246/1307/1246 1241/1305/1241\nf 1240/1301/1240 8/1325/8 6/1331/6\nf 1240/1301/1240 6/1331/6 1251/1315/1251\nf 7/1332/7 9/1329/9 1241/1305/1241\nf 7/1332/7 1241/1305/1241 1244/1304/1244\nf 11/1326/11 1248/1308/1248 1247/1310/1247\nf 11/1326/11 1247/1310/1247 12/1323/12\nf 3/1328/3 2/690/2 671/677/671\nf 3/1328/3 671/677/671 1235/1299/1235\nf 1238/1298/1238 1246/1307/1246 4/1330/4\nf 1238/1298/1238 4/1330/4 5/1327/5\nf 7/1332/7 1244/1304/1244 1251/1315/1251\nf 7/1332/7 1251/1315/1251 6/1331/6\nf 1203/1251/1203 1013/1042/1013 1012/1043/1012\nf 1203/1251/1203 1012/1043/1012 736/757/736\nf 937/959/937 941/964/941 1027/1057/1027\nf 937/959/937 1027/1057/1027 999/1030/999\nf 1084/1122/1084 739/756/739 1034/1067/1034\nf 1084/1122/1084 1034/1067/1034 1037/1071/1037\nf 1197/1244/1197 1196/1243/1196 1201/1249/1201\nf 1197/1244/1197 1201/1249/1201 1199/1245/1199\nf 1203/1251/1203 736/757/736 739/756/739\nf 1203/1251/1203 739/756/739 1084/1122/1084\nf 936/962/936 784/805/784 941/964/941\nf 936/962/936 941/964/941 937/959/937\nf 786/806/786 1004/1033/1004 940/963/940\nf 786/806/786 940/963/940 785/804/785\nf 467/1333/467 612/604/612 387/1334/387\nf 612/604/612 624/630/624 387/1334/387\nf 621/628/621 387/1334/387 624/630/624\nf 604/595/604 44/22/44 28/5/28\nf 472/605/472 612/604/612 467/1333/467\nf 29/6/29 28/5/28 47/26/47\nf 43/21/43 48/25/48 44/22/44\nf 30/7/30 266/1335/266 27/8/27\nf 424/414/424 239/223/239 425/415/425\nf 467/458/467 363/347/363 472/463/472\nf 561/552/561 560/553/560 572/564/572\nf 549/540/549 551/542/551 579/571/579\nf 583/574/583 595/588/595 582/575/582\nf 31/12/31 36/13/36 600/591/600\nf 39/16/39 44/22/44 603/597/603\nf 32/9/32 599/592/599 45/23/45\nf 473/626/473 613/607/613 471/606/471\nf 477/620/477 478/625/478 620/621/620\nf 474/611/474 615/610/615 617/627/617\nf 1257/1336/1257 614/609/614 618/616/618\nf 1257/1336/1257 620/621/620 622/624/622\nf 1257/1336/1257 618/616/618 619/619/619\nf 1257/1336/1257 613/607/613 615/610/615\nf 614/609/614 1257/1336/1257 615/610/615\nf 622/624/622 623/629/623 1257/1336/1257\nf 1257/1336/1257 623/629/623 611/603/611\nf 624/630/624 623/629/623 621/628/621\nf 469/617/469 618/616/618 470/615/470\nf 614/609/614 476/608/476 533/614/533\nf 610/602/610 1257/1336/1257 611/603/611\nf 613/607/613 1257/1336/1257 610/602/610\nf 620/621/620 1257/1336/1257 619/619/619\nf 541/532/541 592/584/592 562/555/562\nf 541/532/541 587/581/587 592/584/592\nf 627/633/627 607/599/607 605/596/605\nf 627/633/627 605/596/605 604/595/604\nf 605/596/605 606/598/606 603/597/603\nf 607/599/607 606/598/606 605/596/605\nf 1207/1254/1207 1082/1337/1082 1015/1338/1015\nf 1219/1280/1219 1207/1254/1207 1015/1338/1015\nf 1015/1338/1015 1216/1278/1216 1219/1280/1219\nf 693/710/693 1198/1247/1198 678/695/678\nf 1207/1254/1207 1087/1253/1087 1082/1337/1082\nf 678/695/678 677/697/677 694/712/694\nf 695/713/695 692/711/692 693/710/693\nf 266/1335/266 679/696/679 27/8/27\nf 883/903/883 1044/1079/1044 1045/1078/1045\nf 992/1020/992 1082/1121/1082 1087/1125/1087\nf 1158/1205/1158 1157/1204/1157 1168/1216/1168\nf 1147/1194/1147 1145/1192/1145 1176/1223/1176\nf 1193/1240/1193 1180/1227/1180 1179/1226/1179\nf 684/702/684 682/699/682 1195/1242/1195\nf 693/710/693 686/707/686 1199/1245/1199\nf 599/592/599 681/698/681 45/23/45\nf 1208/1256/1208 1088/1276/1088 1086/1257/1086\nf 1093/1274/1093 1092/1271/1092 1215/1270/1215\nf 1210/1260/1210 1090/1259/1090 1212/1277/1212\nf 1209/1261/1209 1258/1339/1258 1213/1264/1213\nf 1215/1270/1215 1258/1339/1258 1217/1275/1217\nf 1213/1264/1213 1258/1339/1258 1214/1267/1214\nf 1208/1256/1208 1258/1339/1258 1210/1260/1210\nf 1258/1339/1258 1209/1261/1209 1210/1260/1210\nf 1218/1279/1218 1217/1275/1217 1258/1339/1258\nf 1218/1279/1218 1258/1339/1258 1205/1255/1205\nf 1218/1279/1218 1219/1280/1219 1216/1278/1216\nf 1213/1264/1213 1083/1269/1083 1085/1265/1085\nf 1091/1258/1091 1209/1261/1209 1131/1266/1131\nf 1258/1339/1258 1206/1252/1206 1205/1255/1205\nf 1258/1339/1258 1208/1256/1208 1206/1252/1206\nf 1258/1339/1258 1215/1270/1215 1214/1267/1214\nf 1189/1236/1189 1138/1184/1138 1160/1207/1160\nf 1185/1231/1185 1138/1184/1138 1189/1236/1189\nf 1202/1248/1202 1220/1281/1220 1200/1246/1200\nf 1200/1246/1200 1220/1281/1220 1198/1247/1198\nf 1201/1249/1201 1200/1246/1200 1199/1245/1199\nf 1201/1249/1201 1202/1248/1202 1200/1246/1200\n# 2492 faces\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1]),\n\t\t\ty = float.Parse (strItems [2]),\n\t\t\tz = float.Parse (strItems [3])\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\nusing static Geometry;\n```\n\n# Lesson 2: Triangle rasterization and back face culling\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\n# Old-school method: Line sweeping\n\nThus, the task is to draw two-dimensional triangles. For motivated students it normally takes a couple of hours, even if they are bad programmers. Last time we saw Bresenham’s line drawing algorithm. Today’s task is to draw a filled triangle. Funny enough, but this task is not trivial. I don’t know why, but I know that it’s true. Most of my students struggle with this simple task. So, the initial stub will look like this:\n\n```csharp\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n    Line(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n    Line(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    Line(image, t[0], t[1], color);\n    Line(image, t[1], t[2], color);\n    Line(image, t[2], t[0], color);\n}\n\nVec2i[] t0 = {\n    new Vec2i { x = 10, y = 70 },\n    new Vec2i { x = 50, y = 160 },\n    new Vec2i { x = 70, y = 80 }\n};\nVec2i[] t1 = {\n    new Vec2i { x = 180, y = 50 },\n    new Vec2i { x = 150, y = 1 },\n    new Vec2i { x = 70, y = 180 }\n};\nVec2i[] t2 = {\n    new Vec2i { x = 180, y = 150 },\n    new Vec2i { x = 120, y = 160 },\n    new Vec2i { x = 130, y = 180 }\n};\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThe code is simple: I provide three triangles for the initial debugging of your code. If we invoke `Line` inside the triangle function, we’ll get the contour of the triangle. How to draw a filled triangle?\n\nA good method of drawing a triangle must have the following features:\n\n* It should be (surprise!) simple and fast.\n\n\n* It should be symmetrical: the picture should not depend on the order of vertices passed to the drawing function.\n\n\n* If two triangles have two common vertices, there should be no holes between them because of rasterization rounding.\n\nWe could add more requirements, but let’s do with these ones. Traditionally a line sweeping is used:\n\n1. Sort vertices of the triangle by their y-coordinates\n\n2. Rasterize simultaneously the left and the right sides of the triangle\n\n3. Draw a horizontal line segment between the left and the right boundary points\n\nAt this point my students start to lose the firm ground: which segment is the left one, which one is right? Besides, there are three segments in a triangle... Usually, after this introduction I leave my students for about an hour: once again, reading my code is much less valuable than comparing your own code with mine.\n\n`[One hour passes]`\n\nHow do I draw a triangle? Once again, if you have a better method, I’d be glad to adopt it. Let us assume that we have three points of the triangle: `t0`, `t1`, `t2`, they are sorted in ascending order by the y-coordinate. Then, the boundary A is between `t0` and `t2`, boundary B is between `t0` and `t1`, and then between `t1` and `t2`.\n\n```csharp\nvoid OrderByY (Vec2i[] t)\n{\n    if(t[0].y > t[1].y) Swap(t, 0, 1);\n    if(t[1].y > t[2].y) Swap(t, 1, 2);\n    if(t[0].y > t[1].y) Swap(t, 0, 1);   \n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    Line(image, t[0], t[1], Color.Green);\n    Line(image, t[1], t[2], Color.Green);\n    Line(image, t[2], t[0], Color.Red);    \n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\n// Here boundary A is red, and boundary B is green.\nimage.VerticalFlip ();\nimage\n```\n\nUnfortunately, boundary B is made of two parts. Let us draw the bottom half of the triangle by cutting it horizontally:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        image[A.x, y] = Color.Red; \n        image[B.x, y] = Color.Green; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNote that the segments are not continuous. Last time when we drew straight lines we struggled to get continuous segments and here I did not bother with rotating the image (remember the xy swapping?). Why? We fill the triangles aftewards, that’s why. If we connect the corresponding pairs of points by horizontal lines, the gaps disappear:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        Line(image, A, B, Color.White);\n        image[B.x, y] = Color.Green; \n        image[A.x, y] = Color.Red; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNow, let us draw the second (upper) half of the triangle. We can do this by adding a second loop:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    \n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n    \n    float height_21 = t[2].y - t[1].y;\n    for(int y=t[1].y; y<=t[2].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[1].y) / height_21; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[1].x + (int)((t[2].x-t[1].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThis could be enough, but I dislike to see the same code twice. That is why we will make it a bit less readable, but more handy for modifications/maintaining:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    // I dont care about degenerate triangles\n    if(t[0].y == t[1].y && t[1].y == t[2].y)\n        return;\n\n    OrderByY(t);\n\n    float height_10 = t[1].y - t[0].y;\n    float total_height = t[2].y - t[0].y;\n    for(int i=0; i<total_height; i++) {\n        bool second_half = i > t[1].y - t[0].y || t[1].y == t[0].y;\n        float segment_height = second_half ? t[2].y-t[1].y : t[1].y-t[0].y;\n        var alpha = i / total_height;\n        // be careful with divisions by zero\n        var beta = (i - (second_half ? t[1].y-t[0].y : 0)) / segment_height;\n        Vec2i A = new Vec2i {\n            x = t[0].x + (int)((t[2].x-t[0].x)*alpha),\n            y = t[0].y + i\n        };\n        Vec2i B = new Vec2i {\n            x = second_half ? t[1].x + (int)((t[2].x-t[1].x)*beta) : t[0].x + (int)((t[1].x-t[0].x)*beta),\n            y = t[0].y + i\n        };\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, t[0].y + i] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\n# The method I adopt for my code\n\nWhile not being really complicated, the source code for the line sweeping is a bit messy. Moreover, it is really an old-school approach designed for mono-thread CPU programming. Let us take a look at the following pseudo-code:\n\n```csharp\n// triangle(Vec2i[] points) { \n//     Vec2i bbox[2] = find_bounding_box(points); \n//     for (each pixel in the bounding box) { \n//         if (inside(points, pixel)) { \n//             put_pixel(pixel); \n//         } \n//     } \n// }\n```\n\nDo you like it? I do. It is really easy to find a bounding box. It is certainly no problem to check whether a point belongs a 2D triangle (or any convex polygon).\n\n*Off Topic: if I have to implement some code to check whether a point belongs to a polygon, and this program will run on a plane, I will never get on this plane. Turns out, it is a surprisingly difficult task to solve this problem reliably. But here we just painting pixels. I am okay with that.*\n\nThere is another thing I like about this pseudocode: a neophyte in programming accepts it with enthusiasm, more experienced programmers often chuckle: “*What an idiot wrote it?*”. And an expert in computer graphics programming will shrug his shoulders and say: “*Well, that’s how it works in real life*”. Massively parallel computations in thousands of threads (i’m talking about regular consumer computers here) change the way of thinking.\n\nOkay, let us start: first of all we need to know what the [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) are. Given a 2D triangle ABC and a point P, all in old good Cartesian coordinates `(xy)`. Our goal is to find barycentric coordinates of the point P with respect to the triangle ABC. It means that we look for three numbers `(1 − u − v,u,v)` such that we can find the point P as follows:\n\n![ ](./img/lesson2_f1.png)\n\nWhile being a bit frightening at the first glance, it is really simple: imagine that we put three weights `(1−u−v,u,v)` at the vertices A, B and C, respectively. Then the barycenter of the system is exactly in the point P. We can say the same thing with other words: the point P has coordinates `(u,v)` in the (oblique) basis (A,![](./img/lesson2_ab.png),![](./img/lesson2_ac.png)):\n\n![ ](./img/lesson2_f2.png)\n\nSo, we have vectors ![](./img/lesson2_ab.png)￼, ![](./img/lesson2_ac.png)￼ and ![￼](./img/lesson2_ap.png), we need to find two real numbers u and v respecting the following constraint:\n\n![ ](./img/lesson2_f3.png)\n\nIt is a simple vector equation, or a linear system of two equations with two variables:\n\n![ ](./img/lesson2_f4.png)\n\nI am lazy and do not want to solve linear systems in a scholar way. Let us write it in matrix form:\n\n![ ](./img/lesson2_f5.png)\n\nIt means that we are looking for a vector `(u,v,1)` that is orthogonal to `(￼ABx,AC￼x,￼PAx)` and `(￼ABy,AC￼y,PA￼y)` *at the same time*! I hope you see [where I am heading](https://en.wikipedia.org/wiki/Cross_product). That is a small hint: to find an intersection of two straight lines in a plane (that is exactly what we did here), it is sufficient to compute one cross product. By the way, test yourself: how do we find an equation of a line passing through two given points?\n\nSo, let us program our new rasterization routine: we iterate through all pixels of a bounding box for a given triangle. For each pixel we compute its barycentric coordinates. If it has at least one negative component, then the pixel is outside of the triangle. Probably it is more clear to see the program directly:\n\n```csharp\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}\n```\n\n# Flat shading render\n\nWe already know how to draw a model with empty triangles. Let us fill them with a random color. This will help us to see how well we have encoded filling of triangles. Here is the code:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\n// Map world coordinates [-1..-1] to screen coordinates [0..width]\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*image.Width/2),\n    y = (int)((v.y+1)*image.Height/2)\n};\n\nvar rnd = new Random();\nFunc<byte> rndByte = () => (byte)rnd.Next(255);\nFunc<Color> rndColor = () => new Color(rndByte(), rndByte(), rndByte()); \n\nvar coordinates = new Vec3f[3];\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        var v = headModel.Vertices[vIndex];\n        coordinates[i] = map(v);\n    }    \n    Triangle(image, coordinates, rndColor());\n}\n\nimage.VerticalFlip ();\nimage\n```\n\nLet us get rid of these clown-colors and put some lighting. Captain Obvious: ”*At the same light intensity, the polygon is illuminated most brightly when it is orthogonal to the light direction.*”\n\nLet us compare:\n\n![ ](./img/lesson2_light1.jpeg)\n\n![](./img/lesson2_light2.jpeg)\n\nWe get zero illumination if the polygon is parallel to the vector of light. To paraphrase: the intensity of illumination is equal to the scalar product of the light vector and the normal to the given triangle. The normal to the triangle can be calculated simply as the [cross product](https://en.wikipedia.org/wiki/Cross_product) of its two sides.\n\nAs a side note, at this course we will perform linear computations on the colors. However `(128,128,128)` color is not half as bright as `(255, 255, 255)`. We are going to ignore gamma correction and tolerate the incorrectness of the brightness of our colors.\n\n```csharp\nvar image = new Image (width, height, Format.BGR);\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\nforeach (var face in headModel.Faces) {\n    for (int i = 0; i < 3; i++) {\n        var vIndex = face.Vertices [i];\n        world [i] = headModel.Vertices [vIndex];\n        screen [i] = map (world [i]);\n    }\n\n    var n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n    var intensivity = Dot (n, light_dir);\n    if (intensivity > 0)\n        Triangle (image, screen, Color.White * intensivity);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/lesson1.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/lesson2.csx",
    "content": "using static Geometry;\n\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\n\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n\tLine(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n\tLine(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n\tLine(image, t[0], t[1], color);\n\tLine(image, t[1], t[2], color);\n\tLine(image, t[2], t[0], color);\n}\n\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson2.workbook/obj/african_head.obj",
    "content": "v -0.000581696 -0.734665 -0.623267\nv 0.000283538 -1 0.286843\nv -0.117277 -0.973564 0.306907\nv -0.382144 -0.890788 0.221243\nv -0.247144 -0.942602 0.276051\nv -0.656078 -0.718512 -0.109025\nv -0.609847 -0.786562 0.0198068\nv -0.66248 -0.632053 -0.244271\nv -0.511812 -0.845392 0.127809\nv -0.609326 -0.569868 -0.41571\nv -0.426949 -0.649767 -0.567143\nv -0.201076 -0.720822 -0.633205\nv 0.117382 -0.973645 0.306766\nv 0.382454 -0.890869 0.221097\nv 0.247512 -0.942667 0.275986\nv 0.656371 -0.718624 -0.109224\nv 0.610273 -0.786562 0.0197893\nv 0.66248 -0.631463 -0.244119\nv 0.511631 -0.845357 0.127832\nv 0.608654 -0.568839 -0.416318\nv 0.424663 -0.649937 -0.567418\nv 0.198972 -0.720968 -0.633141\nv 0.153371 -0.140519 0.477416\nv 0.134781 -0.14723 0.48805\nv 0.131261 -0.132153 0.49872\nv 0.14749 -0.135105 0.489565\nv 0.000686924 -0.0534984 0.505694\nv 0.075062 -0.0473306 0.49955\nv 0.0695841 -0.0997942 0.550277\nv 0.0302569 -0.0971868 0.55389\nv 0.0745124 -0.135953 0.523215\nv 0.0354892 -0.12785 0.535159\nv 0.0389268 -0.109557 0.550558\nv 0.0734835 -0.11538 0.538029\nv 0.106386 -0.125623 0.51513\nv 0.107415 -0.144295 0.5047\nv 0.15968 -0.130861 0.484794\nv 0.156224 -0.123705 0.486735\nv 0.15792 -0.107798 0.4677\nv 0.163784 -0.126996 0.470144\nv 0.154687 -0.134655 0.486373\nv 0.160668 -0.135649 0.476189\nv 0.143433 -0.119034 0.499854\nv 0.131606 -0.0726738 0.476148\nv -0.000260156 -0.124553 0.539058\nv -0.000646004 -0.110651 0.55444\nv 0.100423 -0.10574 0.537643\nv 0.126128 -0.115784 0.515598\nv 0.250944 -0.275583 0.380381\nv 0.221602 -0.335752 0.330174\nv 0.275434 -0.301318 0.24751\nv 0.307699 -0.239869 0.292356\nv 0.332124 -0.0415605 0.412962\nv 0.319444 0.00732526 0.451091\nv 0.28667 -0.025805 0.481549\nv 0.297006 -0.0758717 0.454242\nv 0.357953 -0.159928 -0.223225\nv 0.303981 -0.144611 -0.343644\nv 0.296386 -0.0547553 -0.357792\nv 0.357339 -0.0633433 -0.24278\nv 0.45086 0.331215 0.047962\nv 0.438899 0.336167 0.131147\nv 0.447405 0.226107 0.139349\nv 0.455613 0.205353 0.0827643\nv 0.197493 -0.411308 0.138256\nv 0.204911 -0.353378 0.2082\nv 0.102001 -0.419375 0.24969\nv 0.0995867 -0.475697 0.20834\nv 0.150133 -0.372261 0.431226\nv 0.176423 -0.362054 0.392056\nv 0.196019 -0.326474 0.426929\nv 0.154611 -0.348549 0.463444\nv 0.0892273 -0.391968 0.303592\nv 0.159013 -0.363737 0.305077\nv 0.455712 0.508986 -0.0641442\nv 0.432146 0.648411 -0.0417475\nv 0.417051 0.611568 0.0817295\nv 0.44205 0.483438 0.0478626\nv 0.3446 0.43288 0.398633\nv 0.372358 0.383369 0.353998\nv 0.388341 0.404485 0.306953\nv 0.355059 0.467372 0.356967\nv 0.305162 0.338815 0.458112\nv 0.298579 0.319803 0.456627\nv 0.313422 0.304568 0.427776\nv 0.323711 0.315968 0.429291\nv 0.33161 0.397557 0.430226\nv 0.354427 0.359727 0.390478\nv 0.304162 0.291952 0.432377\nv 0.292662 0.309771 0.452991\nv 0.282934 0.292496 0.4562\nv 0.292025 0.281663 0.435178\nv 0.397344 0.565249 0.192585\nv 0.42257 0.455996 0.145494\nv 0.317848 0.364866 0.448834\nv 0.340595 0.337517 0.417978\nv 0.243227 0.479439 0.494236\nv 0.250155 0.546138 0.465934\nv 0.179019 0.560251 0.511681\nv 0.170173 0.4781 0.536229\nv 0.162386 0.410407 0.547009\nv 0.235031 0.427051 0.517018\nv 0.271745 0.634415 0.42162\nv 0.196896 0.657291 0.472505\nv 0.186589 0.312952 0.511073\nv 0.189518 0.32493 0.514165\nv 0.146286 0.31277 0.509009\nv 0.144959 0.300178 0.501713\nv 0.143965 0.300412 0.49409\nv 0.187203 0.310596 0.506407\nv 0.157744 0.364614 0.528804\nv 0.216697 0.382527 0.516083\nv 0.194441 0.332425 0.515989\nv 0.204286 0.349818 0.516732\nv 0.156254 0.334062 0.519579\nv 0.151565 0.320341 0.513961\nv 0.0431068 0.071791 0.618005\nv 0.0477954 0.0867105 0.593486\nv 0.0780844 0.0816652 0.602518\nv 0.0574124 0.0746147 0.621185\nv 0.448253 0.130656 0.149533\nv 0.431801 0.159355 0.215905\nv 0.422792 0.0771637 0.237185\nv 0.428691 0.0348783 0.166914\nv 0.365073 -0.0526507 0.316126\nv 0.326974 -0.104793 0.373068\nv 0.312773 -0.172965 0.33446\nv 0.368107 -0.126698 0.269222\nv 0.203695 -0.131796 0.523934\nv 0.180463 -0.136479 0.525396\nv 0.182848 -0.14892 0.516989\nv 0.204163 -0.152533 0.514914\nv 0.39379 0.00616771 0.269368\nv 0.40177 -0.0591341 0.209048\nv 0.26083 -0.0996422 0.484274\nv 0.250406 -0.0552171 0.50321\nv 0.15851 -0.136292 0.498474\nv 0.155032 -0.134684 0.502964\nv 0.145006 -0.133819 0.514504\nv 0.171033 -0.12032 0.538263\nv 0.158849 -0.127938 0.534943\nv 0.167969 -0.138075 0.523788\nv 0.232061 -0.151474 0.497024\nv 0.23074 -0.117128 0.507191\nv 0.365798 0.221617 0.362743\nv 0.342501 0.235507 0.392185\nv 0.325951 0.202558 0.415114\nv 0.359268 0.178677 0.383229\nv 0.352369 0.0489033 0.417452\nv 0.322262 0.0907619 0.44953\nv 0.295322 0.04895 0.483251\nv 0.367108 0.00328555 0.369771\nv 0.138972 -0.18796 0.555521\nv 0.161562 -0.177794 0.535913\nv 0.154015 -0.155093 0.536392\nv 0.136131 -0.156414 0.558491\nv 0.220263 -0.08194 0.518603\nv 0.202088 -0.0486753 0.52791\nv 0.17564 -0.0814314 0.545822\nv 0.193131 -0.106435 0.533575\nv 0.199492 -0.169714 0.509722\nv 0.190033 -0.188183 0.514668\nv 0.207302 -0.213011 0.492721\nv 0.222415 -0.183044 0.489617\nv 0.125088 -0.132884 0.551294\nv 0.144497 -0.139192 0.530254\nv 0.135014 0.119128 0.544717\nv 0.119534 0.149685 0.554253\nv 0.096915 0.171211 0.569382\nv 0.112553 0.137432 0.569616\nv 0.0878476 0.217858 0.555667\nv 0.0649773 0.232128 0.568628\nv 0.073466 0.185119 0.584571\nv 0.116359 0.191199 0.548932\nv 0.111419 0.228591 0.524951\nv 0.0858774 0.255408 0.530312\nv 0.301408 0.0368718 -0.387812\nv 0.366839 0.037626 -0.269538\nv 0.272125 -0.199781 0.399533\nv 0.246349 -0.195514 0.453266\nv 0.223339 -0.243049 0.450553\nv 0.364021 -0.197455 0.21335\nv 0.411416 -0.124798 0.140589\nv 0.431568 -0.0028997 0.0907502\nv 0.449346 0.11075 0.0889086\nv 0.0649948 0.777167 0.432594\nv 0.133465 0.770619 0.418569\nv 0.14341 0.869244 0.301253\nv 0.0689586 0.877043 0.315395\nv 0.305372 0.809321 0.22043\nv 0.289307 0.723856 0.335524\nv 0.355187 0.660735 0.264773\nv 0.372264 0.728258 0.148528\nv 0.382308 0.7766 0.0116631\nv 0.0971488 0.470588 0.557912\nv 0.110788 0.565185 0.534317\nv 0.100113 0.277828 0.510938\nv 0.10966 0.248679 0.503771\nv 0.0443988 0.240822 0.58581\nv 0.0522151 0.193614 0.604337\nv 0.052601 0.564735 0.541859\nv 0.123726 0.667896 0.498907\nv 0.0597976 0.671147 0.508711\nv 0.0466729 0.466215 0.561034\nv 0.000423846 0.462807 0.558988\nv -0.00017831 0.388326 0.563478\nv 0.0352086 0.389069 0.560584\nv 0.000833078 0.56384 0.544139\nv 0.295773 0.426823 0.470722\nv 0.301706 0.464689 0.451056\nv 0.189957 0.181465 0.501181\nv 0.186163 0.208931 0.491956\nv 0.141574 0.222722 0.500509\nv 0.146526 0.195338 0.518293\nv 0.111986 0.0116865 0.562811\nv 0.111343 0.0404672 0.565769\nv 0.0577164 0.0420398 0.577988\nv 0.0656438 -0.00796249 0.596918\nv 0.147695 0.0440509 0.537258\nv 0.144778 0.0631738 0.538491\nv 0.0268719 -0.0140834 0.602378\nv 0.0270356 -0.0372401 0.622027\nv 0.0876429 -0.0456996 0.601127\nv 0.183093 0.146552 0.519439\nv 0.148589 0.164593 0.536819\nv 0.147344 0.131095 0.542934\nv 0.176733 0.112264 0.532435\nv -0.000394618 -0.0441035 0.617625\nv -0.000260156 -0.0187662 0.600677\nv 0.165058 0.0770935 0.530856\nv 0.148554 0.0982976 0.535562\nv 0.116476 0.272829 0.494797\nv 0.119084 0.26261 0.493569\nv 0.120873 0.268971 0.480883\nv 0.11761 0.27287 0.484221\nv 0.224695 0.848444 0.271198\nv 0.231324 0.918189 0.121063\nv 0.14614 0.9439 0.150241\nv 0.241894 0.945736 -0.185803\nv 0.156043 0.976475 -0.183418\nv 0.146906 0.980702 -0.0177607\nv 0.23195 0.948285 -0.0402158\nv 0.0684324 0.995189 -0.00981573\nv 0.0682103 0.955014 0.162933\nv 0.0891571 0.383649 0.555118\nv 0.110613 0.336412 0.528863\nv 0.122749 0.310759 0.512914\nv 0.147081 -0.111919 0.55631\nv 0.158656 -0.0994551 0.55786\nv 0.0939743 0.0869969 0.616333\nv 0.101206 0.119326 0.615532\nv 0.0670469 0.122121 0.645885\nv 0.0560853 0.0831385 0.640601\nv 0.0795284 0.0820978 0.567845\nv 0.0337354 0.0564741 0.595059\nv 0.0854448 -0.103577 0.606979\nv 0.0826211 -0.0671141 0.612931\nv 0.0280704 -0.0555854 0.637736\nv 0.0319698 -0.0970874 0.628212\nv 0.0789964 -0.121811 0.579602\nv 0.0327415 -0.116959 0.594106\nv 0.0216981 0.0173339 0.585915\nv -0.00123062 -0.095585 0.625704\nv -0.000511542 -0.0598999 0.637227\nv -0.00157555 -0.115643 0.593966\nv -0.000219233 -0.0988881 0.554498\nv 0.0291929 0.0853015 0.665324\nv 0.0352671 0.124524 0.666125\nv 0.0371846 0.159004 0.648446\nv 0.0654158 0.154462 0.629171\nv 0.0280178 0.19967 0.620548\nv 0.0221015 0.245843 0.59797\nv 0.0432997 0.281499 0.556866\nv 0.0222008 0.28717 0.567459\nv -0.000400465 0.125745 0.673871\nv -0.00057585 0.0822265 0.675105\nv -0.000347849 0.160916 0.656029\nv 0.367195 0.315074 0.363767\nv 0.346658 0.302744 0.393991\nv 0.344389 0.266656 0.384439\nv 0.371726 0.266504 0.352507\nv 0.40246 0.429197 0.234116\nv 0.422126 0.335763 0.207276\nv 0.393316 0.264083 0.313887\nv 0.387102 0.325737 0.325369\nv 0.3274 0.295928 0.408636\nv 0.316392 0.29076 0.418709\nv 0.3085 0.274624 0.423199\nv 0.323636 0.272379 0.406602\nv 0.429381 0.244458 0.204002\nv 0.407084 0.332408 0.277313\nv 0.410597 0.257869 0.266264\nv -0.0012657 -0.456867 0.290093\nv -0.00137093 -0.520579 0.266159\nv 0.154137 -0.304206 0.500479\nv 0.193482 -0.282873 0.473493\nv 0.186367 -0.242201 0.509588\nv 0.148993 -0.26399 0.525367\nv 0.110332 -0.274916 0.545857\nv 0.099347 -0.233134 0.560204\nv 0.0558865 -0.227615 0.569605\nv 0.0659185 -0.270006 0.563817\nv 0.154687 -0.142577 0.51838\nv 0.159498 -0.143009 0.513072\nv 0.154646 -0.138239 0.502496\nv 0.149045 -0.137596 0.50639\nv 0.15958 -0.138174 0.517463\nv 0.161574 -0.141559 0.511657\nv 0.0940387 -0.129288 0.582226\nv 0.109215 -0.12609 0.531844\nv 0.0782715 -0.117578 0.557129\nv 0.264817 0.0151299 0.501573\nv 0.280122 0.127096 0.47057\nv 0.262508 0.0886748 0.494464\nv 0.187613 0.050926 0.529248\nv 0.207829 0.0868157 0.523449\nv 0.231821 -0.0170182 0.518246\nv 0.304138 0.164985 0.443485\nv 0.343004 0.132813 0.418235\nv 0.313621 0.250742 0.418382\nv 0.290815 0.22492 0.444303\nv 0.355269 -0.194146 0.0276407\nv 0.388534 -0.179618 0.0746089\nv 0.336544 -0.25083 0.156379\nv 0.29365 -0.279868 0.104617\nv 0.389288 0.153006 0.345258\nv 0.39155 0.205715 0.320166\nv 0.127262 0.566927 -0.64996\nv 0.000868155 0.562946 -0.661419\nv 0.000850617 0.724441 -0.605705\nv 0.118774 0.725955 -0.596105\nv 0.21095 0.754513 0.387525\nv 0.133734 -0.133188 0.514651\nv 0.131302 -0.13393 0.53047\nv 0.0671053 -0.326445 0.551902\nv 0.0661056 -0.374553 0.504765\nv 0.117289 -0.365439 0.489939\nv 0.116552 -0.318792 0.528974\nv 0.288249 -0.135286 0.424736\nv 0.39393 0.0544045 0.33225\nv 0.374655 0.0965379 0.38044\nv 0.000792155 1 -0.0074948\nv 0.0731795 0.993937 -0.182792\nv 0.000868155 0.999152 -0.181886\nv 0.179405 0.936399 -0.330549\nv 0.0842755 0.953459 -0.338026\nv 0.141767 0.271455 0.486238\nv 0.139978 0.267433 0.490862\nv 0.175908 0.259465 0.501362\nv 0.175312 0.263359 0.495861\nv 0.181597 0.230187 0.495539\nv 0.140253 0.240576 0.495341\nv 0.336982 0.587763 0.356927\nv 0.312043 0.518258 0.416183\nv 0.259971 0.350203 0.495411\nv 0.250763 0.331028 0.496036\nv 0.114179 0.255893 0.495902\nv 0.111069 0.276518 0.499456\nv 0.125433 0.293116 0.500415\nv 0.124965 0.282353 0.489968\nv 0.13906 0.254928 0.497457\nv 0.17737 0.2462 0.50062\nv 0.121796 0.272327 0.47658\nv 0.149548 0.0847578 0.549377\nv 0.142825 -0.226381 0.544992\nv 0.106181 -0.197232 0.576871\nv 0.258193 -0.146669 0.465227\nv 0.2105 0.0188071 0.525711\nv 0.181041 -0.0155508 0.531721\nv 0.173453 -0.168949 0.5218\nv 0.180322 -0.15877 0.514949\nv 0.168554 -0.150118 0.516667\nv 0.163082 -0.153579 0.523344\nv 0.139124 -0.128733 0.545343\nv 0.152348 -0.134468 0.527471\nv 0.416192 -0.0714636 0.0335278\nv 0.0220956 0.0520719 0.640232\nv 0.0361615 0.0619695 0.628476\nv -0.000283541 0.202056 0.62768\nv 0.0869063 -0.0493125 -0.489641\nv 0.192289 -0.0534399 -0.447186\nv 0.192003 -0.134672 -0.429197\nv 0.0851642 -0.130335 -0.46373\nv 0.236434 0.310245 0.495686\nv 0.237714 0.31211 0.497539\nv 0.244636 0.32534 0.496212\nv 0.121253 0.281932 0.477293\nv 0.173149 -0.207241 0.528208\nv -0.000242618 0.247989 0.603612\nv -0.00037708 0.28838 0.571697\nv 0.108496 -0.160507 0.588207\nv 0.0613995 -0.166388 0.620127\nv 0.0634222 -0.199565 0.59462\nv 0.0893734 0.151176 0.600127\nv 0.122124 0.0729427 0.596088\nv 0.0993528 0.072475 0.584781\nv 0.108315 0.0599584 0.583916\nv 0.133524 0.0551528 0.575778\nv 0.13315 0.107517 0.580426\nv 0.274937 0.384257 0.485735\nv 0.170606 -0.145383 0.517205\nv 0.0464391 -0.130399 0.611931\nv 0.0392892 -0.113439 0.575094\nv -0.00161647 -0.112428 0.579865\nv -0.00351648 -0.131685 0.617859\nv 0.0194356 0.03489 0.601858\nv -0.000564158 0.0478802 0.644208\nv -2.04632e-05 0.0350303 0.598835\nv 0.222163 0.246884 0.4972\nv 0.217802 0.257547 0.498129\nv 0.293159 0.278716 0.430419\nv 0.302852 0.281932 0.427367\nv 0.285209 0.277366 0.434932\nv 0.289307 0.275834 0.436551\nv 0.290061 0.280494 0.427963\nv -0.000225079 -0.384287 0.444245\nv 0.0651001 -0.383883 0.440585\nv -0.000891543 -0.364076 0.502426\nv 0.116576 -0.381784 0.436341\nv 0.363734 0.712842 -0.467571\nv 0.32166 0.832542 -0.392653\nv 0.376508 0.821429 -0.265451\nv 0.427095 0.698004 -0.319575\nv 0.27178 0.90956 -0.29643\nv 0.310423 0.901357 -0.210644\nv 0.441869 0.677005 -0.175175\nv 0.389019 0.807076 -0.128411\nv 0.313311 0.894506 -0.0788532\nv 0.12783 -0.376125 0.378248\nv 0.0722266 -0.391483 0.37664\nv 0.125579 0.302411 0.505741\nv 0.101656 0.861358 -0.486525\nv 0.214084 0.849981 -0.463327\nv 0.2467 0.723207 -0.559263\nv 0.104913 0.117397 -0.600268\nv 0.221579 0.117865 -0.555159\nv 0.200848 0.0268164 -0.488992\nv 0.0944011 0.0271204 -0.539134\nv 0.391141 0.144178 -0.303545\nv 0.331241 0.130393 -0.444613\nv 0.360829 0.250357 -0.491155\nv 0.424003 0.258021 -0.333419\nv 0.000868155 0.23912 -0.655479\nv 0.00089154 0.393909 -0.675105\nv 0.125626 0.397949 -0.664716\nv 0.115418 0.240453 -0.645617\nv 0.452175 0.547687 -0.348309\nv 0.450217 0.395605 -0.350776\nv 0.383015 0.40193 -0.511868\nv 0.3854 0.562496 -0.506472\nv 0.464078 0.52881 -0.195929\nv 0.311698 0.866351 0.071908\nv -9.64635e-05 -0.406882 0.376985\nv 0.373883 -0.18312 -0.115123\nv 0.389189 -0.0789467 -0.141776\nv 0.247109 0.197607 0.47589\nv 0.22891 0.231497 0.489717\nv 0.121077 -0.116725 0.574393\nv 0.125626 -0.0895459 0.583057\nv 0.110548 -0.128452 0.555428\nv 0.000710309 0.959638 0.167019\nv 0.000710309 0.881206 0.320973\nv 0.224163 0.124079 0.505215\nv 0.255305 0.260798 0.480649\nv 0.25188 0.263516 0.478322\nv 0.214891 0.26119 0.49413\nv 0.116476 0.273741 0.475423\nv 0.290704 0.283902 0.433377\nv 0.29641 0.299523 0.422813\nv 0.29406 0.288222 0.418078\nv 0.142655 0.263364 0.482467\nv 0.121638 0.267831 0.470296\nv 0.171711 0.256898 0.489693\nv 0.246864 0.257401 0.473821\nv 0.274311 0.271648 0.453301\nv 0.274539 0.26862 0.446654\nv 0.233686 0.331104 0.49074\nv 0.187548 0.326632 0.49682\nv 0.296971 0.273928 0.433476\nv 0.134067 -0.0744861 0.577333\nv 0.237434 0.052867 0.514604\nv 0.0637905 0.27076 0.54346\nv 0.375421 0.514218 0.287328\nv 0.353808 -0.333437 -0.190615\nv 0.349365 -0.276331 -0.333858\nv 0.323337 -0.214946 -0.338453\nv 0.356725 -0.247925 -0.205557\nv -0.000330311 -0.581268 0.237302\nv 0.092922 -0.548418 0.185458\nv 0.394783 -0.0876049 -0.0664009\nv 0.358315 -0.197624 -0.02995\nv 0.292785 -0.321493 0.0377429\nv 0.395175 -0.0904345 -0.0143524\nv 0.243385 0.243183 -0.602957\nv 0.000587539 -0.0451091 -0.498205\nv 0.000751232 0.030862 -0.55154\nv 0.000809694 0.11928 -0.61144\nv 0.000850617 0.862837 -0.491295\nv 0.000868155 0.958527 -0.339277\nv 0.000423846 -0.128189 -0.469085\nv 0.264186 0.56961 -0.608026\nv 0.35127 -0.283317 -0.0863656\nv 0.196201 -0.209591 -0.418785\nv 0.0873097 -0.206341 -0.44839\nv 0.000488154 -0.206259 -0.449945\nv 0.263397 0.402579 -0.621226\nv 0.456683 0.384813 -0.0591516\nv 0.457776 0.372302 -0.191281\nv 0.000850617 0.671351 0.512487\nv 0.000809694 0.77919 0.437668\nv 0.408656 0.116286 0.298547\nv 0.295913 0.259781 0.439334\nv 0.285355 0.265481 0.449775\nv 0.278766 0.270035 0.454663\nv 0.128946 -0.0227065 0.564741\nv 0.16203 0.016989 0.534633\nv 0.0985987 0.0583799 0.58087\nv 0.0538462 0.323165 0.543729\nv 0.0794758 0.301522 0.528465\nv -0.00330601 -0.197759 0.600525\nv -0.000511542 -0.225551 0.572931\nv -0.00456879 -0.164231 0.628277\nv -0.000336157 -0.26392 0.574381\nv -0.000768774 -0.325515 0.55686\nv 0.269921 0.242499 0.464742\nv 0.260573 0.253022 0.476072\nv 0.235066 0.15963 0.493271\nv 0.411369 0.186119 0.273583\nv 0.000178307 0.0131539 0.584682\nv 0.153436 -0.0554568 0.55786\nv 0.0264569 0.331747 0.554112\nv -0.000342003 0.332998 0.557743\nv 0.285589 0.277974 0.428156\nv 0.184795 -0.499655 0.1217\nv 0.332808 -0.386298 -0.0699261\nv 0.20739 -0.274419 -0.415909\nv 0.0927467 -0.274308 -0.43723\nv 0.278029 -0.438791 0.0475586\nv 0.000505693 -0.27722 -0.43768\nv 0.438191 0.12488 -0.0367783\nv 0.460214 0.163208 -0.055258\nv 0.485388 0.177437 -0.0277343\nv 0.472304 0.161641 -0.00367724\nv 0.496244 0.232684 -0.0170708\nv 0.477425 0.247036 0.00446648\nv 0.517015 0.298681 -0.0523876\nv 0.492233 0.31788 -0.0441737\nv 0.53425 0.316407 -0.124009\nv 0.511491 0.332595 -0.129276\nv 0.535904 0.290111 -0.170685\nv 0.511128 0.30365 -0.186838\nv 0.538611 0.228878 -0.193017\nv 0.511286 0.231199 -0.218992\nv 0.520242 0.128838 -0.191421\nv 0.490433 0.122168 -0.208603\nv 0.487562 0.00951757 -0.0819458\nv 0.472286 -0.00658864 -0.0930419\nv 0.47079 0.0399937 -0.154257\nv 0.496437 0.0472722 -0.136917\nv 0.485142 -0.0247586 -0.0238758\nv 0.46129 -0.0429694 -0.0334343\nv 0.474888 0.238927 -0.0419989\nv 0.495232 0.289088 -0.0628581\nv 0.508398 0.299996 -0.11766\nv 0.51311 0.283323 -0.158478\nv 0.514642 0.235303 -0.176531\nv 0.501751 0.136134 -0.181559\nv 0.486025 0.0533522 -0.11859\nv 0.486451 0.0268164 -0.067155\nv 0.482529 0.0136625 -0.0120607\nv 0.464265 0.0280383 0.0249515\nv 0.457519 -0.0185791 0.0196256\nv 0.442769 0.0582571 -0.0293244\nv 0.45632 0.0847169 -0.0600578\nv 0.442465 0.0842785 -0.0209644\nv 0.459612 0.268106 0.0209995\nv 0.458559 0.182857 0.0414318\nv 0.463026 0.318488 -0.0446005\nv 0.470222 0.311835 -0.142898\nv 0.455063 0.232836 -0.195221\nv 0.43839 0.13186 -0.191088\nv 0.424564 0.0473131 -0.148417\nv 0.423447 -0.00471202 -0.0897563\nv 0.425377 -0.0292075 -0.0262143\nv 0.430714 -0.0102191 0.0297161\nv 0.446335 0.0345567 0.0460036\nv 0.475607 0.129364 -0.0864649\nv 0.482611 0.0600636 -0.0525396\nv 0.481517 0.0827175 -0.101349\nv 0.470503 0.0444835 -0.0133527\nv 0.479278 0.0776957 0.00471786\nv 0.504692 0.223938 -0.101723\nv 0.50375 0.131866 -0.1473\nv 0.45452 0.100016 0.0450097\nv 0.403623 0.0251386 -0.16934\nv 0.414719 0.138607 -0.218957\nv 0.435461 0.249632 -0.229924\nv -0.000201695 -0.407876 0.310666\nv 0.000347846 -0.171521 0.505794\nv 0.0884205 -0.186598 0.484028\nv 0.141147 -0.173807 0.465513\nv 0.159878 -0.142255 0.458644\nv 0.152483 -0.116468 0.431278\nv 0.0708352 0.0121893 0.376371\nv 0.128069 -0.116368 0.360528\nv 0.143994 -0.166791 0.41184\nv 0.0748398 -0.218144 0.372349\nv 0.280941 0.292858 0.454897\nv 0.281356 0.319879 0.451494\nv 0.127268 0.269088 0.455435\nv 0.116921 0.284697 0.447653\nv 0.119996 0.274998 0.469126\nv 0.15699 0.254759 0.466326\nv 0.265916 0.273601 0.421176\nv 0.214885 0.253946 0.455259\nv 0.141223 0.313133 0.482117\nv 0.211436 0.255823 0.486852\nv 0.277135 0.302686 0.410799\nv 0.252505 0.333881 0.433599\nv 0.202023 0.342182 0.464578\nv 0.11989 0.295816 0.471196\nv 0.146526 0.322539 0.455943\nv 0.126292 0.301838 0.454973\nv 0.119744 0.284878 0.469419\nv 0.00103185 0.0191579 0.374711\nv 0.000909079 -0.205715 0.379849\nv 0.0536357 -0.100847 0.27211\nv 0.00103185 -0.098929 0.27128\nv 0.255463 -0.398733 -0.446098\nv 0.412907 -0.372688 -0.332858\nv 0.452596 -0.41557 -0.353559\nv 0.293329 -0.465367 -0.476007\nv 0.0815337 -0.637104 0.176286\nv 0.0726358 -0.738524 0.179519\nv 0.174763 -0.714911 0.155526\nv 0.172032 -0.601823 0.129884\nv 0.380782 -0.504069 -0.184377\nv 0.357368 -0.419095 -0.180384\nv 0.337538 -0.494803 -0.0548371\nv 0.372989 -0.619402 -0.0373571\nv 0.453578 -0.652661 -0.0939539\nv 0.452351 -0.545892 -0.196981\nv 0.173576 -0.814197 0.195654\nv 0.0739044 -0.845866 0.20734\nv 0.0964414 -0.904976 0.254455\nv 0.197703 -0.864562 0.243353\nv 0.519564 -0.487407 -0.384801\nv 0.555004 -0.584226 -0.219366\nv 0.451357 -0.731555 -0.0215899\nv 0.382594 -0.74824 0.0443666\nv 0.439805 -0.799196 0.0975376\nv 0.519108 -0.768071 -0.00769357\nv 0.274837 -0.806199 0.115503\nv 0.320508 -0.838061 0.183769\nv 0.354533 -0.544232 -0.525256\nv 0.162503 -0.604343 -0.559076\nv 0.131098 -0.496837 -0.498761\nv 0.115161 -0.410103 -0.457756\nv -0.00017831 -0.492774 -0.504192\nv 2.046e-05 -0.40666 -0.465186\nv -0.000482311 -0.600531 -0.555322\nv 0.546217 -0.696736 -0.117257\nv 0.22746 -0.332063 -0.424345\nv 0.101627 -0.33885 -0.437002\nv 0.280193 -0.554165 0.0658922\nv 0.274843 -0.684891 0.0781517\nv 0.000347846 -0.34199 -0.438165\nv 0.000733693 -0.746364 0.176765\nv 0.000312769 -0.874904 0.179121\nv 0.378648 -0.322586 -0.326994\nv -0.000114002 -0.940246 0.234262\nv 0.000979233 -0.650317 0.207112\nv -0.130513 -0.13217 0.498924\nv -0.133687 -0.14723 0.488109\nv -0.15222 -0.140519 0.477457\nv -0.14666 -0.13514 0.489746\nv -0.0697653 -0.0999404 0.550318\nv -0.0736414 -0.0473131 0.499649\nv -0.0305784 -0.0972511 0.55389\nv -0.0396517 -0.109762 0.550014\nv -0.0358517 -0.127727 0.53534\nv -0.0742493 -0.135994 0.523315\nv -0.0733373 -0.115561 0.537643\nv -0.106766 -0.144336 0.504823\nv -0.106281 -0.125786 0.515779\nv -0.156505 -0.107798 0.467782\nv -0.155611 -0.123682 0.486899\nv -0.159311 -0.130796 0.484958\nv -0.162872 -0.126996 0.470243\nv -0.159919 -0.135625 0.47627\nv -0.154055 -0.134696 0.486513\nv -0.142597 -0.118993 0.499994\nv -0.130051 -0.0726738 0.476189\nv -0.10054 -0.105798 0.538111\nv -0.125684 -0.115824 0.51596\nv -0.274604 -0.301394 0.247527\nv -0.220831 -0.335775 0.330215\nv -0.250102 -0.275554 0.380393\nv -0.3066 -0.239804 0.292309\nv -0.284302 -0.0258401 0.479772\nv -0.319479 0.00809111 0.449577\nv -0.331873 -0.0412272 0.412243\nv -0.293674 -0.0747667 0.452418\nv -0.294668 -0.0547787 -0.357622\nv -0.302063 -0.144319 -0.34334\nv -0.356012 -0.159916 -0.223184\nv -0.355474 -0.0633082 -0.24271\nv -0.447241 0.22613 0.139332\nv -0.437922 0.336149 0.131124\nv -0.449486 0.331215 0.047962\nv -0.454982 0.205353 0.0827818\nv -0.103311 -0.419241 0.249936\nv -0.203701 -0.353384 0.208147\nv -0.196966 -0.411506 0.138841\nv -0.101797 -0.475733 0.208638\nv -0.196499 -0.327216 0.427455\nv -0.176283 -0.362363 0.392138\nv -0.150331 -0.372548 0.431378\nv -0.155575 -0.349484 0.46435\nv -0.0890109 -0.391945 0.303855\nv -0.158306 -0.363848 0.305182\nv -0.415613 0.611627 0.0817705\nv -0.430808 0.648493 -0.0417066\nv -0.45411 0.508986 -0.0641209\nv -0.440308 0.483438 0.0478393\nv -0.389808 0.40462 0.306977\nv -0.375935 0.38348 0.354021\nv -0.34643 0.433026 0.398499\nv -0.354807 0.467378 0.356891\nv -0.317409 0.30382 0.429121\nv -0.30173 0.320499 0.456861\nv -0.309295 0.339493 0.457756\nv -0.328406 0.316144 0.429519\nv -0.358297 0.360101 0.389344\nv -0.335684 0.397733 0.427864\nv -0.285156 0.29304 0.457387\nv -0.294212 0.310695 0.451757\nv -0.307675 0.294425 0.430781\nv -0.29475 0.281949 0.435698\nv -0.421091 0.455996 0.145494\nv -0.395403 0.565208 0.19252\nv -0.321999 0.364421 0.449238\nv -0.345494 0.336792 0.417218\nv -0.178165 0.560672 0.512335\nv -0.249354 0.546354 0.466589\nv -0.243286 0.479638 0.494943\nv -0.170168 0.4781 0.536796\nv -0.164123 0.410647 0.547114\nv -0.236966 0.427297 0.516007\nv -0.270669 0.634748 0.422187\nv -0.195815 0.657882 0.47347\nv -0.14597 0.313039 0.508126\nv -0.18946 0.324971 0.513312\nv -0.186823 0.312829 0.511757\nv -0.144895 0.300213 0.501871\nv -0.186911 0.310514 0.506612\nv -0.143462 0.300341 0.494353\nv -0.160048 0.365076 0.528073\nv -0.219468 0.382854 0.516404\nv -0.15782 0.334506 0.520076\nv -0.205952 0.349935 0.517012\nv -0.195236 0.332495 0.516264\nv -0.151653 0.320785 0.513142\nv -0.0805691 0.0827468 0.603261\nv -0.0493739 0.08878 0.593591\nv -0.0448723 0.0732117 0.617958\nv -0.0594819 0.0761932 0.621314\nv -0.422927 0.0771812 0.237185\nv -0.432205 0.159355 0.215905\nv -0.448112 0.130656 0.149516\nv -0.4282 0.0348607 0.166897\nv -0.311779 -0.172912 0.334378\nv -0.324787 -0.103758 0.371735\nv -0.364851 -0.052639 0.316097\nv -0.367254 -0.126698 0.269146\nv -0.183918 -0.149136 0.51793\nv -0.182024 -0.137865 0.527822\nv -0.205163 -0.131463 0.524127\nv -0.205514 -0.152071 0.514943\nv -0.39379 0.00614433 0.269368\nv -0.400951 -0.0591282 0.208995\nv -0.261011 -0.0993382 0.483865\nv -0.25102 -0.0551177 0.50328\nv -0.158849 -0.136444 0.499199\nv -0.155155 -0.134784 0.503397\nv -0.145304 -0.133848 0.514902\nv -0.160802 -0.128394 0.536919\nv -0.173424 -0.121349 0.541327\nv -0.169156 -0.138478 0.524928\nv -0.232096 -0.116964 0.50767\nv -0.232727 -0.151188 0.49696\nv -0.326085 0.202611 0.415651\nv -0.34094 0.235683 0.392156\nv -0.367727 0.221336 0.359031\nv -0.358829 0.177595 0.3841\nv -0.295603 0.0501836 0.478632\nv -0.32232 0.0902006 0.449922\nv -0.351843 0.04895 0.416686\nv -0.367248 0.00336155 0.369624\nv -0.156137 -0.154941 0.536878\nv -0.165134 -0.177028 0.538193\nv -0.144573 -0.187364 0.558725\nv -0.140533 -0.155882 0.559046\nv -0.17761 -0.0804258 0.547933\nv -0.201667 -0.0484356 0.526945\nv -0.22024 -0.0817529 0.517585\nv -0.195826 -0.106131 0.536439\nv -0.207794 -0.213087 0.493049\nv -0.191711 -0.188305 0.515551\nv -0.201111 -0.170071 0.510745\nv -0.223385 -0.183243 0.490178\nv -0.128595 -0.132761 0.551212\nv -0.145777 -0.139513 0.530605\nv -0.0971664 0.171538 0.569909\nv -0.120048 0.150182 0.555387\nv -0.13557 0.119437 0.545004\nv -0.113103 0.137432 0.569453\nv -0.0653573 0.232432 0.569575\nv -0.08745 0.217992 0.556468\nv -0.0739395 0.185388 0.584933\nv -0.0855266 0.255554 0.53095\nv -0.110583 0.228714 0.525501\nv -0.115915 0.191404 0.5495\nv -0.300099 0.0366964 -0.387999\nv -0.364734 0.0377897 -0.269357\nv -0.223181 -0.243207 0.45081\nv -0.246139 -0.195666 0.45347\nv -0.271201 -0.199869 0.399446\nv -0.362846 -0.197443 0.213286\nv -0.410176 -0.124757 0.140565\nv -0.430404 -0.00290555 0.0907385\nv -0.448779 0.11075 0.0889086\nv -0.142135 0.869847 0.301633\nv -0.132167 0.771303 0.419317\nv -0.0633989 0.777407 0.43288\nv -0.0675789 0.877324 0.315577\nv -0.353469 0.660735 0.264732\nv -0.2875 0.723792 0.335465\nv -0.30353 0.809117 0.220313\nv -0.37099 0.728422 0.148627\nv -0.381016 0.776764 0.0117274\nv -0.0996744 0.472587 0.557146\nv -0.109525 0.565325 0.53475\nv -0.100294 0.277787 0.511248\nv -0.108689 0.248457 0.503268\nv -0.0528874 0.193947 0.604898\nv -0.0453926 0.241125 0.586705\nv -0.12255 0.668732 0.500514\nv -0.0511336 0.564922 0.542589\nv -0.0582191 0.671655 0.50974\nv -0.0440363 0.465776 0.561151\nv -0.0361966 0.388923 0.562367\nv -0.301894 0.466338 0.448542\nv -0.295831 0.424807 0.472166\nv -0.140867 0.22264 0.499754\nv -0.185742 0.209381 0.492394\nv -0.186338 0.179495 0.502724\nv -0.145859 0.19535 0.519018\nv -0.0600022 0.0437294 0.578309\nv -0.113337 0.0407946 0.564875\nv -0.114196 0.0121659 0.564255\nv -0.0686019 -0.00676987 0.598064\nv -0.143661 0.0637116 0.537807\nv -0.147607 0.0440217 0.535469\nv -0.0907706 -0.0459919 0.600525\nv -0.0300113 -0.0346152 0.623594\nv -0.028047 -0.0138554 0.603173\nv -0.148028 0.131527 0.5437\nv -0.148519 0.164868 0.537322\nv -0.183164 0.146873 0.520193\nv -0.176978 0.112363 0.532908\nv -0.147823 0.0979234 0.535574\nv -0.165064 0.0766492 0.532955\nv -0.120107 0.268649 0.480825\nv -0.118558 0.262394 0.493353\nv -0.115979 0.27287 0.494434\nv -0.116476 0.272952 0.483859\nv -0.229115 0.916634 0.120496\nv -0.223379 0.848952 0.271461\nv -0.145146 0.945128 0.150709\nv -0.145409 0.980883 -0.0176788\nv -0.154278 0.976311 -0.1834\nv -0.240088 0.945514 -0.185786\nv -0.230512 0.948548 -0.0401515\nv -0.0669533 0.995411 -0.00979819\nv -0.0669124 0.955581 0.163097\nv -0.0891746 0.383199 0.554861\nv -0.112226 0.336757 0.527307\nv -0.123381 0.311174 0.513382\nv -0.149484 -0.111966 0.558549\nv -0.160264 -0.0991219 0.559216\nv -0.0695139 0.122828 0.646821\nv -0.103574 0.1197 0.616608\nv -0.0967747 0.0873945 0.617683\nv -0.0583127 0.0845006 0.640951\nv -0.0810075 0.0824603 0.567973\nv -0.0347818 0.058339 0.594989\nv -0.031812 -0.0520134 0.636181\nv -0.0876079 -0.0656701 0.61341\nv -0.0905251 -0.101683 0.607529\nv -0.0378686 -0.0937434 0.629054\nv -0.0836617 -0.122507 0.579642\nv -0.0385351 -0.11728 0.594673\nv -0.0223295 0.0177081 0.586652\nv -0.0307538 0.0864766 0.665646\nv -0.0369098 0.125196 0.667078\nv -0.0659946 0.154643 0.629212\nv -0.0379446 0.159028 0.648136\nv -0.0287544 0.19984 0.620642\nv -0.0228205 0.245931 0.598298\nv -0.0444456 0.281523 0.558544\nv -0.0233467 0.287164 0.569581\nv -0.348774 0.267521 0.384632\nv -0.352083 0.30296 0.39367\nv -0.371253 0.315308 0.363077\nv -0.374871 0.266369 0.352501\nv -0.422202 0.335746 0.207253\nv -0.401928 0.429197 0.234116\nv -0.395345 0.264083 0.313998\nv -0.391071 0.32586 0.325679\nv -0.312703 0.275793 0.421661\nv -0.320315 0.291642 0.417107\nv -0.332077 0.295173 0.409057\nv -0.327599 0.271742 0.406824\nv -0.429802 0.244434 0.203979\nv -0.409282 0.332454 0.277442\nv -0.411848 0.257886 0.266369\nv -0.187414 -0.242265 0.510307\nv -0.193763 -0.283183 0.474066\nv -0.155254 -0.304954 0.501777\nv -0.149998 -0.264183 0.526518\nv -0.0567108 -0.227311 0.569523\nv -0.101124 -0.233508 0.561461\nv -0.11039 -0.27508 0.546021\nv -0.066205 -0.270351 0.564711\nv -0.154225 -0.138052 0.502391\nv -0.159867 -0.142787 0.513271\nv -0.15533 -0.142366 0.518626\nv -0.148566 -0.137426 0.506285\nv -0.160416 -0.138344 0.518258\nv -0.161965 -0.141513 0.511996\nv -0.110811 -0.126394 0.533276\nv -0.10089 -0.129879 0.583501\nv -0.0809374 -0.117865 0.558397\nv -0.263876 0.014785 0.500935\nv -0.26083 0.088932 0.49537\nv -0.279702 0.127055 0.470506\nv -0.207764 0.0867397 0.523776\nv -0.187729 0.0509786 0.529558\nv -0.232096 -0.0167025 0.518065\nv -0.344056 0.133304 0.417078\nv -0.302046 0.166376 0.445239\nv -0.292551 0.225429 0.44414\nv -0.316041 0.250468 0.418475\nv -0.335386 -0.250836 0.156385\nv -0.387207 -0.179618 0.074568\nv -0.353755 -0.194151 0.0276524\nv -0.292388 -0.279891 0.104617\nv -0.392211 0.205733 0.320201\nv -0.386651 0.150025 0.344942\nv -0.126064 0.567371 -0.651942\nv -0.117096 0.725914 -0.596082\nv -0.209068 0.754227 0.387245\nv -0.134091 -0.133281 0.515294\nv -0.132384 -0.133778 0.530774\nv -0.118289 -0.366228 0.490722\nv -0.0673742 -0.375085 0.505343\nv -0.0685259 -0.327012 0.553422\nv -0.117722 -0.319453 0.530388\nv -0.287793 -0.13528 0.424643\nv -0.375234 0.0965671 0.380457\nv -0.394351 0.054463 0.33218\nv -0.0714373 0.993797 -0.182751\nv -0.0825568 0.953558 -0.338084\nv -0.177458 0.935674 -0.330221\nv -0.176961 0.259482 0.501637\nv -0.139651 0.267463 0.490903\nv -0.141176 0.271537 0.486156\nv -0.175792 0.263446 0.495797\nv -0.139621 0.240295 0.49489\nv -0.181918 0.230053 0.49499\nv -0.335299 0.587722 0.356851\nv -0.311189 0.51838 0.416464\nv -0.263028 0.350391 0.495528\nv -0.252435 0.331198 0.496568\nv -0.111168 0.276448 0.500608\nv -0.113553 0.255671 0.49582\nv -0.124754 0.293525 0.500263\nv -0.124275 0.282616 0.489933\nv -0.138587 0.254671 0.496603\nv -0.17851 0.246346 0.500783\nv -0.120744 0.272286 0.476557\nv -0.150635 0.0843194 0.549231\nv -0.110981 -0.197039 0.578654\nv -0.145877 -0.226522 0.547184\nv -0.257825 -0.146365 0.464946\nv -0.181813 -0.015013 0.533586\nv -0.21057 0.0188715 0.525811\nv -0.169226 -0.14996 0.516989\nv -0.181743 -0.1588 0.515902\nv -0.175376 -0.168545 0.522911\nv -0.163813 -0.153415 0.52335\nv -0.140253 -0.128364 0.545887\nv -0.153091 -0.134363 0.527834\nv -0.414608 -0.0714286 0.0335337\nv -0.0376523 0.063203 0.628721\nv -0.0232707 0.0530365 0.640016\nv -0.190483 -0.134521 -0.42891\nv -0.190425 -0.0530365 -0.446291\nv -0.0856669 -0.0492716 -0.489617\nv -0.0841703 -0.13027 -0.463549\nv -0.238743 0.312729 0.498784\nv -0.236568 0.310718 0.495914\nv -0.245034 0.325784 0.495083\nv -0.120311 0.281967 0.47734\nv -0.176107 -0.207054 0.530523\nv -0.114635 -0.15994 0.588938\nv -0.0702155 -0.19877 0.595006\nv -0.0735478 -0.165324 0.619338\nv -0.0899814 0.151661 0.600396\nv -0.111016 0.0572925 0.58557\nv -0.101867 0.0715163 0.586237\nv -0.127064 0.0733753 0.597824\nv -0.136833 0.0543987 0.574241\nv -0.135833 0.107312 0.581379\nv -0.278287 0.38386 0.485911\nv -0.171226 -0.145371 0.517737\nv -0.0426215 -0.114106 0.575498\nv -0.0575293 -0.131258 0.610721\nv -0.0203535 0.0339429 0.602828\nv -0.224215 0.246978 0.496697\nv -0.219644 0.257664 0.498129\nv -0.308126 0.284604 0.426215\nv -0.296275 0.279026 0.430641\nv -0.291721 0.275554 0.437358\nv -0.286612 0.276705 0.435172\nv -0.291949 0.280143 0.428238\nv -0.065825 -0.384532 0.440825\nv -0.11702 -0.382428 0.436651\nv -0.374667 0.821265 -0.265393\nv -0.3198 0.831958 -0.392208\nv -0.362179 0.712818 -0.467507\nv -0.425879 0.698185 -0.319692\nv -0.269938 0.909215 -0.296313\nv -0.308015 0.900609 -0.210562\nv -0.440407 0.677046 -0.175192\nv -0.387417 0.807117 -0.128411\nv -0.312037 0.894728 -0.0788123\nv -0.0720161 -0.391612 0.376675\nv -0.127765 -0.376523 0.378341\nv -0.124801 0.303066 0.504835\nv -0.0997913 0.860855 -0.486022\nv -0.212687 0.850449 -0.463771\nv -0.245244 0.723306 -0.559461\nv -0.199083 0.0271847 -0.488407\nv -0.21986 0.118005 -0.554936\nv -0.10327 0.117479 -0.600127\nv -0.0928636 0.0273016 -0.53883\nv -0.389259 0.144254 -0.303446\nv -0.329178 0.130557 -0.444432\nv -0.359227 0.250316 -0.491237\nv -0.422325 0.258021 -0.333419\nv -0.123907 0.397932 -0.664658\nv -0.113699 0.240517 -0.645459\nv -0.381641 0.401913 -0.512072\nv -0.448592 0.395605 -0.3508\nv -0.450574 0.547705 -0.348333\nv -0.384366 0.562601 -0.506817\nv -0.462722 0.528827 -0.195952\nv -0.310604 0.866976 0.0721301\nv -0.372013 -0.183143 -0.115123\nv -0.387686 -0.0789994 -0.141781\nv -0.2476 0.197566 0.475487\nv -0.230342 0.231532 0.488372\nv -0.129238 -0.0890256 0.584927\nv -0.123544 -0.115971 0.574872\nv -0.114588 -0.128867 0.557082\nv -0.221702 0.122764 0.506442\nv -0.216107 0.26119 0.49413\nv -0.253242 0.263207 0.478422\nv -0.256568 0.260547 0.479737\nv -0.115342 0.273619 0.475323\nv -0.298743 0.299903 0.422953\nv -0.291698 0.283732 0.432722\nv -0.295854 0.288181 0.418253\nv -0.142059 0.263388 0.482491\nv -0.120428 0.267802 0.470325\nv -0.172108 0.256934 0.489641\nv -0.275083 0.271584 0.453242\nv -0.248582 0.25684 0.473757\nv -0.275001 0.268573 0.446274\nv -0.234253 0.331396 0.490634\nv -0.187624 0.326819 0.49717\nv -0.300292 0.274694 0.432944\nv -0.135658 -0.0739483 0.577444\nv -0.237428 0.052791 0.514919\nv -0.0645564 0.270789 0.544612\nv -0.373819 0.514195 0.287264\nv -0.321852 -0.214718 -0.338184\nv -0.348166 -0.27584 -0.333396\nv -0.352171 -0.333378 -0.190533\nv -0.354936 -0.247872 -0.205511\nv -0.0936937 -0.549137 0.186785\nv -0.35669 -0.197653 -0.0299733\nv -0.393228 -0.0876225 -0.0664009\nv -0.29161 -0.321499 0.0380294\nv -0.393638 -0.0904403 -0.014329\nv -0.241608 0.243201 -0.602916\nv -0.263209 0.569914 -0.609242\nv -0.349441 -0.283282 -0.0863831\nv -0.194821 -0.209504 -0.418674\nv -0.0862925 -0.206323 -0.448413\nv -0.261795 0.402579 -0.621448\nv -0.456233 0.372302 -0.191263\nv -0.455245 0.384813 -0.0591282\nv -0.408072 0.116608 0.297155\nv -0.298661 0.260278 0.439147\nv -0.287606 0.265861 0.450068\nv -0.279696 0.270216 0.454289\nv -0.162731 0.0172638 0.536515\nv -0.13087 -0.0222973 0.565699\nv -0.101475 0.0572691 0.580946\nv -0.0809198 0.301049 0.528407\nv -0.0556351 0.322972 0.54498\nv -0.272306 0.242932 0.464508\nv -0.262964 0.253017 0.476001\nv -0.233067 0.158607 0.487893\nv -0.412053 0.186142 0.273695\nv -0.154815 -0.0532762 0.55793\nv -0.0277489 0.331782 0.556427\nv -0.286179 0.277611 0.427928\nv -0.183941 -0.499632 0.122144\nv -0.331493 -0.386257 -0.0698735\nv -0.206238 -0.274279 -0.416026\nv -0.0915482 -0.274332 -0.437317\nv -0.277193 -0.438779 0.0481257\nv -0.484037 0.177414 -0.0276816\nv -0.458618 0.163319 -0.0553633\nv -0.437233 0.124752 -0.0367315\nv -0.471526 0.1616 -0.00366555\nv -0.476232 0.247018 0.00445479\nv -0.494987 0.232631 -0.0169773\nv -0.491035 0.317921 -0.0441971\nv -0.515688 0.298728 -0.0523583\nv -0.510175 0.332513 -0.1293\nv -0.532917 0.316524 -0.12405\nv -0.50993 0.303592 -0.186815\nv -0.534671 0.290233 -0.170849\nv -0.510152 0.231181 -0.21891\nv -0.537459 0.228895 -0.193058\nv -0.48934 0.122068 -0.20872\nv -0.519208 0.128879 -0.191363\nv -0.469632 0.0399528 -0.15424\nv -0.470766 -0.00661202 -0.0930419\nv -0.486142 0.00947665 -0.0819458\nv -0.495221 0.0472722 -0.1369\nv -0.459705 -0.0431682 -0.033446\nv -0.483546 -0.0248521 -0.0238816\nv -0.494011 0.289082 -0.0628932\nv -0.473502 0.238904 -0.0420457\nv -0.507246 0.300137 -0.117724\nv -0.512134 0.2833 -0.158502\nv -0.513712 0.235303 -0.176549\nv -0.50102 0.136093 -0.181582\nv -0.485095 0.0532704 -0.118549\nv -0.485253 0.0267755 -0.0671726\nv -0.481172 0.0136801 -0.012201\nv -0.456127 -0.0187428 0.0196958\nv -0.462909 0.027933 0.024969\nv -0.454923 0.0845591 -0.060163\nv -0.441284 0.0577602 -0.0294063\nv -0.440921 0.0840388 -0.0210813\nv -0.457712 0.18288 0.0414318\nv -0.458378 0.268123 0.0210228\nv -0.461588 0.318505 -0.044618\nv -0.468843 0.311858 -0.142898\nv -0.453707 0.232836 -0.195204\nv -0.436969 0.13182 -0.191047\nv -0.423167 0.0473306 -0.148288\nv -0.421945 -0.00467109 -0.089692\nv -0.423991 -0.0291198 -0.0260915\nv -0.429434 -0.0102776 0.0297746\nv -0.445242 0.0345158 0.0460211\nv -0.481617 0.0602039 -0.0524227\nv -0.474104 0.129276 -0.0866754\nv -0.480325 0.0824545 -0.101285\nv -0.469474 0.0446648 -0.013376\nv -0.478167 0.0776431 0.00467109\nv -0.503592 0.223961 -0.101887\nv -0.502575 0.131983 -0.147242\nv -0.453707 0.0999988 0.0450097\nv -0.413357 0.138549 -0.218945\nv -0.402232 0.0251035 -0.169299\nv -0.434023 0.249632 -0.229901\nv -0.0871226 -0.186639 0.484069\nv -0.139686 -0.173807 0.465537\nv -0.158481 -0.142278 0.458685\nv -0.0688299 0.0121893 0.376371\nv -0.150805 -0.116468 0.431278\nv -0.126228 -0.116368 0.360528\nv -0.142316 -0.166791 0.41184\nv -0.0730392 -0.218144 0.372349\nv -0.282087 0.293548 0.454716\nv -0.283513 0.320341 0.45129\nv -0.124398 0.285323 0.452968\nv -0.126795 0.269175 0.455978\nv -0.119353 0.275057 0.469524\nv -0.156265 0.2548 0.466332\nv -0.265074 0.27356 0.421036\nv -0.214762 0.253899 0.455218\nv -0.141855 0.312577 0.484315\nv -0.212745 0.255776 0.486875\nv -0.277117 0.302621 0.410811\nv -0.252014 0.333887 0.433371\nv -0.20141 0.342405 0.464461\nv -0.120767 0.295565 0.473184\nv -0.145333 0.322832 0.456154\nv -0.126041 0.301873 0.455785\nv -0.119879 0.284837 0.470541\nv -0.0516539 -0.100847 0.27211\nv -0.454245 -0.41571 -0.353027\nv -0.413392 -0.372097 -0.332203\nv -0.255785 -0.398019 -0.4467\nv -0.294685 -0.464338 -0.476902\nv -0.174388 -0.714777 0.156607\nv -0.0715543 -0.738454 0.180284\nv -0.0798266 -0.636725 0.177765\nv -0.171536 -0.601788 0.131147\nv -0.337345 -0.494639 -0.0546091\nv -0.355094 -0.419334 -0.180442\nv -0.379665 -0.504905 -0.184915\nv -0.373053 -0.619338 -0.0373044\nv -0.45328 -0.545816 -0.197379\nv -0.454128 -0.653065 -0.0942754\nv -0.0965876 -0.904778 0.254759\nv -0.0736004 -0.845567 0.20775\nv -0.172974 -0.81408 0.195975\nv -0.1973 -0.864375 0.243622\nv -0.520961 -0.488138 -0.3841\nv -0.556272 -0.584635 -0.21946\nv -0.439238 -0.799155 0.0975785\nv -0.381694 -0.748264 0.0442672\nv -0.45103 -0.731883 -0.0219173\nv -0.519067 -0.768135 -0.0077988\nv -0.273785 -0.806328 0.115322\nv -0.319391 -0.83802 0.183769\nv -0.163088 -0.604103 -0.559421\nv -0.356672 -0.543712 -0.525361\nv -0.131226 -0.496761 -0.498854\nv -0.114629 -0.410074 -0.45775\nv -0.546533 -0.697291 -0.117619\nv -0.100633 -0.33885 -0.437013\nv -0.22677 -0.331835 -0.424707\nv -0.274931 -0.684651 0.0790578\nv -0.28021 -0.553908 0.0669913\nv -0.378028 -0.321668 -0.326088\nv 0.172833 0.300014 0.41564\nv -0.171097 0.299996 0.415616\n# 1258 vertices\n\nvt  0.532 0.923 0.000\nvt  0.535 0.917 0.000\nvt  0.542 0.923 0.000\nvt  0.541 0.929 0.000\nvt  0.521 0.984 0.000\nvt  0.521 0.996 0.000\nvt  0.505 0.998 0.000\nvt  0.500 0.985 0.000\nvt  0.504 0.917 0.000\nvt  0.507 0.910 0.000\nvt  0.516 0.910 0.000\nvt  0.515 0.918 0.000\nvt  0.523 0.921 0.000\nvt  0.525 0.913 0.000\nvt  0.549 0.958 0.000\nvt  0.538 0.954 0.000\nvt  0.544 0.942 0.000\nvt  0.550 0.946 0.000\nvt  0.545 0.935 0.000\nvt  0.550 0.932 0.000\nvt  0.547 0.974 0.000\nvt  0.533 0.967 0.000\nvt  0.500 0.917 0.000\nvt  0.500 0.910 0.000\nvt  0.542 0.987 0.000\nvt  0.533 0.994 0.000\nvt  0.616 0.254 0.000\nvt  0.653 0.261 0.000\nvt  0.658 0.307 0.000\nvt  0.619 0.292 0.000\nvt  0.636 0.438 0.000\nvt  0.620 0.419 0.000\nvt  0.627 0.396 0.000\nvt  0.647 0.414 0.000\nvt  0.886 0.312 0.000\nvt  0.897 0.370 0.000\nvt  0.860 0.369 0.000\nvt  0.844 0.308 0.000\nvt  0.740 0.593 0.000\nvt  0.741 0.542 0.000\nvt  0.759 0.541 0.000\nvt  0.768 0.598 0.000\nvt  0.644 0.213 0.000\nvt  0.561 0.175 0.000\nvt  0.566 0.146 0.000\nvt  0.644 0.174 0.000\nvt  0.580 0.254 0.000\nvt  0.585 0.277 0.000\nvt  0.565 0.268 0.000\nvt  0.565 0.256 0.000\nvt  0.590 0.217 0.000\nvt  0.544 0.195 0.000\nvt  0.771 0.721 0.000\nvt  0.736 0.712 0.000\nvt  0.758 0.653 0.000\nvt  0.794 0.663 0.000\nvt  0.669 0.622 0.000\nvt  0.685 0.632 0.000\nvt  0.665 0.669 0.000\nvt  0.652 0.651 0.000\nvt  0.623 0.588 0.000\nvt  0.632 0.582 0.000\nvt  0.639 0.590 0.000\nvt  0.627 0.599 0.000\nvt  0.641 0.632 0.000\nvt  0.657 0.612 0.000\nvt  0.619 0.580 0.000\nvt  0.617 0.575 0.000\nvt  0.623 0.573 0.000\nvt  0.627 0.576 0.000\nvt  0.708 0.702 0.000\nvt  0.729 0.646 0.000\nvt  0.633 0.614 0.000\nvt  0.647 0.601 0.000\nvt  0.604 0.718 0.000\nvt  0.574 0.725 0.000\nvt  0.567 0.686 0.000\nvt  0.596 0.682 0.000\nvt  0.562 0.648 0.000\nvt  0.590 0.649 0.000\nvt  0.618 0.756 0.000\nvt  0.584 0.769 0.000\nvt  0.586 0.587 0.000\nvt  0.566 0.586 0.000\nvt  0.568 0.579 0.000\nvt  0.586 0.580 0.000\nvt  0.569 0.574 0.000\nvt  0.586 0.573 0.000\nvt  0.562 0.627 0.000\nvt  0.587 0.627 0.000\nvt  0.587 0.610 0.000\nvt  0.563 0.608 0.000\nvt  0.565 0.595 0.000\nvt  0.587 0.596 0.000\nvt  0.521 0.441 0.000\nvt  0.526 0.450 0.000\nvt  0.520 0.450 0.000\nvt  0.517 0.445 0.000\nvt  0.720 0.504 0.000\nvt  0.709 0.467 0.000\nvt  0.727 0.446 0.000\nvt  0.738 0.494 0.000\nvt  0.656 0.383 0.000\nvt  0.660 0.348 0.000\nvt  0.684 0.368 0.000\nvt  0.673 0.403 0.000\nvt  0.572 0.371 0.000\nvt  0.573 0.365 0.000\nvt  0.581 0.364 0.000\nvt  0.581 0.374 0.000\nvt  0.708 0.400 0.000\nvt  0.693 0.431 0.000\nvt  0.604 0.401 0.000\nvt  0.609 0.383 0.000\nvt  0.557 0.364 0.000\nvt  0.559 0.365 0.000\nvt  0.557 0.366 0.000\nvt  0.556 0.364 0.000\nvt  0.552 0.367 0.000\nvt  0.552 0.364 0.000\nvt  0.568 0.377 0.000\nvt  0.561 0.374 0.000\nvt  0.566 0.370 0.000\nvt  0.594 0.377 0.000\nvt  0.594 0.363 0.000\nvt  0.653 0.551 0.000\nvt  0.644 0.534 0.000\nvt  0.658 0.523 0.000\nvt  0.666 0.545 0.000\nvt  0.637 0.480 0.000\nvt  0.625 0.458 0.000\nvt  0.649 0.459 0.000\nvt  0.662 0.434 0.000\nvt  0.557 0.345 0.000\nvt  0.553 0.353 0.000\nvt  0.543 0.349 0.000\nvt  0.546 0.337 0.000\nvt  0.586 0.403 0.000\nvt  0.573 0.392 0.000\nvt  0.579 0.382 0.000\nvt  0.591 0.389 0.000\nvt  0.572 0.343 0.000\nvt  0.584 0.331 0.000\nvt  0.590 0.347 0.000\nvt  0.578 0.353 0.000\nvt  0.553 0.358 0.000\nvt  0.543 0.355 0.000\nvt  0.553 0.499 0.000\nvt  0.541 0.507 0.000\nvt  0.542 0.484 0.000\nvt  0.553 0.477 0.000\nvt  0.539 0.532 0.000\nvt  0.529 0.541 0.000\nvt  0.531 0.513 0.000\nvt  0.551 0.538 0.000\nvt  0.538 0.552 0.000\nvt  0.552 0.521 0.000\nvt  0.908 0.437 0.000\nvt  0.876 0.429 0.000\nvt  0.608 0.340 0.000\nvt  0.599 0.314 0.000\nvt  0.629 0.336 0.000\nvt  0.691 0.326 0.000\nvt  0.723 0.365 0.000\nvt  0.748 0.426 0.000\nvt  0.755 0.489 0.000\nvt  0.564 0.825 0.000\nvt  0.590 0.868 0.000\nvt  0.558 0.886 0.000\nvt  0.533 0.834 0.000\nvt  0.637 0.789 0.000\nvt  0.673 0.755 0.000\nvt  0.702 0.774 0.000\nvt  0.665 0.817 0.000\nvt  0.740 0.787 0.000\nvt  0.545 0.727 0.000\nvt  0.540 0.686 0.000\nvt  0.551 0.550 0.000\nvt  0.538 0.572 0.000\nvt  0.520 0.546 0.000\nvt  0.522 0.517 0.000\nvt  0.552 0.775 0.000\nvt  0.524 0.777 0.000\nvt  0.521 0.728 0.000\nvt  0.500 0.687 0.000\nvt  0.500 0.651 0.000\nvt  0.515 0.650 0.000\nvt  0.518 0.687 0.000\nvt  0.500 0.727 0.000\nvt  0.625 0.671 0.000\nvt  0.618 0.644 0.000\nvt  0.591 0.533 0.000\nvt  0.571 0.539 0.000\nvt  0.569 0.527 0.000\nvt  0.589 0.518 0.000\nvt  0.545 0.436 0.000\nvt  0.525 0.427 0.000\nvt  0.528 0.413 0.000\nvt  0.549 0.425 0.000\nvt  0.556 0.449 0.000\nvt  0.563 0.439 0.000\nvt  0.514 0.395 0.000\nvt  0.532 0.396 0.000\nvt  0.513 0.409 0.000\nvt  0.566 0.511 0.000\nvt  0.564 0.490 0.000\nvt  0.577 0.478 0.000\nvt  0.584 0.500 0.000\nvt  0.500 0.408 0.000\nvt  0.500 0.394 0.000\nvt  0.571 0.457 0.000\nvt  0.561 0.468 0.000\nvt  0.554 0.561 0.000\nvt  0.557 0.563 0.000\nvt  0.552 0.569 0.000\nvt  0.548 0.569 0.000\nvt  0.627 0.847 0.000\nvt  0.674 0.871 0.000\nvt  0.645 0.898 0.000\nvt  0.776 0.920 0.000\nvt  0.709 0.921 0.000\nvt  0.729 0.888 0.000\nvt  0.783 0.887 0.000\nvt  0.693 0.947 0.000\nvt  0.621 0.920 0.000\nvt  0.535 0.642 0.000\nvt  0.542 0.618 0.000\nvt  0.545 0.599 0.000\nvt  0.559 0.383 0.000\nvt  0.552 0.377 0.000\nvt  0.531 0.470 0.000\nvt  0.520 0.472 0.000\nvt  0.517 0.456 0.000\nvt  0.528 0.457 0.000\nvt  0.530 0.438 0.000\nvt  0.517 0.436 0.000\nvt  0.528 0.383 0.000\nvt  0.513 0.384 0.000\nvt  0.512 0.374 0.000\nvt  0.526 0.374 0.000\nvt  0.512 0.367 0.000\nvt  0.526 0.366 0.000\nvt  0.512 0.362 0.000\nvt  0.526 0.362 0.000\nvt  0.511 0.422 0.000\nvt  0.500 0.384 0.000\nvt  0.500 0.375 0.000\nvt  0.500 0.362 0.000\nvt  0.500 0.367 0.000\nvt  0.511 0.472 0.000\nvt  0.508 0.457 0.000\nvt  0.521 0.491 0.000\nvt  0.512 0.519 0.000\nvt  0.512 0.491 0.000\nvt  0.511 0.550 0.000\nvt  0.520 0.576 0.000\nvt  0.510 0.583 0.000\nvt  0.500 0.457 0.000\nvt  0.500 0.472 0.000\nvt  0.500 0.491 0.000\nvt  0.654 0.584 0.000\nvt  0.656 0.568 0.000\nvt  0.669 0.567 0.000\nvt  0.666 0.589 0.000\nvt  0.705 0.639 0.000\nvt  0.718 0.591 0.000\nvt  0.684 0.563 0.000\nvt  0.680 0.592 0.000\nvt  0.637 0.575 0.000\nvt  0.636 0.566 0.000\nvt  0.645 0.567 0.000\nvt  0.645 0.579 0.000\nvt  0.723 0.546 0.000\nvt  0.697 0.592 0.000\nvt  0.702 0.554 0.000\nvt  0.500 0.163 0.000\nvt  0.500 0.137 0.000\nvt  0.579 0.298 0.000\nvt  0.570 0.317 0.000\nvt  0.554 0.307 0.000\nvt  0.560 0.287 0.000\nvt  0.534 0.318 0.000\nvt  0.517 0.314 0.000\nvt  0.519 0.296 0.000\nvt  0.538 0.300 0.000\nvt  0.562 0.362 0.000\nvt  0.559 0.363 0.000\nvt  0.557 0.362 0.000\nvt  0.559 0.360 0.000\nvt  0.563 0.365 0.000\nvt  0.561 0.368 0.000\nvt  0.543 0.360 0.000\nvt  0.531 0.358 0.000\nvt  0.531 0.351 0.000\nvt  0.611 0.437 0.000\nvt  0.613 0.475 0.000\nvt  0.624 0.497 0.000\nvt  0.580 0.445 0.000\nvt  0.590 0.466 0.000\nvt  0.598 0.418 0.000\nvt  0.648 0.501 0.000\nvt  0.633 0.516 0.000\nvt  0.641 0.554 0.000\nvt  0.630 0.541 0.000\nvt  0.733 0.331 0.000\nvt  0.696 0.288 0.000\nvt  0.706 0.252 0.000\nvt  0.751 0.313 0.000\nvt  0.683 0.535 0.000\nvt  0.674 0.508 0.000\nvt  0.999 0.696 0.000\nvt  0.986 0.778 0.000\nvt  0.950 0.772 0.000\nvt  0.967 0.695 0.000\nvt  0.600 0.811 0.000\nvt  0.552 0.361 0.000\nvt  0.547 0.367 0.000\nvt  0.546 0.364 0.000\nvt  0.525 0.254 0.000\nvt  0.546 0.261 0.000\nvt  0.542 0.280 0.000\nvt  0.522 0.274 0.000\nvt  0.631 0.369 0.000\nvt  0.678 0.460 0.000\nvt  0.662 0.482 0.000\nvt  0.770 0.948 0.000\nvt  0.762 0.981 0.000\nvt  0.676 0.977 0.000\nvt  0.845 0.915 0.000\nvt  0.835 0.891 0.000\nvt  0.569 0.560 0.000\nvt  0.582 0.558 0.000\nvt  0.580 0.563 0.000\nvt  0.569 0.564 0.000\nvt  0.590 0.544 0.000\nvt  0.571 0.548 0.000\nvt  0.635 0.701 0.000\nvt  0.651 0.731 0.000\nvt  0.607 0.593 0.000\nvt  0.609 0.606 0.000\nvt  0.543 0.570 0.000\nvt  0.553 0.556 0.000\nvt  0.552 0.580 0.000\nvt  0.556 0.574 0.000\nvt  0.569 0.554 0.000\nvt  0.585 0.551 0.000\nvt  0.559 0.566 0.000\nvt  0.550 0.458 0.000\nvt  0.532 0.330 0.000\nvt  0.549 0.325 0.000\nvt  0.610 0.364 0.000\nvt  0.589 0.432 0.000\nvt  0.578 0.417 0.000\nvt  0.570 0.357 0.000\nvt  0.565 0.360 0.000\nvt  0.562 0.356 0.000\nvt  0.565 0.351 0.000\nvt  0.557 0.364 0.000\nvt  0.556 0.364 0.000\nvt  0.548 0.371 0.000\nvt  0.557 0.371 0.000\nvt  0.762 0.385 0.000\nvt  0.513 0.445 0.000\nvt  0.508 0.444 0.000\nvt  0.500 0.520 0.000\nvt  0.939 0.378 0.000\nvt  0.932 0.316 0.000\nvt  0.972 0.321 0.000\nvt  0.974 0.384 0.000\nvt  0.605 0.572 0.000\nvt  0.605 0.578 0.000\nvt  0.605 0.584 0.000\nvt  0.559 0.571 0.000\nvt  0.562 0.333 0.000\nvt  0.500 0.552 0.000\nvt  0.500 0.585 0.000\nvt  0.531 0.343 0.000\nvt  0.514 0.338 0.000\nvt  0.516 0.324 0.000\nvt  0.532 0.488 0.000\nvt  0.534 0.448 0.000\nvt  0.540 0.446 0.000\nvt  0.545 0.448 0.000\nvt  0.538 0.455 0.000\nvt  0.541 0.466 0.000\nvt  0.612 0.623 0.000\nvt  0.567 0.366 0.000\nvt  0.513 0.356 0.000\nvt  0.500 0.355 0.000\nvt  0.500 0.346 0.000\nvt  0.514 0.348 0.000\nvt  0.543 0.363 0.000\nvt  0.552 0.364 0.000\nvt  0.531 0.362 0.000\nvt  0.512 0.361 0.000\nvt  0.509 0.433 0.000\nvt  0.500 0.444 0.000\nvt  0.500 0.432 0.000\nvt  0.603 0.551 0.000\nvt  0.599 0.557 0.000\nvt  0.627 0.570 0.000\nvt  0.631 0.571 0.000\nvt  0.625 0.566 0.000\nvt  0.622 0.569 0.000\nvt  0.621 0.567 0.000\nvt  0.529 0.234 0.000\nvt  0.500 0.249 0.000\nvt  0.500 0.227 0.000\nvt  0.550 0.245 0.000\nvt  0.857 0.816 0.000\nvt  0.825 0.804 0.000\nvt  0.851 0.737 0.000\nvt  0.886 0.748 0.000\nvt  0.821 0.866 0.000\nvt  0.798 0.856 0.000\nvt  0.783 0.797 0.000\nvt  0.810 0.729 0.000\nvt  0.755 0.848 0.000\nvt  0.534 0.215 0.000\nvt  0.563 0.233 0.000\nvt  0.548 0.588 0.000\nvt  0.884 0.835 0.000\nvt  0.908 0.854 0.000\nvt  0.919 0.761 0.000\nvt  0.947 0.512 0.000\nvt  0.944 0.446 0.000\nvt  0.974 0.452 0.000\nvt  0.974 0.519 0.000\nvt  0.915 0.504 0.000\nvt  0.887 0.498 0.000\nvt  0.917 0.564 0.000\nvt  0.890 0.556 0.000\nvt  0.999 0.634 0.000\nvt  0.973 0.633 0.000\nvt  0.975 0.577 0.000\nvt  0.999 0.579 0.000\nvt  0.882 0.614 0.000\nvt  0.911 0.622 0.000\nvt  0.901 0.679 0.000\nvt  0.868 0.671 0.000\nvt  0.833 0.667 0.000\nvt  0.708 0.836 0.000\nvt  0.500 0.205 0.000\nvt  0.826 0.364 0.000\nvt  0.801 0.303 0.000\nvt  0.613 0.529 0.000\nvt  0.607 0.544 0.000\nvt  0.541 0.380 0.000\nvt  0.538 0.372 0.000\nvt  0.537 0.366 0.000\nvt  0.537 0.363 0.000\nvt  0.598 0.945 0.000\nvt  0.524 0.902 0.000\nvt  0.599 0.489 0.000\nvt  0.609 0.563 0.000\nvt  0.596 0.563 0.000\nvt  0.612 0.559 0.000\nvt  0.557 0.569 0.000\nvt  0.620 0.571 0.000\nvt  0.616 0.569 0.000\nvt  0.618 0.569 0.000\nvt  0.569 0.568 0.000\nvt  0.561 0.568 0.000\nvt  0.579 0.567 0.000\nvt  0.616 0.564 0.000\nvt  0.613 0.567 0.000\nvt  0.607 0.567 0.000\nvt  0.587 0.568 0.000\nvt  0.606 0.568 0.000\nvt  0.630 0.565 0.000\nvt  0.548 0.389 0.000\nvt  0.601 0.452 0.000\nvt  0.529 0.566 0.000\nvt  0.684 0.686 0.000\nvt  0.872 0.222 0.000\nvt  0.876 0.265 0.000\nvt  0.825 0.258 0.000\nvt  0.821 0.214 0.000\nvt  0.561 0.119 0.000\nvt  0.500 0.114 0.000\nvt  0.771 0.304 0.000\nvt  0.797 0.363 0.000\nvt  0.726 0.227 0.000\nvt  0.777 0.371 0.000\nvt  0.947 0.571 0.000\nvt  0.999 0.388 0.000\nvt  0.999 0.456 0.000\nvt  0.999 0.524 0.000\nvt  0.936 0.877 0.000\nvt  0.856 0.945 0.000\nvt  0.999 0.323 0.000\nvt  0.935 0.689 0.000\nvt  0.776 0.240 0.000\nvt  0.928 0.265 0.000\nvt  0.969 0.264 0.000\nvt  0.999 0.267 0.000\nvt  0.943 0.628 0.000\nvt  0.806 0.622 0.000\nvt  0.851 0.611 0.000\nvt  0.500 0.777 0.000\nvt  0.500 0.839 0.000\nvt  0.692 0.489 0.000\nvt  0.631 0.558 0.000\nvt  0.622 0.562 0.000\nvt  0.626 0.560 0.000\nvt  0.555 0.413 0.000\nvt  0.570 0.429 0.000\nvt  0.539 0.440 0.000\nvt  0.524 0.607 0.000\nvt  0.531 0.591 0.000\nvt  0.500 0.361 0.000\nvt  0.500 0.321 0.000\nvt  0.500 0.312 0.000\nvt  0.500 0.336 0.000\nvt  0.500 0.294 0.000\nvt  0.500 0.273 0.000\nvt  0.622 0.549 0.000\nvt  0.616 0.554 0.000\nvt  0.607 0.509 0.000\nvt  0.701 0.520 0.000\nvt  0.500 0.421 0.000\nvt  0.564 0.403 0.000\nvt  0.511 0.615 0.000\nvt  0.500 0.618 0.000\nvt  0.617 0.568 0.000\nvt  0.636 0.139 0.000\nvt  0.764 0.192 0.000\nvt  0.921 0.220 0.000\nvt  0.967 0.219 0.000\nvt  0.708 0.168 0.000\nvt  0.999 0.218 0.000\nvt  0.803 0.523 0.000\nvt  0.794 0.535 0.000\nvt  0.783 0.527 0.000\nvt  0.791 0.508 0.000\nvt  0.789 0.571 0.000\nvt  0.797 0.562 0.000\nvt  0.813 0.591 0.000\nvt  0.815 0.578 0.000\nvt  0.839 0.583 0.000\nvt  0.835 0.574 0.000\nvt  0.850 0.569 0.000\nvt  0.845 0.560 0.000\nvt  0.855 0.539 0.000\nvt  0.847 0.535 0.000\nvt  0.850 0.501 0.000\nvt  0.841 0.502 0.000\nvt  0.814 0.438 0.000\nvt  0.836 0.464 0.000\nvt  0.828 0.472 0.000\nvt  0.809 0.452 0.000\nvt  0.792 0.427 0.000\nvt  0.790 0.441 0.000\nvt  0.818 0.567 0.000\nvt  0.807 0.550 0.000\nvt  0.831 0.561 0.000\nvt  0.839 0.553 0.000\nvt  0.837 0.534 0.000\nvt  0.831 0.505 0.000\nvt  0.820 0.479 0.000\nvt  0.804 0.465 0.000\nvt  0.786 0.460 0.000\nvt  0.773 0.456 0.000\nvt  0.779 0.433 0.000\nvt  0.797 0.489 0.000\nvt  0.785 0.495 0.000\nvt  0.789 0.486 0.000\nvt  0.772 0.537 0.000\nvt  0.781 0.583 0.000\nvt  0.812 0.602 0.000\nvt  0.848 0.587 0.000\nvt  0.862 0.546 0.000\nvt  0.859 0.500 0.000\nvt  0.820 0.412 0.000\nvt  0.843 0.450 0.000\nvt  0.791 0.404 0.000\nvt  0.773 0.417 0.000\nvt  0.764 0.447 0.000\nvt  0.801 0.477 0.000\nvt  0.813 0.487 0.000\nvt  0.806 0.496 0.000\nvt  0.787 0.478 0.000\nvt  0.778 0.489 0.000\nvt  0.822 0.538 0.000\nvt  0.822 0.510 0.000\nvt  0.767 0.492 0.000\nvt  0.870 0.496 0.000\nvt  0.851 0.425 0.000\nvt  0.872 0.552 0.000\nvt  0.500 0.183 0.000\nvt  0.516 0.930 0.000\nvt  0.500 0.928 0.000\nvt  0.528 0.934 0.000\nvt  0.537 0.938 0.000\nvt  0.516 0.970 0.000\nvt  0.520 0.955 0.000\nvt  0.530 0.952 0.000\nvt  0.522 0.944 0.000\nvt  0.512 0.942 0.000\nvt  0.615 0.572 0.000\nvt  0.612 0.569 0.000\nvt  0.576 0.968 0.000\nvt  0.573 0.973 0.000\nvt  0.562 0.969 0.000\nvt  0.563 0.961 0.000\nvt  0.571 0.956 0.000\nvt  0.582 0.961 0.000\nvt  0.611 0.961 0.000\nvt  0.606 0.967 0.000\nvt  0.595 0.960 0.000\nvt  0.601 0.955 0.000\nvt  0.570 0.569 0.000\nvt  0.595 0.566 0.000\nvt  0.616 0.967 0.000\nvt  0.617 0.975 0.000\nvt  0.607 0.978 0.000\nvt  0.614 0.982 0.000\nvt  0.605 0.991 0.000\nvt  0.599 0.986 0.000\nvt  0.593 0.996 0.000\nvt  0.589 0.989 0.000\nvt  0.562 0.570 0.000\nvt  0.573 0.994 0.000\nvt  0.579 0.987 0.000\nvt  0.584 0.996 0.000\nvt  0.581 0.953 0.000\nvt  0.592 0.953 0.000\nvt  0.561 0.988 0.000\nvt  0.572 0.981 0.000\nvt  0.563 0.978 0.000\nvt  0.500 0.970 0.000\nvt  0.500 0.943 0.000\nvt  0.511 0.956 0.000\nvt  0.500 0.956 0.000\nvt  0.868 0.132 0.000\nvt  0.867 0.090 0.000\nvt  0.916 0.092 0.000\nvt  0.918 0.133 0.000\nvt  0.554 0.066 0.000\nvt  0.612 0.070 0.000\nvt  0.619 0.103 0.000\nvt  0.558 0.095 0.000\nvt  0.815 0.169 0.000\nvt  0.758 0.148 0.000\nvt  0.747 0.102 0.000\nvt  0.814 0.126 0.000\nvt  0.770 0.072 0.000\nvt  0.817 0.087 0.000\nvt  0.552 0.038 0.000\nvt  0.551 0.020 0.000\nvt  0.602 0.021 0.000\nvt  0.605 0.039 0.000\nvt  0.821 0.050 0.000\nvt  0.867 0.055 0.000\nvt  0.712 0.053 0.000\nvt  0.700 0.022 0.000\nvt  0.739 0.023 0.000\nvt  0.740 0.052 0.000\nvt  0.652 0.022 0.000\nvt  0.659 0.043 0.000\nvt  0.913 0.055 0.000\nvt  0.959 0.055 0.000\nvt  0.960 0.091 0.000\nvt  0.999 0.089 0.000\nvt  0.999 0.131 0.000\nvt  0.962 0.133 0.000\nvt  0.999 0.053 0.000\nvt  0.778 0.038 0.000\nvt  0.917 0.177 0.000\nvt  0.965 0.178 0.000\nvt  0.674 0.083 0.000\nvt  0.685 0.124 0.000\nvt  0.999 0.175 0.000\nvt  0.500 0.037 0.000\nvt  0.500 0.066 0.000\nvt  0.871 0.175 0.000\nvt  0.500 0.019 0.000\nvt  0.500 0.092 0.000\nvt  0.999 0.002 0.000\nvt  0.958 0.002 0.000\nvt  0.867 0.002 0.000\nvt  0.823 0.002 0.000\nvt  0.908 0.002 0.000\nvt  0.601 0.002 0.000\nvt  0.550 0.002 0.000\nvt  0.697 0.002 0.000\nvt  0.650 0.002 0.000\nvt  0.782 0.002 0.000\nvt  0.740 0.002 0.000\nvt  0.500 0.002 0.000\nvt  0.468 0.923 0.000\nvt  0.459 0.929 0.000\nvt  0.458 0.923 0.000\nvt  0.465 0.917 0.000\nvt  0.479 0.984 0.000\nvt  0.495 0.998 0.000\nvt  0.479 0.996 0.000\nvt  0.496 0.917 0.000\nvt  0.485 0.918 0.000\nvt  0.484 0.910 0.000\nvt  0.493 0.910 0.000\nvt  0.477 0.921 0.000\nvt  0.475 0.913 0.000\nvt  0.451 0.958 0.000\nvt  0.450 0.946 0.000\nvt  0.456 0.942 0.000\nvt  0.462 0.954 0.000\nvt  0.455 0.935 0.000\nvt  0.450 0.932 0.000\nvt  0.467 0.967 0.000\nvt  0.453 0.974 0.000\nvt  0.467 0.994 0.000\nvt  0.458 0.987 0.000\nvt  0.384 0.254 0.000\nvt  0.381 0.292 0.000\nvt  0.342 0.307 0.000\nvt  0.347 0.261 0.000\nvt  0.364 0.438 0.000\nvt  0.353 0.414 0.000\nvt  0.373 0.396 0.000\nvt  0.380 0.419 0.000\nvt  0.114 0.312 0.000\nvt  0.156 0.308 0.000\nvt  0.140 0.369 0.000\nvt  0.103 0.370 0.000\nvt  0.260 0.593 0.000\nvt  0.232 0.598 0.000\nvt  0.241 0.541 0.000\nvt  0.259 0.542 0.000\nvt  0.356 0.213 0.000\nvt  0.356 0.174 0.000\nvt  0.434 0.146 0.000\nvt  0.439 0.175 0.000\nvt  0.420 0.254 0.000\nvt  0.435 0.256 0.000\nvt  0.435 0.268 0.000\nvt  0.415 0.277 0.000\nvt  0.456 0.195 0.000\nvt  0.410 0.217 0.000\nvt  0.229 0.721 0.000\nvt  0.206 0.663 0.000\nvt  0.242 0.653 0.000\nvt  0.264 0.712 0.000\nvt  0.331 0.622 0.000\nvt  0.348 0.651 0.000\nvt  0.335 0.669 0.000\nvt  0.315 0.632 0.000\nvt  0.377 0.588 0.000\nvt  0.373 0.599 0.000\nvt  0.361 0.590 0.000\nvt  0.368 0.582 0.000\nvt  0.359 0.632 0.000\nvt  0.343 0.612 0.000\nvt  0.381 0.580 0.000\nvt  0.373 0.576 0.000\nvt  0.377 0.573 0.000\nvt  0.383 0.575 0.000\nvt  0.292 0.702 0.000\nvt  0.271 0.646 0.000\nvt  0.353 0.601 0.000\nvt  0.367 0.614 0.000\nvt  0.396 0.718 0.000\nvt  0.404 0.682 0.000\nvt  0.433 0.686 0.000\nvt  0.426 0.725 0.000\nvt  0.410 0.649 0.000\nvt  0.438 0.648 0.000\nvt  0.416 0.769 0.000\nvt  0.382 0.756 0.000\nvt  0.414 0.587 0.000\nvt  0.414 0.580 0.000\nvt  0.432 0.579 0.000\nvt  0.434 0.586 0.000\nvt  0.431 0.574 0.000\nvt  0.414 0.573 0.000\nvt  0.413 0.627 0.000\nvt  0.438 0.627 0.000\nvt  0.413 0.610 0.000\nvt  0.413 0.596 0.000\nvt  0.435 0.595 0.000\nvt  0.437 0.608 0.000\nvt  0.479 0.441 0.000\nvt  0.483 0.445 0.000\nvt  0.480 0.450 0.000\nvt  0.474 0.450 0.000\nvt  0.280 0.504 0.000\nvt  0.262 0.494 0.000\nvt  0.273 0.446 0.000\nvt  0.291 0.467 0.000\nvt  0.344 0.383 0.000\nvt  0.327 0.403 0.000\nvt  0.316 0.368 0.000\nvt  0.340 0.348 0.000\nvt  0.428 0.371 0.000\nvt  0.419 0.374 0.000\nvt  0.419 0.364 0.000\nvt  0.427 0.365 0.000\nvt  0.307 0.431 0.000\nvt  0.292 0.400 0.000\nvt  0.391 0.383 0.000\nvt  0.396 0.401 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.366 0.000\nvt  0.441 0.365 0.000\nvt  0.448 0.367 0.000\nvt  0.448 0.364 0.000\nvt  0.432 0.377 0.000\nvt  0.434 0.370 0.000\nvt  0.439 0.374 0.000\nvt  0.406 0.377 0.000\nvt  0.406 0.363 0.000\nvt  0.347 0.551 0.000\nvt  0.334 0.545 0.000\nvt  0.342 0.523 0.000\nvt  0.356 0.534 0.000\nvt  0.363 0.480 0.000\nvt  0.351 0.459 0.000\nvt  0.375 0.458 0.000\nvt  0.338 0.434 0.000\nvt  0.443 0.345 0.000\nvt  0.454 0.337 0.000\nvt  0.457 0.349 0.000\nvt  0.447 0.353 0.000\nvt  0.414 0.403 0.000\nvt  0.409 0.389 0.000\nvt  0.421 0.382 0.000\nvt  0.427 0.392 0.000\nvt  0.428 0.343 0.000\nvt  0.422 0.353 0.000\nvt  0.410 0.347 0.000\nvt  0.416 0.331 0.000\nvt  0.457 0.355 0.000\nvt  0.447 0.358 0.000\nvt  0.447 0.499 0.000\nvt  0.447 0.477 0.000\nvt  0.458 0.484 0.000\nvt  0.459 0.507 0.000\nvt  0.461 0.532 0.000\nvt  0.469 0.513 0.000\nvt  0.471 0.541 0.000\nvt  0.449 0.538 0.000\nvt  0.448 0.521 0.000\nvt  0.462 0.552 0.000\nvt  0.124 0.429 0.000\nvt  0.092 0.437 0.000\nvt  0.392 0.340 0.000\nvt  0.371 0.336 0.000\nvt  0.401 0.314 0.000\nvt  0.309 0.326 0.000\nvt  0.252 0.426 0.000\nvt  0.277 0.365 0.000\nvt  0.245 0.489 0.000\nvt  0.436 0.825 0.000\nvt  0.467 0.834 0.000\nvt  0.442 0.886 0.000\nvt  0.410 0.868 0.000\nvt  0.363 0.789 0.000\nvt  0.335 0.817 0.000\nvt  0.298 0.774 0.000\nvt  0.327 0.755 0.000\nvt  0.260 0.787 0.000\nvt  0.460 0.686 0.000\nvt  0.455 0.727 0.000\nvt  0.462 0.572 0.000\nvt  0.449 0.550 0.000\nvt  0.480 0.546 0.000\nvt  0.478 0.517 0.000\nvt  0.479 0.728 0.000\nvt  0.476 0.777 0.000\nvt  0.448 0.775 0.000\nvt  0.482 0.687 0.000\nvt  0.485 0.650 0.000\nvt  0.375 0.671 0.000\nvt  0.382 0.644 0.000\nvt  0.409 0.533 0.000\nvt  0.411 0.518 0.000\nvt  0.431 0.527 0.000\nvt  0.429 0.539 0.000\nvt  0.455 0.436 0.000\nvt  0.451 0.425 0.000\nvt  0.472 0.413 0.000\nvt  0.475 0.427 0.000\nvt  0.444 0.449 0.000\nvt  0.437 0.439 0.000\nvt  0.486 0.395 0.000\nvt  0.487 0.409 0.000\nvt  0.468 0.396 0.000\nvt  0.434 0.511 0.000\nvt  0.416 0.500 0.000\nvt  0.423 0.478 0.000\nvt  0.436 0.490 0.000\nvt  0.429 0.457 0.000\nvt  0.439 0.468 0.000\nvt  0.446 0.561 0.000\nvt  0.452 0.569 0.000\nvt  0.448 0.569 0.000\nvt  0.443 0.563 0.000\nvt  0.373 0.847 0.000\nvt  0.355 0.898 0.000\nvt  0.326 0.871 0.000\nvt  0.224 0.920 0.000\nvt  0.217 0.887 0.000\nvt  0.271 0.888 0.000\nvt  0.291 0.921 0.000\nvt  0.379 0.920 0.000\nvt  0.307 0.947 0.000\nvt  0.465 0.642 0.000\nvt  0.455 0.599 0.000\nvt  0.458 0.618 0.000\nvt  0.448 0.377 0.000\nvt  0.441 0.383 0.000\nvt  0.469 0.470 0.000\nvt  0.472 0.457 0.000\nvt  0.483 0.456 0.000\nvt  0.480 0.472 0.000\nvt  0.470 0.438 0.000\nvt  0.483 0.436 0.000\nvt  0.472 0.383 0.000\nvt  0.474 0.374 0.000\nvt  0.488 0.374 0.000\nvt  0.487 0.384 0.000\nvt  0.474 0.366 0.000\nvt  0.488 0.367 0.000\nvt  0.474 0.362 0.000\nvt  0.488 0.362 0.000\nvt  0.489 0.422 0.000\nvt  0.492 0.457 0.000\nvt  0.489 0.472 0.000\nvt  0.479 0.491 0.000\nvt  0.488 0.491 0.000\nvt  0.488 0.519 0.000\nvt  0.489 0.550 0.000\nvt  0.490 0.583 0.000\nvt  0.480 0.576 0.000\nvt  0.346 0.584 0.000\nvt  0.334 0.589 0.000\nvt  0.331 0.567 0.000\nvt  0.344 0.568 0.000\nvt  0.295 0.639 0.000\nvt  0.282 0.591 0.000\nvt  0.320 0.592 0.000\nvt  0.316 0.563 0.000\nvt  0.363 0.575 0.000\nvt  0.355 0.579 0.000\nvt  0.355 0.567 0.000\nvt  0.364 0.566 0.000\nvt  0.277 0.546 0.000\nvt  0.298 0.554 0.000\nvt  0.303 0.592 0.000\nvt  0.421 0.298 0.000\nvt  0.440 0.287 0.000\nvt  0.446 0.307 0.000\nvt  0.430 0.317 0.000\nvt  0.466 0.318 0.000\nvt  0.462 0.300 0.000\nvt  0.481 0.296 0.000\nvt  0.483 0.314 0.000\nvt  0.438 0.362 0.000\nvt  0.441 0.360 0.000\nvt  0.443 0.362 0.000\nvt  0.441 0.363 0.000\nvt  0.439 0.368 0.000\nvt  0.437 0.365 0.000\nvt  0.469 0.351 0.000\nvt  0.469 0.358 0.000\nvt  0.457 0.360 0.000\nvt  0.389 0.437 0.000\nvt  0.387 0.475 0.000\nvt  0.376 0.497 0.000\nvt  0.420 0.445 0.000\nvt  0.410 0.466 0.000\nvt  0.402 0.418 0.000\nvt  0.352 0.501 0.000\nvt  0.367 0.516 0.000\nvt  0.359 0.554 0.000\nvt  0.370 0.541 0.000\nvt  0.267 0.331 0.000\nvt  0.249 0.313 0.000\nvt  0.294 0.252 0.000\nvt  0.304 0.288 0.000\nvt  0.317 0.535 0.000\nvt  0.326 0.508 0.000\nvt  0.001 0.696 0.000\nvt  0.033 0.695 0.000\nvt  0.050 0.772 0.000\nvt  0.014 0.778 0.000\nvt  0.400 0.811 0.000\nvt  0.448 0.361 0.000\nvt  0.454 0.364 0.000\nvt  0.453 0.367 0.000\nvt  0.475 0.254 0.000\nvt  0.478 0.274 0.000\nvt  0.458 0.280 0.000\nvt  0.454 0.261 0.000\nvt  0.369 0.369 0.000\nvt  0.322 0.460 0.000\nvt  0.338 0.482 0.000\nvt  0.324 0.977 0.000\nvt  0.238 0.981 0.000\nvt  0.230 0.948 0.000\nvt  0.155 0.915 0.000\nvt  0.165 0.891 0.000\nvt  0.431 0.560 0.000\nvt  0.431 0.564 0.000\nvt  0.420 0.563 0.000\nvt  0.418 0.558 0.000\nvt  0.410 0.544 0.000\nvt  0.429 0.548 0.000\nvt  0.349 0.731 0.000\nvt  0.365 0.701 0.000\nvt  0.391 0.606 0.000\nvt  0.393 0.593 0.000\nvt  0.457 0.570 0.000\nvt  0.447 0.556 0.000\nvt  0.444 0.574 0.000\nvt  0.448 0.580 0.000\nvt  0.415 0.551 0.000\nvt  0.431 0.554 0.000\nvt  0.441 0.566 0.000\nvt  0.450 0.458 0.000\nvt  0.451 0.325 0.000\nvt  0.468 0.330 0.000\nvt  0.390 0.364 0.000\nvt  0.411 0.432 0.000\nvt  0.422 0.417 0.000\nvt  0.430 0.357 0.000\nvt  0.435 0.351 0.000\nvt  0.438 0.356 0.000\nvt  0.435 0.360 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.371 0.000\nvt  0.452 0.371 0.000\nvt  0.238 0.385 0.000\nvt  0.487 0.445 0.000\nvt  0.492 0.444 0.000\nvt  0.061 0.378 0.000\nvt  0.026 0.384 0.000\nvt  0.028 0.321 0.000\nvt  0.068 0.316 0.000\nvt  0.395 0.572 0.000\nvt  0.395 0.578 0.000\nvt  0.395 0.584 0.000\nvt  0.441 0.571 0.000\nvt  0.438 0.333 0.000\nvt  0.469 0.343 0.000\nvt  0.486 0.338 0.000\nvt  0.484 0.324 0.000\nvt  0.468 0.488 0.000\nvt  0.466 0.448 0.000\nvt  0.462 0.455 0.000\nvt  0.455 0.448 0.000\nvt  0.460 0.446 0.000\nvt  0.459 0.466 0.000\nvt  0.388 0.623 0.000\nvt  0.433 0.366 0.000\nvt  0.487 0.356 0.000\nvt  0.486 0.348 0.000\nvt  0.457 0.363 0.000\nvt  0.448 0.364 0.000\nvt  0.469 0.362 0.000\nvt  0.488 0.361 0.000\nvt  0.491 0.433 0.000\nvt  0.401 0.557 0.000\nvt  0.397 0.551 0.000\nvt  0.373 0.570 0.000\nvt  0.369 0.571 0.000\nvt  0.375 0.566 0.000\nvt  0.379 0.567 0.000\nvt  0.378 0.569 0.000\nvt  0.471 0.234 0.000\nvt  0.450 0.245 0.000\nvt  0.143 0.816 0.000\nvt  0.114 0.748 0.000\nvt  0.149 0.737 0.000\nvt  0.175 0.804 0.000\nvt  0.202 0.856 0.000\nvt  0.179 0.866 0.000\nvt  0.190 0.729 0.000\nvt  0.217 0.797 0.000\nvt  0.245 0.848 0.000\nvt  0.466 0.215 0.000\nvt  0.437 0.233 0.000\nvt  0.452 0.588 0.000\nvt  0.092 0.854 0.000\nvt  0.116 0.835 0.000\nvt  0.081 0.761 0.000\nvt  0.053 0.512 0.000\nvt  0.026 0.519 0.000\nvt  0.026 0.452 0.000\nvt  0.056 0.446 0.000\nvt  0.113 0.498 0.000\nvt  0.085 0.504 0.000\nvt  0.110 0.556 0.000\nvt  0.083 0.564 0.000\nvt  0.001 0.634 0.000\nvt  0.001 0.579 0.000\nvt  0.025 0.577 0.000\nvt  0.027 0.633 0.000\nvt  0.118 0.614 0.000\nvt  0.132 0.671 0.000\nvt  0.099 0.679 0.000\nvt  0.089 0.622 0.000\nvt  0.167 0.667 0.000\nvt  0.292 0.836 0.000\nvt  0.199 0.303 0.000\nvt  0.174 0.364 0.000\nvt  0.393 0.544 0.000\nvt  0.387 0.529 0.000\nvt  0.459 0.380 0.000\nvt  0.462 0.372 0.000\nvt  0.463 0.366 0.000\nvt  0.463 0.363 0.000\nvt  0.402 0.945 0.000\nvt  0.476 0.902 0.000\nvt  0.401 0.489 0.000\nvt  0.391 0.563 0.000\nvt  0.388 0.559 0.000\nvt  0.404 0.563 0.000\nvt  0.443 0.569 0.000\nvt  0.380 0.571 0.000\nvt  0.382 0.569 0.000\nvt  0.384 0.569 0.000\nvt  0.439 0.568 0.000\nvt  0.431 0.568 0.000\nvt  0.421 0.567 0.000\nvt  0.393 0.567 0.000\nvt  0.387 0.567 0.000\nvt  0.384 0.564 0.000\nvt  0.394 0.568 0.000\nvt  0.413 0.568 0.000\nvt  0.370 0.565 0.000\nvt  0.452 0.389 0.000\nvt  0.399 0.452 0.000\nvt  0.471 0.566 0.000\nvt  0.316 0.686 0.000\nvt  0.128 0.222 0.000\nvt  0.179 0.214 0.000\nvt  0.175 0.258 0.000\nvt  0.124 0.265 0.000\nvt  0.439 0.119 0.000\nvt  0.229 0.304 0.000\nvt  0.203 0.363 0.000\nvt  0.274 0.227 0.000\nvt  0.223 0.371 0.000\nvt  0.053 0.571 0.000\nvt  0.001 0.388 0.000\nvt  0.001 0.456 0.000\nvt  0.001 0.524 0.000\nvt  0.064 0.877 0.000\nvt  0.144 0.945 0.000\nvt  0.001 0.323 0.000\nvt  0.065 0.689 0.000\nvt  0.224 0.240 0.000\nvt  0.072 0.265 0.000\nvt  0.001 0.267 0.000\nvt  0.031 0.264 0.000\nvt  0.057 0.628 0.000\nvt  0.194 0.622 0.000\nvt  0.149 0.611 0.000\nvt  0.308 0.489 0.000\nvt  0.369 0.558 0.000\nvt  0.374 0.560 0.000\nvt  0.378 0.562 0.000\nvt  0.445 0.413 0.000\nvt  0.430 0.429 0.000\nvt  0.461 0.440 0.000\nvt  0.476 0.607 0.000\nvt  0.469 0.591 0.000\nvt  0.378 0.549 0.000\nvt  0.384 0.554 0.000\nvt  0.393 0.509 0.000\nvt  0.299 0.520 0.000\nvt  0.436 0.403 0.000\nvt  0.489 0.615 0.000\nvt  0.383 0.568 0.000\nvt  0.364 0.139 0.000\nvt  0.236 0.192 0.000\nvt  0.033 0.219 0.000\nvt  0.079 0.220 0.000\nvt  0.292 0.168 0.000\nvt  0.001 0.218 0.000\nvt  0.197 0.523 0.000\nvt  0.209 0.508 0.000\nvt  0.217 0.527 0.000\nvt  0.206 0.535 0.000\nvt  0.211 0.571 0.000\nvt  0.203 0.562 0.000\nvt  0.187 0.591 0.000\nvt  0.185 0.578 0.000\nvt  0.161 0.583 0.000\nvt  0.165 0.574 0.000\nvt  0.150 0.569 0.000\nvt  0.155 0.560 0.000\nvt  0.145 0.539 0.000\nvt  0.153 0.535 0.000\nvt  0.150 0.501 0.000\nvt  0.159 0.502 0.000\nvt  0.186 0.438 0.000\nvt  0.191 0.452 0.000\nvt  0.172 0.472 0.000\nvt  0.164 0.464 0.000\nvt  0.208 0.427 0.000\nvt  0.210 0.441 0.000\nvt  0.182 0.567 0.000\nvt  0.193 0.550 0.000\nvt  0.169 0.561 0.000\nvt  0.161 0.553 0.000\nvt  0.163 0.534 0.000\nvt  0.169 0.505 0.000\nvt  0.196 0.465 0.000\nvt  0.180 0.479 0.000\nvt  0.214 0.460 0.000\nvt  0.227 0.456 0.000\nvt  0.221 0.433 0.000\nvt  0.203 0.489 0.000\nvt  0.211 0.486 0.000\nvt  0.215 0.495 0.000\nvt  0.228 0.537 0.000\nvt  0.219 0.583 0.000\nvt  0.188 0.602 0.000\nvt  0.152 0.587 0.000\nvt  0.138 0.546 0.000\nvt  0.141 0.500 0.000\nvt  0.157 0.450 0.000\nvt  0.180 0.412 0.000\nvt  0.209 0.404 0.000\nvt  0.227 0.417 0.000\nvt  0.236 0.447 0.000\nvt  0.194 0.496 0.000\nvt  0.187 0.487 0.000\nvt  0.199 0.477 0.000\nvt  0.213 0.478 0.000\nvt  0.222 0.489 0.000\nvt  0.178 0.538 0.000\nvt  0.178 0.510 0.000\nvt  0.233 0.492 0.000\nvt  0.130 0.496 0.000\nvt  0.149 0.425 0.000\nvt  0.128 0.552 0.000\nvt  0.484 0.930 0.000\nvt  0.472 0.934 0.000\nvt  0.463 0.938 0.000\nvt  0.470 0.952 0.000\nvt  0.480 0.955 0.000\nvt  0.484 0.970 0.000\nvt  0.488 0.942 0.000\nvt  0.478 0.944 0.000\nvt  0.388 0.569 0.000\nvt  0.385 0.572 0.000\nvt  0.424 0.968 0.000\nvt  0.437 0.961 0.000\nvt  0.438 0.969 0.000\nvt  0.427 0.973 0.000\nvt  0.418 0.961 0.000\nvt  0.429 0.956 0.000\nvt  0.389 0.961 0.000\nvt  0.399 0.955 0.000\nvt  0.405 0.960 0.000\nvt  0.394 0.967 0.000\nvt  0.429 0.569 0.000\nvt  0.405 0.566 0.000\nvt  0.393 0.978 0.000\nvt  0.383 0.975 0.000\nvt  0.384 0.967 0.000\nvt  0.401 0.986 0.000\nvt  0.395 0.991 0.000\nvt  0.386 0.982 0.000\nvt  0.411 0.989 0.000\nvt  0.407 0.996 0.000\nvt  0.438 0.570 0.000\nvt  0.427 0.994 0.000\nvt  0.416 0.996 0.000\nvt  0.421 0.987 0.000\nvt  0.419 0.953 0.000\nvt  0.408 0.953 0.000\nvt  0.439 0.988 0.000\nvt  0.428 0.981 0.000\nvt  0.437 0.978 0.000\nvt  0.489 0.956 0.000\nvt  0.132 0.132 0.000\nvt  0.082 0.133 0.000\nvt  0.084 0.092 0.000\nvt  0.133 0.090 0.000\nvt  0.446 0.066 0.000\nvt  0.442 0.095 0.000\nvt  0.381 0.103 0.000\nvt  0.388 0.070 0.000\nvt  0.185 0.169 0.000\nvt  0.186 0.126 0.000\nvt  0.253 0.102 0.000\nvt  0.242 0.148 0.000\nvt  0.230 0.072 0.000\nvt  0.183 0.087 0.000\nvt  0.448 0.038 0.000\nvt  0.395 0.039 0.000\nvt  0.398 0.021 0.000\nvt  0.449 0.020 0.000\nvt  0.133 0.055 0.000\nvt  0.179 0.050 0.000\nvt  0.288 0.053 0.000\nvt  0.260 0.052 0.000\nvt  0.261 0.023 0.000\nvt  0.300 0.022 0.000\nvt  0.341 0.043 0.000\nvt  0.348 0.022 0.000\nvt  0.087 0.055 0.000\nvt  0.040 0.091 0.000\nvt  0.041 0.055 0.000\nvt  0.038 0.133 0.000\nvt  0.001 0.131 0.000\nvt  0.001 0.089 0.000\nvt  0.001 0.053 0.000\nvt  0.222 0.038 0.000\nvt  0.083 0.177 0.000\nvt  0.035 0.178 0.000\nvt  0.326 0.083 0.000\nvt  0.315 0.124 0.000\nvt  0.001 0.175 0.000\nvt  0.129 0.175 0.000\nvt  0.001 0.002 0.000\nvt  0.042 0.002 0.000\nvt  0.133 0.002 0.000\nvt  0.177 0.002 0.000\nvt  0.092 0.002 0.000\nvt  0.399 0.002 0.000\nvt  0.450 0.002 0.000\nvt  0.303 0.002 0.000\nvt  0.350 0.002 0.000\nvt  0.218 0.002 0.000\nvt  0.260 0.002 0.000\nvt  0.558 0.967 0.000\nvt  0.557 0.976 0.000\nvt  0.500 0.997 0.000\nvt  0.588 0.975 0.000\nvt  0.442 0.967 0.000\nvt  0.443 0.976 0.000\nvt  0.412 0.975 0.000\n# 1339 texture vertices\n\nvn  0.001 0.482 -0.876\nvn  -0.001 0.661 0.751\nvn  0.136 0.595 0.792\nvn  -0.203 0.679 0.706\nvn  -0.092 0.474 0.876\nvn  -0.184 0.792 0.581\nvn  -0.098 0.863 0.495\nvn  -0.449 0.820 0.356\nvn  -0.220 0.748 0.626\nvn  -0.560 0.798 -0.222\nvn  -0.233 0.531 -0.815\nvn  0.001 0.534 -0.845\nvn  -0.135 0.596 0.791\nvn  0.203 0.676 0.708\nvn  0.091 0.476 0.875\nvn  0.189 0.792 0.581\nvn  0.099 0.862 0.496\nvn  0.444 0.821 0.360\nvn  0.221 0.747 0.627\nvn  0.556 0.801 -0.221\nvn  0.228 0.532 -0.815\nvn  -0.002 0.536 -0.844\nvn  -0.574 0.744 -0.343\nvn  -0.485 0.523 -0.701\nvn  -0.121 0.869 -0.480\nvn  -0.215 0.930 -0.298\nvn  -0.000 -0.806 -0.591\nvn  -0.277 -0.779 -0.562\nvn  -0.258 -0.731 -0.632\nvn  -0.046 -0.809 -0.586\nvn  -0.210 0.565 -0.798\nvn  -0.094 0.624 -0.775\nvn  0.015 0.952 -0.307\nvn  0.045 0.919 -0.392\nvn  -0.099 0.857 -0.505\nvn  -0.379 0.493 -0.783\nvn  -0.947 0.285 -0.149\nvn  -0.809 -0.421 -0.411\nvn  -0.895 -0.443 -0.043\nvn  -0.999 -0.020 0.035\nvn  -0.359 0.933 -0.019\nvn  -0.809 0.586 0.047\nvn  -0.667 -0.516 -0.538\nvn  -0.726 -0.626 -0.285\nvn  -0.001 0.671 -0.741\nvn  -0.001 0.945 -0.327\nvn  -0.531 -0.632 -0.565\nvn  -0.618 -0.566 -0.546\nvn  0.800 -0.473 0.369\nvn  0.618 -0.771 0.151\nvn  0.693 -0.711 0.116\nvn  0.818 -0.467 0.335\nvn  0.849 -0.259 0.460\nvn  0.775 -0.130 0.619\nvn  0.667 -0.132 0.733\nvn  0.775 -0.270 0.571\nvn  0.958 -0.057 -0.280\nvn  0.763 0.033 -0.646\nvn  0.763 -0.153 -0.628\nvn  0.911 -0.129 -0.391\nvn  0.990 0.067 0.126\nvn  0.979 0.090 0.185\nvn  0.981 0.057 0.184\nvn  0.996 0.020 0.090\nvn  0.770 -0.392 0.504\nvn  0.657 -0.721 0.219\nvn  0.478 -0.656 0.584\nvn  0.599 -0.389 0.700\nvn  0.498 -0.846 0.192\nvn  0.537 -0.840 0.082\nvn  0.740 -0.557 0.378\nvn  0.668 -0.570 0.479\nvn  0.280 -0.914 0.294\nvn  0.421 -0.898 0.126\nvn  0.991 0.084 0.103\nvn  0.964 0.223 0.143\nvn  0.960 0.189 0.207\nvn  0.979 0.103 0.175\nvn  0.868 0.172 0.465\nvn  0.907 0.085 0.413\nvn  0.938 0.144 0.316\nvn  0.897 0.178 0.405\nvn  0.662 -0.174 0.729\nvn  0.583 -0.417 0.697\nvn  0.627 -0.449 0.637\nvn  0.685 -0.405 0.605\nvn  0.827 0.091 0.555\nvn  0.890 0.018 0.455\nvn  0.663 -0.395 0.636\nvn  0.606 -0.428 0.671\nvn  0.313 -0.735 0.602\nvn  -0.136 -0.864 0.485\nvn  0.951 0.158 0.267\nvn  0.964 0.113 0.241\nvn  0.731 -0.036 0.681\nvn  0.819 -0.134 0.558\nvn  0.546 0.270 0.793\nvn  0.602 0.237 0.763\nvn  0.444 0.233 0.865\nvn  0.353 0.173 0.920\nvn  0.240 -0.093 0.966\nvn  0.498 0.051 0.866\nvn  0.675 0.338 0.656\nvn  0.480 0.400 0.780\nvn  0.064 -0.572 0.818\nvn  0.126 -0.313 0.941\nvn  0.207 -0.613 0.763\nvn  0.221 -0.810 0.544\nvn  0.598 -0.694 -0.401\nvn  0.124 -0.977 -0.175\nvn  0.218 -0.333 0.917\nvn  0.377 -0.161 0.912\nvn  0.142 -0.210 0.967\nvn  0.256 -0.155 0.954\nvn  0.111 -0.351 0.930\nvn  0.107 -0.480 0.871\nvn  0.675 -0.732 -0.096\nvn  0.496 -0.844 0.206\nvn  -0.016 -0.986 0.167\nvn  0.304 -0.948 0.097\nvn  0.982 -0.082 0.171\nvn  0.963 -0.002 0.269\nvn  0.967 -0.134 0.216\nvn  0.969 -0.177 0.175\nvn  0.916 -0.244 0.319\nvn  0.853 -0.341 0.394\nvn  0.837 -0.365 0.407\nvn  0.886 -0.281 0.368\nvn  0.422 -0.292 0.858\nvn  0.039 -0.571 0.820\nvn  -0.011 -0.399 0.917\nvn  0.333 -0.349 0.876\nvn  0.935 -0.237 0.263\nvn  0.949 -0.159 0.273\nvn  0.697 -0.213 0.685\nvn  0.568 -0.123 0.814\nvn  -0.938 0.322 0.130\nvn  -0.609 -0.738 -0.291\nvn  -0.447 -0.857 -0.258\nvn  0.259 -0.528 0.809\nvn  0.137 -0.704 0.697\nvn  -0.107 -0.741 0.663\nvn  0.647 -0.296 0.703\nvn  0.603 -0.168 0.780\nvn  0.836 0.072 0.545\nvn  0.744 0.114 0.659\nvn  0.701 0.149 0.698\nvn  0.802 0.157 0.577\nvn  0.823 -0.080 0.562\nvn  0.690 0.142 0.710\nvn  0.628 0.036 0.778\nvn  0.894 -0.247 0.373\nvn  0.624 -0.153 0.766\nvn  0.661 0.110 0.742\nvn  0.712 0.424 0.559\nvn  0.701 0.284 0.654\nvn  0.504 -0.050 0.862\nvn  0.413 0.027 0.910\nvn  0.569 0.046 0.821\nvn  0.488 -0.134 0.862\nvn  0.411 -0.180 0.894\nvn  0.610 -0.024 0.792\nvn  0.747 -0.250 0.616\nvn  0.672 -0.313 0.671\nvn  0.536 0.762 0.363\nvn  0.559 0.768 0.312\nvn  0.802 0.272 0.531\nvn  0.618 0.206 0.759\nvn  0.717 0.383 0.583\nvn  0.780 0.464 0.420\nvn  0.617 0.401 0.678\nvn  0.658 0.397 0.640\nvn  0.672 0.440 0.596\nvn  0.501 0.314 0.807\nvn  0.612 0.527 0.589\nvn  0.679 0.320 0.661\nvn  0.732 -0.406 -0.547\nvn  0.885 -0.261 -0.386\nvn  0.842 -0.347 0.414\nvn  0.782 -0.349 0.517\nvn  0.784 -0.368 0.500\nvn  0.858 -0.453 0.244\nvn  0.953 -0.279 0.118\nvn  0.977 -0.189 0.104\nvn  0.989 -0.110 0.102\nvn  0.142 0.669 0.730\nvn  0.300 0.652 0.696\nvn  0.291 0.792 0.536\nvn  0.143 0.821 0.553\nvn  0.737 0.561 0.378\nvn  0.716 0.470 0.515\nvn  0.884 0.306 0.353\nvn  0.898 0.354 0.263\nvn  0.890 0.423 0.171\nvn  0.174 0.078 0.982\nvn  0.219 0.254 0.942\nvn  0.665 -0.104 0.739\nvn  0.671 0.390 0.631\nvn  0.596 0.435 0.675\nvn  0.636 0.467 0.614\nvn  0.076 0.244 0.967\nvn  0.261 0.437 0.861\nvn  0.107 0.440 0.892\nvn  0.011 0.082 0.997\nvn  0.005 0.082 0.997\nvn  0.028 -0.027 0.999\nvn  0.073 -0.057 0.996\nvn  0.006 0.228 0.974\nvn  0.683 0.140 0.717\nvn  0.724 0.233 0.650\nvn  0.400 0.338 0.852\nvn  0.270 0.126 0.955\nvn  0.357 0.433 0.828\nvn  0.503 0.485 0.716\nvn  0.536 0.133 0.834\nvn  0.416 -0.306 0.856\nvn  0.337 0.097 0.937\nvn  0.262 0.372 0.891\nvn  0.425 0.075 0.902\nvn  0.701 -0.147 0.698\nvn  -0.056 0.558 0.828\nvn  0.005 0.605 0.796\nvn  0.483 0.327 0.812\nvn  0.497 0.276 0.823\nvn  0.505 0.283 0.815\nvn  0.340 -0.030 0.940\nvn  0.332 0.066 0.941\nvn  0.026 0.644 0.765\nvn  0.021 0.538 0.843\nvn  0.170 -0.012 0.985\nvn  0.365 -0.067 0.929\nvn  0.826 -0.173 0.537\nvn  0.320 0.415 0.852\nvn  0.384 0.739 0.554\nvn  0.987 -0.013 0.160\nvn  0.495 0.720 0.487\nvn  0.490 0.830 0.268\nvn  0.279 0.906 0.317\nvn  0.431 0.899 -0.074\nvn  0.267 0.957 -0.112\nvn  0.283 0.953 0.107\nvn  0.471 0.877 0.092\nvn  0.132 0.985 0.113\nvn  0.135 0.931 0.339\nvn  0.190 -0.184 0.964\nvn  0.292 -0.372 0.881\nvn  0.307 -0.447 0.840\nvn  0.393 -0.580 0.713\nvn  0.524 -0.286 0.802\nvn  0.380 -0.582 0.719\nvn  0.697 0.212 0.685\nvn  0.603 0.070 0.795\nvn  0.558 -0.571 0.602\nvn  -0.089 -0.701 0.707\nvn  0.794 -0.345 0.500\nvn  0.345 -0.517 0.783\nvn  0.481 0.101 0.871\nvn  0.134 0.283 0.950\nvn  0.113 -0.558 0.822\nvn  -0.073 -0.993 0.089\nvn  -0.041 -0.994 0.103\nvn  0.084 -0.038 0.996\nvn  -0.012 -0.622 0.783\nvn  -0.002 0.254 0.967\nvn  0.004 -0.997 0.079\nvn  0.001 -0.832 -0.555\nvn  0.477 -0.363 0.801\nvn  0.414 0.160 0.896\nvn  0.395 0.485 0.780\nvn  0.611 0.484 0.627\nvn  0.406 0.510 0.758\nvn  0.375 0.498 0.782\nvn  0.555 0.314 0.770\nvn  0.349 0.411 0.842\nvn  0.012 0.247 0.969\nvn  0.002 -0.369 0.930\nvn  -0.003 0.509 0.861\nvn  0.876 -0.041 0.481\nvn  0.757 -0.214 0.618\nvn  0.737 -0.048 0.674\nvn  0.840 -0.012 0.542\nvn  0.960 0.137 0.243\nvn  0.969 0.103 0.226\nvn  0.909 0.015 0.417\nvn  0.906 0.015 0.423\nvn  0.676 -0.276 0.683\nvn  0.688 -0.223 0.691\nvn  0.691 0.035 0.722\nvn  0.719 -0.082 0.691\nvn  0.964 0.062 0.260\nvn  0.956 0.070 0.286\nvn  0.953 0.037 0.300\nvn  -0.003 -0.415 0.910\nvn  -0.001 -0.380 0.925\nvn  0.658 -0.419 0.625\nvn  0.735 -0.421 0.532\nvn  0.663 -0.303 0.685\nvn  0.550 -0.321 0.771\nvn  0.423 -0.236 0.875\nvn  0.326 -0.294 0.899\nvn  0.124 -0.396 0.910\nvn  0.218 -0.177 0.960\nvn  0.530 0.781 0.331\nvn  0.167 0.827 0.537\nvn  0.094 0.948 0.303\nvn  0.313 0.934 0.171\nvn  -0.406 -0.892 0.201\nvn  -0.743 0.107 0.661\nvn  0.455 0.704 0.546\nvn  0.288 0.957 0.025\nvn  0.245 0.958 0.150\nvn  0.532 -0.027 0.846\nvn  0.566 0.213 0.796\nvn  0.508 0.208 0.836\nvn  0.173 0.028 0.984\nvn  0.371 0.122 0.921\nvn  0.429 -0.045 0.902\nvn  0.614 0.165 0.772\nvn  0.737 0.157 0.657\nvn  0.726 0.057 0.685\nvn  0.662 0.061 0.747\nvn  0.845 -0.523 -0.112\nvn  0.845 -0.501 -0.185\nvn  0.744 -0.668 0.009\nvn  0.773 -0.630 0.079\nvn  0.889 0.108 0.445\nvn  0.899 0.077 0.430\nvn  0.184 0.204 -0.961\nvn  0.005 0.202 -0.979\nvn  -0.000 0.485 -0.875\nvn  0.159 0.484 -0.861\nvn  0.499 0.592 0.633\nvn  0.305 0.950 0.065\nvn  -0.274 -0.953 -0.127\nvn  0.245 -0.456 0.856\nvn  0.083 -0.881 0.465\nvn  0.435 -0.739 0.515\nvn  0.504 -0.429 0.750\nvn  0.818 -0.367 0.443\nvn  0.933 -0.162 0.322\nvn  0.872 0.029 0.489\nvn  0.002 0.994 0.113\nvn  0.133 0.983 -0.126\nvn  -0.001 0.992 -0.127\nvn  0.280 0.892 -0.356\nvn  0.126 0.916 -0.381\nvn  0.210 0.974 -0.083\nvn  -0.082 0.663 0.745\nvn  -0.059 0.391 0.919\nvn  0.111 0.992 -0.055\nvn  0.081 -0.190 0.978\nvn  0.035 0.076 0.996\nvn  0.852 0.236 0.467\nvn  0.775 0.219 0.593\nvn  0.505 -0.109 0.856\nvn  0.446 -0.314 0.838\nvn  0.511 0.200 0.836\nvn  0.623 -0.242 0.744\nvn  0.436 -0.554 0.709\nvn  0.599 -0.742 0.300\nvn  -0.036 0.177 0.984\nvn  -0.039 -0.159 0.987\nvn  0.308 0.942 -0.135\nvn  0.989 0.093 -0.111\nvn  0.477 -0.259 0.840\nvn  0.473 -0.423 0.773\nvn  0.774 -0.329 0.541\nvn  0.285 0.019 0.958\nvn  0.350 0.101 0.931\nvn  0.579 0.261 0.773\nvn  0.298 0.015 0.954\nvn  0.165 0.336 0.927\nvn  0.577 0.511 0.636\nvn  0.254 -0.834 0.490\nvn  -0.114 -0.925 0.363\nvn  0.941 -0.280 -0.188\nvn  0.460 -0.738 0.493\nvn  0.740 -0.635 0.221\nvn  0.003 0.529 0.849\nvn  0.206 -0.427 -0.881\nvn  0.497 -0.316 -0.808\nvn  0.457 -0.144 -0.878\nvn  0.179 -0.244 -0.953\nvn  -0.182 -0.980 -0.078\nvn  0.342 -0.427 0.837\nvn  0.424 -0.296 0.856\nvn  0.896 -0.357 -0.264\nvn  0.594 -0.104 0.798\nvn  0.012 0.528 0.849\nvn  0.042 0.469 0.882\nvn  0.624 0.102 0.775\nvn  0.324 -0.123 0.938\nvn  0.202 -0.638 0.743\nvn  0.714 0.512 0.477\nvn  0.433 -0.511 0.742\nvn  -0.350 -0.708 0.613\nvn  0.095 -0.410 0.907\nvn  0.622 -0.593 0.512\nvn  0.846 0.304 0.437\nvn  0.582 -0.043 0.812\nvn  -0.226 -0.380 0.897\nvn  0.215 0.644 0.734\nvn  0.123 0.952 0.280\nvn  -0.004 0.956 0.293\nvn  -0.005 0.635 0.772\nvn  0.325 -0.730 0.601\nvn  -0.017 -0.840 0.543\nvn  0.017 -0.788 0.616\nvn  0.294 -0.138 0.946\nvn  0.214 0.401 0.891\nvn  -0.150 0.490 0.859\nvn  0.573 -0.125 0.810\nvn  -0.134 0.957 0.258\nvn  0.252 0.828 0.501\nvn  -0.673 0.643 0.364\nvn  0.004 -0.960 0.279\nvn  0.032 -0.991 0.133\nvn  0.006 -0.908 0.419\nvn  0.180 -0.980 0.086\nvn  0.740 0.403 -0.538\nvn  0.627 0.652 -0.426\nvn  0.814 0.561 -0.149\nvn  0.925 0.321 -0.206\nvn  0.492 0.825 -0.280\nvn  0.649 0.757 -0.076\nvn  0.966 0.258 0.022\nvn  0.864 0.501 0.053\nvn  0.680 0.729 0.077\nvn  0.272 -0.962 -0.032\nvn  0.225 -0.968 0.111\nvn  0.288 -0.510 0.810\nvn  0.126 0.748 -0.651\nvn  0.340 0.725 -0.598\nvn  0.421 0.466 -0.778\nvn  0.205 -0.458 -0.865\nvn  0.489 -0.479 -0.729\nvn  0.500 -0.523 -0.690\nvn  0.210 -0.566 -0.798\nvn  0.895 -0.322 -0.309\nvn  0.759 -0.434 -0.485\nvn  0.797 -0.287 -0.532\nvn  0.937 -0.248 -0.245\nvn  -0.001 -0.238 -0.971\nvn  -0.000 -0.025 -1.000\nvn  0.194 -0.025 -0.981\nvn  0.201 -0.248 -0.948\nvn  0.969 0.094 -0.229\nvn  0.968 -0.101 -0.228\nvn  0.814 -0.088 -0.575\nvn  0.800 0.142 -0.583\nvn  0.998 0.061 -0.010\nvn  0.726 0.657 0.205\nvn  0.000 -0.985 0.174\nvn  0.985 -0.166 0.038\nvn  0.955 -0.220 -0.200\nvn  0.472 0.076 0.879\nvn  0.343 -0.235 0.909\nvn  0.464 -0.641 0.612\nvn  0.578 -0.186 0.795\nvn  -0.189 -0.982 0.010\nvn  0.004 0.938 0.345\nvn  0.002 0.829 0.559\nvn  0.445 0.232 0.865\nvn  0.463 0.340 0.818\nvn  -0.116 0.983 0.143\nvn  0.004 0.995 0.102\nvn  0.978 0.204 0.044\nvn  -0.967 -0.216 -0.137\nvn  -0.911 -0.347 0.224\nvn  -0.728 0.350 0.590\nvn  0.426 0.738 -0.523\nvn  0.618 0.786 0.011\nvn  0.151 0.857 -0.493\nvn  -0.333 0.912 -0.241\nvn  -0.277 0.956 0.095\nvn  -0.569 0.822 -0.032\nvn  -0.341 -0.671 -0.658\nvn  0.161 -0.736 -0.657\nvn  0.528 0.432 0.731\nvn  0.586 0.105 0.803\nvn  0.436 0.074 0.897\nvn  0.621 0.267 0.737\nvn  0.936 0.153 0.316\nvn  0.999 -0.010 0.042\nvn  0.826 0.281 -0.489\nvn  0.775 0.178 -0.606\nvn  0.995 -0.039 -0.095\nvn  0.005 -0.414 0.910\nvn  0.580 -0.243 0.778\nvn  0.938 -0.339 -0.068\nvn  0.925 -0.371 0.080\nvn  0.888 -0.269 0.373\nvn  0.923 -0.371 -0.106\nvn  0.494 -0.274 -0.825\nvn  -0.001 -0.456 -0.890\nvn  -0.002 -0.569 -0.822\nvn  -0.001 -0.452 -0.892\nvn  -0.003 0.749 -0.663\nvn  -0.000 0.920 -0.391\nvn  -0.001 -0.280 -0.960\nvn  0.470 0.194 -0.861\nvn  0.965 -0.123 0.234\nvn  0.400 -0.039 -0.916\nvn  0.142 -0.166 -0.976\nvn  -0.000 -0.194 -0.981\nvn  0.497 -0.049 -0.867\nvn  0.998 0.042 0.045\nvn  0.996 -0.037 -0.082\nvn  0.009 0.433 0.901\nvn  0.004 0.669 0.743\nvn  0.955 0.004 0.296\nvn  0.737 -0.001 0.675\nvn  0.707 0.177 0.684\nvn  0.484 0.627 0.610\nvn  0.515 0.250 0.820\nvn  0.360 0.121 0.925\nvn  -0.544 -0.573 0.613\nvn  0.382 -0.114 0.917\nvn  0.489 -0.108 0.866\nvn  -0.002 -0.670 0.742\nvn  0.002 -0.394 0.919\nvn  -0.004 -0.168 0.986\nvn  0.007 -0.109 0.994\nvn  0.009 -0.519 0.855\nvn  0.660 -0.118 0.742\nvn  0.621 -0.127 0.774\nvn  0.416 0.220 0.882\nvn  0.946 0.046 0.322\nvn  0.014 0.006 1.000\nvn  0.569 0.184 0.802\nvn  0.218 0.013 0.976\nvn  0.044 0.087 0.995\nvn  -0.419 0.862 0.284\nvn  0.647 -0.120 0.753\nvn  0.954 -0.017 0.301\nvn  0.352 0.140 -0.926\nvn  0.095 -0.050 -0.994\nvn  0.770 0.025 0.638\nvn  0.000 -0.078 -0.997\nvn  0.985 -0.172 0.009\nvn  0.920 -0.340 0.195\nvn  0.929 -0.331 -0.163\nvn  0.969 -0.237 0.074\nvn  0.969 -0.183 0.165\nvn  0.801 0.160 0.577\nvn  0.954 -0.021 0.301\nvn  0.293 0.803 0.520\nvn  0.977 0.170 0.129\nvn  0.134 0.985 -0.104\nvn  0.994 0.106 -0.036\nvn  0.099 0.675 -0.731\nvn  0.997 -0.079 -0.000\nvn  0.197 0.126 -0.972\nvn  0.978 -0.175 -0.110\nvn  0.110 -0.321 -0.941\nvn  0.939 -0.332 -0.089\nvn  0.400 -0.789 -0.467\nvn  0.171 -0.673 -0.720\nvn  0.931 -0.336 -0.144\nvn  0.854 -0.500 0.146\nvn  0.161 -0.985 -0.069\nvn  0.931 -0.304 -0.200\nvn  0.813 -0.565 -0.143\nvn  0.823 -0.546 0.154\nvn  0.795 -0.387 0.467\nvn  0.809 -0.168 0.563\nvn  0.826 0.053 0.562\nvn  0.925 0.261 0.275\nvn  0.990 0.071 0.119\nvn  0.951 0.129 0.281\nvn  0.810 -0.147 0.568\nvn  0.383 -0.603 0.699\nvn  0.769 0.635 0.079\nvn  0.786 0.352 0.508\nvn  0.919 0.082 -0.386\nvn  0.937 0.163 0.310\nvn  0.974 -0.026 0.224\nvn  0.787 0.550 0.279\nvn  0.517 0.758 -0.397\nvn  0.337 0.112 -0.935\nvn  0.221 -0.300 -0.928\nvn  0.395 -0.578 -0.714\nvn  0.521 -0.711 -0.472\nvn  0.432 -0.901 -0.043\nvn  0.826 -0.520 0.218\nvn  0.885 -0.217 0.412\nvn  0.786 -0.107 0.609\nvn  0.864 0.400 0.304\nvn  0.954 0.061 0.293\nvn  0.949 0.313 0.046\nvn  0.991 0.028 -0.131\nvn  0.945 -0.116 0.305\nvn  0.970 -0.241 0.032\nvn  0.946 -0.038 0.322\nvn  0.886 -0.270 -0.376\nvn  0.855 -0.272 -0.441\nvn  0.952 -0.122 -0.281\nvn  0.002 -0.883 0.469\nvn  -0.001 0.792 -0.611\nvn  -0.180 0.823 -0.539\nvn  -0.642 0.677 -0.360\nvn  -0.957 0.288 -0.031\nvn  -0.912 -0.300 0.281\nvn  -0.454 -0.866 0.207\nvn  -0.855 -0.043 0.517\nvn  -0.834 0.460 0.305\nvn  -0.242 0.911 0.334\nvn  -0.720 -0.667 -0.192\nvn  -0.762 -0.580 -0.288\nvn  0.452 0.774 0.444\nvn  0.857 0.048 0.513\nvn  0.966 0.131 0.225\nvn  0.211 0.953 0.219\nvn  -0.108 0.726 0.679\nvn  0.021 0.946 0.324\nvn  0.566 -0.691 -0.450\nvn  -0.068 0.939 -0.338\nvn  -0.261 -0.298 0.918\nvn  -0.200 -0.891 0.407\nvn  0.124 -0.991 0.059\nvn  0.913 -0.350 -0.211\nvn  0.488 -0.838 0.244\nvn  0.738 -0.593 0.322\nvn  0.994 -0.060 -0.087\nvn  -0.000 -0.981 0.193\nvn  0.000 0.974 0.227\nvn  -0.350 -0.016 0.936\nvn  0.000 -0.017 1.000\nvn  0.252 0.455 -0.854\nvn  0.774 0.620 -0.127\nvn  0.634 0.759 -0.148\nvn  0.192 0.569 -0.800\nvn  0.405 -0.094 0.909\nvn  0.031 0.149 0.988\nvn  0.360 0.283 0.889\nvn  0.469 0.080 0.880\nvn  0.769 0.452 0.452\nvn  0.946 0.185 0.266\nvn  0.893 0.181 0.413\nvn  0.654 0.429 0.623\nvn  0.506 0.610 0.610\nvn  0.436 0.659 0.613\nvn  0.160 0.558 0.814\nvn  -0.285 0.396 0.873\nvn  -0.223 0.539 0.812\nvn  0.037 0.570 0.821\nvn  0.623 0.727 -0.289\nvn  0.456 0.738 0.497\nvn  0.382 0.656 0.651\nvn  0.278 0.687 0.671\nvn  0.213 0.798 0.563\nvn  0.171 0.844 0.508\nvn  0.300 0.690 0.659\nvn  0.144 0.793 0.591\nvn  0.204 0.541 -0.816\nvn  -0.001 0.494 -0.870\nvn  0.029 0.458 -0.888\nvn  0.060 0.366 -0.929\nvn  0.000 0.421 -0.907\nvn  0.000 0.386 -0.922\nvn  0.001 0.455 -0.891\nvn  0.264 0.718 0.644\nvn  0.307 0.317 -0.897\nvn  0.056 0.164 -0.985\nvn  0.717 0.079 0.693\nvn  0.638 0.188 0.746\nvn  0.000 0.202 -0.979\nvn  0.006 -0.044 0.999\nvn  0.001 0.405 0.914\nvn  0.805 0.560 -0.194\nvn  0.002 0.627 0.779\nvn  0.010 -0.298 0.954\nvn  0.124 0.870 -0.477\nvn  0.488 0.530 -0.693\nvn  0.566 0.756 -0.329\nvn  0.213 0.932 -0.294\nvn  0.245 -0.741 -0.626\nvn  0.275 -0.782 -0.559\nvn  0.044 -0.811 -0.584\nvn  -0.012 0.949 -0.315\nvn  0.097 0.621 -0.778\nvn  0.215 0.561 -0.799\nvn  -0.030 0.913 -0.407\nvn  0.378 0.505 -0.776\nvn  0.084 0.865 -0.495\nvn  0.892 -0.451 -0.026\nvn  0.803 -0.447 -0.394\nvn  0.954 0.274 -0.123\nvn  0.998 -0.024 0.066\nvn  0.806 0.588 0.057\nvn  0.351 0.936 -0.012\nvn  0.662 -0.536 -0.524\nvn  0.725 -0.630 -0.278\nvn  0.524 -0.662 -0.536\nvn  0.620 -0.585 -0.522\nvn  -0.694 -0.711 0.115\nvn  -0.621 -0.770 0.148\nvn  -0.805 -0.470 0.362\nvn  -0.819 -0.465 0.335\nvn  -0.680 -0.145 0.719\nvn  -0.763 -0.140 0.631\nvn  -0.840 -0.272 0.470\nvn  -0.773 -0.256 0.580\nvn  -0.763 -0.155 -0.627\nvn  -0.763 0.034 -0.645\nvn  -0.958 -0.057 -0.281\nvn  -0.910 -0.129 -0.393\nvn  -0.983 0.060 0.175\nvn  -0.980 0.096 0.177\nvn  -0.990 0.069 0.123\nvn  -0.996 0.023 0.083\nvn  -0.484 -0.649 0.587\nvn  -0.662 -0.717 0.220\nvn  -0.775 -0.388 0.499\nvn  -0.606 -0.384 0.697\nvn  -0.748 -0.556 0.363\nvn  -0.539 -0.840 0.071\nvn  -0.496 -0.849 0.183\nvn  -0.668 -0.580 0.467\nvn  -0.280 -0.913 0.296\nvn  -0.424 -0.897 0.125\nvn  -0.960 0.187 0.209\nvn  -0.965 0.222 0.143\nvn  -0.991 0.084 0.104\nvn  -0.979 0.104 0.175\nvn  -0.940 0.170 0.295\nvn  -0.909 0.107 0.404\nvn  -0.862 0.204 0.464\nvn  -0.896 0.204 0.395\nvn  -0.570 -0.493 0.658\nvn  -0.531 -0.465 0.709\nvn  -0.651 -0.181 0.737\nvn  -0.688 -0.376 0.620\nvn  -0.892 0.030 0.452\nvn  -0.827 0.122 0.549\nvn  -0.345 -0.706 0.619\nvn  -0.566 -0.461 0.684\nvn  -0.543 -0.393 0.742\nvn  -0.097 -0.841 0.533\nvn  -0.964 0.119 0.237\nvn  -0.950 0.158 0.268\nvn  -0.733 -0.024 0.679\nvn  -0.825 -0.117 0.552\nvn  -0.442 0.232 0.866\nvn  -0.605 0.237 0.760\nvn  -0.556 0.267 0.787\nvn  -0.350 0.172 0.921\nvn  -0.239 -0.096 0.966\nvn  -0.501 0.068 0.863\nvn  -0.679 0.342 0.650\nvn  -0.486 0.403 0.776\nvn  -0.211 -0.600 0.772\nvn  -0.123 -0.334 0.934\nvn  -0.052 -0.530 0.847\nvn  -0.176 -0.798 0.577\nvn  -0.131 -0.968 -0.212\nvn  -0.598 -0.684 -0.418\nvn  -0.205 -0.329 0.922\nvn  -0.374 -0.151 0.915\nvn  -0.117 -0.376 0.919\nvn  -0.246 -0.160 0.956\nvn  -0.126 -0.268 0.955\nvn  -0.137 -0.531 0.837\nvn  0.062 -0.980 0.190\nvn  -0.478 -0.855 0.203\nvn  -0.669 -0.734 -0.114\nvn  -0.286 -0.955 0.083\nvn  -0.967 -0.136 0.215\nvn  -0.965 -0.005 0.263\nvn  -0.983 -0.085 0.164\nvn  -0.969 -0.182 0.170\nvn  -0.840 -0.358 0.408\nvn  -0.857 -0.341 0.386\nvn  -0.910 -0.256 0.326\nvn  -0.884 -0.284 0.371\nvn  0.022 -0.449 0.893\nvn  -0.046 -0.611 0.791\nvn  -0.478 -0.294 0.827\nvn  -0.375 -0.338 0.863\nvn  -0.935 -0.243 0.259\nvn  -0.949 -0.164 0.269\nvn  -0.736 -0.207 0.645\nvn  -0.587 -0.108 0.802\nvn  0.945 0.284 0.163\nvn  0.592 -0.756 -0.279\nvn  0.442 -0.866 -0.236\nvn  -0.053 -0.740 0.670\nvn  -0.228 -0.529 0.817\nvn  0.170 -0.772 0.613\nvn  -0.609 -0.162 0.777\nvn  -0.663 -0.292 0.690\nvn  -0.713 0.145 0.686\nvn  -0.759 0.059 0.648\nvn  -0.825 0.047 0.564\nvn  -0.809 0.158 0.566\nvn  -0.637 0.025 0.770\nvn  -0.687 0.129 0.715\nvn  -0.821 -0.086 0.564\nvn  -0.891 -0.252 0.378\nvn  -0.721 0.489 0.490\nvn  -0.698 0.164 0.697\nvn  -0.646 -0.143 0.750\nvn  -0.712 0.352 0.608\nvn  -0.567 0.074 0.821\nvn  -0.464 0.032 0.885\nvn  -0.518 -0.023 0.855\nvn  -0.550 -0.128 0.825\nvn  -0.756 -0.260 0.601\nvn  -0.645 -0.025 0.764\nvn  -0.437 -0.158 0.885\nvn  -0.687 -0.310 0.657\nvn  -0.541 0.781 0.313\nvn  -0.565 0.780 0.270\nvn  -0.712 0.385 0.587\nvn  -0.611 0.201 0.765\nvn  -0.859 0.335 0.388\nvn  -0.775 0.474 0.417\nvn  -0.673 0.387 0.630\nvn  -0.628 0.400 0.668\nvn  -0.676 0.438 0.592\nvn  -0.698 0.309 0.646\nvn  -0.622 0.535 0.573\nvn  -0.511 0.327 0.795\nvn  -0.733 -0.405 -0.547\nvn  -0.884 -0.261 -0.388\nvn  -0.791 -0.366 0.490\nvn  -0.793 -0.344 0.502\nvn  -0.844 -0.347 0.408\nvn  -0.858 -0.453 0.243\nvn  -0.953 -0.280 0.116\nvn  -0.976 -0.193 0.100\nvn  -0.989 -0.113 0.096\nvn  -0.289 0.792 0.537\nvn  -0.301 0.654 0.693\nvn  -0.134 0.672 0.728\nvn  -0.137 0.821 0.554\nvn  -0.884 0.305 0.354\nvn  -0.716 0.471 0.515\nvn  -0.736 0.562 0.377\nvn  -0.897 0.355 0.265\nvn  -0.890 0.422 0.171\nvn  -0.179 0.082 0.981\nvn  -0.216 0.250 0.944\nvn  -0.661 -0.125 0.740\nvn  -0.679 0.371 0.633\nvn  -0.636 0.460 0.620\nvn  -0.594 0.426 0.682\nvn  -0.258 0.436 0.862\nvn  -0.070 0.240 0.968\nvn  -0.095 0.440 0.893\nvn  -0.011 0.089 0.996\nvn  -0.069 -0.049 0.996\nvn  -0.719 0.247 0.649\nvn  -0.673 0.172 0.719\nvn  -0.353 0.447 0.822\nvn  -0.270 0.134 0.954\nvn  -0.440 0.328 0.836\nvn  -0.511 0.490 0.706\nvn  -0.342 0.114 0.933\nvn  -0.435 -0.298 0.849\nvn  -0.552 0.158 0.818\nvn  -0.273 0.369 0.888\nvn  -0.705 -0.192 0.683\nvn  -0.357 0.088 0.930\nvn  -0.499 0.346 0.795\nvn  0.009 0.585 0.811\nvn  0.086 0.584 0.807\nvn  -0.348 -0.035 0.937\nvn  -0.516 0.299 0.803\nvn  -0.512 0.295 0.806\nvn  -0.339 0.070 0.938\nvn  -0.348 -0.070 0.935\nvn  -0.148 -0.003 0.989\nvn  -0.349 0.750 0.561\nvn  -0.322 0.418 0.849\nvn  -0.890 -0.163 0.425\nvn  -0.990 -0.001 0.144\nvn  -0.500 0.824 0.267\nvn  -0.501 0.717 0.484\nvn  -0.285 0.905 0.315\nvn  -0.282 0.954 0.103\nvn  -0.268 0.957 -0.114\nvn  -0.433 0.898 -0.078\nvn  -0.473 0.876 0.093\nvn  -0.131 0.985 0.111\nvn  -0.127 0.932 0.339\nvn  -0.211 -0.186 0.960\nvn  -0.293 -0.359 0.886\nvn  -0.344 -0.465 0.816\nvn  -0.382 -0.591 0.710\nvn  -0.525 -0.255 0.812\nvn  -0.598 0.089 0.796\nvn  -0.688 0.244 0.683\nvn  -0.344 -0.576 0.742\nvn  -0.544 -0.583 0.603\nvn  0.098 -0.695 0.712\nvn  -0.805 -0.326 0.496\nvn  -0.132 0.306 0.943\nvn  -0.485 0.160 0.860\nvn  -0.351 -0.498 0.793\nvn  -0.141 -0.499 0.855\nvn  0.065 -0.990 0.123\nvn  0.037 -0.989 0.143\nvn  -0.065 -0.055 0.996\nvn  -0.473 -0.369 0.800\nvn  -0.396 0.179 0.900\nvn  -0.600 0.505 0.620\nvn  -0.387 0.499 0.776\nvn  -0.398 0.505 0.766\nvn  -0.358 0.488 0.796\nvn  -0.570 0.304 0.763\nvn  -0.317 0.412 0.854\nvn  -0.742 -0.129 0.658\nvn  -0.771 -0.207 0.602\nvn  -0.881 -0.036 0.472\nvn  -0.841 -0.052 0.538\nvn  -0.972 0.111 0.208\nvn  -0.961 0.151 0.230\nvn  -0.916 -0.004 0.402\nvn  -0.913 0.013 0.408\nvn  -0.689 0.026 0.724\nvn  -0.641 -0.316 0.699\nvn  -0.647 -0.304 0.699\nvn  -0.697 -0.094 0.711\nvn  -0.966 0.063 0.249\nvn  -0.963 0.075 0.259\nvn  -0.958 0.031 0.287\nvn  -0.681 -0.315 0.661\nvn  -0.745 -0.412 0.525\nvn  -0.666 -0.413 0.621\nvn  -0.548 -0.335 0.767\nvn  -0.107 -0.395 0.913\nvn  -0.299 -0.320 0.899\nvn  -0.418 -0.236 0.877\nvn  -0.210 -0.169 0.963\nvn  -0.090 0.952 0.291\nvn  -0.166 0.838 0.520\nvn  -0.523 0.797 0.302\nvn  -0.302 0.941 0.154\nvn  0.408 -0.888 0.211\nvn  0.735 0.117 0.668\nvn  -0.279 0.960 0.001\nvn  -0.468 0.706 0.531\nvn  -0.232 0.964 0.131\nvn  -0.555 -0.033 0.831\nvn  -0.517 0.199 0.833\nvn  -0.549 0.222 0.806\nvn  -0.376 0.125 0.918\nvn  -0.210 0.031 0.977\nvn  -0.435 -0.045 0.899\nvn  -0.739 0.154 0.656\nvn  -0.610 0.153 0.777\nvn  -0.663 0.041 0.748\nvn  -0.733 0.013 0.681\nvn  -0.744 -0.668 0.007\nvn  -0.845 -0.501 -0.187\nvn  -0.845 -0.522 -0.114\nvn  -0.774 -0.629 0.079\nvn  -0.897 0.040 0.440\nvn  -0.896 0.094 0.434\nvn  -0.179 0.204 -0.962\nvn  -0.157 0.488 -0.858\nvn  -0.506 0.590 0.630\nvn  -0.305 0.951 0.047\nvn  0.267 -0.958 -0.102\nvn  -0.432 -0.745 0.509\nvn  -0.075 -0.883 0.463\nvn  -0.236 -0.454 0.859\nvn  -0.504 -0.423 0.753\nvn  -0.821 -0.351 0.449\nvn  -0.876 0.033 0.481\nvn  -0.934 -0.155 0.322\nvn  -0.134 0.983 -0.126\nvn  -0.128 0.916 -0.381\nvn  -0.284 0.891 -0.353\nvn  0.055 0.396 0.917\nvn  0.092 0.644 0.760\nvn  -0.199 0.976 -0.093\nvn  -0.109 0.991 -0.072\nvn  -0.039 0.079 0.996\nvn  -0.081 -0.191 0.978\nvn  -0.854 0.239 0.462\nvn  -0.774 0.223 0.593\nvn  -0.502 -0.119 0.856\nvn  -0.403 -0.420 0.813\nvn  -0.680 -0.255 0.687\nvn  -0.525 0.172 0.834\nvn  -0.376 -0.531 0.759\nvn  -0.576 -0.754 0.316\nvn  0.040 0.159 0.986\nvn  0.036 -0.180 0.983\nvn  -0.308 0.943 -0.129\nvn  -0.983 0.074 -0.170\nvn  -0.456 -0.445 0.771\nvn  -0.476 -0.297 0.828\nvn  -0.788 -0.316 0.528\nvn  -0.393 0.095 0.915\nvn  -0.308 0.018 0.951\nvn  -0.125 0.331 0.935\nvn  -0.283 0.033 0.959\nvn  -0.598 0.322 0.734\nvn  -0.575 0.559 0.598\nvn  -0.216 -0.852 0.476\nvn  0.156 -0.927 0.342\nvn  -0.941 -0.282 -0.189\nvn  -0.739 -0.637 0.221\nvn  -0.469 -0.731 0.495\nvn  -0.458 -0.139 -0.878\nvn  -0.498 -0.315 -0.808\nvn  -0.210 -0.426 -0.880\nvn  -0.182 -0.243 -0.953\nvn  -0.334 -0.402 0.853\nvn  0.221 -0.960 -0.173\nvn  -0.414 -0.366 0.834\nvn  -0.902 -0.373 -0.218\nvn  -0.632 -0.114 0.767\nvn  -0.642 0.122 0.757\nvn  -0.194 -0.651 0.734\nvn  -0.351 -0.095 0.931\nvn  -0.707 0.530 0.467\nvn  -0.087 -0.550 0.831\nvn  0.352 -0.710 0.610\nvn  -0.500 -0.482 0.720\nvn  -0.653 -0.626 0.427\nvn  -0.856 0.328 0.399\nvn  -0.578 -0.029 0.816\nvn  0.275 -0.432 0.859\nvn  -0.123 0.953 0.277\nvn  -0.228 0.657 0.719\nvn  -0.298 -0.735 0.609\nvn  -0.300 -0.179 0.937\nvn  -0.219 0.400 0.890\nvn  -0.587 -0.175 0.791\nvn  0.175 0.460 0.870\nvn  -0.179 0.856 0.485\nvn  0.114 0.959 0.259\nvn  0.664 0.620 0.418\nvn  -0.026 -0.991 0.129\nvn  -0.184 -0.979 0.082\nvn  -0.810 0.566 -0.151\nvn  -0.628 0.654 -0.422\nvn  -0.741 0.405 -0.536\nvn  -0.924 0.322 -0.207\nvn  -0.493 0.823 -0.280\nvn  -0.648 0.758 -0.080\nvn  -0.966 0.258 0.022\nvn  -0.864 0.501 0.051\nvn  -0.679 0.730 0.075\nvn  -0.221 -0.970 0.105\nvn  -0.271 -0.962 -0.038\nvn  -0.376 -0.516 0.769\nvn  -0.124 0.748 -0.652\nvn  -0.339 0.727 -0.598\nvn  -0.420 0.469 -0.777\nvn  -0.500 -0.524 -0.690\nvn  -0.489 -0.481 -0.728\nvn  -0.206 -0.458 -0.865\nvn  -0.212 -0.565 -0.797\nvn  -0.893 -0.325 -0.312\nvn  -0.759 -0.435 -0.485\nvn  -0.796 -0.289 -0.532\nvn  -0.937 -0.249 -0.246\nvn  -0.193 -0.029 -0.981\nvn  -0.202 -0.249 -0.947\nvn  -0.814 -0.090 -0.574\nvn  -0.969 -0.102 -0.227\nvn  -0.969 0.093 -0.229\nvn  -0.801 0.142 -0.581\nvn  -0.998 0.061 -0.010\nvn  -0.718 0.664 0.209\nvn  -0.985 -0.168 0.036\nvn  -0.954 -0.222 -0.201\nvn  -0.451 0.039 0.891\nvn  -0.341 -0.253 0.905\nvn  -0.604 -0.144 0.784\nvn  -0.472 -0.641 0.606\nvn  0.107 -0.991 0.080\nvn  -0.463 0.274 0.843\nvn  -0.002 0.997 0.081\nvn  0.083 0.977 0.195\nvn  -0.466 0.366 0.805\nvn  -0.977 0.200 0.072\nvn  0.916 -0.331 0.226\nvn  0.929 -0.364 -0.067\nvn  0.728 0.359 0.584\nvn  -0.419 0.737 -0.531\nvn  -0.638 0.769 0.043\nvn  -0.146 0.857 -0.494\nvn  0.280 0.954 0.105\nvn  0.343 0.909 -0.237\nvn  0.546 0.838 -0.008\nvn  0.342 -0.678 -0.651\nvn  -0.159 -0.734 -0.660\nvn  -0.545 0.363 0.756\nvn  -0.599 0.165 0.783\nvn  -0.447 0.066 0.892\nvn  -0.645 0.255 0.721\nvn  -0.936 0.164 0.311\nvn  -0.776 0.182 -0.604\nvn  -0.827 0.285 -0.485\nvn  -0.999 -0.012 0.041\nvn  -0.995 -0.037 -0.093\nvn  -0.586 -0.252 0.770\nvn  -0.926 -0.370 0.079\nvn  -0.938 -0.339 -0.067\nvn  -0.889 -0.266 0.372\nvn  -0.922 -0.372 -0.106\nvn  -0.493 -0.275 -0.825\nvn  -0.473 0.194 -0.860\nvn  -0.965 -0.122 0.231\nvn  -0.401 -0.036 -0.915\nvn  -0.143 -0.164 -0.976\nvn  -0.496 -0.052 -0.867\nvn  -0.996 -0.037 -0.083\nvn  -0.998 0.042 0.045\nvn  -0.950 0.012 0.313\nvn  -0.733 -0.008 0.681\nvn  -0.670 0.247 0.700\nvn  -0.408 0.697 0.589\nvn  -0.330 0.155 0.931\nvn  -0.517 0.244 0.821\nvn  0.568 -0.625 0.535\nvn  -0.512 -0.108 0.852\nvn  -0.414 -0.112 0.903\nvn  -0.654 -0.140 0.743\nvn  -0.608 -0.086 0.789\nvn  -0.422 0.215 0.881\nvn  -0.943 0.031 0.332\nvn  -0.549 0.190 0.814\nvn  -0.193 0.018 0.981\nvn  0.358 0.872 0.335\nvn  -0.651 -0.118 0.750\nvn  -0.954 -0.010 0.300\nvn  -0.352 0.145 -0.925\nvn  -0.095 -0.049 -0.994\nvn  -0.769 0.031 0.639\nvn  -0.929 -0.329 -0.171\nvn  -0.923 -0.336 0.190\nvn  -0.985 -0.174 0.005\nvn  -0.970 -0.234 0.068\nvn  -0.801 0.162 0.576\nvn  -0.969 -0.184 0.166\nvn  -0.293 0.803 0.519\nvn  -0.954 -0.019 0.300\nvn  -0.133 0.986 -0.105\nvn  -0.976 0.175 0.130\nvn  -0.098 0.675 -0.732\nvn  -0.993 0.112 -0.041\nvn  -0.197 0.127 -0.972\nvn  -0.997 -0.077 -0.003\nvn  -0.112 -0.322 -0.940\nvn  -0.978 -0.176 -0.109\nvn  -0.171 -0.674 -0.719\nvn  -0.397 -0.789 -0.468\nvn  -0.937 -0.337 -0.091\nvn  -0.929 -0.341 -0.146\nvn  -0.158 -0.985 -0.070\nvn  -0.854 -0.500 0.145\nvn  -0.814 -0.564 -0.141\nvn  -0.931 -0.306 -0.199\nvn  -0.824 -0.545 0.156\nvn  -0.797 -0.383 0.466\nvn  -0.811 -0.165 0.562\nvn  -0.824 0.053 0.564\nvn  -0.926 0.257 0.275\nvn  -0.991 0.062 0.118\nvn  -0.952 0.122 0.281\nvn  -0.383 -0.604 0.699\nvn  -0.810 -0.150 0.567\nvn  -0.784 0.355 0.509\nvn  -0.761 0.645 0.076\nvn  -0.920 0.079 -0.385\nvn  -0.975 -0.023 0.222\nvn  -0.937 0.166 0.308\nvn  -0.787 0.551 0.279\nvn  -0.517 0.758 -0.396\nvn  -0.337 0.112 -0.935\nvn  -0.221 -0.301 -0.928\nvn  -0.395 -0.579 -0.714\nvn  -0.520 -0.711 -0.473\nvn  -0.426 -0.904 -0.044\nvn  -0.824 -0.523 0.219\nvn  -0.886 -0.220 0.409\nvn  -0.863 0.404 0.303\nvn  -0.782 -0.104 0.615\nvn  -0.953 0.066 0.297\nvn  -0.949 0.312 0.046\nvn  -0.991 0.025 -0.134\nvn  -0.944 -0.116 0.308\nvn  -0.971 -0.237 0.041\nvn  -0.947 -0.041 0.318\nvn  -0.854 -0.274 -0.443\nvn  -0.885 -0.271 -0.378\nvn  -0.952 -0.121 -0.282\nvn  0.180 0.824 -0.537\nvn  0.642 0.679 -0.355\nvn  0.956 0.291 -0.021\nvn  0.453 -0.867 0.208\nvn  0.910 -0.301 0.285\nvn  0.854 -0.043 0.518\nvn  0.833 0.459 0.308\nvn  0.241 0.911 0.334\nvn  0.731 -0.650 -0.206\nvn  0.760 -0.585 -0.282\nvn  -0.814 0.019 0.580\nvn  -0.563 0.638 0.526\nvn  -0.925 -0.012 0.381\nvn  -0.214 0.952 0.217\nvn  0.096 0.721 0.686\nvn  -0.027 0.945 0.325\nvn  -0.555 -0.678 -0.481\nvn  0.062 0.937 -0.343\nvn  0.240 -0.291 0.926\nvn  0.184 -0.889 0.419\nvn  -0.126 -0.990 0.061\nvn  -0.889 -0.369 -0.271\nvn  -0.506 -0.832 0.229\nvn  -0.808 -0.443 0.388\nvn  -0.993 -0.084 0.087\nvn  0.350 -0.016 0.937\nvn  -0.636 0.759 -0.140\nvn  -0.771 0.626 -0.115\nvn  -0.250 0.462 -0.851\nvn  -0.192 0.568 -0.801\nvn  -0.359 0.279 0.891\nvn  -0.026 0.144 0.989\nvn  -0.398 -0.100 0.912\nvn  -0.465 0.084 0.881\nvn  -0.895 0.186 0.405\nvn  -0.947 0.184 0.264\nvn  -0.761 0.459 0.458\nvn  -0.657 0.429 0.620\nvn  -0.426 0.660 0.618\nvn  -0.505 0.610 0.611\nvn  0.223 0.536 0.814\nvn  0.285 0.393 0.874\nvn  -0.163 0.555 0.815\nvn  -0.038 0.570 0.821\nvn  -0.628 0.723 -0.288\nvn  -0.458 0.737 0.497\nvn  -0.212 0.799 0.563\nvn  -0.278 0.687 0.672\nvn  -0.380 0.657 0.651\nvn  -0.170 0.846 0.506\nvn  -0.305 0.687 0.660\nvn  -0.144 0.795 0.589\nvn  0.001 0.494 -0.870\nvn  -0.208 0.539 -0.816\nvn  -0.027 0.458 -0.888\nvn  -0.057 0.367 -0.929\nvn  -0.262 0.718 0.645\nvn  -0.054 0.163 -0.985\nvn  -0.306 0.325 -0.895\nvn  -0.643 0.181 0.744\nvn  -0.717 0.083 0.692\nvn  -0.800 0.573 -0.178\nvn  0.296 -0.070 0.953\nvn  -0.319 -0.065 0.946\n# 1258 vertex normals\n\ng head\ns 1\nf 24/1/24 25/2/25 26/3/26\nf 24/1/24 26/3/26 23/4/23\nf 28/5/28 29/6/29 30/7/30\nf 28/5/28 30/7/30 27/8/27\nf 32/9/32 33/10/33 34/11/34\nf 32/9/32 34/11/34 31/12/31\nf 36/13/36 31/12/31 34/11/34\nf 36/13/36 34/11/34 35/14/35\nf 36/13/36 35/14/35 25/2/25\nf 36/13/36 25/2/25 24/1/24\nf 38/15/38 39/16/39 40/17/40\nf 38/15/38 40/17/40 37/18/37\nf 42/19/42 23/4/23 26/3/26\nf 42/19/42 26/3/26 41/20/41\nf 40/17/40 42/19/42 41/20/41\nf 40/17/40 41/20/41 37/18/37\nf 38/15/38 43/21/43 44/22/44\nf 38/15/38 44/22/44 39/16/39\nf 32/9/32 45/23/45 46/24/46\nf 32/9/32 46/24/46 33/10/33\nf 28/5/28 44/22/44 48/25/48\nf 28/5/28 48/25/48 47/26/47\nf 50/27/50 51/28/51 52/29/52\nf 50/27/50 52/29/52 49/30/49\nf 54/31/54 55/32/55 56/33/56\nf 54/31/54 56/33/56 53/34/53\nf 58/35/58 59/36/59 60/37/60\nf 58/35/58 60/37/60 57/38/57\nf 62/39/62 63/40/63 64/41/64\nf 62/39/62 64/41/64 61/42/61\nf 66/43/66 67/44/67 68/45/68\nf 66/43/66 68/45/68 65/46/65\nf 70/47/70 71/48/71 72/49/72\nf 70/47/70 72/49/72 69/50/69\nf 67/44/67 66/43/66 74/51/74\nf 67/44/67 74/51/74 73/52/73\nf 66/43/66 51/28/51 50/27/50\nf 66/43/66 50/27/50 74/51/74\nf 76/53/76 77/54/77 78/55/78\nf 76/53/76 78/55/78 75/56/75\nf 80/57/80 81/58/81 82/59/82\nf 80/57/80 82/59/82 79/60/79\nf 84/61/84 85/62/85 86/63/86\nf 84/61/84 86/63/86 83/64/83\nf 87/65/87 88/66/88 80/57/80\nf 87/65/87 80/57/80 79/60/79\nf 90/67/90 91/68/91 92/69/92\nf 90/67/90 92/69/92 89/70/89\nf 93/71/93 94/72/94 78/55/78\nf 93/71/93 78/55/78 77/54/77\nf 87/65/87 95/73/95 96/74/96\nf 87/65/87 96/74/96 88/66/88\nf 98/75/98 99/76/99 100/77/100\nf 98/75/98 100/77/100 97/78/97\nf 100/77/100 101/79/101 102/80/102\nf 100/77/100 102/80/102 97/78/97\nf 98/75/98 103/81/103 104/82/104\nf 98/75/98 104/82/104 99/76/99\nf 106/83/106 107/84/107 108/85/108\nf 106/83/106 108/85/108 105/86/105\nf 109/87/109 110/88/110 105/86/105\nf 109/87/109 105/86/105 108/85/108\nf 101/79/101 111/89/111 112/90/112\nf 101/79/101 112/90/112 102/80/102\nf 114/91/114 115/92/115 116/93/116\nf 114/91/114 116/93/116 113/94/113\nf 118/95/118 119/96/119 120/97/120\nf 118/95/118 120/97/120 117/98/117\nf 122/99/122 123/100/123 124/101/124\nf 122/99/122 124/101/124 121/102/121\nf 126/103/126 127/104/127 128/105/128\nf 126/103/126 128/105/128 125/106/125\nf 130/107/130 131/108/131 132/109/132\nf 130/107/130 132/109/132 129/110/129\nf 125/106/125 128/105/128 134/111/134\nf 125/106/125 134/111/134 133/112/133\nf 56/33/56 55/32/55 136/113/136\nf 56/33/56 136/113/136 135/114/135\nf 37/115/37 137/116/137 138/117/138\nf 37/115/37 138/117/138 38/118/38\nf 139/119/139 43/120/43 38/118/38\nf 139/119/139 38/118/38 138/117/138\nf 140/121/140 141/122/141 142/123/142\nf 140/121/140 142/123/142 130/107/130\nf 144/124/144 129/110/129 132/109/132\nf 144/124/144 132/109/132 143/125/143\nf 146/126/146 147/127/147 148/128/148\nf 146/126/146 148/128/148 145/129/145\nf 150/130/150 151/131/151 54/31/54\nf 150/130/150 54/31/54 149/132/149\nf 54/31/54 53/34/53 152/133/152\nf 54/31/54 152/133/152 149/132/149\nf 154/134/154 155/135/155 156/136/156\nf 154/134/154 156/136/156 153/137/153\nf 158/138/158 159/139/159 160/140/160\nf 158/138/158 160/140/160 157/141/157\nf 162/142/162 163/143/163 164/144/164\nf 162/142/162 164/144/164 161/145/161\nf 129/110/129 144/124/144 157/141/157\nf 129/110/129 157/141/157 160/140/160\nf 156/136/156 155/135/155 166/146/166\nf 156/136/156 166/146/166 165/147/165\nf 168/148/168 169/149/169 170/150/170\nf 168/148/168 170/150/170 167/151/167\nf 171/152/171 172/153/172 173/154/173\nf 171/152/171 173/154/173 169/149/169\nf 175/155/175 176/156/176 171/152/171\nf 175/155/175 171/152/171 174/157/174\nf 59/36/59 177/158/177 178/159/178\nf 59/36/59 178/159/178 60/37/60\nf 180/160/180 181/161/181 49/30/49\nf 180/160/180 49/30/49 179/162/179\nf 127/104/127 52/29/52 182/163/182\nf 127/104/127 182/163/182 128/105/128\nf 134/111/134 183/164/183 184/165/184\nf 134/111/134 184/165/184 124/101/124\nf 185/166/185 121/102/121 124/101/124\nf 185/166/185 124/101/124 184/165/184\nf 187/167/187 188/168/188 189/169/189\nf 187/167/187 189/169/189 186/170/186\nf 191/171/191 192/172/192 193/173/193\nf 191/171/191 193/173/193 190/174/190\nf 76/53/76 194/175/194 193/173/193\nf 76/53/76 193/173/193 77/54/77\nf 100/77/100 99/76/99 196/176/196\nf 100/77/100 196/176/196 195/177/195\nf 176/156/176 175/155/175 198/178/198\nf 176/156/176 198/178/198 197/179/197\nf 199/180/199 200/181/200 173/154/173\nf 199/180/199 173/154/173 172/153/172\nf 196/176/196 202/182/202 203/183/203\nf 196/176/196 203/183/203 201/184/201\nf 205/185/205 206/186/206 207/187/207\nf 205/185/205 207/187/207 204/188/204\nf 208/189/208 205/185/205 204/188/204\nf 208/189/208 204/188/204 201/184/201\nf 210/190/210 97/78/97 102/80/102\nf 210/190/210 102/80/102 209/191/209\nf 79/60/79 210/190/210 209/191/209\nf 79/60/79 209/191/209 87/65/87\nf 212/192/212 213/193/213 214/194/214\nf 212/192/212 214/194/214 211/195/211\nf 216/196/216 217/197/217 218/198/218\nf 216/196/216 218/198/218 215/199/215\nf 220/200/220 216/196/216 215/199/215\nf 220/200/220 215/199/215 219/201/219\nf 222/202/222 223/203/223 218/198/218\nf 222/202/222 218/198/218 221/204/221\nf 225/205/225 226/206/226 227/207/227\nf 225/205/225 227/207/227 224/208/224\nf 222/202/222 221/204/221 229/209/229\nf 222/202/222 229/209/229 228/210/228\nf 230/211/230 231/212/231 220/200/220\nf 230/211/230 220/200/220 219/201/219\nf 227/207/227 226/206/226 231/212/231\nf 227/207/227 231/212/231 230/211/230\nf 233/213/233 234/214/234 235/215/235\nf 233/213/233 235/215/235 232/216/232\nf 186/170/186 203/183/203 202/182/202\nf 186/170/186 202/182/202 187/167/187\nf 236/217/236 237/218/237 238/219/238\nf 236/217/236 238/219/238 188/168/188\nf 240/220/240 241/221/241 242/222/242\nf 240/220/240 242/222/242 239/223/239\nf 241/221/241 243/224/243 244/225/244\nf 241/221/241 244/225/244 238/219/238\nf 245/226/245 101/79/101 100/77/100\nf 245/226/245 100/77/100 195/177/195\nf 195/177/195 204/188/204 207/187/207\nf 195/177/195 207/187/207 245/226/245\nf 111/89/111 246/227/246 247/228/247\nf 111/89/111 247/228/247 115/92/115\nf 141/122/141 140/121/140 249/229/249\nf 141/122/141 249/229/249 248/230/248\nf 251/231/251 252/232/252 253/233/253\nf 251/231/251 253/233/253 250/234/250\nf 254/235/254 118/95/118 255/236/255\nf 254/235/254 255/236/255 217/197/217\nf 257/237/257 258/238/258 259/239/259\nf 257/237/257 259/239/259 256/240/256\nf 256/240/256 259/239/259 261/241/261\nf 256/240/256 261/241/261 260/242/260\nf 260/242/260 261/241/261 30/243/30\nf 260/242/260 30/243/30 29/244/29\nf 218/198/218 217/197/217 262/245/262\nf 218/198/218 262/245/262 221/204/221\nf 259/239/259 258/238/258 264/246/264\nf 259/239/259 264/246/264 263/247/263\nf 266/248/266 30/243/30 261/241/261\nf 266/248/266 261/241/261 265/249/265\nf 253/233/253 252/232/252 268/250/268\nf 253/233/253 268/250/268 267/251/267\nf 270/252/270 200/181/200 271/253/271\nf 270/252/270 271/253/271 269/254/269\nf 199/180/199 272/255/272 271/253/271\nf 199/180/199 271/253/271 200/181/200\nf 199/180/199 273/256/273 274/257/274\nf 199/180/199 274/257/274 272/255/272\nf 276/258/276 267/251/267 268/250/268\nf 276/258/276 268/250/268 275/259/275\nf 275/259/275 268/250/268 269/254/269\nf 275/259/275 269/254/269 277/260/277\nf 93/71/93 77/54/77 193/173/193\nf 93/71/93 193/173/193 192/172/192\nf 279/261/279 280/262/280 281/263/281\nf 279/261/279 281/263/281 278/264/278\nf 278/264/278 88/66/88 96/74/96\nf 278/264/278 96/74/96 279/261/279\nf 282/265/282 283/266/283 62/39/62\nf 282/265/282 62/39/62 94/72/94\nf 281/263/281 284/267/284 285/268/285\nf 281/263/281 285/268/285 278/264/278\nf 287/269/287 288/270/288 289/271/289\nf 287/269/287 289/271/289 286/272/286\nf 63/40/63 62/39/62 283/266/283\nf 63/40/63 283/266/283 290/273/290\nf 283/266/283 291/274/291 292/275/292\nf 283/266/283 292/275/292 290/273/290\nf 293/276/293 294/277/294 68/45/68\nf 293/276/293 68/45/68 67/44/67\nf 296/278/296 297/279/297 298/280/298\nf 296/278/296 298/280/298 295/281/295\nf 300/282/300 301/283/301 302/284/302\nf 300/282/300 302/284/302 299/285/299\nf 304/286/304 305/287/305 306/288/306\nf 304/286/304 306/288/306 303/289/303\nf 138/117/138 137/116/137 308/290/308\nf 138/117/138 308/290/308 307/291/307\nf 165/147/165 310/292/310 311/293/311\nf 165/147/165 311/293/311 309/294/309\nf 312/295/312 55/32/55 54/31/54\nf 312/295/312 54/31/54 151/131/151\nf 314/296/314 151/131/151 150/130/150\nf 314/296/314 150/130/150 313/297/313\nf 315/298/315 316/299/316 227/207/227\nf 315/298/315 227/207/227 230/211/230\nf 136/113/136 317/300/317 158/138/158\nf 136/113/136 158/138/158 157/141/157\nf 319/301/319 148/128/148 147/127/147\nf 319/301/319 147/127/147 318/302/318\nf 320/303/320 321/304/321 147/127/147\nf 320/303/320 147/127/147 146/126/146\nf 323/305/323 324/306/324 325/307/325\nf 323/305/323 325/307/325 322/308/322\nf 80/57/80 88/66/88 278/264/278\nf 80/57/80 278/264/278 285/268/285\nf 327/309/327 145/129/145 148/128/148\nf 327/309/327 148/128/148 326/310/326\nf 279/261/279 286/272/286 289/271/289\nf 279/261/279 289/271/289 280/262/280\nf 329/311/329 330/312/330 331/313/331\nf 329/311/329 331/313/331 328/314/328\nf 187/167/187 202/182/202 104/82/104\nf 187/167/187 104/82/104 332/315/332\nf 236/217/236 332/315/332 191/171/191\nf 236/217/236 191/171/191 190/174/190\nf 165/147/165 166/146/166 333/316/333\nf 165/147/165 333/316/333 310/292/310\nf 139/119/139 334/317/334 48/318/48\nf 139/119/139 48/318/48 43/120/43\nf 336/319/336 337/320/337 338/321/338\nf 336/319/336 338/321/338 335/322/335\nf 51/28/51 324/306/324 182/163/182\nf 51/28/51 182/163/182 52/29/52\nf 339/323/339 126/103/126 53/34/53\nf 339/323/339 53/34/53 56/33/56\nf 340/324/340 341/325/341 149/132/149\nf 340/324/340 149/132/149 152/133/152\nf 243/224/243 343/326/343 344/327/344\nf 243/224/243 344/327/344 342/328/342\nf 346/329/346 343/326/343 240/220/240\nf 346/329/346 240/220/240 345/330/345\nf 348/331/348 349/332/349 350/333/350\nf 348/331/348 350/333/350 347/334/347\nf 351/335/351 352/336/352 213/193/213\nf 351/335/351 213/193/213 212/192/212\nf 128/105/128 182/163/182 183/164/183\nf 128/105/128 183/164/183 134/111/134\nf 103/81/103 98/75/98 354/337/354\nf 103/81/103 354/337/354 353/338/353\nf 114/91/114 113/94/113 356/339/356\nf 114/91/114 356/339/356 355/340/355\nf 358/341/358 197/179/197 198/178/198\nf 358/341/358 198/178/198 357/342/357\nf 107/84/107 359/343/359 360/344/360\nf 107/84/107 360/344/360 108/85/108\nf 348/331/348 361/345/361 362/346/362\nf 348/331/348 362/346/362 349/332/349\nf 347/334/347 363/347/363 234/214/234\nf 347/334/347 234/214/234 348/331/348\nf 220/200/220 231/212/231 167/151/167\nf 220/200/220 167/151/167 364/348/364\nf 153/137/153 366/349/366 300/282/300\nf 153/137/153 300/282/300 365/350/365\nf 295/281/295 72/49/72 71/48/71\nf 295/281/295 71/48/71 296/278/296\nf 179/162/179 339/323/339 367/351/367\nf 179/162/179 367/351/367 180/160/180\nf 368/352/368 369/353/369 158/138/158\nf 368/352/368 158/138/158 317/300/317\nf 317/300/317 136/113/136 55/32/55\nf 317/300/317 55/32/55 312/295/312\nf 371/354/371 372/355/372 373/356/373\nf 371/354/371 373/356/373 370/357/370\nf 41/358/41 26/359/26 306/288/306\nf 41/358/41 306/288/306 305/287/305\nf 305/287/305 137/116/137 37/115/37\nf 305/287/305 37/115/37 41/358/41\nf 248/230/248 374/360/374 375/361/375\nf 248/230/248 375/361/375 141/122/141\nf 66/43/66 325/307/325 324/306/324\nf 66/43/66 324/306/324 51/28/51\nf 183/164/183 323/305/323 376/362/376\nf 183/164/183 376/362/376 184/165/184\nf 378/363/378 253/233/253 267/251/267\nf 378/363/378 267/251/267 377/364/377\nf 269/254/269 271/253/271 379/365/379\nf 269/254/269 379/365/379 277/260/277\nf 381/366/381 382/367/382 383/368/383\nf 381/366/381 383/368/383 380/369/380\nf 384/370/384 385/371/385 105/86/105\nf 384/370/384 105/86/105 110/88/110\nf 105/86/105 385/371/385 386/372/386\nf 105/86/105 386/372/386 106/83/106\nf 360/344/360 387/373/387 109/87/109\nf 360/344/360 109/87/109 108/85/108\nf 181/161/181 180/160/180 164/144/164\nf 181/161/181 164/144/164 163/143/163\nf 365/350/365 388/374/388 154/134/154\nf 365/350/365 154/134/154 153/137/153\nf 168/148/168 167/151/167 231/212/231\nf 168/148/168 231/212/231 226/206/226\nf 81/58/81 291/274/291 283/266/283\nf 81/58/81 283/266/283 282/265/282\nf 272/255/272 389/375/389 379/365/379\nf 272/255/272 379/365/379 271/253/271\nf 274/257/274 390/376/390 389/375/389\nf 274/257/274 389/375/389 272/255/272\nf 139/119/139 375/361/375 374/360/374\nf 139/119/139 374/360/374 334/317/334\nf 391/377/391 366/349/366 153/137/153\nf 391/377/391 153/137/153 156/136/156\nf 392/378/392 393/379/393 366/349/366\nf 392/378/392 366/349/366 391/377/391\nf 173/154/173 200/181/200 270/252/270\nf 173/154/173 270/252/270 394/380/394\nf 301/283/301 300/282/300 366/349/366\nf 301/283/301 366/349/366 393/379/393\nf 396/381/396 397/382/397 398/383/398\nf 396/381/396 398/383/398 395/384/395\nf 399/385/399 364/348/364 167/151/167\nf 399/385/399 167/151/167 170/150/170\nf 394/380/394 251/231/251 399/385/399\nf 394/380/394 399/385/399 170/150/170\nf 270/252/270 252/232/252 251/231/251\nf 270/252/270 251/231/251 394/380/394\nf 102/80/102 112/90/112 400/386/400\nf 102/80/102 400/386/400 209/191/209\nf 131/108/131 401/387/401 372/355/372\nf 131/108/131 372/355/372 371/354/371\nf 391/377/391 156/136/156 165/147/165\nf 391/377/391 165/147/165 309/294/309\nf 403/388/403 404/389/404 405/390/405\nf 403/388/403 405/390/405 402/391/402\nf 402/391/402 392/378/392 391/377/391\nf 402/391/402 391/377/391 309/294/309\nf 35/392/35 310/292/310 333/316/333\nf 35/392/35 333/316/333 25/393/25\nf 35/392/35 34/394/34 311/293/311\nf 35/392/35 311/293/311 310/292/310\nf 34/394/34 33/395/33 403/388/403\nf 34/394/34 403/388/403 311/293/311\nf 406/396/406 262/245/262 217/197/217\nf 406/396/406 217/197/217 255/236/255\nf 377/364/377 407/397/407 408/398/408\nf 377/364/377 408/398/408 406/396/406\nf 117/98/117 378/363/378 255/236/255\nf 117/98/117 255/236/255 118/95/118\nf 270/252/270 269/254/269 268/250/268\nf 270/252/270 268/250/268 252/232/252\nf 304/286/304 303/289/303 373/356/373\nf 304/286/304 373/356/373 372/355/372\nf 362/346/362 409/399/409 410/400/410\nf 362/346/362 410/400/410 349/332/349\nf 411/401/411 412/402/412 89/70/89\nf 411/401/411 89/70/89 92/69/92\nf 414/403/414 411/401/411 415/404/415\nf 414/403/414 415/404/415 413/405/413\nf 417/406/417 336/319/336 418/407/418\nf 417/406/417 418/407/418 416/408/416\nf 337/320/337 419/409/419 69/50/69\nf 337/320/337 69/50/69 72/49/72\nf 421/410/421 422/411/422 423/412/423\nf 421/410/421 423/412/423 420/413/420\nf 421/410/421 424/414/424 425/415/425\nf 421/410/421 425/415/425 422/411/422\nf 423/412/423 422/411/422 427/416/427\nf 423/412/423 427/416/427 426/417/426\nf 239/223/239 242/222/242 428/418/428\nf 239/223/239 428/418/428 425/415/425\nf 430/419/430 73/52/73 74/51/74\nf 430/419/430 74/51/74 429/420/429\nf 70/47/70 69/50/69 419/409/419\nf 70/47/70 419/409/419 429/420/429\nf 247/228/247 431/421/431 116/93/116\nf 247/228/247 116/93/116 115/92/115\nf 346/329/346 345/330/345 433/422/433\nf 346/329/346 433/422/433 432/423/432\nf 433/422/433 421/410/421 420/413/420\nf 433/422/433 420/413/420 434/424/434\nf 436/425/436 437/426/437 438/427/438\nf 436/425/436 438/427/438 435/428/435\nf 437/426/437 381/366/381 380/369/380\nf 437/426/437 380/369/380 438/427/438\nf 178/159/178 177/158/177 440/429/440\nf 178/159/178 440/429/440 439/430/439\nf 440/429/440 441/431/441 442/432/442\nf 440/429/440 442/432/442 439/430/439\nf 444/433/444 445/434/445 446/435/446\nf 444/433/444 446/435/446 443/436/443\nf 324/306/324 323/305/323 183/164/183\nf 324/306/324 183/164/183 182/163/182\nf 213/193/213 352/336/352 357/342/357\nf 213/193/213 357/342/357 198/178/198\nf 214/194/214 175/155/175 174/157/174\nf 214/194/214 174/157/174 225/205/225\nf 448/437/448 449/438/449 450/439/450\nf 448/437/448 450/439/450 447/440/447\nf 423/412/423 426/417/426 451/441/451\nf 423/412/423 451/441/451 447/440/447\nf 75/56/75 451/441/451 426/417/426\nf 75/56/75 426/417/426 76/53/76\nf 78/55/78 94/72/94 62/39/62\nf 78/55/78 62/39/62 61/42/61\nf 286/272/286 86/63/86 85/62/85\nf 286/272/286 85/62/85 287/269/287\nf 95/73/95 87/65/87 209/191/209\nf 95/73/95 209/191/209 400/386/400\nf 237/218/237 452/442/452 428/418/428\nf 237/218/237 428/418/428 242/222/242\nf 190/174/190 193/173/193 194/175/194\nf 190/174/190 194/175/194 452/442/452\nf 237/218/237 236/217/236 190/174/190\nf 237/218/237 190/174/190 452/442/452\nf 79/60/79 82/59/82 354/337/354\nf 79/60/79 354/337/354 210/190/210\nf 286/272/286 279/261/279 96/74/96\nf 286/272/286 96/74/96 86/63/86\nf 430/419/430 417/406/417 416/408/416\nf 430/419/430 416/408/416 453/443/453\nf 338/321/338 295/281/295 298/280/298\nf 338/321/338 298/280/298 299/285/299\nf 57/38/57 60/37/60 455/444/455\nf 57/38/57 455/444/455 454/445/454\nf 212/192/212 456/446/456 457/447/457\nf 212/192/212 457/447/457 351/335/351\nf 83/64/83 355/340/355 356/339/356\nf 83/64/83 356/339/356 84/61/84\nf 142/123/142 141/122/141 375/361/375\nf 142/123/142 375/361/375 307/291/307\nf 401/387/401 142/123/142 307/291/307\nf 401/387/401 307/291/307 308/290/308\nf 459/448/459 257/237/257 256/240/256\nf 459/448/459 256/240/256 458/449/458\nf 228/210/228 264/246/264 258/238/258\nf 228/210/228 258/238/258 222/202/222\nf 256/240/256 260/242/260 460/450/460\nf 256/240/256 460/450/460 458/449/458\nf 460/450/460 260/242/260 29/244/29\nf 460/450/460 29/244/29 47/451/47\nf 263/247/263 265/249/265 261/241/261\nf 263/247/263 261/241/261 259/239/259\nf 461/452/461 462/453/462 189/169/189\nf 461/452/461 189/169/189 244/225/244\nf 227/207/227 316/299/316 463/454/463\nf 227/207/227 463/454/463 224/208/224\nf 465/455/465 466/456/466 410/400/410\nf 465/455/465 410/400/410 464/457/464\nf 90/67/90 386/372/386 385/371/385\nf 90/67/90 385/371/385 91/68/91\nf 233/213/233 361/345/361 348/331/348\nf 233/213/233 348/331/348 234/214/234\nf 235/215/235 234/214/234 363/347/363\nf 235/215/235 363/347/363 467/458/467\nf 338/321/338 337/320/337 72/49/72\nf 338/321/338 72/49/72 295/281/295\nf 338/321/338 299/285/299 302/284/302\nf 338/321/338 302/284/302 335/322/335\nf 468/459/468 469/460/469 470/461/470\nf 468/459/468 470/461/470 415/404/415\nf 347/334/347 471/462/471 472/463/472\nf 347/334/347 472/463/472 363/347/363\nf 471/462/471 347/334/347 350/333/350\nf 471/462/471 350/333/350 473/464/473\nf 465/455/465 475/465/475 476/466/476\nf 465/455/465 476/466/476 474/467/474\nf 384/370/384 110/88/110 478/468/478\nf 384/370/384 478/468/478 477/469/477\nf 414/403/414 479/470/479 412/402/412\nf 414/403/414 412/402/412 411/401/411\nf 288/270/288 287/269/287 412/402/412\nf 288/270/288 412/402/412 479/470/479\nf 85/62/85 84/61/84 90/67/90\nf 85/62/85 90/67/90 89/70/89\nf 386/372/386 356/339/356 113/94/113\nf 386/372/386 113/94/113 106/83/106\nf 232/216/232 358/341/358 357/342/357\nf 232/216/232 357/342/357 233/213/233\nf 297/279/297 296/278/296 181/161/181\nf 297/279/297 181/161/181 163/143/163\nf 419/409/419 337/320/337 336/319/336\nf 419/409/419 336/319/336 417/406/417\nf 49/30/49 52/29/52 127/104/127\nf 49/30/49 127/104/127 179/162/179\nf 26/359/26 25/393/25 333/316/333\nf 26/359/26 333/316/333 306/288/306\nf 371/354/371 370/357/370 162/142/162\nf 371/354/371 162/142/162 161/145/161\nf 258/238/258 257/237/257 223/203/223\nf 258/238/258 223/203/223 222/202/222\nf 257/237/257 459/448/459 480/471/480\nf 257/237/257 480/471/480 223/203/223\nf 211/195/211 214/194/214 225/205/225\nf 211/195/211 225/205/225 224/208/224\nf 316/299/316 481/472/481 314/296/314\nf 316/299/316 314/296/314 463/454/463\nf 171/152/171 169/149/169 168/148/168\nf 171/152/171 168/148/168 174/157/174\nf 273/256/273 199/180/199 172/153/172\nf 273/256/273 172/153/172 482/473/482\nf 168/148/168 226/206/226 225/205/225\nf 168/148/168 225/205/225 174/157/174\nf 245/226/245 246/227/246 111/89/111\nf 245/226/245 111/89/111 101/79/101\nf 114/91/114 112/90/112 111/89/111\nf 114/91/114 111/89/111 115/92/115\nf 210/190/210 354/337/354 98/75/98\nf 210/190/210 98/75/98 97/78/97\nf 431/421/431 358/341/358 232/216/232\nf 431/421/431 232/216/232 359/343/359\nf 235/215/235 360/344/360 359/343/359\nf 235/215/235 359/343/359 232/216/232\nf 360/344/360 235/215/235 467/458/467\nf 360/344/360 467/458/467 387/373/387\nf 81/58/81 282/265/282 483/474/483\nf 81/58/81 483/474/483 82/59/82\nf 485/475/485 486/476/486 487/477/487\nf 485/475/485 487/477/487 484/478/484\nf 489/479/489 68/45/68 294/277/294\nf 489/479/489 294/277/294 488/480/488\nf 491/481/491 454/445/454 455/444/455\nf 491/481/491 455/444/455 490/482/490\nf 154/134/154 370/357/370 373/356/373\nf 154/134/154 373/356/373 155/135/155\nf 491/481/491 322/308/322 325/307/325\nf 491/481/491 325/307/325 492/483/492\nf 491/481/491 490/482/490 493/484/493\nf 491/481/491 493/484/493 322/308/322\nf 436/425/436 435/428/435 446/435/446\nf 436/425/436 446/435/446 494/485/494\nf 495/486/495 496/487/496 438/427/438\nf 495/486/495 438/427/438 380/369/380\nf 496/487/496 497/488/497 435/428/435\nf 496/487/496 435/428/435 438/427/438\nf 331/313/331 330/312/330 498/489/498\nf 331/313/331 498/489/498 432/423/432\nf 499/490/499 346/329/346 432/423/432\nf 499/490/499 432/423/432 498/489/498\nf 380/369/380 383/368/383 500/491/500\nf 380/369/380 500/491/500 495/486/495\nf 501/492/501 328/314/328 331/313/331\nf 501/492/501 331/313/331 434/424/434\nf 499/490/499 344/327/344 343/326/343\nf 499/490/499 343/326/343 346/329/346\nf 492/483/492 502/493/502 454/445/454\nf 492/483/492 454/445/454 491/481/491\nf 454/445/454 502/493/502 487/477/487\nf 454/445/454 487/477/487 57/38/57\nf 486/476/486 58/35/58 57/38/57\nf 486/476/486 57/38/57 487/477/487\nf 58/35/58 486/476/486 503/494/503\nf 58/35/58 503/494/503 382/367/382\nf 383/368/383 504/495/504 505/496/505\nf 383/368/383 505/496/505 500/491/500\nf 447/440/447 450/439/450 420/413/420\nf 447/440/447 420/413/420 423/412/423\nf 329/311/329 328/314/328 445/434/445\nf 329/311/329 445/434/445 444/433/444\nf 450/439/450 449/438/449 506/497/506\nf 450/439/450 506/497/506 501/492/501\nf 507/498/507 508/499/508 451/441/451\nf 507/498/507 451/441/451 75/56/75\nf 99/76/99 104/82/104 202/182/202\nf 99/76/99 202/182/202 196/176/196\nf 509/500/509 208/189/208 201/184/201\nf 509/500/509 201/184/201 203/183/203\nf 201/184/201 204/188/204 195/177/195\nf 201/184/201 195/177/195 196/176/196\nf 462/453/462 510/501/510 186/170/186\nf 462/453/462 186/170/186 189/169/189\nf 203/183/203 186/170/186 510/501/510\nf 203/183/203 510/501/510 509/500/509\nf 148/128/148 319/301/319 341/325/341\nf 148/128/148 341/325/341 326/310/326\nf 326/310/326 341/325/341 340/324/340\nf 326/310/326 340/324/340 511/502/511\nf 123/100/123 511/502/511 340/324/340\nf 123/100/123 340/324/340 133/112/133\nf 71/48/71 49/30/49 181/161/181\nf 71/48/71 181/161/181 296/278/296\nf 154/134/154 388/374/388 162/142/162\nf 154/134/154 162/142/162 370/357/370\nf 155/135/155 373/356/373 303/289/303\nf 155/135/155 303/289/303 166/146/166\nf 166/146/166 303/289/303 306/288/306\nf 166/146/166 306/288/306 333/316/333\nf 512/503/512 320/303/320 289/271/289\nf 512/503/512 289/271/289 288/270/288\nf 479/470/479 414/403/414 514/504/514\nf 479/470/479 514/504/514 513/505/513\nf 414/403/414 413/405/413 475/465/475\nf 414/403/414 475/465/475 514/504/514\nf 513/505/513 512/503/512 288/270/288\nf 513/505/513 288/270/288 479/470/479\nf 191/171/191 103/81/103 353/338/353\nf 191/171/191 353/338/353 192/172/192\nf 332/315/332 104/82/104 103/81/103\nf 332/315/332 103/81/103 191/171/191\nf 82/59/82 483/474/483 353/338/353\nf 82/59/82 353/338/353 354/337/354\nf 83/64/83 86/63/86 96/74/96\nf 83/64/83 96/74/96 95/73/95\nf 83/64/83 95/73/95 400/386/400\nf 83/64/83 400/386/400 355/340/355\nf 355/340/355 400/386/400 112/90/112\nf 355/340/355 112/90/112 114/91/114\nf 144/124/144 135/114/135 136/113/136\nf 144/124/144 136/113/136 157/141/157\nf 298/280/298 365/350/365 300/282/300\nf 298/280/298 300/282/300 299/285/299\nf 298/280/298 297/279/297 388/374/388\nf 298/280/298 388/374/388 365/350/365\nf 367/351/367 143/125/143 164/144/164\nf 367/351/367 164/144/164 180/160/180\nf 515/506/515 516/507/516 219/201/219\nf 515/506/515 219/201/219 215/199/215\nf 254/235/254 217/197/217 216/196/216\nf 254/235/254 216/196/216 517/508/517\nf 398/383/398 364/348/364 399/385/399\nf 398/383/398 399/385/399 395/384/395\nf 398/383/398 397/382/397 517/508/517\nf 398/383/398 517/508/517 216/196/216\nf 518/509/518 519/510/519 246/227/246\nf 518/509/518 246/227/246 245/226/245\nf 319/301/319 150/130/150 149/132/149\nf 319/301/319 149/132/149 341/325/341\nf 429/420/429 419/409/419 417/406/417\nf 429/420/429 417/406/417 430/419/430\nf 33/395/33 46/511/46 404/389/404\nf 33/395/33 404/389/404 403/388/403\nf 403/388/403 402/391/402 309/294/309\nf 403/388/403 309/294/309 311/293/311\nf 393/379/393 520/512/520 521/513/521\nf 393/379/393 521/513/521 301/283/301\nf 522/514/522 520/512/520 393/379/393\nf 522/514/522 393/379/393 392/378/392\nf 302/284/302 301/283/301 521/513/521\nf 302/284/302 521/513/521 523/515/523\nf 302/284/302 523/515/523 524/516/524\nf 302/284/302 524/516/524 335/322/335\nf 321/304/321 456/446/456 318/302/318\nf 321/304/321 318/302/318 147/127/147\nf 456/446/456 321/304/321 525/517/525\nf 456/446/456 525/517/525 457/447/457\nf 410/400/410 409/399/409 526/518/526\nf 410/400/410 526/518/526 464/457/464\nf 410/400/410 466/456/466 350/333/350\nf 410/400/410 350/333/350 349/332/349\nf 456/446/456 212/192/212 211/195/211\nf 456/446/456 211/195/211 527/519/527\nf 211/195/211 224/208/224 463/454/463\nf 211/195/211 463/454/463 527/519/527\nf 407/397/407 377/364/377 267/251/267\nf 407/397/407 267/251/267 276/258/276\nf 378/363/378 377/364/377 406/396/406\nf 378/363/378 406/396/406 255/236/255\nf 175/155/175 214/194/214 213/193/213\nf 175/155/175 213/193/213 198/178/198\nf 386/372/386 90/67/90 84/61/84\nf 386/372/386 84/61/84 356/339/356\nf 409/399/409 362/346/362 351/335/351\nf 409/399/409 351/335/351 457/447/457\nf 85/62/85 89/70/89 412/402/412\nf 85/62/85 412/402/412 287/269/287\nf 361/345/361 233/213/233 357/342/357\nf 361/345/361 357/342/357 352/336/352\nf 116/93/116 431/421/431 359/343/359\nf 116/93/116 359/343/359 107/84/107\nf 116/93/116 107/84/107 106/83/106\nf 116/93/116 106/83/106 113/94/113\nf 352/336/352 351/335/351 362/346/362\nf 352/336/352 362/346/362 361/345/361\nf 513/505/513 514/504/514 464/457/464\nf 513/505/513 464/457/464 526/518/526\nf 526/518/526 409/399/409 457/447/457\nf 526/518/526 457/447/457 525/517/525\nf 514/504/514 475/465/475 465/455/465\nf 514/504/514 465/455/465 464/457/464\nf 358/341/358 431/421/431 247/228/247\nf 358/341/358 247/228/247 197/179/197\nf 176/156/176 482/473/482 172/153/172\nf 176/156/176 172/153/172 171/152/171\nf 396/381/396 395/384/395 250/234/250\nf 396/381/396 250/234/250 119/96/119\nf 395/384/395 399/385/399 251/231/251\nf 395/384/395 251/231/251 250/234/250\nf 291/274/291 81/58/81 80/57/80\nf 291/274/291 80/57/80 285/268/285\nf 284/267/284 292/275/292 291/274/291\nf 284/267/284 291/274/291 285/268/285\nf 528/520/528 327/309/327 326/310/326\nf 528/520/528 326/310/326 511/502/511\nf 126/103/126 125/106/125 152/133/152\nf 126/103/126 152/133/152 53/34/53\nf 152/133/152 125/106/125 133/112/133\nf 152/133/152 133/112/133 340/324/340\nf 127/104/127 126/103/126 339/323/339\nf 127/104/127 339/323/339 179/162/179\nf 56/33/56 135/114/135 367/351/367\nf 56/33/56 367/351/367 339/323/339\nf 124/101/124 123/100/123 133/112/133\nf 124/101/124 133/112/133 134/111/134\nf 143/125/143 367/351/367 135/114/135\nf 143/125/143 135/114/135 144/124/144\nf 164/144/164 143/125/143 132/109/132\nf 164/144/164 132/109/132 161/145/161\nf 401/387/401 131/108/131 130/107/130\nf 401/387/401 130/107/130 142/123/142\nf 292/275/292 528/520/528 122/99/122\nf 292/275/292 122/99/122 290/273/290\nf 61/42/61 507/498/507 75/56/75\nf 61/42/61 75/56/75 78/55/78\nf 320/303/320 512/503/512 525/517/525\nf 320/303/320 525/517/525 321/304/321\nf 512/503/512 513/505/513 526/518/526\nf 512/503/512 526/518/526 525/517/525\nf 123/100/123 122/99/122 528/520/528\nf 123/100/123 528/520/528 511/502/511\nf 262/245/262 529/521/529 229/209/229\nf 262/245/262 229/209/229 221/204/221\nf 316/299/316 315/298/315 368/352/368\nf 316/299/316 368/352/368 481/472/481\nf 516/507/516 315/298/315 230/211/230\nf 516/507/516 230/211/230 219/201/219\nf 515/506/515 530/522/530 369/353/369\nf 515/506/515 369/353/369 516/507/516\nf 530/522/530 515/506/515 223/203/223\nf 530/522/530 223/203/223 480/471/480\nf 215/199/215 218/198/218 223/203/223\nf 215/199/215 223/203/223 515/506/515\nf 459/448/459 458/449/458 374/360/374\nf 459/448/459 374/360/374 248/230/248\nf 458/449/458 460/450/460 334/317/334\nf 458/449/458 334/317/334 374/360/374\nf 334/317/334 460/450/460 47/451/47\nf 334/317/334 47/451/47 48/318/48\nf 459/448/459 248/230/248 249/229/249\nf 459/448/459 249/229/249 480/471/480\nf 253/233/253 120/97/120 119/96/119\nf 253/233/253 119/96/119 250/234/250\nf 394/380/394 170/150/170 169/149/169\nf 394/380/394 169/149/169 173/154/173\nf 519/510/519 482/473/482 176/156/176\nf 519/510/519 176/156/176 197/179/197\nf 518/509/518 273/256/273 482/473/482\nf 518/509/518 482/473/482 519/510/519\nf 531/523/531 274/257/274 273/256/273\nf 531/523/531 273/256/273 518/509/518\nf 532/524/532 390/376/390 274/257/274\nf 532/524/532 274/257/274 531/523/531\nf 343/326/343 243/224/243 241/221/241\nf 343/326/343 241/221/241 240/220/240\nf 188/168/188 238/219/238 244/225/244\nf 188/168/188 244/225/244 189/169/189\nf 187/167/187 332/315/332 236/217/236\nf 187/167/187 236/217/236 188/168/188\nf 447/440/447 451/441/451 508/499/508\nf 447/440/447 508/499/508 448/437/448\nf 162/142/162 388/374/388 297/279/297\nf 162/142/162 297/279/297 163/143/163\nf 392/378/392 402/391/402 405/390/405\nf 392/378/392 405/390/405 522/514/522\nf 533/525/533 413/405/413 415/404/415\nf 533/525/533 415/404/415 470/461/470\nf 534/526/534 65/46/65 68/45/68\nf 534/526/534 68/45/68 489/479/489\nf 502/493/502 535/527/535 484/478/484\nf 502/493/502 484/478/484 487/477/487\nf 503/494/503 536/528/536 537/529/537\nf 503/494/503 537/529/537 504/495/504\nf 492/483/492 538/530/538 535/527/535\nf 492/483/492 535/527/535 502/493/502\nf 492/483/492 325/307/325 66/43/66\nf 492/483/492 66/43/66 65/46/65\nf 504/495/504 537/529/537 539/531/539\nf 504/495/504 539/531/539 505/496/505\nf 239/223/239 424/414/424 345/330/345\nf 239/223/239 345/330/345 240/220/240\nf 59/36/59 58/35/58 382/367/382\nf 59/36/59 382/367/382 381/366/381\nf 432/423/432 433/422/433 434/424/434\nf 432/423/432 434/424/434 331/313/331\nf 437/426/437 436/425/436 440/429/440\nf 437/426/437 440/429/440 177/158/177\nf 381/366/381 437/426/437 177/158/177\nf 381/366/381 177/158/177 59/36/59\nf 449/438/449 441/431/441 494/485/494\nf 449/438/449 494/485/494 506/497/506\nf 450/439/450 501/492/501 434/424/434\nf 450/439/450 434/424/434 420/413/420\nf 382/367/382 503/494/503 504/495/504\nf 382/367/382 504/495/504 383/368/383\nf 501/492/501 506/497/506 445/434/445\nf 501/492/501 445/434/445 328/314/328\nf 536/528/536 503/494/503 486/476/486\nf 536/528/536 486/476/486 485/475/485\nf 313/297/313 150/130/150 319/301/319\nf 313/297/313 319/301/319 318/302/318\nf 327/309/327 284/267/284 281/263/281\nf 327/309/327 281/263/281 145/129/145\nf 483/474/483 93/71/93 192/172/192\nf 483/474/483 192/172/192 353/338/353\nf 483/474/483 282/265/282 94/72/94\nf 483/474/483 94/72/94 93/71/93\nf 422/411/422 425/415/425 428/418/428\nf 422/411/422 428/418/428 427/416/427\nf 421/410/421 433/422/433 345/330/345\nf 421/410/421 345/330/345 424/414/424\nf 463/454/463 314/296/314 313/297/313\nf 463/454/463 313/297/313 527/519/527\nf 315/298/315 516/507/516 369/353/369\nf 315/298/315 369/353/369 368/352/368\nf 314/296/314 481/472/481 312/295/312\nf 314/296/314 312/295/312 151/131/151\nf 368/352/368 317/300/317 312/295/312\nf 368/352/368 312/295/312 481/472/481\nf 369/353/369 530/522/530 159/139/159\nf 369/353/369 159/139/159 158/138/158\nf 480/471/480 249/229/249 159/139/159\nf 480/471/480 159/139/159 530/522/530\nf 262/245/262 406/396/406 408/398/408\nf 262/245/262 408/398/408 529/521/529\nf 398/383/398 216/196/216 220/200/220\nf 398/383/398 220/200/220 364/348/364\nf 541/532/541 542/533/542 543/534/543\nf 541/532/541 543/534/543 540/535/540\nf 545/536/545 543/534/543 542/533/542\nf 545/536/545 542/533/542 544/537/544\nf 547/538/547 545/536/545 544/537/544\nf 547/538/547 544/537/544 546/539/546\nf 549/540/549 547/538/547 546/539/546\nf 549/540/549 546/539/546 548/541/548\nf 551/542/551 549/540/549 548/541/548\nf 551/542/551 548/541/548 550/543/550\nf 553/544/553 551/542/551 550/543/550\nf 553/544/553 550/543/550 552/545/552\nf 555/546/555 553/544/553 552/545/552\nf 555/546/555 552/545/552 554/547/554\nf 557/548/557 558/549/558 559/550/559\nf 557/548/557 559/550/559 556/551/556\nf 561/552/561 557/548/557 556/551/556\nf 561/552/561 556/551/556 560/553/560\nf 563/554/563 546/539/546 544/537/544\nf 563/554/563 544/537/544 562/555/562\nf 564/556/564 548/541/548 546/539/546\nf 564/556/564 546/539/546 563/554/563\nf 565/557/565 550/543/550 548/541/548\nf 565/557/565 548/541/548 564/556/564\nf 566/558/566 552/545/552 550/543/550\nf 566/558/566 550/543/550 565/557/565\nf 552/545/552 566/558/566 567/559/567\nf 552/545/552 567/559/567 554/547/554\nf 559/550/559 568/560/568 569/561/569\nf 559/550/559 569/561/569 556/551/556\nf 570/562/570 560/553/560 556/551/556\nf 570/562/570 556/551/556 569/561/569\nf 571/563/571 572/564/572 560/553/560\nf 571/563/571 560/553/560 570/562/570\nf 574/565/574 540/535/540 575/566/575\nf 574/565/574 575/566/575 573/567/573\nf 577/568/577 543/534/543 545/536/545\nf 577/568/577 545/536/545 576/569/576\nf 545/536/545 547/538/547 578/570/578\nf 545/536/545 578/570/578 576/569/576\nf 579/571/579 578/570/578 547/538/547\nf 579/571/579 547/538/547 549/540/549\nf 580/572/580 579/571/579 551/542/551\nf 580/572/580 551/542/551 553/544/553\nf 580/572/580 553/544/553 555/546/555\nf 580/572/580 555/546/555 581/573/581\nf 558/549/558 557/548/557 583/574/583\nf 558/549/558 583/574/583 582/575/582\nf 561/552/561 584/576/584 583/574/583\nf 561/552/561 583/574/583 557/548/557\nf 561/552/561 572/564/572 585/577/585\nf 561/552/561 585/577/585 584/576/584\nf 571/563/571 586/578/586 585/577/585\nf 571/563/571 585/577/585 572/564/572\nf 544/537/544 542/533/542 541/532/541\nf 544/537/544 541/532/541 562/555/562\nf 574/565/574 588/579/588 589/580/589\nf 574/565/574 589/580/589 587/581/587\nf 574/565/574 573/567/573 590/582/590\nf 574/565/574 590/582/590 588/579/588\nf 590/582/590 573/567/573 575/566/575\nf 590/582/590 575/566/575 591/583/591\nf 575/566/575 540/535/540 543/534/543\nf 575/566/575 543/534/543 591/583/591\nf 564/556/564 592/584/592 566/558/566\nf 564/556/564 566/558/566 565/557/565\nf 592/584/592 593/585/593 567/559/567\nf 592/584/592 567/559/567 566/558/566\nf 568/560/568 559/550/559 554/547/554\nf 568/560/568 554/547/554 567/559/567\nf 554/547/554 559/550/559 558/549/558\nf 554/547/554 558/549/558 555/546/555\nf 582/575/582 581/573/581 555/546/555\nf 582/575/582 555/546/555 558/549/558\nf 592/584/592 564/556/564 563/554/563\nf 592/584/592 563/554/563 562/555/562\nf 589/580/589 568/560/568 567/559/567\nf 589/580/589 567/559/567 593/585/593\nf 540/535/540 574/565/574 587/581/587\nf 540/535/540 587/581/587 541/532/541\nf 571/563/571 570/562/570 590/582/590\nf 571/563/571 590/582/590 591/583/591\nf 589/580/589 588/579/588 569/561/569\nf 589/580/589 569/561/569 568/560/568\nf 543/534/543 577/568/577 594/586/594\nf 543/534/543 594/586/594 591/583/591\nf 594/586/594 586/578/586 571/563/571\nf 594/586/594 571/563/571 591/583/591\nf 596/587/596 581/573/581 582/575/582\nf 596/587/596 582/575/582 595/588/595\nf 596/587/596 597/589/597 580/572/580\nf 596/587/596 580/572/580 581/573/581\nf 583/574/583 490/482/490 455/444/455\nf 583/574/583 455/444/455 595/588/595\nf 583/574/583 584/576/584 493/484/493\nf 583/574/583 493/484/493 490/482/490\nf 597/589/597 508/499/508 579/571/579\nf 597/589/597 579/571/579 580/572/580\nf 442/432/442 448/437/448 508/499/508\nf 442/432/442 508/499/508 597/589/597\nf 60/37/60 178/159/178 595/588/595\nf 60/37/60 595/588/595 455/444/455\nf 178/159/178 439/430/439 596/587/596\nf 178/159/178 596/587/596 595/588/595\nf 577/568/577 64/41/64 185/166/185\nf 577/568/577 185/166/185 594/586/594\nf 586/578/586 184/165/184 376/362/376\nf 586/578/586 376/362/376 585/577/585\nf 590/582/590 570/562/570 569/561/569\nf 590/582/590 569/561/569 588/579/588\nf 61/42/61 576/569/576 578/570/578\nf 61/42/61 578/570/578 507/498/507\nf 585/577/585 376/362/376 493/484/493\nf 585/577/585 493/484/493 584/576/584\nf 453/443/453 598/590/598 73/52/73\nf 453/443/453 73/52/73 430/419/430\nf 519/510/519 197/179/197 247/228/247\nf 519/510/519 247/228/247 246/227/246\nf 281/263/281 280/262/280 146/126/146\nf 281/263/281 146/126/146 145/129/145\nf 64/41/64 63/40/63 121/102/121\nf 64/41/64 121/102/121 185/166/185\nf 284/267/284 327/309/327 528/520/528\nf 284/267/284 528/520/528 292/275/292\nf 290/273/290 122/99/122 121/102/121\nf 290/273/290 121/102/121 63/40/63\nf 280/262/280 289/271/289 320/303/320\nf 280/262/280 320/303/320 146/126/146\nf 184/165/184 586/578/586 594/586/594\nf 184/165/184 594/586/594 185/166/185\nf 253/233/253 378/363/378 117/98/117\nf 253/233/253 117/98/117 120/97/120\nf 249/229/249 140/121/140 160/140/160\nf 249/229/249 160/140/160 159/139/159\nf 129/110/129 160/140/160 140/121/140\nf 129/110/129 140/121/140 130/107/130\nf 161/145/161 132/109/132 131/108/131\nf 161/145/161 131/108/131 371/354/371\nf 313/297/313 318/302/318 456/446/456\nf 313/297/313 456/446/456 527/519/527\nf 492/483/492 65/46/65 534/526/534\nf 492/483/492 534/526/534 538/530/538\nf 441/431/441 449/438/449 448/437/448\nf 441/431/441 448/437/448 442/432/442\nf 443/436/443 446/435/446 435/428/435\nf 443/436/443 435/428/435 497/488/497\nf 446/435/446 445/434/445 506/497/506\nf 446/435/446 506/497/506 494/485/494\nf 441/431/441 440/429/440 436/425/436\nf 441/431/441 436/425/436 494/485/494\nf 596/587/596 439/430/439 442/432/442\nf 596/587/596 442/432/442 597/589/597\nf 577/568/577 576/569/576 61/42/61\nf 577/568/577 61/42/61 64/41/64\nf 238/219/238 237/218/237 242/222/242\nf 238/219/238 242/222/242 241/221/241\nf 194/175/194 76/53/76 426/417/426\nf 194/175/194 426/417/426 427/416/427\nf 452/442/452 194/175/194 427/416/427\nf 452/442/452 427/416/427 428/418/428\nf 461/452/461 244/225/244 243/224/243\nf 461/452/461 243/224/243 342/328/342\nf 508/499/508 507/498/507 578/570/578\nf 508/499/508 578/570/578 579/571/579\nf 245/226/245 207/187/207 531/523/531\nf 245/226/245 531/523/531 518/509/518\nf 206/186/206 532/524/532 531/523/531\nf 206/186/206 531/523/531 207/187/207\nf 32/9/32 31/12/31 600/591/600\nf 32/9/32 600/591/600 599/592/599\nf 601/593/601 600/591/600 36/13/36\nf 601/593/601 36/13/36 24/1/24\nf 602/594/602 601/593/601 24/1/24\nf 602/594/602 24/1/24 23/4/23\nf 40/17/40 602/594/602 23/4/23\nf 40/17/40 23/4/23 42/19/42\nf 44/22/44 604/595/604 605/596/605\nf 44/22/44 605/596/605 603/597/603\nf 39/16/39 603/597/603 602/594/602\nf 39/16/39 602/594/602 40/17/40\nf 601/593/601 606/598/606 607/599/607\nf 601/593/601 607/599/607 600/591/600\nf 468/459/468 608/600/608 609/601/609\nf 468/459/468 609/601/609 469/460/469\nf 477/469/477 609/601/609 608/600/608\nf 477/469/477 608/600/608 384/370/384\nf 610/602/610 611/603/611 612/604/612\nf 610/602/610 612/604/612 472/605/472\nf 610/602/610 472/605/472 471/606/471\nf 610/602/610 471/606/471 613/607/613\nf 476/608/476 614/609/614 615/610/615\nf 476/608/476 615/610/615 474/611/474\nf 478/468/478 110/88/110 109/87/109\nf 478/468/478 109/87/109 616/612/616\nf 466/456/466 465/455/465 474/467/474\nf 466/456/466 474/467/474 617/613/617\nf 466/456/466 617/613/617 473/464/473\nf 466/456/466 473/464/473 350/333/350\nf 614/609/614 533/614/533 470/615/470\nf 614/609/614 470/615/470 618/616/618\nf 475/465/475 413/405/413 533/525/533\nf 475/465/475 533/525/533 476/466/476\nf 618/616/618 469/617/469 609/618/609\nf 618/616/618 609/618/609 619/619/619\nf 619/619/619 609/618/609 477/620/477\nf 619/619/619 477/620/477 620/621/620\nf 387/373/387 621/622/621 616/612/616\nf 387/373/387 616/612/616 109/87/109\nf 616/623/616 622/624/622 620/621/620\nf 616/623/616 620/621/620 478/625/478\nf 473/626/473 617/627/617 615/610/615\nf 473/626/473 615/610/615 613/607/613\nf 621/628/621 623/629/623 622/624/622\nf 621/628/621 622/624/622 616/623/616\nf 624/630/624 612/604/612 611/603/611\nf 624/630/624 611/603/611 623/629/623\nf 49/30/49 71/48/71 70/47/70\nf 49/30/49 70/47/70 50/27/50\nf 336/319/336 335/322/335 524/516/524\nf 336/319/336 524/516/524 418/407/418\nf 598/590/598 293/276/293 67/44/67\nf 598/590/598 67/44/67 73/52/73\nf 50/27/50 70/47/70 429/420/429\nf 50/27/50 429/420/429 74/51/74\nf 322/308/322 493/484/493 376/362/376\nf 322/308/322 376/362/376 323/305/323\nf 589/580/589 593/585/593 592/584/592\nf 589/580/589 592/584/592 587/581/587\nf 396/381/396 119/96/119 118/95/118\nf 396/381/396 118/95/118 254/235/254\nf 517/508/517 397/382/397 396/381/396\nf 517/508/517 396/381/396 254/235/254\nf 28/5/28 27/8/27 625/631/625\nf 28/5/28 625/631/625 604/595/604\nf 600/591/600 607/599/607 626/632/626\nf 600/591/600 626/632/626 599/592/599\nf 607/599/607 627/633/627 628/634/628\nf 607/599/607 628/634/628 626/632/626\nf 604/595/604 625/631/625 628/634/628\nf 604/595/604 628/634/628 627/633/627\nf 630/635/630 631/636/631 632/637/632\nf 630/635/630 632/637/632 629/638/629\nf 634/639/634 635/640/635 636/641/636\nf 634/639/634 636/641/636 633/642/633\nf 638/643/638 639/644/639 640/645/640\nf 638/643/638 640/645/640 637/646/637\nf 641/647/641 642/648/642 637/646/637\nf 641/647/641 637/646/637 640/645/640\nf 644/649/644 645/650/645 646/651/646\nf 644/649/644 646/651/646 643/652/643\nf 631/636/631 642/648/642 648/653/648\nf 631/636/631 648/653/648 647/654/647\nf 650/655/650 651/656/651 652/657/652\nf 650/655/650 652/657/652 649/658/649\nf 643/652/643 646/651/646 654/659/654\nf 643/652/643 654/659/654 653/660/653\nf 654/659/654 651/656/651 650/655/650\nf 654/659/654 650/655/650 653/660/653\nf 655/661/655 656/662/656 657/663/657\nf 655/661/655 657/663/657 632/637/632\nf 657/663/657 659/664/659 660/665/660\nf 657/663/657 660/665/660 658/666/658\nf 661/667/661 659/664/659 657/663/657\nf 661/667/661 657/663/657 656/662/656\nf 631/636/631 647/654/647 655/661/655\nf 631/636/631 655/661/655 632/637/632\nf 637/646/637 642/648/642 631/636/631\nf 637/646/637 631/636/631 630/635/630\nf 640/645/640 650/655/650 649/658/649\nf 640/645/640 649/658/649 641/647/641\nf 652/657/652 662/668/662 641/647/641\nf 652/657/652 641/647/641 649/658/649\nf 648/653/648 642/648/642 641/647/641\nf 648/653/648 641/647/641 662/668/662\nf 663/669/663 664/670/664 537/529/537\nf 663/669/663 537/529/537 536/528/536\nf 666/671/666 640/645/640 639/644/639\nf 666/671/666 639/644/639 665/672/665\nf 666/671/666 665/672/665 636/641/636\nf 666/671/666 636/641/636 635/640/635\nf 667/673/667 539/531/539 537/529/537\nf 667/673/667 537/529/537 664/670/664\nf 634/639/634 644/649/644 643/652/643\nf 634/639/634 643/652/643 635/640/635\nf 653/660/653 650/655/650 640/645/640\nf 653/660/653 640/645/640 666/671/666\nf 666/671/666 635/640/635 643/652/643\nf 666/671/666 643/652/643 653/660/653\nf 669/674/669 644/649/644 634/639/634\nf 669/674/669 634/639/634 668/675/668\nf 638/643/638 637/646/637 630/635/630\nf 638/643/638 630/635/630 670/676/670\nf 645/650/645 644/649/644 669/674/669\nf 645/650/645 669/674/669 671/677/671\nf 638/643/638 670/676/670 485/475/485\nf 638/643/638 485/475/485 484/478/484\nf 672/678/672 633/642/633 489/479/489\nf 672/678/672 489/479/489 488/480/488\nf 632/637/632 657/663/657 658/666/658\nf 632/637/632 658/666/658 629/638/629\nf 670/676/670 663/669/663 536/528/536\nf 670/676/670 536/528/536 485/475/485\nf 633/642/633 636/641/636 534/526/534\nf 633/642/633 534/526/534 489/479/489\nf 484/478/484 535/527/535 639/644/639\nf 484/478/484 639/644/639 638/643/638\nf 629/638/629 658/666/658 664/670/664\nf 629/638/629 664/670/664 663/669/663\nf 665/672/665 639/644/639 535/527/535\nf 665/672/665 535/527/535 538/530/538\nf 636/641/636 665/672/665 538/530/538\nf 636/641/636 538/530/538 534/526/534\nf 660/665/660 667/673/667 664/670/664\nf 660/665/660 664/670/664 658/666/658\nf 668/675/668 634/639/634 633/642/633\nf 668/675/668 633/642/633 672/678/672\nf 630/635/630 629/638/629 663/669/663\nf 630/635/630 663/669/663 670/676/670\nf 1/679/1 661/667/661 656/662/656\nf 1/679/1 656/662/656 22/680/22\nf 20/681/20 647/654/647 648/653/648\nf 20/681/20 648/653/648 18/682/18\nf 647/654/647 20/681/20 21/683/21\nf 647/654/647 21/683/21 655/661/655\nf 15/684/15 646/651/646 645/650/645\nf 15/684/15 645/650/645 13/685/13\nf 19/686/19 651/656/651 654/659/654\nf 19/686/19 654/659/654 14/687/14\nf 648/653/648 662/668/662 16/688/16\nf 648/653/648 16/688/16 18/682/18\nf 17/689/17 652/657/652 651/656/651\nf 17/689/17 651/656/651 19/686/19\nf 21/683/21 22/680/22 656/662/656\nf 21/683/21 656/662/656 655/661/655\nf 13/685/13 645/650/645 671/677/671\nf 13/685/13 671/677/671 2/690/2\nf 646/651/646 15/684/15 14/687/14\nf 646/651/646 14/687/14 654/659/654\nf 17/689/17 16/688/16 662/668/662\nf 17/689/17 662/668/662 652/657/652\nf 608/600/608 91/68/91 385/371/385\nf 608/600/608 385/371/385 384/370/384\nf 304/286/304 372/355/372 401/387/401\nf 304/286/304 401/387/401 308/290/308\nf 468/459/468 415/404/415 411/401/411\nf 468/459/468 411/401/411 92/69/92\nf 602/594/602 603/597/603 606/598/606\nf 602/594/602 606/598/606 601/593/601\nf 608/600/608 468/459/468 92/69/92\nf 608/600/608 92/69/92 91/68/91\nf 305/287/305 304/286/304 308/290/308\nf 305/287/305 308/290/308 137/116/137\nf 139/119/139 138/117/138 307/291/307\nf 139/119/139 307/291/307 375/361/375\nf 674/691/674 675/692/675 676/693/676\nf 674/691/674 676/693/676 673/694/673\nf 678/695/678 27/8/27 679/696/679\nf 678/695/678 679/696/679 677/697/677\nf 681/698/681 682/699/682 683/700/683\nf 681/698/681 683/700/683 680/701/680\nf 684/702/684 685/703/685 683/700/683\nf 684/702/684 683/700/683 682/699/682\nf 684/702/684 674/691/674 673/694/673\nf 684/702/684 673/694/673 685/703/685\nf 687/704/687 688/705/688 689/706/689\nf 687/704/687 689/706/689 686/707/686\nf 690/708/690 691/709/691 676/693/676\nf 690/708/690 676/693/676 675/692/675\nf 689/706/689 688/705/688 691/709/691\nf 689/706/689 691/709/691 690/708/690\nf 687/704/687 686/707/686 693/710/693\nf 687/704/687 693/710/693 692/711/692\nf 681/698/681 680/701/680 46/24/46\nf 681/698/681 46/24/46 45/23/45\nf 678/695/678 694/712/694 695/713/695\nf 678/695/678 695/713/695 693/710/693\nf 697/714/697 698/715/698 699/716/699\nf 697/714/697 699/716/699 696/717/696\nf 701/718/701 702/719/702 703/720/703\nf 701/718/701 703/720/703 700/721/700\nf 705/722/705 706/723/706 707/724/707\nf 705/722/705 707/724/707 704/725/704\nf 709/726/709 710/727/710 711/728/711\nf 709/726/709 711/728/711 708/729/708\nf 713/730/713 714/731/714 715/732/715\nf 713/730/713 715/732/715 712/733/712\nf 717/734/717 718/735/718 719/736/719\nf 717/734/717 719/736/719 716/737/716\nf 712/733/712 720/738/720 721/739/721\nf 712/733/712 721/739/721 713/730/713\nf 713/730/713 721/739/721 697/714/697\nf 713/730/713 697/714/697 696/717/696\nf 723/740/723 724/741/724 725/742/725\nf 723/740/723 725/742/725 722/743/722\nf 727/744/727 728/745/728 729/746/729\nf 727/744/727 729/746/729 726/747/726\nf 731/748/731 732/749/732 733/750/733\nf 731/748/731 733/750/733 730/751/730\nf 735/752/735 728/745/728 727/744/727\nf 735/752/735 727/744/727 734/753/734\nf 737/754/737 738/755/738 739/756/739\nf 737/754/737 739/756/739 736/757/736\nf 741/758/741 722/743/722 725/742/725\nf 741/758/741 725/742/725 740/759/740\nf 735/752/735 734/753/734 743/760/743\nf 735/752/735 743/760/743 742/761/742\nf 745/762/745 746/763/746 747/764/747\nf 745/762/745 747/764/747 744/765/744\nf 747/764/747 746/763/746 749/766/749\nf 747/764/747 749/766/749 748/767/748\nf 745/762/745 744/765/744 751/768/751\nf 745/762/745 751/768/751 750/769/750\nf 753/770/753 754/771/754 755/772/755\nf 753/770/753 755/772/755 752/773/752\nf 757/774/757 755/772/755 754/771/754\nf 757/774/757 754/771/754 756/775/756\nf 748/767/748 749/766/749 759/776/759\nf 748/767/748 759/776/759 758/777/758\nf 761/778/761 762/779/762 763/780/763\nf 761/778/761 763/780/763 760/781/760\nf 765/782/765 766/783/766 767/784/767\nf 765/782/765 767/784/767 764/785/764\nf 769/786/769 770/787/770 771/788/771\nf 769/786/769 771/788/771 768/789/768\nf 773/790/773 774/791/774 775/792/775\nf 773/790/773 775/792/775 772/793/772\nf 777/794/777 778/795/778 779/796/779\nf 777/794/777 779/796/779 776/797/776\nf 774/791/774 780/798/780 781/799/781\nf 774/791/774 781/799/781 775/792/775\nf 703/720/703 782/800/782 783/801/783\nf 703/720/703 783/801/783 700/721/700\nf 688/802/688 687/803/687 785/804/785\nf 688/802/688 785/804/785 784/805/784\nf 786/806/786 785/804/785 687/803/687\nf 786/806/786 687/803/687 692/807/692\nf 788/808/788 777/794/777 789/809/789\nf 788/808/788 789/809/789 787/810/787\nf 790/811/790 791/812/791 779/796/779\nf 790/811/790 779/796/779 778/795/778\nf 793/813/793 794/814/794 795/815/795\nf 793/813/793 795/815/795 792/816/792\nf 797/817/797 798/818/798 701/718/701\nf 797/817/797 701/718/701 796/819/796\nf 701/718/701 798/818/798 799/820/799\nf 701/718/701 799/820/799 702/719/702\nf 801/821/801 802/822/802 803/823/803\nf 801/821/801 803/823/803 800/824/800\nf 805/825/805 806/826/806 807/827/807\nf 805/825/805 807/827/807 804/828/804\nf 809/829/809 810/830/810 811/831/811\nf 809/829/809 811/831/811 808/832/808\nf 778/795/778 807/827/807 806/826/806\nf 778/795/778 806/826/806 790/811/790\nf 803/823/803 812/833/812 813/834/813\nf 803/823/803 813/834/813 800/824/800\nf 815/835/815 816/836/816 817/837/817\nf 815/835/815 817/837/817 814/838/814\nf 819/839/819 814/838/814 820/840/820\nf 819/839/819 820/840/820 818/841/818\nf 822/842/822 823/843/823 819/839/819\nf 822/842/822 819/839/819 821/844/821\nf 704/725/704 707/724/707 825/845/825\nf 704/725/704 825/845/825 824/846/824\nf 827/847/827 828/848/828 698/715/698\nf 827/847/827 698/715/698 826/849/826\nf 772/793/772 775/792/775 829/850/829\nf 772/793/772 829/850/829 699/716/699\nf 781/799/781 771/788/771 831/851/831\nf 781/799/781 831/851/831 830/852/830\nf 832/853/832 831/851/831 771/788/771\nf 832/853/832 771/788/771 770/787/770\nf 834/854/834 835/855/835 836/856/836\nf 834/854/834 836/856/836 833/857/833\nf 838/858/838 839/859/839 840/860/840\nf 838/858/838 840/860/840 837/861/837\nf 723/740/723 722/743/722 840/860/840\nf 723/740/723 840/860/840 841/862/841\nf 747/764/747 842/863/842 843/864/843\nf 747/764/747 843/864/843 744/765/744\nf 821/844/821 844/865/844 845/866/845\nf 821/844/821 845/866/845 822/842/822\nf 847/867/847 818/841/818 820/840/820\nf 847/867/847 820/840/820 846/868/846\nf 843/864/843 849/869/849 850/870/850\nf 843/864/843 850/870/850 848/871/848\nf 205/185/205 851/872/851 852/873/852\nf 205/185/205 852/873/852 206/186/206\nf 208/189/208 849/869/849 851/872/851\nf 208/189/208 851/872/851 205/185/205\nf 853/874/853 854/875/854 749/766/749\nf 853/874/853 749/766/749 746/763/746\nf 728/745/728 735/752/735 854/875/854\nf 728/745/728 854/875/854 853/874/853\nf 856/876/856 857/877/857 858/878/858\nf 856/876/856 858/878/858 855/879/855\nf 860/880/860 861/881/861 862/882/862\nf 860/880/860 862/882/862 859/883/859\nf 863/884/863 864/885/864 861/881/861\nf 863/884/863 861/881/861 860/880/860\nf 866/886/866 867/887/867 862/882/862\nf 866/886/866 862/882/862 865/888/865\nf 869/889/869 870/890/870 871/891/871\nf 869/889/869 871/891/871 868/892/868\nf 866/886/866 228/210/228 229/209/229\nf 866/886/866 229/209/229 867/887/867\nf 873/893/873 864/885/864 863/884/863\nf 873/893/873 863/884/863 872/894/872\nf 871/891/871 873/893/873 872/894/872\nf 871/891/871 872/894/872 868/892/868\nf 875/895/875 876/896/876 877/897/877\nf 875/895/875 877/897/877 874/898/874\nf 835/855/835 834/854/834 848/871/848\nf 835/855/835 848/871/848 850/870/850\nf 879/899/879 833/857/833 880/900/880\nf 879/899/879 880/900/880 878/901/878\nf 882/902/882 883/903/883 884/904/884\nf 882/902/882 884/904/884 881/905/881\nf 881/905/881 880/900/880 886/906/886\nf 881/905/881 886/906/886 885/907/885\nf 887/908/887 842/863/842 747/764/747\nf 887/908/887 747/764/747 748/767/748\nf 842/863/842 887/908/887 852/873/852\nf 842/863/842 852/873/852 851/872/851\nf 758/777/758 760/781/760 889/909/889\nf 758/777/758 889/909/889 888/910/888\nf 787/810/787 890/911/890 891/912/891\nf 787/810/787 891/912/891 788/808/788\nf 893/913/893 894/914/894 895/915/895\nf 893/913/893 895/915/895 892/916/892\nf 896/917/896 859/883/859 897/918/897\nf 896/917/896 897/918/897 765/782/765\nf 899/919/899 900/920/900 901/921/901\nf 899/919/899 901/921/901 898/922/898\nf 900/920/900 902/923/902 903/924/903\nf 900/920/900 903/924/903 901/921/901\nf 902/923/902 677/925/677 679/926/679\nf 902/923/902 679/926/679 903/924/903\nf 862/882/862 867/887/867 904/927/904\nf 862/882/862 904/927/904 859/883/859\nf 901/921/901 263/247/263 264/246/264\nf 901/921/901 264/246/264 898/922/898\nf 266/248/266 265/249/265 903/924/903\nf 266/248/266 903/924/903 679/926/679\nf 895/915/895 905/928/905 906/929/906\nf 895/915/895 906/929/906 892/916/892\nf 907/930/907 908/931/908 909/932/909\nf 907/930/907 909/932/909 846/868/846\nf 847/867/847 846/868/846 909/932/909\nf 847/867/847 909/932/909 910/933/910\nf 847/867/847 910/933/910 912/934/912\nf 847/867/847 912/934/912 911/935/911\nf 276/258/276 275/259/275 906/929/906\nf 276/258/276 906/929/906 905/928/905\nf 275/259/275 277/260/277 908/931/908\nf 275/259/275 908/931/908 906/929/906\nf 741/758/741 837/861/837 840/860/840\nf 741/758/741 840/860/840 722/743/722\nf 914/936/914 915/937/915 916/938/916\nf 914/936/914 916/938/916 913/939/913\nf 915/937/915 914/936/914 743/760/743\nf 915/937/915 743/760/743 734/753/734\nf 918/940/918 740/759/740 709/726/709\nf 918/940/918 709/726/709 917/941/917\nf 916/938/916 915/937/915 920/942/920\nf 916/938/916 920/942/920 919/943/919\nf 922/944/922 923/945/923 924/946/924\nf 922/944/922 924/946/924 921/947/921\nf 708/729/708 925/948/925 917/941/917\nf 708/729/708 917/941/917 709/726/709\nf 917/941/917 925/948/925 927/949/927\nf 917/941/917 927/949/927 926/950/926\nf 293/276/293 712/733/712 715/732/715\nf 293/276/293 715/732/715 294/277/294\nf 929/951/929 930/952/930 931/953/931\nf 929/951/929 931/953/931 928/954/928\nf 933/955/933 934/956/934 935/957/935\nf 933/955/933 935/957/935 932/958/932\nf 937/959/937 938/960/938 939/961/939\nf 937/959/937 939/961/939 936/962/936\nf 785/804/785 940/963/940 941/964/941\nf 785/804/785 941/964/941 784/805/784\nf 812/833/812 943/965/943 944/966/944\nf 812/833/812 944/966/944 942/967/942\nf 945/968/945 796/819/796 701/718/701\nf 945/968/945 701/718/701 700/721/700\nf 946/969/946 947/970/947 797/817/797\nf 946/969/946 797/817/797 796/819/796\nf 949/971/949 873/893/873 871/891/871\nf 949/971/949 871/891/871 948/972/948\nf 783/801/783 806/826/806 805/825/805\nf 783/801/783 805/825/805 950/973/950\nf 951/974/951 952/975/952 792/816/792\nf 951/974/951 792/816/792 795/815/795\nf 954/976/954 793/813/793 792/816/792\nf 954/976/954 792/816/792 953/977/953\nf 956/978/956 957/979/957 958/980/958\nf 956/978/956 958/980/958 955/981/955\nf 727/744/727 920/942/920 915/937/915\nf 727/744/727 915/937/915 734/753/734\nf 959/982/959 960/983/960 795/815/795\nf 959/982/959 795/815/795 794/814/794\nf 914/936/914 913/939/913 924/946/924\nf 914/936/914 924/946/924 923/945/923\nf 329/984/329 961/985/961 962/986/962\nf 329/984/329 962/986/962 330/987/330\nf 834/854/834 963/988/963 751/768/751\nf 834/854/834 751/768/751 848/871/848\nf 879/899/879 839/859/839 838/858/838\nf 879/899/879 838/858/838 963/988/963\nf 812/833/812 942/967/942 964/989/964\nf 812/833/812 964/989/964 813/834/813\nf 786/806/786 692/807/692 695/990/695\nf 786/806/786 695/990/695 965/991/965\nf 967/992/967 968/993/968 969/994/969\nf 967/992/967 969/994/969 966/995/966\nf 696/717/696 699/716/699 829/850/829\nf 696/717/696 829/850/829 955/981/955\nf 970/996/970 703/720/703 702/719/702\nf 970/996/970 702/719/702 773/790/773\nf 972/997/972 799/820/799 798/818/798\nf 972/997/972 798/818/798 971/998/971\nf 885/907/885 342/999/342 344/1000/344\nf 885/907/885 344/1000/344 973/1001/973\nf 974/1002/974 975/1003/975 882/902/882\nf 974/1002/974 882/902/882 973/1001/973\nf 977/1004/977 978/1005/978 979/1006/979\nf 977/1004/977 979/1006/979 976/1007/976\nf 981/1008/981 856/876/856 855/879/855\nf 981/1008/981 855/879/855 980/1009/980\nf 775/792/775 781/799/781 830/852/830\nf 775/792/775 830/852/830 829/850/829\nf 750/769/750 982/1010/982 983/1011/983\nf 750/769/750 983/1011/983 745/762/745\nf 761/778/761 984/1012/984 985/1013/985\nf 761/778/761 985/1013/985 762/779/762\nf 986/1014/986 987/1015/987 845/866/845\nf 986/1014/986 845/866/845 844/865/844\nf 752/773/752 755/772/755 989/1016/989\nf 752/773/752 989/1016/989 988/1017/988\nf 977/1004/977 976/1007/976 991/1018/991\nf 977/1004/977 991/1018/991 990/1019/990\nf 978/1005/978 977/1004/977 874/898/874\nf 978/1005/978 874/898/874 992/1020/992\nf 863/884/863 993/1021/993 816/836/816\nf 863/884/863 816/836/816 872/894/872\nf 802/822/802 995/1022/995 933/955/933\nf 802/822/802 933/955/933 994/1023/994\nf 930/952/930 929/951/929 716/737/716\nf 930/952/930 716/737/716 719/736/719\nf 828/848/828 827/847/827 996/1024/996\nf 828/848/828 996/1024/996 970/996/970\nf 998/1025/998 950/973/950 805/825/805\nf 998/1025/998 805/825/805 997/1026/997\nf 950/973/950 945/968/945 700/721/700\nf 950/973/950 700/721/700 783/801/783\nf 1000/1027/1000 1001/1028/1001 1002/1029/1002\nf 1000/1027/1000 1002/1029/1002 999/1030/999\nf 691/1031/691 936/962/936 939/961/939\nf 691/1031/691 939/961/939 676/1032/676\nf 936/962/936 691/1031/691 688/802/688\nf 936/962/936 688/802/688 784/805/784\nf 890/911/890 787/810/787 1004/1033/1004\nf 890/911/890 1004/1033/1004 1003/1034/1003\nf 713/730/713 696/717/696 955/981/955\nf 713/730/713 955/981/955 958/980/958\nf 830/852/830 831/851/831 1005/1035/1005\nf 830/852/830 1005/1035/1005 956/978/956\nf 1006/1036/1006 1007/1037/1007 905/928/905\nf 1006/1036/1006 905/928/905 895/915/895\nf 908/931/908 277/260/277 379/365/379\nf 908/931/908 379/365/379 909/932/909\nf 1009/1038/1009 1010/1039/1010 1011/1040/1011\nf 1009/1038/1009 1011/1040/1011 1008/1041/1008\nf 1013/1042/1013 756/775/756 754/771/754\nf 1013/1042/1013 754/771/754 1012/1043/1012\nf 754/771/754 753/770/753 1014/1044/1014\nf 754/771/754 1014/1044/1014 1012/1043/1012\nf 989/1016/989 755/772/755 757/774/757\nf 989/1016/989 757/774/757 1015/1045/1015\nf 826/849/826 808/832/808 811/831/811\nf 826/849/826 811/831/811 827/847/827\nf 995/1022/995 802/822/802 801/821/801\nf 995/1022/995 801/821/801 1016/1046/1016\nf 815/835/815 868/892/868 872/894/872\nf 815/835/815 872/894/872 816/836/816\nf 726/747/726 918/940/918 917/941/917\nf 726/747/726 917/941/917 926/950/926\nf 910/933/910 909/932/909 379/365/379\nf 910/933/910 379/365/379 389/375/389\nf 912/934/912 910/933/910 389/375/389\nf 912/934/912 389/375/389 390/376/390\nf 786/806/786 965/991/965 1003/1034/1003\nf 786/806/786 1003/1034/1003 1004/1033/1004\nf 1017/1047/1017 803/823/803 802/822/802\nf 1017/1047/1017 802/822/802 994/1023/994\nf 1019/1048/1019 1017/1047/1017 994/1023/994\nf 1019/1048/1019 994/1023/994 1018/1049/1018\nf 820/840/820 1020/1050/1020 907/930/907\nf 820/840/820 907/930/907 846/868/846\nf 932/958/932 1018/1049/1018 994/1023/994\nf 932/958/932 994/1023/994 933/955/933\nf 1022/1051/1022 1023/1052/1023 1024/1053/1024\nf 1022/1051/1022 1024/1053/1024 1021/1054/1021\nf 1025/1055/1025 817/837/817 816/836/816\nf 1025/1055/1025 816/836/816 993/1021/993\nf 1020/1050/1020 817/837/817 1025/1055/1025\nf 1020/1050/1020 1025/1055/1025 893/913/893\nf 907/930/907 1020/1050/1020 893/913/893\nf 907/930/907 893/913/893 892/916/892\nf 749/766/749 854/875/854 1026/1056/1026\nf 749/766/749 1026/1056/1026 759/776/759\nf 776/797/776 1000/1027/1000 999/1030/999\nf 776/797/776 999/1030/999 1027/1057/1027\nf 1017/1047/1017 943/965/943 812/833/812\nf 1017/1047/1017 812/833/812 803/823/803\nf 1028/1058/1028 1029/1059/1029 405/390/405\nf 1028/1058/1028 405/390/405 404/389/404\nf 1029/1059/1029 943/965/943 1017/1047/1017\nf 1029/1059/1029 1017/1047/1017 1019/1048/1019\nf 685/1060/685 673/1061/673 964/989/964\nf 685/1060/685 964/989/964 942/967/942\nf 685/1060/685 942/967/942 944/966/944\nf 685/1060/685 944/966/944 683/1062/683\nf 683/1062/683 944/966/944 1028/1058/1028\nf 683/1062/683 1028/1058/1028 680/1063/680\nf 1030/1064/1030 897/918/897 859/883/859\nf 1030/1064/1030 859/883/859 904/927/904\nf 1007/1037/1007 1030/1064/1030 408/398/408\nf 1007/1037/1007 408/398/408 407/397/407\nf 766/783/766 765/782/765 897/918/897\nf 766/783/766 897/918/897 1006/1036/1006\nf 907/930/907 892/916/892 906/929/906\nf 907/930/907 906/929/906 908/931/908\nf 937/959/937 999/1030/999 1002/1029/1002\nf 937/959/937 1002/1029/1002 938/960/938\nf 991/1018/991 976/1007/976 1032/1065/1032\nf 991/1018/991 1032/1065/1032 1031/1066/1031\nf 1034/1067/1034 739/756/739 738/755/738\nf 1034/1067/1034 738/755/738 1033/1068/1033\nf 1035/1069/1035 1036/1070/1036 1037/1071/1037\nf 1035/1069/1035 1037/1071/1037 1034/1067/1034\nf 1038/1072/1038 416/408/416 418/407/418\nf 1038/1072/1038 418/407/418 967/992/967\nf 966/995/966 719/736/719 718/735/718\nf 966/995/966 718/735/718 1039/1073/1039\nf 1041/1074/1041 1042/1075/1042 1043/1076/1043\nf 1041/1074/1041 1043/1076/1043 1040/1077/1040\nf 1041/1074/1041 1040/1077/1040 1045/1078/1045\nf 1041/1074/1041 1045/1078/1045 1044/1079/1044\nf 1043/1076/1043 1046/1080/1046 1047/1081/1047\nf 1043/1076/1043 1047/1081/1047 1040/1077/1040\nf 883/903/883 1045/1078/1045 1048/1082/1048\nf 883/903/883 1048/1082/1048 884/904/884\nf 1049/1083/1049 1050/1084/1050 721/739/721\nf 1049/1083/1049 721/739/721 720/738/720\nf 717/734/717 1050/1084/1050 1039/1073/1039\nf 717/734/717 1039/1073/1039 718/735/718\nf 889/909/889 760/781/760 763/780/763\nf 889/909/889 763/780/763 1051/1085/1051\nf 974/1002/974 1052/1086/1052 1053/1087/1053\nf 974/1002/974 1053/1087/1053 975/1003/975\nf 1053/1087/1053 1054/1088/1054 1042/1075/1042\nf 1053/1087/1053 1042/1075/1042 1041/1074/1041\nf 1056/1089/1056 1057/1090/1057 1058/1091/1058\nf 1056/1089/1056 1058/1091/1058 1055/1092/1055\nf 1055/1092/1055 1058/1091/1058 1010/1039/1010\nf 1055/1092/1055 1010/1039/1010 1009/1038/1009\nf 825/845/825 1059/1093/1059 1060/1094/1060\nf 825/845/825 1060/1094/1060 824/846/824\nf 1060/1094/1060 1059/1093/1059 1062/1095/1062\nf 1060/1094/1060 1062/1095/1062 1061/1096/1061\nf 444/1097/444 443/1098/443 1064/1099/1064\nf 444/1097/444 1064/1099/1064 1063/1100/1063\nf 955/981/955 829/850/829 830/852/830\nf 955/981/955 830/852/830 956/978/956\nf 855/879/855 845/866/845 987/1015/987\nf 855/879/855 987/1015/987 980/1009/980\nf 858/878/858 869/889/869 823/843/823\nf 858/878/858 823/843/823 822/842/822\nf 1066/1101/1066 1067/1102/1067 1068/1103/1068\nf 1066/1101/1066 1068/1103/1068 1065/1104/1065\nf 1043/1076/1043 1067/1102/1067 1069/1105/1069\nf 1043/1076/1043 1069/1105/1069 1046/1080/1046\nf 724/741/724 723/740/723 1046/1080/1046\nf 724/741/724 1046/1080/1046 1069/1105/1069\nf 725/742/725 710/727/710 709/726/709\nf 725/742/725 709/726/709 740/759/740\nf 923/945/923 922/944/922 730/751/730\nf 923/945/923 730/751/730 733/750/733\nf 742/761/742 1026/1056/1026 854/875/854\nf 742/761/742 854/875/854 735/752/735\nf 878/901/878 884/904/884 1048/1082/1048\nf 878/901/878 1048/1082/1048 1070/1106/1070\nf 839/859/839 1070/1106/1070 841/862/841\nf 839/859/839 841/862/841 840/860/840\nf 878/901/878 1070/1106/1070 839/859/839\nf 878/901/878 839/859/839 879/899/879\nf 728/745/728 853/874/853 983/1011/983\nf 728/745/728 983/1011/983 729/746/729\nf 923/945/923 733/750/733 743/760/743\nf 923/945/923 743/760/743 914/936/914\nf 1049/1083/1049 453/443/453 416/408/416\nf 1049/1083/1049 416/408/416 1038/1072/1038\nf 969/994/969 934/956/934 931/953/931\nf 969/994/969 931/953/931 930/952/930\nf 706/723/706 1071/1107/1071 1072/1108/1072\nf 706/723/706 1072/1108/1072 707/724/707\nf 856/876/856 981/1008/981 1074/1109/1074\nf 856/876/856 1074/1109/1074 1073/1110/1073\nf 732/749/732 731/748/731 985/1013/985\nf 732/749/732 985/1013/985 984/1012/984\nf 789/809/789 940/963/940 1004/1033/1004\nf 789/809/789 1004/1033/1004 787/810/787\nf 1027/1057/1027 941/964/941 940/963/940\nf 1027/1057/1027 940/963/940 789/809/789\nf 1075/1111/1075 1076/1112/1076 900/920/900\nf 1075/1111/1075 900/920/900 899/919/899\nf 228/210/228 866/886/866 898/922/898\nf 228/210/228 898/922/898 264/246/264\nf 900/920/900 1076/1112/1076 1077/1113/1077\nf 900/920/900 1077/1113/1077 902/923/902\nf 1077/1113/1077 694/1114/694 677/925/677\nf 1077/1113/1077 677/925/677 902/923/902\nf 263/247/263 901/921/901 903/924/903\nf 263/247/263 903/924/903 265/249/265\nf 461/1115/461 886/906/886 836/856/836\nf 461/1115/461 836/856/836 462/1116/462\nf 871/891/871 870/890/870 1078/1117/1078\nf 871/891/871 1078/1117/1078 948/972/948\nf 1080/1118/1080 1081/1119/1081 1032/1065/1032\nf 1080/1118/1080 1032/1065/1032 1079/1120/1079\nf 737/754/737 736/757/736 1012/1043/1012\nf 737/754/737 1012/1043/1012 1014/1044/1014\nf 875/895/875 874/898/874 977/1004/977\nf 875/895/875 977/1004/977 990/1019/990\nf 877/897/877 1082/1121/1082 992/1020/992\nf 877/897/877 992/1020/992 874/898/874\nf 969/994/969 930/952/930 719/736/719\nf 969/994/969 719/736/719 966/995/966\nf 969/994/969 968/993/968 935/957/935\nf 969/994/969 935/957/935 934/956/934\nf 1084/1122/1084 1037/1071/1037 1085/1123/1085\nf 1084/1122/1084 1085/1123/1085 1083/1124/1083\nf 978/1005/978 992/1020/992 1087/1125/1087\nf 978/1005/978 1087/1125/1087 1086/1126/1086\nf 1086/1126/1086 1088/1127/1088 979/1006/979\nf 1086/1126/1086 979/1006/979 978/1005/978\nf 1080/1118/1080 1090/1128/1090 1091/1129/1091\nf 1080/1118/1080 1091/1129/1091 1089/1130/1089\nf 1013/1042/1013 1092/1131/1092 1093/1132/1093\nf 1013/1042/1013 1093/1132/1093 756/775/756\nf 1035/1069/1035 1034/1067/1034 1033/1068/1033\nf 1035/1069/1035 1033/1068/1033 1094/1133/1094\nf 921/947/921 1094/1133/1094 1033/1068/1033\nf 921/947/921 1033/1068/1033 922/944/922\nf 730/751/730 738/755/738 737/754/737\nf 730/751/730 737/754/737 731/748/731\nf 1014/1044/1014 753/770/753 762/779/762\nf 1014/1044/1014 762/779/762 985/1013/985\nf 876/896/876 875/895/875 987/1015/987\nf 876/896/876 987/1015/987 986/1014/986\nf 928/954/928 808/832/808 826/849/826\nf 928/954/928 826/849/826 929/951/929\nf 1039/1073/1039 1038/1072/1038 967/992/967\nf 1039/1073/1039 967/992/967 966/995/966\nf 698/715/698 828/848/828 772/793/772\nf 698/715/698 772/793/772 699/716/699\nf 676/1032/676 939/961/939 964/989/964\nf 676/1032/676 964/989/964 673/1061/673\nf 1000/1027/1000 810/830/810 809/829/809\nf 1000/1027/1000 809/829/809 1001/1028/1001\nf 898/922/898 866/886/866 865/888/865\nf 898/922/898 865/888/865 899/919/899\nf 899/919/899 865/888/865 1095/1134/1095\nf 899/919/899 1095/1134/1095 1075/1111/1075\nf 857/877/857 870/890/870 869/889/869\nf 857/877/857 869/889/869 858/878/858\nf 948/972/948 1078/1117/1078 946/969/946\nf 948/972/948 946/969/946 1096/1135/1096\nf 819/839/819 823/843/823 815/835/815\nf 819/839/819 815/835/815 814/838/814\nf 911/935/911 1097/1136/1097 818/841/818\nf 911/935/911 818/841/818 847/867/847\nf 815/835/815 823/843/823 869/889/869\nf 815/835/815 869/889/869 868/892/868\nf 887/908/887 748/767/748 758/777/758\nf 887/908/887 758/777/758 888/910/888\nf 761/778/761 760/781/760 758/777/758\nf 761/778/761 758/777/758 759/776/759\nf 853/874/853 746/763/746 745/762/745\nf 853/874/853 745/762/745 983/1011/983\nf 1051/1085/1051 988/1017/988 876/896/876\nf 1051/1085/1051 876/896/876 986/1014/986\nf 877/897/877 876/896/876 988/1017/988\nf 877/897/877 988/1017/988 989/1016/989\nf 989/1016/989 1015/1045/1015 1082/1121/1082\nf 989/1016/989 1082/1121/1082 877/897/877\nf 726/747/726 729/746/729 1098/1137/1098\nf 726/747/726 1098/1137/1098 918/940/918\nf 1100/1138/1100 1101/1139/1101 1102/1140/1102\nf 1100/1138/1100 1102/1140/1102 1099/1141/1099\nf 1103/1142/1103 488/480/488 294/277/294\nf 1103/1142/1103 294/277/294 715/732/715\nf 1104/1143/1104 1105/1144/1105 1072/1108/1072\nf 1104/1143/1104 1072/1108/1072 1071/1107/1071\nf 801/821/801 800/824/800 1002/1029/1002\nf 801/821/801 1002/1029/1002 1001/1028/1001\nf 1104/1143/1104 1106/1145/1106 958/980/958\nf 1104/1143/1104 958/980/958 957/979/957\nf 1104/1143/1104 957/979/957 1107/1146/1107\nf 1104/1143/1104 1107/1146/1107 1105/1144/1105\nf 1056/1089/1056 1108/1147/1108 1064/1099/1064\nf 1056/1089/1056 1064/1099/1064 1057/1090/1057\nf 495/1148/495 1010/1039/1010 1058/1091/1058\nf 495/1148/495 1058/1091/1058 496/1149/496\nf 496/1149/496 1058/1091/1058 1057/1090/1057\nf 496/1149/496 1057/1090/1057 497/1150/497\nf 962/986/962 1052/1086/1052 498/1151/498\nf 962/986/962 498/1151/498 330/987/330\nf 499/1152/499 498/1151/498 1052/1086/1052\nf 499/1152/499 1052/1086/1052 974/1002/974\nf 1010/1039/1010 495/1148/495 500/1153/500\nf 1010/1039/1010 500/1153/500 1011/1040/1011\nf 1109/1154/1109 1054/1088/1054 962/986/962\nf 1109/1154/1109 962/986/962 961/985/961\nf 499/1152/499 974/1002/974 973/1001/973\nf 499/1152/499 973/1001/973 344/1000/344\nf 1106/1145/1106 1104/1143/1104 1071/1107/1071\nf 1106/1145/1106 1071/1107/1071 1110/1155/1110\nf 1071/1107/1071 706/723/706 1102/1140/1102\nf 1071/1107/1071 1102/1140/1102 1110/1155/1110\nf 1099/1141/1099 1102/1140/1102 706/723/706\nf 1099/1141/1099 706/723/706 705/722/705\nf 705/722/705 1008/1041/1008 1111/1156/1111\nf 705/722/705 1111/1156/1111 1099/1141/1099\nf 1011/1040/1011 500/1153/500 505/1157/505\nf 1011/1040/1011 505/1157/505 1112/1158/1112\nf 1067/1102/1067 1043/1076/1043 1042/1075/1042\nf 1067/1102/1067 1042/1075/1042 1068/1103/1068\nf 329/984/329 444/1097/444 1063/1100/1063\nf 329/984/329 1063/1100/1063 961/985/961\nf 1068/1103/1068 1109/1154/1109 1113/1159/1113\nf 1068/1103/1068 1113/1159/1113 1065/1104/1065\nf 1115/1160/1115 724/741/724 1069/1105/1069\nf 1115/1160/1115 1069/1105/1069 1114/1161/1114\nf 744/765/744 843/864/843 848/871/848\nf 744/765/744 848/871/848 751/768/751\nf 509/500/509 850/870/850 849/869/849\nf 509/500/509 849/869/849 208/189/208\nf 849/869/849 843/864/843 842/863/842\nf 849/869/849 842/863/842 851/872/851\nf 462/1116/462 836/856/836 835/855/835\nf 462/1116/462 835/855/835 510/501/510\nf 850/870/850 509/500/509 510/501/510\nf 850/870/850 510/501/510 835/855/835\nf 795/815/795 960/983/960 971/998/971\nf 795/815/795 971/998/971 951/974/951\nf 960/983/960 1116/1162/1116 972/997/972\nf 960/983/960 972/997/972 971/998/971\nf 768/789/768 780/798/780 972/997/972\nf 768/789/768 972/997/972 1116/1162/1116\nf 716/737/716 929/951/929 826/849/826\nf 716/737/716 826/849/826 698/715/698\nf 801/821/801 1001/1028/1001 809/829/809\nf 801/821/801 809/829/809 1016/1046/1016\nf 800/824/800 813/834/813 938/960/938\nf 800/824/800 938/960/938 1002/1029/1002\nf 813/834/813 964/989/964 939/961/939\nf 813/834/813 939/961/939 938/960/938\nf 1117/1163/1117 921/947/921 924/946/924\nf 1117/1163/1117 924/946/924 954/976/954\nf 1094/1133/1094 1118/1164/1118 1119/1165/1119\nf 1094/1133/1094 1119/1165/1119 1035/1069/1035\nf 1035/1069/1035 1119/1165/1119 1089/1130/1089\nf 1035/1069/1035 1089/1130/1089 1036/1070/1036\nf 1118/1164/1118 1094/1133/1094 921/947/921\nf 1118/1164/1118 921/947/921 1117/1163/1117\nf 838/858/838 837/861/837 982/1010/982\nf 838/858/838 982/1010/982 750/769/750\nf 963/988/963 838/858/838 750/769/750\nf 963/988/963 750/769/750 751/768/751\nf 729/746/729 983/1011/983 982/1010/982\nf 729/746/729 982/1010/982 1098/1137/1098\nf 732/749/732 742/761/742 743/760/743\nf 732/749/732 743/760/743 733/750/733\nf 732/749/732 984/1012/984 1026/1056/1026\nf 732/749/732 1026/1056/1026 742/761/742\nf 984/1012/984 761/778/761 759/776/759\nf 984/1012/984 759/776/759 1026/1056/1026\nf 790/811/790 806/826/806 783/801/783\nf 790/811/790 783/801/783 782/800/782\nf 931/953/931 934/956/934 933/955/933\nf 931/953/931 933/955/933 995/1022/995\nf 931/953/931 995/1022/995 1016/1046/1016\nf 931/953/931 1016/1046/1016 928/954/928\nf 996/1024/996 827/847/827 811/831/811\nf 996/1024/996 811/831/811 791/812/791\nf 1121/1166/1121 861/881/861 864/885/864\nf 1121/1166/1121 864/885/864 1120/1167/1120\nf 896/917/896 1122/1168/1122 860/880/860\nf 896/917/896 860/880/860 859/883/859\nf 1024/1053/1024 1023/1052/1023 1025/1055/1025\nf 1024/1053/1024 1025/1055/1025 993/1021/993\nf 1024/1053/1024 860/880/860 1122/1168/1122\nf 1024/1053/1024 1122/1168/1122 1021/1054/1021\nf 1124/1169/1124 887/908/887 888/910/888\nf 1124/1169/1124 888/910/888 1123/1170/1123\nf 951/974/951 971/998/971 798/818/798\nf 951/974/951 798/818/798 797/817/797\nf 1050/1084/1050 1049/1083/1049 1038/1072/1038\nf 1050/1084/1050 1038/1072/1038 1039/1073/1039\nf 680/1063/680 1028/1058/1028 404/389/404\nf 680/1063/680 404/389/404 46/511/46\nf 1028/1058/1028 944/966/944 943/965/943\nf 1028/1058/1028 943/965/943 1029/1059/1029\nf 1018/1049/1018 932/958/932 521/513/521\nf 1018/1049/1018 521/513/521 520/512/520\nf 522/514/522 1019/1048/1019 1018/1049/1018\nf 522/514/522 1018/1049/1018 520/512/520\nf 935/957/935 523/515/523 521/513/521\nf 935/957/935 521/513/521 932/958/932\nf 935/957/935 968/993/968 524/516/524\nf 935/957/935 524/516/524 523/515/523\nf 953/977/953 792/816/792 952/975/952\nf 953/977/953 952/975/952 1073/1110/1073\nf 1073/1110/1073 1074/1109/1074 1125/1171/1125\nf 1073/1110/1073 1125/1171/1125 953/977/953\nf 1032/1065/1032 1081/1119/1081 1126/1172/1126\nf 1032/1065/1032 1126/1172/1126 1031/1066/1031\nf 1032/1065/1032 976/1007/976 979/1006/979\nf 1032/1065/1032 979/1006/979 1079/1120/1079\nf 1073/1110/1073 1127/1173/1127 857/877/857\nf 1073/1110/1073 857/877/857 856/876/856\nf 857/877/857 1127/1173/1127 1078/1117/1078\nf 857/877/857 1078/1117/1078 870/890/870\nf 407/397/407 276/258/276 905/928/905\nf 407/397/407 905/928/905 1007/1037/1007\nf 1006/1036/1006 897/918/897 1030/1064/1030\nf 1006/1036/1006 1030/1064/1030 1007/1037/1007\nf 822/842/822 845/866/845 855/879/855\nf 822/842/822 855/879/855 858/878/858\nf 1014/1044/1014 985/1013/985 731/748/731\nf 1014/1044/1014 731/748/731 737/754/737\nf 1031/1066/1031 1074/1109/1074 981/1008/981\nf 1031/1066/1031 981/1008/981 991/1018/991\nf 730/751/730 922/944/922 1033/1068/1033\nf 730/751/730 1033/1068/1033 738/755/738\nf 990/1019/990 980/1009/980 987/1015/987\nf 990/1019/990 987/1015/987 875/895/875\nf 763/780/763 752/773/752 988/1017/988\nf 763/780/763 988/1017/988 1051/1085/1051\nf 763/780/763 762/779/762 753/770/753\nf 763/780/763 753/770/753 752/773/752\nf 980/1009/980 990/1019/990 991/1018/991\nf 980/1009/980 991/1018/991 981/1008/981\nf 1118/1164/1118 1126/1172/1126 1081/1119/1081\nf 1118/1164/1118 1081/1119/1081 1119/1165/1119\nf 1126/1172/1126 1125/1171/1125 1074/1109/1074\nf 1126/1172/1126 1074/1109/1074 1031/1066/1031\nf 1119/1165/1119 1081/1119/1081 1080/1118/1080\nf 1119/1165/1119 1080/1118/1080 1089/1130/1089\nf 986/1014/986 844/865/844 889/909/889\nf 986/1014/986 889/909/889 1051/1085/1051\nf 821/844/821 819/839/819 818/841/818\nf 821/844/821 818/841/818 1097/1136/1097\nf 1022/1051/1022 764/785/764 894/914/894\nf 1022/1051/1022 894/914/894 1023/1052/1023\nf 1023/1052/1023 894/914/894 893/913/893\nf 1023/1052/1023 893/913/893 1025/1055/1025\nf 926/950/926 920/942/920 727/744/727\nf 926/950/926 727/744/727 726/747/726\nf 919/943/919 920/942/920 926/950/926\nf 919/943/919 926/950/926 927/949/927\nf 1128/1174/1128 1116/1162/1116 960/983/960\nf 1128/1174/1128 960/983/960 959/982/959\nf 773/790/773 702/719/702 799/820/799\nf 773/790/773 799/820/799 774/791/774\nf 799/820/799 972/997/972 780/798/780\nf 799/820/799 780/798/780 774/791/774\nf 772/793/772 828/848/828 970/996/970\nf 772/793/772 970/996/970 773/790/773\nf 703/720/703 970/996/970 996/1024/996\nf 703/720/703 996/1024/996 782/800/782\nf 771/788/771 781/799/781 780/798/780\nf 771/788/771 780/798/780 768/789/768\nf 791/812/791 790/811/790 782/800/782\nf 791/812/791 782/800/782 996/1024/996\nf 811/831/811 810/830/810 779/796/779\nf 811/831/811 779/796/779 791/812/791\nf 1027/1057/1027 789/809/789 777/794/777\nf 1027/1057/1027 777/794/777 776/797/776\nf 927/949/927 925/948/925 769/786/769\nf 927/949/927 769/786/769 1128/1174/1128\nf 710/727/710 725/742/725 724/741/724\nf 710/727/710 724/741/724 1115/1160/1115\nf 954/976/954 953/977/953 1125/1171/1125\nf 954/976/954 1125/1171/1125 1117/1163/1117\nf 1117/1163/1117 1125/1171/1125 1126/1172/1126\nf 1117/1163/1117 1126/1172/1126 1118/1164/1118\nf 768/789/768 1116/1162/1116 1128/1174/1128\nf 768/789/768 1128/1174/1128 769/786/769\nf 904/927/904 867/887/867 229/209/229\nf 904/927/904 229/209/229 529/521/529\nf 948/972/948 1096/1135/1096 998/1025/998\nf 948/972/948 998/1025/998 949/971/949\nf 1120/1167/1120 864/885/864 873/893/873\nf 1120/1167/1120 873/893/873 949/971/949\nf 1121/1166/1121 1120/1167/1120 997/1026/997\nf 1121/1166/1121 997/1026/997 1129/1175/1129\nf 1129/1175/1129 1095/1134/1095 865/888/865\nf 1129/1175/1129 865/888/865 1121/1166/1121\nf 861/881/861 1121/1166/1121 865/888/865\nf 861/881/861 865/888/865 862/882/862\nf 1075/1111/1075 890/911/890 1003/1034/1003\nf 1075/1111/1075 1003/1034/1003 1076/1112/1076\nf 1076/1112/1076 1003/1034/1003 965/991/965\nf 1076/1112/1076 965/991/965 1077/1113/1077\nf 965/991/965 695/990/695 694/1114/694\nf 965/991/965 694/1114/694 1077/1113/1077\nf 1075/1111/1075 1095/1134/1095 891/912/891\nf 1075/1111/1075 891/912/891 890/911/890\nf 895/915/895 894/914/894 764/785/764\nf 895/915/895 764/785/764 767/784/767\nf 1020/1050/1020 820/840/820 814/838/814\nf 1020/1050/1020 814/838/814 817/837/817\nf 1123/1170/1123 844/865/844 821/844/821\nf 1123/1170/1123 821/844/821 1097/1136/1097\nf 1124/1169/1124 1123/1170/1123 1097/1136/1097\nf 1124/1169/1124 1097/1136/1097 911/935/911\nf 1130/1176/1130 1124/1169/1124 911/935/911\nf 1130/1176/1130 911/935/911 912/934/912\nf 532/524/532 1130/1176/1130 912/934/912\nf 532/524/532 912/934/912 390/376/390\nf 973/1001/973 882/902/882 881/905/881\nf 973/1001/973 881/905/881 885/907/885\nf 833/857/833 836/856/836 886/906/886\nf 833/857/833 886/906/886 880/900/880\nf 834/854/834 833/857/833 879/899/879\nf 834/854/834 879/899/879 963/988/963\nf 1067/1102/1067 1066/1101/1066 1114/1161/1114\nf 1067/1102/1067 1114/1161/1114 1069/1105/1069\nf 809/829/809 808/832/808 928/954/928\nf 809/829/809 928/954/928 1016/1046/1016\nf 1019/1048/1019 522/514/522 405/390/405\nf 1019/1048/1019 405/390/405 1029/1059/1029\nf 1131/1177/1131 1085/1123/1085 1037/1071/1037\nf 1131/1177/1131 1037/1071/1037 1036/1070/1036\nf 1132/1178/1132 1103/1142/1103 715/732/715\nf 1132/1178/1132 715/732/715 714/731/714\nf 1110/1155/1110 1102/1140/1102 1101/1139/1101\nf 1110/1155/1110 1101/1139/1101 1133/1179/1133\nf 1111/1156/1111 1112/1158/1112 1135/1180/1135\nf 1111/1156/1111 1135/1180/1135 1134/1181/1134\nf 1106/1145/1106 1110/1155/1110 1133/1179/1133\nf 1106/1145/1106 1133/1179/1133 1136/1182/1136\nf 1106/1145/1106 714/731/714 713/730/713\nf 1106/1145/1106 713/730/713 958/980/958\nf 1112/1158/1112 505/1157/505 539/1183/539\nf 1112/1158/1112 539/1183/539 1135/1180/1135\nf 883/903/883 882/902/882 975/1003/975\nf 883/903/883 975/1003/975 1044/1079/1044\nf 704/725/704 1009/1038/1009 1008/1041/1008\nf 704/725/704 1008/1041/1008 705/722/705\nf 1052/1086/1052 962/986/962 1054/1088/1054\nf 1052/1086/1052 1054/1088/1054 1053/1087/1053\nf 1055/1092/1055 824/846/824 1060/1094/1060\nf 1055/1092/1055 1060/1094/1060 1056/1089/1056\nf 1009/1038/1009 704/725/704 824/846/824\nf 1009/1038/1009 824/846/824 1055/1092/1055\nf 1065/1104/1065 1113/1159/1113 1108/1147/1108\nf 1065/1104/1065 1108/1147/1108 1061/1096/1061\nf 1068/1103/1068 1042/1075/1042 1054/1088/1054\nf 1068/1103/1068 1054/1088/1054 1109/1154/1109\nf 1008/1041/1008 1011/1040/1011 1112/1158/1112\nf 1008/1041/1008 1112/1158/1112 1111/1156/1111\nf 1109/1154/1109 961/985/961 1063/1100/1063\nf 1109/1154/1109 1063/1100/1063 1113/1159/1113\nf 1134/1181/1134 1100/1138/1100 1099/1141/1099\nf 1134/1181/1134 1099/1141/1099 1111/1156/1111\nf 947/970/947 952/975/952 951/974/951\nf 947/970/947 951/974/951 797/817/797\nf 959/982/959 794/814/794 916/938/916\nf 959/982/959 916/938/916 919/943/919\nf 1098/1137/1098 982/1010/982 837/861/837\nf 1098/1137/1098 837/861/837 741/758/741\nf 1098/1137/1098 741/758/741 740/759/740\nf 1098/1137/1098 740/759/740 918/940/918\nf 1040/1077/1040 1047/1081/1047 1048/1082/1048\nf 1040/1077/1040 1048/1082/1048 1045/1078/1045\nf 1041/1074/1041 1044/1079/1044 975/1003/975\nf 1041/1074/1041 975/1003/975 1053/1087/1053\nf 1078/1117/1078 1127/1173/1127 947/970/947\nf 1078/1117/1078 947/970/947 946/969/946\nf 949/971/949 998/1025/998 997/1026/997\nf 949/971/949 997/1026/997 1120/1167/1120\nf 946/969/946 796/819/796 945/968/945\nf 946/969/946 945/968/945 1096/1135/1096\nf 998/1025/998 1096/1135/1096 945/968/945\nf 998/1025/998 945/968/945 950/973/950\nf 997/1026/997 805/825/805 804/828/804\nf 997/1026/997 804/828/804 1129/1175/1129\nf 1095/1134/1095 1129/1175/1129 804/828/804\nf 1095/1134/1095 804/828/804 891/912/891\nf 904/927/904 529/521/529 408/398/408\nf 904/927/904 408/398/408 1030/1064/1030\nf 1024/1053/1024 993/1021/993 863/884/863\nf 1024/1053/1024 863/884/863 860/880/860\nf 1138/1184/1138 1139/1185/1139 1140/1186/1140\nf 1138/1184/1138 1140/1186/1140 1137/1187/1137\nf 1141/1188/1141 1142/1189/1142 1137/1187/1137\nf 1141/1188/1141 1137/1187/1137 1140/1186/1140\nf 1143/1190/1143 1144/1191/1144 1142/1189/1142\nf 1143/1190/1143 1142/1189/1142 1141/1188/1141\nf 1145/1192/1145 1146/1193/1146 1144/1191/1144\nf 1145/1192/1145 1144/1191/1144 1143/1190/1143\nf 1147/1194/1147 1148/1195/1148 1146/1193/1146\nf 1147/1194/1147 1146/1193/1146 1145/1192/1145\nf 1149/1196/1149 1150/1197/1150 1148/1195/1148\nf 1149/1196/1149 1148/1195/1148 1147/1194/1147\nf 1151/1198/1151 1152/1199/1152 1150/1197/1150\nf 1151/1198/1151 1150/1197/1150 1149/1196/1149\nf 1154/1200/1154 1155/1201/1155 1156/1202/1156\nf 1154/1200/1154 1156/1202/1156 1153/1203/1153\nf 1157/1204/1157 1158/1205/1158 1155/1201/1155\nf 1157/1204/1157 1155/1201/1155 1154/1200/1154\nf 1159/1206/1159 1160/1207/1160 1142/1189/1142\nf 1159/1206/1159 1142/1189/1142 1144/1191/1144\nf 1161/1208/1161 1159/1206/1159 1144/1191/1144\nf 1161/1208/1161 1144/1191/1144 1146/1193/1146\nf 1162/1209/1162 1161/1208/1161 1146/1193/1146\nf 1162/1209/1162 1146/1193/1146 1148/1195/1148\nf 1163/1210/1163 1162/1209/1162 1148/1195/1148\nf 1163/1210/1163 1148/1195/1148 1150/1197/1150\nf 1150/1197/1150 1152/1199/1152 1164/1211/1164\nf 1150/1197/1150 1164/1211/1164 1163/1210/1163\nf 1156/1202/1156 1155/1201/1155 1166/1212/1166\nf 1156/1202/1156 1166/1212/1166 1165/1213/1165\nf 1167/1214/1167 1166/1212/1166 1155/1201/1155\nf 1167/1214/1167 1155/1201/1155 1158/1205/1158\nf 1169/1215/1169 1167/1214/1167 1158/1205/1158\nf 1169/1215/1169 1158/1205/1158 1168/1216/1168\nf 1170/1217/1170 1171/1218/1171 1172/1219/1172\nf 1170/1217/1170 1172/1219/1172 1139/1185/1139\nf 1173/1220/1173 1174/1221/1174 1141/1188/1141\nf 1173/1220/1173 1141/1188/1141 1140/1186/1140\nf 1141/1188/1141 1174/1221/1174 1175/1222/1175\nf 1141/1188/1141 1175/1222/1175 1143/1190/1143\nf 1176/1223/1176 1145/1192/1145 1143/1190/1143\nf 1176/1223/1176 1143/1190/1143 1175/1222/1175\nf 1177/1224/1177 1149/1196/1149 1147/1194/1147\nf 1177/1224/1177 1147/1194/1147 1176/1223/1176\nf 1177/1224/1177 1178/1225/1178 1151/1198/1151\nf 1177/1224/1177 1151/1198/1151 1149/1196/1149\nf 1153/1203/1153 1179/1226/1179 1180/1227/1180\nf 1153/1203/1153 1180/1227/1180 1154/1200/1154\nf 1157/1204/1157 1154/1200/1154 1180/1227/1180\nf 1157/1204/1157 1180/1227/1180 1181/1228/1181\nf 1157/1204/1157 1181/1228/1181 1182/1229/1182\nf 1157/1204/1157 1182/1229/1182 1168/1216/1168\nf 1169/1215/1169 1168/1216/1168 1182/1229/1182\nf 1169/1215/1169 1182/1229/1182 1183/1230/1183\nf 1142/1189/1142 1160/1207/1160 1138/1184/1138\nf 1142/1189/1142 1138/1184/1138 1137/1187/1137\nf 1170/1217/1170 1185/1231/1185 1186/1232/1186\nf 1170/1217/1170 1186/1232/1186 1184/1233/1184\nf 1170/1217/1170 1184/1233/1184 1187/1234/1187\nf 1170/1217/1170 1187/1234/1187 1171/1218/1171\nf 1187/1234/1187 1188/1235/1188 1172/1219/1172\nf 1187/1234/1187 1172/1219/1172 1171/1218/1171\nf 1172/1219/1172 1188/1235/1188 1140/1186/1140\nf 1172/1219/1172 1140/1186/1140 1139/1185/1139\nf 1161/1208/1161 1162/1209/1162 1163/1210/1163\nf 1161/1208/1161 1163/1210/1163 1189/1236/1189\nf 1189/1236/1189 1163/1210/1163 1164/1211/1164\nf 1189/1236/1189 1164/1211/1164 1190/1237/1190\nf 1165/1213/1165 1164/1211/1164 1152/1199/1152\nf 1165/1213/1165 1152/1199/1152 1156/1202/1156\nf 1152/1199/1152 1151/1198/1151 1153/1203/1153\nf 1152/1199/1152 1153/1203/1153 1156/1202/1156\nf 1179/1226/1179 1153/1203/1153 1151/1198/1151\nf 1179/1226/1179 1151/1198/1151 1178/1225/1178\nf 1189/1236/1189 1160/1207/1160 1159/1206/1159\nf 1189/1236/1189 1159/1206/1159 1161/1208/1161\nf 1186/1232/1186 1190/1237/1190 1164/1211/1164\nf 1186/1232/1186 1164/1211/1164 1165/1213/1165\nf 1139/1185/1139 1138/1184/1138 1185/1231/1185\nf 1139/1185/1139 1185/1231/1185 1170/1217/1170\nf 1169/1215/1169 1188/1235/1188 1187/1234/1187\nf 1169/1215/1169 1187/1234/1187 1167/1214/1167\nf 1186/1232/1186 1165/1213/1165 1166/1212/1166\nf 1186/1232/1186 1166/1212/1166 1184/1233/1184\nf 1140/1186/1140 1188/1235/1188 1191/1238/1191\nf 1140/1186/1140 1191/1238/1191 1173/1220/1173\nf 1191/1238/1191 1188/1235/1188 1169/1215/1169\nf 1191/1238/1191 1169/1215/1169 1183/1230/1183\nf 1192/1239/1192 1193/1240/1193 1179/1226/1179\nf 1192/1239/1192 1179/1226/1179 1178/1225/1178\nf 1192/1239/1192 1178/1225/1178 1177/1224/1177\nf 1192/1239/1192 1177/1224/1177 1194/1241/1194\nf 1180/1227/1180 1193/1240/1193 1072/1108/1072\nf 1180/1227/1180 1072/1108/1072 1105/1144/1105\nf 1180/1227/1180 1105/1144/1105 1107/1146/1107\nf 1180/1227/1180 1107/1146/1107 1181/1228/1181\nf 1194/1241/1194 1177/1224/1177 1176/1223/1176\nf 1194/1241/1194 1176/1223/1176 1114/1161/1114\nf 1062/1095/1062 1194/1241/1194 1114/1161/1114\nf 1062/1095/1062 1114/1161/1114 1066/1101/1066\nf 707/724/707 1072/1108/1072 1193/1240/1193\nf 707/724/707 1193/1240/1193 825/845/825\nf 825/845/825 1193/1240/1193 1192/1239/1192\nf 825/845/825 1192/1239/1192 1059/1093/1059\nf 1173/1220/1173 1191/1238/1191 832/853/832\nf 1173/1220/1173 832/853/832 711/728/711\nf 1183/1230/1183 1182/1229/1182 1005/1035/1005\nf 1183/1230/1183 1005/1035/1005 831/851/831\nf 1187/1234/1187 1184/1233/1184 1166/1212/1166\nf 1187/1234/1187 1166/1212/1166 1167/1214/1167\nf 710/727/710 1115/1160/1115 1175/1222/1175\nf 710/727/710 1175/1222/1175 1174/1221/1174\nf 1182/1229/1182 1181/1228/1181 1107/1146/1107\nf 1182/1229/1182 1107/1146/1107 1005/1035/1005\nf 453/443/453 1049/1083/1049 720/738/720\nf 453/443/453 720/738/720 598/590/598\nf 1123/1170/1123 888/910/888 889/909/889\nf 1123/1170/1123 889/909/889 844/865/844\nf 916/938/916 794/814/794 793/813/793\nf 916/938/916 793/813/793 913/939/913\nf 711/728/711 832/853/832 770/787/770\nf 711/728/711 770/787/770 708/729/708\nf 919/943/919 927/949/927 1128/1174/1128\nf 919/943/919 1128/1174/1128 959/982/959\nf 925/948/925 708/729/708 770/787/770\nf 925/948/925 770/787/770 769/786/769\nf 913/939/913 793/813/793 954/976/954\nf 913/939/913 954/976/954 924/946/924\nf 831/851/831 832/853/832 1191/1238/1191\nf 831/851/831 1191/1238/1191 1183/1230/1183\nf 895/915/895 767/784/767 766/783/766\nf 895/915/895 766/783/766 1006/1036/1006\nf 891/912/891 804/828/804 807/827/807\nf 891/912/891 807/827/807 788/808/788\nf 778/795/778 777/794/777 788/808/788\nf 778/795/778 788/808/788 807/827/807\nf 810/830/810 1000/1027/1000 776/797/776\nf 810/830/810 776/797/776 779/796/779\nf 947/970/947 1127/1173/1127 1073/1110/1073\nf 947/970/947 1073/1110/1073 952/975/952\nf 1106/1145/1106 1136/1182/1136 1132/1178/1132\nf 1106/1145/1106 1132/1178/1132 714/731/714\nf 1061/1096/1061 1062/1095/1062 1066/1101/1066\nf 1061/1096/1061 1066/1101/1066 1065/1104/1065\nf 443/1098/443 497/1150/497 1057/1090/1057\nf 443/1098/443 1057/1090/1057 1064/1099/1064\nf 1064/1099/1064 1108/1147/1108 1113/1159/1113\nf 1064/1099/1064 1113/1159/1113 1063/1100/1063\nf 1061/1096/1061 1108/1147/1108 1056/1089/1056\nf 1061/1096/1061 1056/1089/1056 1060/1094/1060\nf 1192/1239/1192 1194/1241/1194 1062/1095/1062\nf 1192/1239/1192 1062/1095/1062 1059/1093/1059\nf 1173/1220/1173 711/728/711 710/727/710\nf 1173/1220/1173 710/727/710 1174/1221/1174\nf 880/900/880 881/905/881 884/904/884\nf 880/900/880 884/904/884 878/901/878\nf 841/862/841 1047/1081/1047 1046/1080/1046\nf 841/862/841 1046/1080/1046 723/740/723\nf 1070/1106/1070 1048/1082/1048 1047/1081/1047\nf 1070/1106/1070 1047/1081/1047 841/862/841\nf 461/1115/461 342/999/342 885/907/885\nf 461/1115/461 885/907/885 886/906/886\nf 1114/1161/1114 1176/1223/1176 1175/1222/1175\nf 1114/1161/1114 1175/1222/1175 1115/1160/1115\nf 887/908/887 1124/1169/1124 1130/1176/1130\nf 887/908/887 1130/1176/1130 852/873/852\nf 206/186/206 852/873/852 1130/1176/1130\nf 206/186/206 1130/1176/1130 532/524/532\nf 681/698/681 599/592/599 1195/1242/1195\nf 681/698/681 1195/1242/1195 682/699/682\nf 1196/1243/1196 674/691/674 684/702/684\nf 1196/1243/1196 684/702/684 1195/1242/1195\nf 1197/1244/1197 675/692/675 674/691/674\nf 1197/1244/1197 674/691/674 1196/1243/1196\nf 689/706/689 690/708/690 675/692/675\nf 689/706/689 675/692/675 1197/1244/1197\nf 693/710/693 1199/1245/1199 1200/1246/1200\nf 693/710/693 1200/1246/1200 1198/1247/1198\nf 686/707/686 689/706/689 1197/1244/1197\nf 686/707/686 1197/1244/1197 1199/1245/1199\nf 1196/1243/1196 1195/1242/1195 1202/1248/1202\nf 1196/1243/1196 1202/1248/1202 1201/1249/1201\nf 1084/1122/1084 1083/1124/1083 1204/1250/1204\nf 1084/1122/1084 1204/1250/1204 1203/1251/1203\nf 1092/1131/1092 1013/1042/1013 1203/1251/1203\nf 1092/1131/1092 1203/1251/1203 1204/1250/1204\nf 1206/1252/1206 1087/1253/1087 1207/1254/1207\nf 1206/1252/1206 1207/1254/1207 1205/1255/1205\nf 1206/1252/1206 1208/1256/1208 1086/1257/1086\nf 1206/1252/1206 1086/1257/1086 1087/1253/1087\nf 1091/1258/1091 1090/1259/1090 1210/1260/1210\nf 1091/1258/1091 1210/1260/1210 1209/1261/1209\nf 1093/1132/1093 1211/1262/1211 757/774/757\nf 1093/1132/1093 757/774/757 756/775/756\nf 1079/1120/1079 1212/1263/1212 1090/1128/1090\nf 1079/1120/1079 1090/1128/1090 1080/1118/1080\nf 1079/1120/1079 979/1006/979 1088/1127/1088\nf 1079/1120/1079 1088/1127/1088 1212/1263/1212\nf 1209/1261/1209 1213/1264/1213 1085/1265/1085\nf 1209/1261/1209 1085/1265/1085 1131/1266/1131\nf 1089/1130/1089 1091/1129/1091 1131/1177/1131\nf 1089/1130/1089 1131/1177/1131 1036/1070/1036\nf 1213/1264/1213 1214/1267/1214 1204/1268/1204\nf 1213/1264/1213 1204/1268/1204 1083/1269/1083\nf 1214/1267/1214 1215/1270/1215 1092/1271/1092\nf 1214/1267/1214 1092/1271/1092 1204/1268/1204\nf 1015/1045/1015 757/774/757 1211/1262/1211\nf 1015/1045/1015 1211/1262/1211 1216/1272/1216\nf 1211/1273/1211 1093/1274/1093 1215/1270/1215\nf 1211/1273/1211 1215/1270/1215 1217/1275/1217\nf 1088/1276/1088 1208/1256/1208 1210/1260/1210\nf 1088/1276/1088 1210/1260/1210 1212/1277/1212\nf 1216/1278/1216 1211/1273/1211 1217/1275/1217\nf 1216/1278/1216 1217/1275/1217 1218/1279/1218\nf 1219/1280/1219 1218/1279/1218 1205/1255/1205\nf 1219/1280/1219 1205/1255/1205 1207/1254/1207\nf 698/715/698 697/714/697 717/734/717\nf 698/715/698 717/734/717 716/737/716\nf 967/992/967 418/407/418 524/516/524\nf 967/992/967 524/516/524 968/993/968\nf 598/590/598 720/738/720 712/733/712\nf 598/590/598 712/733/712 293/276/293\nf 697/714/697 721/739/721 1050/1084/1050\nf 697/714/697 1050/1084/1050 717/734/717\nf 957/979/957 956/978/956 1005/1035/1005\nf 957/979/957 1005/1035/1005 1107/1146/1107\nf 1186/1232/1186 1185/1231/1185 1189/1236/1189\nf 1186/1232/1186 1189/1236/1189 1190/1237/1190\nf 1022/1051/1022 896/917/896 765/782/765\nf 1022/1051/1022 765/782/765 764/785/764\nf 1122/1168/1122 896/917/896 1022/1051/1022\nf 1122/1168/1122 1022/1051/1022 1021/1054/1021\nf 678/695/678 1198/1247/1198 625/631/625\nf 678/695/678 625/631/625 27/8/27\nf 1195/1242/1195 599/592/599 626/632/626\nf 1195/1242/1195 626/632/626 1202/1248/1202\nf 1202/1248/1202 626/632/626 628/634/628\nf 1202/1248/1202 628/634/628 1220/1281/1220\nf 1198/1247/1198 1220/1281/1220 628/634/628\nf 1198/1247/1198 628/634/628 625/631/625\nf 1222/1282/1222 1223/1283/1223 1224/1284/1224\nf 1222/1282/1222 1224/1284/1224 1221/1285/1221\nf 1226/1286/1226 1227/1287/1227 1228/1288/1228\nf 1226/1286/1226 1228/1288/1228 1225/1289/1225\nf 1230/1290/1230 1231/1291/1231 1232/1292/1232\nf 1230/1290/1230 1232/1292/1232 1229/1293/1229\nf 1234/1294/1234 1232/1292/1232 1231/1291/1231\nf 1234/1294/1234 1231/1291/1231 1233/1295/1233\nf 1236/1296/1236 1237/1297/1237 1238/1298/1238\nf 1236/1296/1236 1238/1298/1238 1235/1299/1235\nf 1221/1285/1221 1239/1300/1239 1240/1301/1240\nf 1221/1285/1221 1240/1301/1240 1233/1295/1233\nf 1242/1302/1242 1243/1303/1243 1244/1304/1244\nf 1242/1302/1242 1244/1304/1244 1241/1305/1241\nf 1237/1297/1237 1245/1306/1245 1246/1307/1246\nf 1237/1297/1237 1246/1307/1246 1238/1298/1238\nf 1246/1307/1246 1245/1306/1245 1242/1302/1242\nf 1246/1307/1246 1242/1302/1242 1241/1305/1241\nf 1248/1308/1248 1224/1284/1224 1249/1309/1249\nf 1248/1308/1248 1249/1309/1249 1247/1310/1247\nf 1249/1309/1249 1250/1311/1250 660/1312/660\nf 1249/1309/1249 660/1312/660 659/1313/659\nf 661/1314/661 1247/1310/1247 1249/1309/1249\nf 661/1314/661 1249/1309/1249 659/1313/659\nf 1221/1285/1221 1224/1284/1224 1248/1308/1248\nf 1221/1285/1221 1248/1308/1248 1239/1300/1239\nf 1231/1291/1231 1222/1282/1222 1221/1285/1221\nf 1231/1291/1231 1221/1285/1221 1233/1295/1233\nf 1232/1292/1232 1234/1294/1234 1243/1303/1243\nf 1232/1292/1232 1243/1303/1243 1242/1302/1242\nf 1244/1304/1244 1243/1303/1243 1234/1294/1234\nf 1244/1304/1244 1234/1294/1234 1251/1315/1251\nf 1240/1301/1240 1251/1315/1251 1234/1294/1234\nf 1240/1301/1240 1234/1294/1234 1233/1295/1233\nf 1253/1316/1253 1134/1181/1134 1135/1180/1135\nf 1253/1316/1253 1135/1180/1135 1252/1317/1252\nf 1254/1318/1254 1255/1319/1255 1229/1293/1229\nf 1254/1318/1254 1229/1293/1229 1232/1292/1232\nf 1254/1318/1254 1225/1289/1225 1228/1288/1228\nf 1254/1318/1254 1228/1288/1228 1255/1319/1255\nf 667/1320/667 1252/1317/1252 1135/1180/1135\nf 667/1320/667 1135/1180/1135 539/1183/539\nf 1226/1286/1226 1225/1289/1225 1237/1297/1237\nf 1226/1286/1226 1237/1297/1237 1236/1296/1236\nf 1245/1306/1245 1254/1318/1254 1232/1292/1232\nf 1245/1306/1245 1232/1292/1232 1242/1302/1242\nf 1254/1318/1254 1245/1306/1245 1237/1297/1237\nf 1254/1318/1254 1237/1297/1237 1225/1289/1225\nf 669/674/669 668/675/668 1226/1286/1226\nf 669/674/669 1226/1286/1226 1236/1296/1236\nf 1230/1290/1230 1256/1321/1256 1222/1282/1222\nf 1230/1290/1230 1222/1282/1222 1231/1291/1231\nf 1235/1299/1235 671/677/671 669/674/669\nf 1235/1299/1235 669/674/669 1236/1296/1236\nf 1230/1290/1230 1101/1139/1101 1100/1138/1100\nf 1230/1290/1230 1100/1138/1100 1256/1321/1256\nf 672/678/672 488/480/488 1103/1142/1103\nf 672/678/672 1103/1142/1103 1227/1287/1227\nf 1224/1284/1224 1223/1283/1223 1250/1311/1250\nf 1224/1284/1224 1250/1311/1250 1249/1309/1249\nf 1256/1321/1256 1100/1138/1100 1134/1181/1134\nf 1256/1321/1256 1134/1181/1134 1253/1316/1253\nf 1227/1287/1227 1103/1142/1103 1132/1178/1132\nf 1227/1287/1227 1132/1178/1132 1228/1288/1228\nf 1101/1139/1101 1230/1290/1230 1229/1293/1229\nf 1101/1139/1101 1229/1293/1229 1133/1179/1133\nf 1223/1283/1223 1253/1316/1253 1252/1317/1252\nf 1223/1283/1223 1252/1317/1252 1250/1311/1250\nf 1255/1319/1255 1136/1182/1136 1133/1179/1133\nf 1255/1319/1255 1133/1179/1133 1229/1293/1229\nf 1228/1288/1228 1132/1178/1132 1136/1182/1136\nf 1228/1288/1228 1136/1182/1136 1255/1319/1255\nf 660/1312/660 1250/1311/1250 1252/1317/1252\nf 660/1312/660 1252/1317/1252 667/1320/667\nf 668/675/668 672/678/672 1227/1287/1227\nf 668/675/668 1227/1287/1227 1226/1286/1226\nf 1222/1282/1222 1256/1321/1256 1253/1316/1253\nf 1222/1282/1222 1253/1316/1253 1223/1283/1223\nf 1/1322/1 12/1323/12 1247/1310/1247\nf 1/1322/1 1247/1310/1247 661/1314/661\nf 10/1324/10 8/1325/8 1240/1301/1240\nf 10/1324/10 1240/1301/1240 1239/1300/1239\nf 1239/1300/1239 1248/1308/1248 11/1326/11\nf 1239/1300/1239 11/1326/11 10/1324/10\nf 5/1327/5 3/1328/3 1235/1299/1235\nf 5/1327/5 1235/1299/1235 1238/1298/1238\nf 9/1329/9 4/1330/4 1246/1307/1246\nf 9/1329/9 1246/1307/1246 1241/1305/1241\nf 1240/1301/1240 8/1325/8 6/1331/6\nf 1240/1301/1240 6/1331/6 1251/1315/1251\nf 7/1332/7 9/1329/9 1241/1305/1241\nf 7/1332/7 1241/1305/1241 1244/1304/1244\nf 11/1326/11 1248/1308/1248 1247/1310/1247\nf 11/1326/11 1247/1310/1247 12/1323/12\nf 3/1328/3 2/690/2 671/677/671\nf 3/1328/3 671/677/671 1235/1299/1235\nf 1238/1298/1238 1246/1307/1246 4/1330/4\nf 1238/1298/1238 4/1330/4 5/1327/5\nf 7/1332/7 1244/1304/1244 1251/1315/1251\nf 7/1332/7 1251/1315/1251 6/1331/6\nf 1203/1251/1203 1013/1042/1013 1012/1043/1012\nf 1203/1251/1203 1012/1043/1012 736/757/736\nf 937/959/937 941/964/941 1027/1057/1027\nf 937/959/937 1027/1057/1027 999/1030/999\nf 1084/1122/1084 739/756/739 1034/1067/1034\nf 1084/1122/1084 1034/1067/1034 1037/1071/1037\nf 1197/1244/1197 1196/1243/1196 1201/1249/1201\nf 1197/1244/1197 1201/1249/1201 1199/1245/1199\nf 1203/1251/1203 736/757/736 739/756/739\nf 1203/1251/1203 739/756/739 1084/1122/1084\nf 936/962/936 784/805/784 941/964/941\nf 936/962/936 941/964/941 937/959/937\nf 786/806/786 1004/1033/1004 940/963/940\nf 786/806/786 940/963/940 785/804/785\nf 467/1333/467 612/604/612 387/1334/387\nf 612/604/612 624/630/624 387/1334/387\nf 621/628/621 387/1334/387 624/630/624\nf 604/595/604 44/22/44 28/5/28\nf 472/605/472 612/604/612 467/1333/467\nf 29/6/29 28/5/28 47/26/47\nf 43/21/43 48/25/48 44/22/44\nf 30/7/30 266/1335/266 27/8/27\nf 424/414/424 239/223/239 425/415/425\nf 467/458/467 363/347/363 472/463/472\nf 561/552/561 560/553/560 572/564/572\nf 549/540/549 551/542/551 579/571/579\nf 583/574/583 595/588/595 582/575/582\nf 31/12/31 36/13/36 600/591/600\nf 39/16/39 44/22/44 603/597/603\nf 32/9/32 599/592/599 45/23/45\nf 473/626/473 613/607/613 471/606/471\nf 477/620/477 478/625/478 620/621/620\nf 474/611/474 615/610/615 617/627/617\nf 1257/1336/1257 614/609/614 618/616/618\nf 1257/1336/1257 620/621/620 622/624/622\nf 1257/1336/1257 618/616/618 619/619/619\nf 1257/1336/1257 613/607/613 615/610/615\nf 614/609/614 1257/1336/1257 615/610/615\nf 622/624/622 623/629/623 1257/1336/1257\nf 1257/1336/1257 623/629/623 611/603/611\nf 624/630/624 623/629/623 621/628/621\nf 469/617/469 618/616/618 470/615/470\nf 614/609/614 476/608/476 533/614/533\nf 610/602/610 1257/1336/1257 611/603/611\nf 613/607/613 1257/1336/1257 610/602/610\nf 620/621/620 1257/1336/1257 619/619/619\nf 541/532/541 592/584/592 562/555/562\nf 541/532/541 587/581/587 592/584/592\nf 627/633/627 607/599/607 605/596/605\nf 627/633/627 605/596/605 604/595/604\nf 605/596/605 606/598/606 603/597/603\nf 607/599/607 606/598/606 605/596/605\nf 1207/1254/1207 1082/1337/1082 1015/1338/1015\nf 1219/1280/1219 1207/1254/1207 1015/1338/1015\nf 1015/1338/1015 1216/1278/1216 1219/1280/1219\nf 693/710/693 1198/1247/1198 678/695/678\nf 1207/1254/1207 1087/1253/1087 1082/1337/1082\nf 678/695/678 677/697/677 694/712/694\nf 695/713/695 692/711/692 693/710/693\nf 266/1335/266 679/696/679 27/8/27\nf 883/903/883 1044/1079/1044 1045/1078/1045\nf 992/1020/992 1082/1121/1082 1087/1125/1087\nf 1158/1205/1158 1157/1204/1157 1168/1216/1168\nf 1147/1194/1147 1145/1192/1145 1176/1223/1176\nf 1193/1240/1193 1180/1227/1180 1179/1226/1179\nf 684/702/684 682/699/682 1195/1242/1195\nf 693/710/693 686/707/686 1199/1245/1199\nf 599/592/599 681/698/681 45/23/45\nf 1208/1256/1208 1088/1276/1088 1086/1257/1086\nf 1093/1274/1093 1092/1271/1092 1215/1270/1215\nf 1210/1260/1210 1090/1259/1090 1212/1277/1212\nf 1209/1261/1209 1258/1339/1258 1213/1264/1213\nf 1215/1270/1215 1258/1339/1258 1217/1275/1217\nf 1213/1264/1213 1258/1339/1258 1214/1267/1214\nf 1208/1256/1208 1258/1339/1258 1210/1260/1210\nf 1258/1339/1258 1209/1261/1209 1210/1260/1210\nf 1218/1279/1218 1217/1275/1217 1258/1339/1258\nf 1218/1279/1218 1258/1339/1258 1205/1255/1205\nf 1218/1279/1218 1219/1280/1219 1216/1278/1216\nf 1213/1264/1213 1083/1269/1083 1085/1265/1085\nf 1091/1258/1091 1209/1261/1209 1131/1266/1131\nf 1258/1339/1258 1206/1252/1206 1205/1255/1205\nf 1258/1339/1258 1208/1256/1208 1206/1252/1206\nf 1258/1339/1258 1215/1270/1215 1214/1267/1214\nf 1189/1236/1189 1138/1184/1138 1160/1207/1160\nf 1185/1231/1185 1138/1184/1138 1189/1236/1189\nf 1202/1248/1202 1220/1281/1220 1200/1246/1200\nf 1200/1246/1200 1220/1281/1220 1198/1247/1198\nf 1201/1249/1201 1200/1246/1200 1199/1245/1199\nf 1201/1249/1201 1202/1248/1202 1200/1246/1200\n# 2492 faces\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1]),\n\t\t\ty = float.Parse (strItems [2]),\n\t\t\tz = float.Parse (strItems [3])\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\nusing static Geometry;\n```\n\n# **Lesson 3: Hidden faces removal (z buffer)**\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\n# Introduction\n\nHello, let me introduce you my friend z-buffer of a black guy. He will help us get rid of the visual artifacts of the hidden faces removal we had during the last lesson.\n\n![](./img/lesson3_face1.png)\n\nBy the way, i'd like to mention that this model i use heavily in the course is created by [Vidar Rapp](https://se.linkedin.com/in/vidarrapp). He kindely granted me a permission to use it for teaching rendering basics and i vandalized it, but i promise you to give back the eyes to the guy.\n\nWell, back to the topic, in theory we could just draw all the triangles without discarding any. If we do it properly starting rear-to-front, the front facets will erase the back ones. It is called the [painter's algorithm](http://en.wikipedia.org/wiki/Painter%27s_algorithm). Unfortunately, it comes along with a high computational cost: for each camera movement we need to re-sort all the scene. And then there are dynamic scenes... And this is not even the main problem. The main problem is it is not always possible to determine the correct order.\n\n# **Let us try to render a simple scene**\n\nImagine a simple scene made of three triangles: the camera looks up-to-down, we project the colored triangles onto the white screen:\n\n![ ](./img/lesson3_scene1.png)\n\nThe render should look like this:\n\n![ ](./img/lesson3_scene2.png)\n\nBlue facet - is it behind or in front of the red one? The painter's algorithm does not work here. It is possible to split blue facet in two (one in front of the red facet and one behind). And then the one in front of the red one is to be split in two - one in front of the green triangle and one behind... I think you get the problem: in scenes with millions of triangles it is really expensive to compute. It is possible to use [BSP trees](https://en.wikipedia.org/wiki/Binary_space_partitioning) to get it done. By the way, this data structure is constant for moving camera, but it is really messy. And the life is too short to get it messy.\n\n# **Even simpler: let us lose a dimension. Y-buffer!**\n\nLet us lose a dimension for a while and to cut the above scene along the yellow plane:\n\n![ ](./img/lesson3_scene3.png)\n\nI mean, now our scene is made of three line segments (intersection of the yellow plane and each of the triangles), and the final render has a normal width but 1 pixel height:\n\n![ ](./img/lesson3_scene4.png)\n\nOur scene is two-dimensional, so it is easy to draw it using the line() function we programmed in the very first lesson.\n\n```csharp\nvar scene = new Image (800, 500, Format.BGR);\n\n// scene \"2d mesh\"\nLine(scene, new Vec2i {x=20, y=34}, new Vec2i {x=744, y=400}, Color.Red);\nLine(scene, new Vec2i {x=120, y=434}, new Vec2i {x=444, y=400}, Color.Green);\nLine(scene, new Vec2i {x=330, y=463}, new Vec2i {x=594, y=200}, Color.Blue);\n\n// screen line\nLine(scene, new Vec2i {x=10, y=10}, new Vec2i{x=790, y=10}, Color.White);\n\nscene.VerticalFlip(); // I want to have the origin at the left bottom corner of the image\nscene // This is how our 2D scene looks like if we look at it sideways:\n```\n\nLet us render it. Recall that the render is 1 pixel height. In my source code I create images 16 pixels height for the ease of reading on high resolution screens. `Rasterize()` function writes only in the first line of the image `render`\n\n```csharp\nvoid Rasterize(Image image, Vec2i p0, Vec2i p1, int[] ybuffer, Color color)\n{\n    if (p0.x>p1.x)\n        Swap(ref p0, ref p1);\n    \n    for (int x=p0.x; x<=p1.x; x++) {\n        float t = (x-p0.x)/(float)(p1.x-p0.x);\n        var y = (int)(p0.y*(1-t) + p1.y*t);\n        if (ybuffer[x] < y) {\n            ybuffer[x] = y;\n            image[x, 0] = color;\n        }\n    }\n}\n\nvar ybuffer = new int [width];\nfor (int i = 0; i < width; i++)\n    ybuffer[i] = int.MinValue;\n\nvar render = new Image (width, 16, Format.BGR);\nRasterize(render, new Vec2i{x=20,y=34}, new Vec2i{x=744, y=400}, ybuffer, Color.Red);\nRasterize(render, new Vec2i{x=120, y=434}, new Vec2i{x=444,y=400}, ybuffer, Color.Green);\nRasterize(render, new Vec2i{x=330, y=463}, new Vec2i{x=594,y=200}, ybuffer, Color.Blue);\n\nrender\n```\n\nIt is really-really simple: I iterate through all x-coordinates between `p0.x` and `p1.x` and compute the corresponding y-coordinate of the segment. Then I check what we got in our array `ybuffer` with current `x` index. If the current `y`-value is closer to the camera than the value in the `ybuffer`, then I draw it on the screen and update the `ybuffer`.\n\nLet us see it step-by-step. After calling `Rasterize()` on the first (red) segment this is our memory:\n\nscreen:![](./img/lesson3_rasterize1.png)\n\nybuffer: ![ ](./img/lesson3_rasterize2.png)\n\nHere the magenta color indicates the minus infinity, those are places corresponding to the screen we did not touch. All the rest is shown in the shades of gray: clear colors are close to the camera, dark colors far from the camera.\n\nThen we draw the green segment.\n\nscreen:![ ](./img/lesson3_rasterize3.png)\n\nybuffer:![ ](./img/lesson3_rasterize4.png)\n\nAnd finally the blue one.\n\nscreen:![ ](./img/lesson3_rasterize5.png)\n\nybuffer:![ ](./img/lesson3_rasterize6.png)\n\nCongratulations, we just drew a 2D scene on a 1D screen! Let us admire once again the render: ![ ](./img/lesson3_rasterize7.png)\n\n# Back to 3D\n\nSo, for drawing on a 2D screen the z-buffer must be two-dimensional:\n\n`var zbuffer = new int[width * height];`\n\nPersonally I pack a two-dimensional buffer into a one-dimensional, the conversion is trivial:\n\n`var idx = x + y* width;`\n\nand the back one:\n\n`var x = idx % width;`\\\n`var y = idx % width;`\n\nThen in the code I simply iterate through all the triangles and call the rasterizer function with current triangle and a reference to the z-buffer.\n\nThe only difficulty is how to compute the z-value of a pixel we want to draw. Let us recall how we computed the y-value in the y-buffer example:\n\n`int y = p0.y*(1-t) + p1.y*t;`\n\nWhat is the nature of the `t` variable? It turns out that `(1-t, t)` are barycentric coordinates of the point `(x,y)` with respect to the segment `p0, p1: (x,y) = p0*(1-t) + p1*t`. So the idea is to take the barycentric coordinates version of triangle rasterization, and for every pixel we want to draw simply to multiply its barycentric coordinates by the z-values of the vertices of the triangle we rasterize:\n\n```csharp\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - p;\n\n    var r = Cross (new Vec3f {\n        x = ab.x,\n        y = ac.x,\n        z = pa.x\n    }, new Vec3f {\n        x = ab.y,\n        y = ac.y,\n        z = pa.y\n    });\n\n    // triangle is degenerate, in this case return smth with negative coordinates\n    // dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n    if ((int)r.z == 0)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n    return new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D (t0), Project2D (t1), Project2D (t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n\nfloat [] InitZBuffer (Image image)\n{\n    var zbuffer = new float [image.Width * image.Height];\n    for (int idx = 0; idx < zbuffer.Length; idx++)\n        zbuffer [idx] = float.NegativeInfinity;\n    return zbuffer;\n}\n\nvar image = new Image(width, height, Format.BGR);\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*(image.Width-1)/2 + 0.5f),\n    y = (int)((v.y+1)*(image.Height-1)/2 + 0.5f),\n    z = v.z\n};\n\nvar zbuffer = InitZBuffer(image);\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = headModel.Vertices[vIndex];\n        screen[i] = map(world[i]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, Color.White * intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Okay, we just interpolated the z-values. What else can we do?\n\nTexture!\n\nIn the `.obj` file we have lines starting with `vt u v`, they give an array of texture coordinates. The number in the middle (between the slashes) in the facet lines\\\n`f x/x/x x/x/x x/x/x` are the texture coordinates of this vertex of this triangle. Interpolate it inside the triangle, multiply by the width-height of the texture image and you will get the color to put in your render.\n\n```csharp\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n            var v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n\n                var color = texture [u, v];\n                image [x, y] = color * intensivity;\n            }\n        }\n    }\n}\n\nvar image = new Image(width, height, Format.BGR);\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nFunc<Vec3f, Vec2f> uvMap = v => new Vec2f {\n    x = v.x * (headTexture.Width - 1),\n    y = v.y * (headTexture.Height - 1)\n}; \n\nvar zbuffer = InitZBuffer(image);\nvar uv = new Vec2f[3];\nvar model = headModel;\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/lesson1.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/lesson2.csx",
    "content": "using static Geometry;\n\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\n\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n\tLine(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n\tLine(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n\tLine(image, t[0], t[1], color);\n\tLine(image, t[1], t[2], color);\n\tLine(image, t[2], t[0], color);\n}\n\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/lesson2.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\nusing static Geometry;\n```\n\n# Lesson 2: Triangle rasterization and back face culling\n\n# Old-school method: Line sweeping\n\nThus, the task is to draw two-dimensional triangles. For motivated students it normally takes a couple of hours, even if they are bad programmers. Last time we saw Bresenham’s line drawing algorithm. Today’s task is to draw a filled triangle. Funny enough, but this task is not trivial. I don’t know why, but I know that it’s true. Most of my students struggle with this simple task. So, the initial stub will look like this:\n\n```csharp\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n    Line(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n    Line(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    Line(image, t[0], t[1], color);\n    Line(image, t[1], t[2], color);\n    Line(image, t[2], t[0], color);\n}\n\nVec2i[] t0 = {\n    new Vec2i { x = 10, y = 70 },\n    new Vec2i { x = 50, y = 160 },\n    new Vec2i { x = 70, y = 80 }\n};\nVec2i[] t1 = {\n    new Vec2i { x = 180, y = 50 },\n    new Vec2i { x = 150, y = 1 },\n    new Vec2i { x = 70, y = 180 }\n};\nVec2i[] t2 = {\n    new Vec2i { x = 180, y = 150 },\n    new Vec2i { x = 120, y = 160 },\n    new Vec2i { x = 130, y = 180 }\n};\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThe code is simple: I provide three triangles for the initial debugging of your code. If we invoke `Line` inside the triangle function, we’ll get the contour of the triangle. How to draw a filled triangle?\n\nA good method of drawing a triangle must have the following features:\n\n* It should be (surprise!) simple and fast.\n\n\n* It should be symmetrical: the picture should not depend on the order of vertices passed to the drawing function.\n\n\n* If two triangles have two common vertices, there should be no holes between them because of rasterization rounding.\n\nWe could add more requirements, but let’s do with these ones. Traditionally a line sweeping is used:\n\n1. Sort vertices of the triangle by their y-coordinates\n\n2. Rasterize simultaneously the left and the right sides of the triangle\n\n3. Draw a horizontal line segment between the left and the right boundary points\n\nAt this point my students start to lose the firm ground: which segment is the left one, which one is right? Besides, there are three segments in a triangle... Usually, after this introduction I leave my students for about an hour: once again, reading my code is much less valuable than comparing your own code with mine.\n\n`[One hour passes]`\n\nHow do I draw a triangle? Once again, if you have a better method, I’d be glad to adopt it. Let us assume that we have three points of the triangle: `t0`, `t1`, `t2`, they are sorted in ascending order by the y-coordinate. Then, the boundary A is between `t0` and `t2`, boundary B is between `t0` and `t1`, and then between `t1` and `t2`.\n\n```csharp\nvoid OrderByY (Vec2i[] t)\n{\n    if(t[0].y > t[1].y) Swap(t, 0, 1);\n    if(t[1].y > t[2].y) Swap(t, 1, 2);\n    if(t[0].y > t[1].y) Swap(t, 0, 1);   \n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    Line(image, t[0], t[1], Color.Green);\n    Line(image, t[1], t[2], Color.Green);\n    Line(image, t[2], t[0], Color.Red);    \n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\n// Here boundary A is red, and boundary B is green.\nimage.VerticalFlip ();\nimage\n```\n\nUnfortunately, boundary B is made of two parts. Let us draw the bottom half of the triangle by cutting it horizontally:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        image[A.x, y] = Color.Red; \n        image[B.x, y] = Color.Green; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNote that the segments are not continuous. Last time when we drew straight lines we struggled to get continuous segments and here I did not bother with rotating the image (remember the xy swapping?). Why? We fill the triangles aftewards, that’s why. If we connect the corresponding pairs of points by horizontal lines, the gaps disappear:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        Line(image, A, B, Color.White);\n        image[B.x, y] = Color.Green; \n        image[A.x, y] = Color.Red; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNow, let us draw the second (upper) half of the triangle. We can do this by adding a second loop:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    \n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n    \n    float height_21 = t[2].y - t[1].y;\n    for(int y=t[1].y; y<=t[2].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[1].y) / height_21; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[1].x + (int)((t[2].x-t[1].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThis could be enough, but I dislike to see the same code twice. That is why we will make it a bit less readable, but more handy for modifications/maintaining:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    // I dont care about degenerate triangles\n    if(t[0].y == t[1].y && t[1].y == t[2].y)\n        return;\n\n    OrderByY(t);\n\n    float height_10 = t[1].y - t[0].y;\n    float total_height = t[2].y - t[0].y;\n    for(int i=0; i<total_height; i++) {\n        bool second_half = i > t[1].y - t[0].y || t[1].y == t[0].y;\n        float segment_height = second_half ? t[2].y-t[1].y : t[1].y-t[0].y;\n        var alpha = i / total_height;\n        // be careful with divisions by zero\n        var beta = (i - (second_half ? t[1].y-t[0].y : 0)) / segment_height;\n        Vec2i A = new Vec2i {\n            x = t[0].x + (int)((t[2].x-t[0].x)*alpha),\n            y = t[0].y + i\n        };\n        Vec2i B = new Vec2i {\n            x = second_half ? t[1].x + (int)((t[2].x-t[1].x)*beta) : t[0].x + (int)((t[1].x-t[0].x)*beta),\n            y = t[0].y + i\n        };\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, t[0].y + i] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\n# The method I adopt for my code\n\nWhile not being really complicated, the source code for the line sweeping is a bit messy. Moreover, it is really an old-school approach designed for mono-thread CPU programming. Let us take a look at the following pseudo-code:\n\n```csharp\n// triangle(Vec2i[] points) { \n//     Vec2i bbox[2] = find_bounding_box(points); \n//     for (each pixel in the bounding box) { \n//         if (inside(points, pixel)) { \n//             put_pixel(pixel); \n//         } \n//     } \n// }\n```\n\nDo you like it? I do. It is really easy to find a bounding box. It is certainly no problem to check whether a point belongs a 2D triangle (or any convex polygon).\n\n*Off Topic: if I have to implement some code to check whether a point belongs to a polygon, and this program will run on a plane, I will never get on this plane. Turns out, it is a surprisingly difficult task to solve this problem reliably. But here we just painting pixels. I am okay with that.*\n\nThere is another thing I like about this pseudocode: a neophyte in programming accepts it with enthusiasm, more experienced programmers often chuckle: “*What an idiot wrote it?*”. And an expert in computer graphics programming will shrug his shoulders and say: “*Well, that’s how it works in real life*”. Massively parallel computations in thousands of threads (i’m talking about regular consumer computers here) change the way of thinking.\n\nOkay, let us start: first of all we need to know what the [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) are. Given a 2D triangle ABC and a point P, all in old good Cartesian coordinates `(xy)`. Our goal is to find barycentric coordinates of the point P with respect to the triangle ABC. It means that we look for three numbers `(1 − u − v,u,v)` such that we can find the point P as follows:\n\n![ ](./img/lesson2_f1.png)\n\nWhile being a bit frightening at the first glance, it is really simple: imagine that we put three weights `(1−u−v,u,v)` at the vertices A, B and C, respectively. Then the barycenter of the system is exactly in the point P. We can say the same thing with other words: the point P has coordinates `(u,v)` in the (oblique) basis (A,![](./img/lesson2_ab.png),![](./img/lesson2_ac.png)):\n\n![ ](./img/lesson2_f2.png)\n\nSo, we have vectors ![](./img/lesson2_ab.png)￼, ![](./img/lesson2_ac.png)￼ and ![￼](./img/lesson2_ap.png), we need to find two real numbers u and v respecting the following constraint:\n\n![ ](./img/lesson2_f3.png)\n\nIt is a simple vector equation, or a linear system of two equations with two variables:\n\n![ ](./img/lesson2_f4.png)\n\nI am lazy and do not want to solve linear systems in a scholar way. Let us write it in matrix form:\n\n![ ](./img/lesson2_f5.png)\n\nIt means that we are looking for a vector `(u,v,1)` that is orthogonal to `(￼ABx,AC￼x,￼PAx)` and `(￼ABy,AC￼y,PA￼y)` *at the same time*! I hope you see [where I am heading](https://en.wikipedia.org/wiki/Cross_product). That is a small hint: to find an intersection of two straight lines in a plane (that is exactly what we did here), it is sufficient to compute one cross product. By the way, test yourself: how do we find an equation of a line passing through two given points?\n\nSo, let us program our new rasterization routine: we iterate through all pixels of a bounding box for a given triangle. For each pixel we compute its barycentric coordinates. If it has at least one negative component, then the pixel is outside of the triangle. Probably it is more clear to see the program directly:\n\n```csharp\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}\n```\n\n# Flat shading render\n\nWe already know how to draw a model with empty triangles. Let us fill them with a random color. This will help us to see how well we have encoded filling of triangles. Here is the code:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\n// Map world coordinates [-1..-1] to screen coordinates [0..width]\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*image.Width/2),\n    y = (int)((v.y+1)*image.Height/2)\n};\n\nvar rnd = new Random();\nFunc<byte> rndByte = () => (byte)rnd.Next(255);\nFunc<Color> rndColor = () => new Color(rndByte(), rndByte(), rndByte()); \n\nvar coordinates = new Vec3f[3];\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        var v = headModel.Vertices[vIndex];\n        coordinates[i] = map(v);\n    }    \n    Triangle(image, coordinates, rndColor());\n}\n\nimage.VerticalFlip ();\nimage\n```\n\nLet us get rid of these clown-colors and put some lighting. Captain Obvious: ”*At the same light intensity, the polygon is illuminated most brightly when it is orthogonal to the light direction.*”\n\nLet us compare:\n\n![ ](./img/lesson2_light1.jpeg)\n\n![](./img/lesson2_light2.jpeg)\n\nWe get zero illumination if the polygon is parallel to the vector of light. To paraphrase: the intensity of illumination is equal to the scalar product of the light vector and the normal to the given triangle. The normal to the triangle can be calculated simply as the [cross product](https://en.wikipedia.org/wiki/Cross_product) of its two sides.\n\nAs a side note, at this course we will perform linear computations on the colors. However `(128,128,128)` color is not half as bright as `(255, 255, 255)`. We are going to ignore gamma correction and tolerate the incorrectness of the brightness of our colors.\n\n```csharp\nvar image = new Image (width, height, Format.BGR);\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\nforeach (var face in headModel.Faces) {\n    for (int i = 0; i < 3; i++) {\n        var vIndex = face.Vertices [i];\n        world [i] = headModel.Vertices [vIndex];\n        screen [i] = map (world [i]);\n    }\n\n    var n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n    var intensivity = Dot (n, light_dir);\n    if (intensivity > 0)\n        Triangle (image, screen, Color.White * intensivity);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/lesson3.csx",
    "content": "using static Geometry;\n\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nfloat [] InitZBuffer (Image image)\n{\n\tvar zbuffer = new float [image.Width * image.Height];\n\tfor (int idx = 0; idx < zbuffer.Length; idx++)\n\t\tzbuffer [idx] = float.NegativeInfinity;\n\treturn zbuffer;\n}\n\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n\tvar ab = b - a;\n\tvar ac = c - a;\n\tvar pa = a - p;\n\n\tvar r = Cross (new Vec3f {\n\t\tx = ab.x,\n\t\ty = ac.x,\n\t\tz = pa.x\n\t}, new Vec3f {\n\t\tx = ab.y,\n\t\ty = ac.y,\n\t\tz = pa.y\n\t});\n\n\t// triangle is degenerate, in this case return smth with negative coordinates\n\t// dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n\tif ((int)r.z == 0)\n\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\treturn new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n\tVec3f t0 = coordinates [0];\n\tVec3f t1 = coordinates [1];\n\tVec3f t2 = coordinates [2];\n\n\tvar pMax = new Vec2i {\n\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t};\n\tvar pMin = new Vec2i {\n\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t};\n\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\tx = x + 0.5f,\n\t\t\t\ty = y + 0.5f\n\t\t\t};\n\t\t\tvar bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\tcontinue;\n\n\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\tvar u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n\t\t\tvar v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\tzbuffer [idx] = z;\n\n\t\t\t\tvar color = texture [u, v];\n\t\t\t\timage [x, y] = color * intensivity;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson3.workbook/obj/african_head.obj",
    "content": "v -0.000581696 -0.734665 -0.623267\nv 0.000283538 -1 0.286843\nv -0.117277 -0.973564 0.306907\nv -0.382144 -0.890788 0.221243\nv -0.247144 -0.942602 0.276051\nv -0.656078 -0.718512 -0.109025\nv -0.609847 -0.786562 0.0198068\nv -0.66248 -0.632053 -0.244271\nv -0.511812 -0.845392 0.127809\nv -0.609326 -0.569868 -0.41571\nv -0.426949 -0.649767 -0.567143\nv -0.201076 -0.720822 -0.633205\nv 0.117382 -0.973645 0.306766\nv 0.382454 -0.890869 0.221097\nv 0.247512 -0.942667 0.275986\nv 0.656371 -0.718624 -0.109224\nv 0.610273 -0.786562 0.0197893\nv 0.66248 -0.631463 -0.244119\nv 0.511631 -0.845357 0.127832\nv 0.608654 -0.568839 -0.416318\nv 0.424663 -0.649937 -0.567418\nv 0.198972 -0.720968 -0.633141\nv 0.153371 -0.140519 0.477416\nv 0.134781 -0.14723 0.48805\nv 0.131261 -0.132153 0.49872\nv 0.14749 -0.135105 0.489565\nv 0.000686924 -0.0534984 0.505694\nv 0.075062 -0.0473306 0.49955\nv 0.0695841 -0.0997942 0.550277\nv 0.0302569 -0.0971868 0.55389\nv 0.0745124 -0.135953 0.523215\nv 0.0354892 -0.12785 0.535159\nv 0.0389268 -0.109557 0.550558\nv 0.0734835 -0.11538 0.538029\nv 0.106386 -0.125623 0.51513\nv 0.107415 -0.144295 0.5047\nv 0.15968 -0.130861 0.484794\nv 0.156224 -0.123705 0.486735\nv 0.15792 -0.107798 0.4677\nv 0.163784 -0.126996 0.470144\nv 0.154687 -0.134655 0.486373\nv 0.160668 -0.135649 0.476189\nv 0.143433 -0.119034 0.499854\nv 0.131606 -0.0726738 0.476148\nv -0.000260156 -0.124553 0.539058\nv -0.000646004 -0.110651 0.55444\nv 0.100423 -0.10574 0.537643\nv 0.126128 -0.115784 0.515598\nv 0.250944 -0.275583 0.380381\nv 0.221602 -0.335752 0.330174\nv 0.275434 -0.301318 0.24751\nv 0.307699 -0.239869 0.292356\nv 0.332124 -0.0415605 0.412962\nv 0.319444 0.00732526 0.451091\nv 0.28667 -0.025805 0.481549\nv 0.297006 -0.0758717 0.454242\nv 0.357953 -0.159928 -0.223225\nv 0.303981 -0.144611 -0.343644\nv 0.296386 -0.0547553 -0.357792\nv 0.357339 -0.0633433 -0.24278\nv 0.45086 0.331215 0.047962\nv 0.438899 0.336167 0.131147\nv 0.447405 0.226107 0.139349\nv 0.455613 0.205353 0.0827643\nv 0.197493 -0.411308 0.138256\nv 0.204911 -0.353378 0.2082\nv 0.102001 -0.419375 0.24969\nv 0.0995867 -0.475697 0.20834\nv 0.150133 -0.372261 0.431226\nv 0.176423 -0.362054 0.392056\nv 0.196019 -0.326474 0.426929\nv 0.154611 -0.348549 0.463444\nv 0.0892273 -0.391968 0.303592\nv 0.159013 -0.363737 0.305077\nv 0.455712 0.508986 -0.0641442\nv 0.432146 0.648411 -0.0417475\nv 0.417051 0.611568 0.0817295\nv 0.44205 0.483438 0.0478626\nv 0.3446 0.43288 0.398633\nv 0.372358 0.383369 0.353998\nv 0.388341 0.404485 0.306953\nv 0.355059 0.467372 0.356967\nv 0.305162 0.338815 0.458112\nv 0.298579 0.319803 0.456627\nv 0.313422 0.304568 0.427776\nv 0.323711 0.315968 0.429291\nv 0.33161 0.397557 0.430226\nv 0.354427 0.359727 0.390478\nv 0.304162 0.291952 0.432377\nv 0.292662 0.309771 0.452991\nv 0.282934 0.292496 0.4562\nv 0.292025 0.281663 0.435178\nv 0.397344 0.565249 0.192585\nv 0.42257 0.455996 0.145494\nv 0.317848 0.364866 0.448834\nv 0.340595 0.337517 0.417978\nv 0.243227 0.479439 0.494236\nv 0.250155 0.546138 0.465934\nv 0.179019 0.560251 0.511681\nv 0.170173 0.4781 0.536229\nv 0.162386 0.410407 0.547009\nv 0.235031 0.427051 0.517018\nv 0.271745 0.634415 0.42162\nv 0.196896 0.657291 0.472505\nv 0.186589 0.312952 0.511073\nv 0.189518 0.32493 0.514165\nv 0.146286 0.31277 0.509009\nv 0.144959 0.300178 0.501713\nv 0.143965 0.300412 0.49409\nv 0.187203 0.310596 0.506407\nv 0.157744 0.364614 0.528804\nv 0.216697 0.382527 0.516083\nv 0.194441 0.332425 0.515989\nv 0.204286 0.349818 0.516732\nv 0.156254 0.334062 0.519579\nv 0.151565 0.320341 0.513961\nv 0.0431068 0.071791 0.618005\nv 0.0477954 0.0867105 0.593486\nv 0.0780844 0.0816652 0.602518\nv 0.0574124 0.0746147 0.621185\nv 0.448253 0.130656 0.149533\nv 0.431801 0.159355 0.215905\nv 0.422792 0.0771637 0.237185\nv 0.428691 0.0348783 0.166914\nv 0.365073 -0.0526507 0.316126\nv 0.326974 -0.104793 0.373068\nv 0.312773 -0.172965 0.33446\nv 0.368107 -0.126698 0.269222\nv 0.203695 -0.131796 0.523934\nv 0.180463 -0.136479 0.525396\nv 0.182848 -0.14892 0.516989\nv 0.204163 -0.152533 0.514914\nv 0.39379 0.00616771 0.269368\nv 0.40177 -0.0591341 0.209048\nv 0.26083 -0.0996422 0.484274\nv 0.250406 -0.0552171 0.50321\nv 0.15851 -0.136292 0.498474\nv 0.155032 -0.134684 0.502964\nv 0.145006 -0.133819 0.514504\nv 0.171033 -0.12032 0.538263\nv 0.158849 -0.127938 0.534943\nv 0.167969 -0.138075 0.523788\nv 0.232061 -0.151474 0.497024\nv 0.23074 -0.117128 0.507191\nv 0.365798 0.221617 0.362743\nv 0.342501 0.235507 0.392185\nv 0.325951 0.202558 0.415114\nv 0.359268 0.178677 0.383229\nv 0.352369 0.0489033 0.417452\nv 0.322262 0.0907619 0.44953\nv 0.295322 0.04895 0.483251\nv 0.367108 0.00328555 0.369771\nv 0.138972 -0.18796 0.555521\nv 0.161562 -0.177794 0.535913\nv 0.154015 -0.155093 0.536392\nv 0.136131 -0.156414 0.558491\nv 0.220263 -0.08194 0.518603\nv 0.202088 -0.0486753 0.52791\nv 0.17564 -0.0814314 0.545822\nv 0.193131 -0.106435 0.533575\nv 0.199492 -0.169714 0.509722\nv 0.190033 -0.188183 0.514668\nv 0.207302 -0.213011 0.492721\nv 0.222415 -0.183044 0.489617\nv 0.125088 -0.132884 0.551294\nv 0.144497 -0.139192 0.530254\nv 0.135014 0.119128 0.544717\nv 0.119534 0.149685 0.554253\nv 0.096915 0.171211 0.569382\nv 0.112553 0.137432 0.569616\nv 0.0878476 0.217858 0.555667\nv 0.0649773 0.232128 0.568628\nv 0.073466 0.185119 0.584571\nv 0.116359 0.191199 0.548932\nv 0.111419 0.228591 0.524951\nv 0.0858774 0.255408 0.530312\nv 0.301408 0.0368718 -0.387812\nv 0.366839 0.037626 -0.269538\nv 0.272125 -0.199781 0.399533\nv 0.246349 -0.195514 0.453266\nv 0.223339 -0.243049 0.450553\nv 0.364021 -0.197455 0.21335\nv 0.411416 -0.124798 0.140589\nv 0.431568 -0.0028997 0.0907502\nv 0.449346 0.11075 0.0889086\nv 0.0649948 0.777167 0.432594\nv 0.133465 0.770619 0.418569\nv 0.14341 0.869244 0.301253\nv 0.0689586 0.877043 0.315395\nv 0.305372 0.809321 0.22043\nv 0.289307 0.723856 0.335524\nv 0.355187 0.660735 0.264773\nv 0.372264 0.728258 0.148528\nv 0.382308 0.7766 0.0116631\nv 0.0971488 0.470588 0.557912\nv 0.110788 0.565185 0.534317\nv 0.100113 0.277828 0.510938\nv 0.10966 0.248679 0.503771\nv 0.0443988 0.240822 0.58581\nv 0.0522151 0.193614 0.604337\nv 0.052601 0.564735 0.541859\nv 0.123726 0.667896 0.498907\nv 0.0597976 0.671147 0.508711\nv 0.0466729 0.466215 0.561034\nv 0.000423846 0.462807 0.558988\nv -0.00017831 0.388326 0.563478\nv 0.0352086 0.389069 0.560584\nv 0.000833078 0.56384 0.544139\nv 0.295773 0.426823 0.470722\nv 0.301706 0.464689 0.451056\nv 0.189957 0.181465 0.501181\nv 0.186163 0.208931 0.491956\nv 0.141574 0.222722 0.500509\nv 0.146526 0.195338 0.518293\nv 0.111986 0.0116865 0.562811\nv 0.111343 0.0404672 0.565769\nv 0.0577164 0.0420398 0.577988\nv 0.0656438 -0.00796249 0.596918\nv 0.147695 0.0440509 0.537258\nv 0.144778 0.0631738 0.538491\nv 0.0268719 -0.0140834 0.602378\nv 0.0270356 -0.0372401 0.622027\nv 0.0876429 -0.0456996 0.601127\nv 0.183093 0.146552 0.519439\nv 0.148589 0.164593 0.536819\nv 0.147344 0.131095 0.542934\nv 0.176733 0.112264 0.532435\nv -0.000394618 -0.0441035 0.617625\nv -0.000260156 -0.0187662 0.600677\nv 0.165058 0.0770935 0.530856\nv 0.148554 0.0982976 0.535562\nv 0.116476 0.272829 0.494797\nv 0.119084 0.26261 0.493569\nv 0.120873 0.268971 0.480883\nv 0.11761 0.27287 0.484221\nv 0.224695 0.848444 0.271198\nv 0.231324 0.918189 0.121063\nv 0.14614 0.9439 0.150241\nv 0.241894 0.945736 -0.185803\nv 0.156043 0.976475 -0.183418\nv 0.146906 0.980702 -0.0177607\nv 0.23195 0.948285 -0.0402158\nv 0.0684324 0.995189 -0.00981573\nv 0.0682103 0.955014 0.162933\nv 0.0891571 0.383649 0.555118\nv 0.110613 0.336412 0.528863\nv 0.122749 0.310759 0.512914\nv 0.147081 -0.111919 0.55631\nv 0.158656 -0.0994551 0.55786\nv 0.0939743 0.0869969 0.616333\nv 0.101206 0.119326 0.615532\nv 0.0670469 0.122121 0.645885\nv 0.0560853 0.0831385 0.640601\nv 0.0795284 0.0820978 0.567845\nv 0.0337354 0.0564741 0.595059\nv 0.0854448 -0.103577 0.606979\nv 0.0826211 -0.0671141 0.612931\nv 0.0280704 -0.0555854 0.637736\nv 0.0319698 -0.0970874 0.628212\nv 0.0789964 -0.121811 0.579602\nv 0.0327415 -0.116959 0.594106\nv 0.0216981 0.0173339 0.585915\nv -0.00123062 -0.095585 0.625704\nv -0.000511542 -0.0598999 0.637227\nv -0.00157555 -0.115643 0.593966\nv -0.000219233 -0.0988881 0.554498\nv 0.0291929 0.0853015 0.665324\nv 0.0352671 0.124524 0.666125\nv 0.0371846 0.159004 0.648446\nv 0.0654158 0.154462 0.629171\nv 0.0280178 0.19967 0.620548\nv 0.0221015 0.245843 0.59797\nv 0.0432997 0.281499 0.556866\nv 0.0222008 0.28717 0.567459\nv -0.000400465 0.125745 0.673871\nv -0.00057585 0.0822265 0.675105\nv -0.000347849 0.160916 0.656029\nv 0.367195 0.315074 0.363767\nv 0.346658 0.302744 0.393991\nv 0.344389 0.266656 0.384439\nv 0.371726 0.266504 0.352507\nv 0.40246 0.429197 0.234116\nv 0.422126 0.335763 0.207276\nv 0.393316 0.264083 0.313887\nv 0.387102 0.325737 0.325369\nv 0.3274 0.295928 0.408636\nv 0.316392 0.29076 0.418709\nv 0.3085 0.274624 0.423199\nv 0.323636 0.272379 0.406602\nv 0.429381 0.244458 0.204002\nv 0.407084 0.332408 0.277313\nv 0.410597 0.257869 0.266264\nv -0.0012657 -0.456867 0.290093\nv -0.00137093 -0.520579 0.266159\nv 0.154137 -0.304206 0.500479\nv 0.193482 -0.282873 0.473493\nv 0.186367 -0.242201 0.509588\nv 0.148993 -0.26399 0.525367\nv 0.110332 -0.274916 0.545857\nv 0.099347 -0.233134 0.560204\nv 0.0558865 -0.227615 0.569605\nv 0.0659185 -0.270006 0.563817\nv 0.154687 -0.142577 0.51838\nv 0.159498 -0.143009 0.513072\nv 0.154646 -0.138239 0.502496\nv 0.149045 -0.137596 0.50639\nv 0.15958 -0.138174 0.517463\nv 0.161574 -0.141559 0.511657\nv 0.0940387 -0.129288 0.582226\nv 0.109215 -0.12609 0.531844\nv 0.0782715 -0.117578 0.557129\nv 0.264817 0.0151299 0.501573\nv 0.280122 0.127096 0.47057\nv 0.262508 0.0886748 0.494464\nv 0.187613 0.050926 0.529248\nv 0.207829 0.0868157 0.523449\nv 0.231821 -0.0170182 0.518246\nv 0.304138 0.164985 0.443485\nv 0.343004 0.132813 0.418235\nv 0.313621 0.250742 0.418382\nv 0.290815 0.22492 0.444303\nv 0.355269 -0.194146 0.0276407\nv 0.388534 -0.179618 0.0746089\nv 0.336544 -0.25083 0.156379\nv 0.29365 -0.279868 0.104617\nv 0.389288 0.153006 0.345258\nv 0.39155 0.205715 0.320166\nv 0.127262 0.566927 -0.64996\nv 0.000868155 0.562946 -0.661419\nv 0.000850617 0.724441 -0.605705\nv 0.118774 0.725955 -0.596105\nv 0.21095 0.754513 0.387525\nv 0.133734 -0.133188 0.514651\nv 0.131302 -0.13393 0.53047\nv 0.0671053 -0.326445 0.551902\nv 0.0661056 -0.374553 0.504765\nv 0.117289 -0.365439 0.489939\nv 0.116552 -0.318792 0.528974\nv 0.288249 -0.135286 0.424736\nv 0.39393 0.0544045 0.33225\nv 0.374655 0.0965379 0.38044\nv 0.000792155 1 -0.0074948\nv 0.0731795 0.993937 -0.182792\nv 0.000868155 0.999152 -0.181886\nv 0.179405 0.936399 -0.330549\nv 0.0842755 0.953459 -0.338026\nv 0.141767 0.271455 0.486238\nv 0.139978 0.267433 0.490862\nv 0.175908 0.259465 0.501362\nv 0.175312 0.263359 0.495861\nv 0.181597 0.230187 0.495539\nv 0.140253 0.240576 0.495341\nv 0.336982 0.587763 0.356927\nv 0.312043 0.518258 0.416183\nv 0.259971 0.350203 0.495411\nv 0.250763 0.331028 0.496036\nv 0.114179 0.255893 0.495902\nv 0.111069 0.276518 0.499456\nv 0.125433 0.293116 0.500415\nv 0.124965 0.282353 0.489968\nv 0.13906 0.254928 0.497457\nv 0.17737 0.2462 0.50062\nv 0.121796 0.272327 0.47658\nv 0.149548 0.0847578 0.549377\nv 0.142825 -0.226381 0.544992\nv 0.106181 -0.197232 0.576871\nv 0.258193 -0.146669 0.465227\nv 0.2105 0.0188071 0.525711\nv 0.181041 -0.0155508 0.531721\nv 0.173453 -0.168949 0.5218\nv 0.180322 -0.15877 0.514949\nv 0.168554 -0.150118 0.516667\nv 0.163082 -0.153579 0.523344\nv 0.139124 -0.128733 0.545343\nv 0.152348 -0.134468 0.527471\nv 0.416192 -0.0714636 0.0335278\nv 0.0220956 0.0520719 0.640232\nv 0.0361615 0.0619695 0.628476\nv -0.000283541 0.202056 0.62768\nv 0.0869063 -0.0493125 -0.489641\nv 0.192289 -0.0534399 -0.447186\nv 0.192003 -0.134672 -0.429197\nv 0.0851642 -0.130335 -0.46373\nv 0.236434 0.310245 0.495686\nv 0.237714 0.31211 0.497539\nv 0.244636 0.32534 0.496212\nv 0.121253 0.281932 0.477293\nv 0.173149 -0.207241 0.528208\nv -0.000242618 0.247989 0.603612\nv -0.00037708 0.28838 0.571697\nv 0.108496 -0.160507 0.588207\nv 0.0613995 -0.166388 0.620127\nv 0.0634222 -0.199565 0.59462\nv 0.0893734 0.151176 0.600127\nv 0.122124 0.0729427 0.596088\nv 0.0993528 0.072475 0.584781\nv 0.108315 0.0599584 0.583916\nv 0.133524 0.0551528 0.575778\nv 0.13315 0.107517 0.580426\nv 0.274937 0.384257 0.485735\nv 0.170606 -0.145383 0.517205\nv 0.0464391 -0.130399 0.611931\nv 0.0392892 -0.113439 0.575094\nv -0.00161647 -0.112428 0.579865\nv -0.00351648 -0.131685 0.617859\nv 0.0194356 0.03489 0.601858\nv -0.000564158 0.0478802 0.644208\nv -2.04632e-05 0.0350303 0.598835\nv 0.222163 0.246884 0.4972\nv 0.217802 0.257547 0.498129\nv 0.293159 0.278716 0.430419\nv 0.302852 0.281932 0.427367\nv 0.285209 0.277366 0.434932\nv 0.289307 0.275834 0.436551\nv 0.290061 0.280494 0.427963\nv -0.000225079 -0.384287 0.444245\nv 0.0651001 -0.383883 0.440585\nv -0.000891543 -0.364076 0.502426\nv 0.116576 -0.381784 0.436341\nv 0.363734 0.712842 -0.467571\nv 0.32166 0.832542 -0.392653\nv 0.376508 0.821429 -0.265451\nv 0.427095 0.698004 -0.319575\nv 0.27178 0.90956 -0.29643\nv 0.310423 0.901357 -0.210644\nv 0.441869 0.677005 -0.175175\nv 0.389019 0.807076 -0.128411\nv 0.313311 0.894506 -0.0788532\nv 0.12783 -0.376125 0.378248\nv 0.0722266 -0.391483 0.37664\nv 0.125579 0.302411 0.505741\nv 0.101656 0.861358 -0.486525\nv 0.214084 0.849981 -0.463327\nv 0.2467 0.723207 -0.559263\nv 0.104913 0.117397 -0.600268\nv 0.221579 0.117865 -0.555159\nv 0.200848 0.0268164 -0.488992\nv 0.0944011 0.0271204 -0.539134\nv 0.391141 0.144178 -0.303545\nv 0.331241 0.130393 -0.444613\nv 0.360829 0.250357 -0.491155\nv 0.424003 0.258021 -0.333419\nv 0.000868155 0.23912 -0.655479\nv 0.00089154 0.393909 -0.675105\nv 0.125626 0.397949 -0.664716\nv 0.115418 0.240453 -0.645617\nv 0.452175 0.547687 -0.348309\nv 0.450217 0.395605 -0.350776\nv 0.383015 0.40193 -0.511868\nv 0.3854 0.562496 -0.506472\nv 0.464078 0.52881 -0.195929\nv 0.311698 0.866351 0.071908\nv -9.64635e-05 -0.406882 0.376985\nv 0.373883 -0.18312 -0.115123\nv 0.389189 -0.0789467 -0.141776\nv 0.247109 0.197607 0.47589\nv 0.22891 0.231497 0.489717\nv 0.121077 -0.116725 0.574393\nv 0.125626 -0.0895459 0.583057\nv 0.110548 -0.128452 0.555428\nv 0.000710309 0.959638 0.167019\nv 0.000710309 0.881206 0.320973\nv 0.224163 0.124079 0.505215\nv 0.255305 0.260798 0.480649\nv 0.25188 0.263516 0.478322\nv 0.214891 0.26119 0.49413\nv 0.116476 0.273741 0.475423\nv 0.290704 0.283902 0.433377\nv 0.29641 0.299523 0.422813\nv 0.29406 0.288222 0.418078\nv 0.142655 0.263364 0.482467\nv 0.121638 0.267831 0.470296\nv 0.171711 0.256898 0.489693\nv 0.246864 0.257401 0.473821\nv 0.274311 0.271648 0.453301\nv 0.274539 0.26862 0.446654\nv 0.233686 0.331104 0.49074\nv 0.187548 0.326632 0.49682\nv 0.296971 0.273928 0.433476\nv 0.134067 -0.0744861 0.577333\nv 0.237434 0.052867 0.514604\nv 0.0637905 0.27076 0.54346\nv 0.375421 0.514218 0.287328\nv 0.353808 -0.333437 -0.190615\nv 0.349365 -0.276331 -0.333858\nv 0.323337 -0.214946 -0.338453\nv 0.356725 -0.247925 -0.205557\nv -0.000330311 -0.581268 0.237302\nv 0.092922 -0.548418 0.185458\nv 0.394783 -0.0876049 -0.0664009\nv 0.358315 -0.197624 -0.02995\nv 0.292785 -0.321493 0.0377429\nv 0.395175 -0.0904345 -0.0143524\nv 0.243385 0.243183 -0.602957\nv 0.000587539 -0.0451091 -0.498205\nv 0.000751232 0.030862 -0.55154\nv 0.000809694 0.11928 -0.61144\nv 0.000850617 0.862837 -0.491295\nv 0.000868155 0.958527 -0.339277\nv 0.000423846 -0.128189 -0.469085\nv 0.264186 0.56961 -0.608026\nv 0.35127 -0.283317 -0.0863656\nv 0.196201 -0.209591 -0.418785\nv 0.0873097 -0.206341 -0.44839\nv 0.000488154 -0.206259 -0.449945\nv 0.263397 0.402579 -0.621226\nv 0.456683 0.384813 -0.0591516\nv 0.457776 0.372302 -0.191281\nv 0.000850617 0.671351 0.512487\nv 0.000809694 0.77919 0.437668\nv 0.408656 0.116286 0.298547\nv 0.295913 0.259781 0.439334\nv 0.285355 0.265481 0.449775\nv 0.278766 0.270035 0.454663\nv 0.128946 -0.0227065 0.564741\nv 0.16203 0.016989 0.534633\nv 0.0985987 0.0583799 0.58087\nv 0.0538462 0.323165 0.543729\nv 0.0794758 0.301522 0.528465\nv -0.00330601 -0.197759 0.600525\nv -0.000511542 -0.225551 0.572931\nv -0.00456879 -0.164231 0.628277\nv -0.000336157 -0.26392 0.574381\nv -0.000768774 -0.325515 0.55686\nv 0.269921 0.242499 0.464742\nv 0.260573 0.253022 0.476072\nv 0.235066 0.15963 0.493271\nv 0.411369 0.186119 0.273583\nv 0.000178307 0.0131539 0.584682\nv 0.153436 -0.0554568 0.55786\nv 0.0264569 0.331747 0.554112\nv -0.000342003 0.332998 0.557743\nv 0.285589 0.277974 0.428156\nv 0.184795 -0.499655 0.1217\nv 0.332808 -0.386298 -0.0699261\nv 0.20739 -0.274419 -0.415909\nv 0.0927467 -0.274308 -0.43723\nv 0.278029 -0.438791 0.0475586\nv 0.000505693 -0.27722 -0.43768\nv 0.438191 0.12488 -0.0367783\nv 0.460214 0.163208 -0.055258\nv 0.485388 0.177437 -0.0277343\nv 0.472304 0.161641 -0.00367724\nv 0.496244 0.232684 -0.0170708\nv 0.477425 0.247036 0.00446648\nv 0.517015 0.298681 -0.0523876\nv 0.492233 0.31788 -0.0441737\nv 0.53425 0.316407 -0.124009\nv 0.511491 0.332595 -0.129276\nv 0.535904 0.290111 -0.170685\nv 0.511128 0.30365 -0.186838\nv 0.538611 0.228878 -0.193017\nv 0.511286 0.231199 -0.218992\nv 0.520242 0.128838 -0.191421\nv 0.490433 0.122168 -0.208603\nv 0.487562 0.00951757 -0.0819458\nv 0.472286 -0.00658864 -0.0930419\nv 0.47079 0.0399937 -0.154257\nv 0.496437 0.0472722 -0.136917\nv 0.485142 -0.0247586 -0.0238758\nv 0.46129 -0.0429694 -0.0334343\nv 0.474888 0.238927 -0.0419989\nv 0.495232 0.289088 -0.0628581\nv 0.508398 0.299996 -0.11766\nv 0.51311 0.283323 -0.158478\nv 0.514642 0.235303 -0.176531\nv 0.501751 0.136134 -0.181559\nv 0.486025 0.0533522 -0.11859\nv 0.486451 0.0268164 -0.067155\nv 0.482529 0.0136625 -0.0120607\nv 0.464265 0.0280383 0.0249515\nv 0.457519 -0.0185791 0.0196256\nv 0.442769 0.0582571 -0.0293244\nv 0.45632 0.0847169 -0.0600578\nv 0.442465 0.0842785 -0.0209644\nv 0.459612 0.268106 0.0209995\nv 0.458559 0.182857 0.0414318\nv 0.463026 0.318488 -0.0446005\nv 0.470222 0.311835 -0.142898\nv 0.455063 0.232836 -0.195221\nv 0.43839 0.13186 -0.191088\nv 0.424564 0.0473131 -0.148417\nv 0.423447 -0.00471202 -0.0897563\nv 0.425377 -0.0292075 -0.0262143\nv 0.430714 -0.0102191 0.0297161\nv 0.446335 0.0345567 0.0460036\nv 0.475607 0.129364 -0.0864649\nv 0.482611 0.0600636 -0.0525396\nv 0.481517 0.0827175 -0.101349\nv 0.470503 0.0444835 -0.0133527\nv 0.479278 0.0776957 0.00471786\nv 0.504692 0.223938 -0.101723\nv 0.50375 0.131866 -0.1473\nv 0.45452 0.100016 0.0450097\nv 0.403623 0.0251386 -0.16934\nv 0.414719 0.138607 -0.218957\nv 0.435461 0.249632 -0.229924\nv -0.000201695 -0.407876 0.310666\nv 0.000347846 -0.171521 0.505794\nv 0.0884205 -0.186598 0.484028\nv 0.141147 -0.173807 0.465513\nv 0.159878 -0.142255 0.458644\nv 0.152483 -0.116468 0.431278\nv 0.0708352 0.0121893 0.376371\nv 0.128069 -0.116368 0.360528\nv 0.143994 -0.166791 0.41184\nv 0.0748398 -0.218144 0.372349\nv 0.280941 0.292858 0.454897\nv 0.281356 0.319879 0.451494\nv 0.127268 0.269088 0.455435\nv 0.116921 0.284697 0.447653\nv 0.119996 0.274998 0.469126\nv 0.15699 0.254759 0.466326\nv 0.265916 0.273601 0.421176\nv 0.214885 0.253946 0.455259\nv 0.141223 0.313133 0.482117\nv 0.211436 0.255823 0.486852\nv 0.277135 0.302686 0.410799\nv 0.252505 0.333881 0.433599\nv 0.202023 0.342182 0.464578\nv 0.11989 0.295816 0.471196\nv 0.146526 0.322539 0.455943\nv 0.126292 0.301838 0.454973\nv 0.119744 0.284878 0.469419\nv 0.00103185 0.0191579 0.374711\nv 0.000909079 -0.205715 0.379849\nv 0.0536357 -0.100847 0.27211\nv 0.00103185 -0.098929 0.27128\nv 0.255463 -0.398733 -0.446098\nv 0.412907 -0.372688 -0.332858\nv 0.452596 -0.41557 -0.353559\nv 0.293329 -0.465367 -0.476007\nv 0.0815337 -0.637104 0.176286\nv 0.0726358 -0.738524 0.179519\nv 0.174763 -0.714911 0.155526\nv 0.172032 -0.601823 0.129884\nv 0.380782 -0.504069 -0.184377\nv 0.357368 -0.419095 -0.180384\nv 0.337538 -0.494803 -0.0548371\nv 0.372989 -0.619402 -0.0373571\nv 0.453578 -0.652661 -0.0939539\nv 0.452351 -0.545892 -0.196981\nv 0.173576 -0.814197 0.195654\nv 0.0739044 -0.845866 0.20734\nv 0.0964414 -0.904976 0.254455\nv 0.197703 -0.864562 0.243353\nv 0.519564 -0.487407 -0.384801\nv 0.555004 -0.584226 -0.219366\nv 0.451357 -0.731555 -0.0215899\nv 0.382594 -0.74824 0.0443666\nv 0.439805 -0.799196 0.0975376\nv 0.519108 -0.768071 -0.00769357\nv 0.274837 -0.806199 0.115503\nv 0.320508 -0.838061 0.183769\nv 0.354533 -0.544232 -0.525256\nv 0.162503 -0.604343 -0.559076\nv 0.131098 -0.496837 -0.498761\nv 0.115161 -0.410103 -0.457756\nv -0.00017831 -0.492774 -0.504192\nv 2.046e-05 -0.40666 -0.465186\nv -0.000482311 -0.600531 -0.555322\nv 0.546217 -0.696736 -0.117257\nv 0.22746 -0.332063 -0.424345\nv 0.101627 -0.33885 -0.437002\nv 0.280193 -0.554165 0.0658922\nv 0.274843 -0.684891 0.0781517\nv 0.000347846 -0.34199 -0.438165\nv 0.000733693 -0.746364 0.176765\nv 0.000312769 -0.874904 0.179121\nv 0.378648 -0.322586 -0.326994\nv -0.000114002 -0.940246 0.234262\nv 0.000979233 -0.650317 0.207112\nv -0.130513 -0.13217 0.498924\nv -0.133687 -0.14723 0.488109\nv -0.15222 -0.140519 0.477457\nv -0.14666 -0.13514 0.489746\nv -0.0697653 -0.0999404 0.550318\nv -0.0736414 -0.0473131 0.499649\nv -0.0305784 -0.0972511 0.55389\nv -0.0396517 -0.109762 0.550014\nv -0.0358517 -0.127727 0.53534\nv -0.0742493 -0.135994 0.523315\nv -0.0733373 -0.115561 0.537643\nv -0.106766 -0.144336 0.504823\nv -0.106281 -0.125786 0.515779\nv -0.156505 -0.107798 0.467782\nv -0.155611 -0.123682 0.486899\nv -0.159311 -0.130796 0.484958\nv -0.162872 -0.126996 0.470243\nv -0.159919 -0.135625 0.47627\nv -0.154055 -0.134696 0.486513\nv -0.142597 -0.118993 0.499994\nv -0.130051 -0.0726738 0.476189\nv -0.10054 -0.105798 0.538111\nv -0.125684 -0.115824 0.51596\nv -0.274604 -0.301394 0.247527\nv -0.220831 -0.335775 0.330215\nv -0.250102 -0.275554 0.380393\nv -0.3066 -0.239804 0.292309\nv -0.284302 -0.0258401 0.479772\nv -0.319479 0.00809111 0.449577\nv -0.331873 -0.0412272 0.412243\nv -0.293674 -0.0747667 0.452418\nv -0.294668 -0.0547787 -0.357622\nv -0.302063 -0.144319 -0.34334\nv -0.356012 -0.159916 -0.223184\nv -0.355474 -0.0633082 -0.24271\nv -0.447241 0.22613 0.139332\nv -0.437922 0.336149 0.131124\nv -0.449486 0.331215 0.047962\nv -0.454982 0.205353 0.0827818\nv -0.103311 -0.419241 0.249936\nv -0.203701 -0.353384 0.208147\nv -0.196966 -0.411506 0.138841\nv -0.101797 -0.475733 0.208638\nv -0.196499 -0.327216 0.427455\nv -0.176283 -0.362363 0.392138\nv -0.150331 -0.372548 0.431378\nv -0.155575 -0.349484 0.46435\nv -0.0890109 -0.391945 0.303855\nv -0.158306 -0.363848 0.305182\nv -0.415613 0.611627 0.0817705\nv -0.430808 0.648493 -0.0417066\nv -0.45411 0.508986 -0.0641209\nv -0.440308 0.483438 0.0478393\nv -0.389808 0.40462 0.306977\nv -0.375935 0.38348 0.354021\nv -0.34643 0.433026 0.398499\nv -0.354807 0.467378 0.356891\nv -0.317409 0.30382 0.429121\nv -0.30173 0.320499 0.456861\nv -0.309295 0.339493 0.457756\nv -0.328406 0.316144 0.429519\nv -0.358297 0.360101 0.389344\nv -0.335684 0.397733 0.427864\nv -0.285156 0.29304 0.457387\nv -0.294212 0.310695 0.451757\nv -0.307675 0.294425 0.430781\nv -0.29475 0.281949 0.435698\nv -0.421091 0.455996 0.145494\nv -0.395403 0.565208 0.19252\nv -0.321999 0.364421 0.449238\nv -0.345494 0.336792 0.417218\nv -0.178165 0.560672 0.512335\nv -0.249354 0.546354 0.466589\nv -0.243286 0.479638 0.494943\nv -0.170168 0.4781 0.536796\nv -0.164123 0.410647 0.547114\nv -0.236966 0.427297 0.516007\nv -0.270669 0.634748 0.422187\nv -0.195815 0.657882 0.47347\nv -0.14597 0.313039 0.508126\nv -0.18946 0.324971 0.513312\nv -0.186823 0.312829 0.511757\nv -0.144895 0.300213 0.501871\nv -0.186911 0.310514 0.506612\nv -0.143462 0.300341 0.494353\nv -0.160048 0.365076 0.528073\nv -0.219468 0.382854 0.516404\nv -0.15782 0.334506 0.520076\nv -0.205952 0.349935 0.517012\nv -0.195236 0.332495 0.516264\nv -0.151653 0.320785 0.513142\nv -0.0805691 0.0827468 0.603261\nv -0.0493739 0.08878 0.593591\nv -0.0448723 0.0732117 0.617958\nv -0.0594819 0.0761932 0.621314\nv -0.422927 0.0771812 0.237185\nv -0.432205 0.159355 0.215905\nv -0.448112 0.130656 0.149516\nv -0.4282 0.0348607 0.166897\nv -0.311779 -0.172912 0.334378\nv -0.324787 -0.103758 0.371735\nv -0.364851 -0.052639 0.316097\nv -0.367254 -0.126698 0.269146\nv -0.183918 -0.149136 0.51793\nv -0.182024 -0.137865 0.527822\nv -0.205163 -0.131463 0.524127\nv -0.205514 -0.152071 0.514943\nv -0.39379 0.00614433 0.269368\nv -0.400951 -0.0591282 0.208995\nv -0.261011 -0.0993382 0.483865\nv -0.25102 -0.0551177 0.50328\nv -0.158849 -0.136444 0.499199\nv -0.155155 -0.134784 0.503397\nv -0.145304 -0.133848 0.514902\nv -0.160802 -0.128394 0.536919\nv -0.173424 -0.121349 0.541327\nv -0.169156 -0.138478 0.524928\nv -0.232096 -0.116964 0.50767\nv -0.232727 -0.151188 0.49696\nv -0.326085 0.202611 0.415651\nv -0.34094 0.235683 0.392156\nv -0.367727 0.221336 0.359031\nv -0.358829 0.177595 0.3841\nv -0.295603 0.0501836 0.478632\nv -0.32232 0.0902006 0.449922\nv -0.351843 0.04895 0.416686\nv -0.367248 0.00336155 0.369624\nv -0.156137 -0.154941 0.536878\nv -0.165134 -0.177028 0.538193\nv -0.144573 -0.187364 0.558725\nv -0.140533 -0.155882 0.559046\nv -0.17761 -0.0804258 0.547933\nv -0.201667 -0.0484356 0.526945\nv -0.22024 -0.0817529 0.517585\nv -0.195826 -0.106131 0.536439\nv -0.207794 -0.213087 0.493049\nv -0.191711 -0.188305 0.515551\nv -0.201111 -0.170071 0.510745\nv -0.223385 -0.183243 0.490178\nv -0.128595 -0.132761 0.551212\nv -0.145777 -0.139513 0.530605\nv -0.0971664 0.171538 0.569909\nv -0.120048 0.150182 0.555387\nv -0.13557 0.119437 0.545004\nv -0.113103 0.137432 0.569453\nv -0.0653573 0.232432 0.569575\nv -0.08745 0.217992 0.556468\nv -0.0739395 0.185388 0.584933\nv -0.0855266 0.255554 0.53095\nv -0.110583 0.228714 0.525501\nv -0.115915 0.191404 0.5495\nv -0.300099 0.0366964 -0.387999\nv -0.364734 0.0377897 -0.269357\nv -0.223181 -0.243207 0.45081\nv -0.246139 -0.195666 0.45347\nv -0.271201 -0.199869 0.399446\nv -0.362846 -0.197443 0.213286\nv -0.410176 -0.124757 0.140565\nv -0.430404 -0.00290555 0.0907385\nv -0.448779 0.11075 0.0889086\nv -0.142135 0.869847 0.301633\nv -0.132167 0.771303 0.419317\nv -0.0633989 0.777407 0.43288\nv -0.0675789 0.877324 0.315577\nv -0.353469 0.660735 0.264732\nv -0.2875 0.723792 0.335465\nv -0.30353 0.809117 0.220313\nv -0.37099 0.728422 0.148627\nv -0.381016 0.776764 0.0117274\nv -0.0996744 0.472587 0.557146\nv -0.109525 0.565325 0.53475\nv -0.100294 0.277787 0.511248\nv -0.108689 0.248457 0.503268\nv -0.0528874 0.193947 0.604898\nv -0.0453926 0.241125 0.586705\nv -0.12255 0.668732 0.500514\nv -0.0511336 0.564922 0.542589\nv -0.0582191 0.671655 0.50974\nv -0.0440363 0.465776 0.561151\nv -0.0361966 0.388923 0.562367\nv -0.301894 0.466338 0.448542\nv -0.295831 0.424807 0.472166\nv -0.140867 0.22264 0.499754\nv -0.185742 0.209381 0.492394\nv -0.186338 0.179495 0.502724\nv -0.145859 0.19535 0.519018\nv -0.0600022 0.0437294 0.578309\nv -0.113337 0.0407946 0.564875\nv -0.114196 0.0121659 0.564255\nv -0.0686019 -0.00676987 0.598064\nv -0.143661 0.0637116 0.537807\nv -0.147607 0.0440217 0.535469\nv -0.0907706 -0.0459919 0.600525\nv -0.0300113 -0.0346152 0.623594\nv -0.028047 -0.0138554 0.603173\nv -0.148028 0.131527 0.5437\nv -0.148519 0.164868 0.537322\nv -0.183164 0.146873 0.520193\nv -0.176978 0.112363 0.532908\nv -0.147823 0.0979234 0.535574\nv -0.165064 0.0766492 0.532955\nv -0.120107 0.268649 0.480825\nv -0.118558 0.262394 0.493353\nv -0.115979 0.27287 0.494434\nv -0.116476 0.272952 0.483859\nv -0.229115 0.916634 0.120496\nv -0.223379 0.848952 0.271461\nv -0.145146 0.945128 0.150709\nv -0.145409 0.980883 -0.0176788\nv -0.154278 0.976311 -0.1834\nv -0.240088 0.945514 -0.185786\nv -0.230512 0.948548 -0.0401515\nv -0.0669533 0.995411 -0.00979819\nv -0.0669124 0.955581 0.163097\nv -0.0891746 0.383199 0.554861\nv -0.112226 0.336757 0.527307\nv -0.123381 0.311174 0.513382\nv -0.149484 -0.111966 0.558549\nv -0.160264 -0.0991219 0.559216\nv -0.0695139 0.122828 0.646821\nv -0.103574 0.1197 0.616608\nv -0.0967747 0.0873945 0.617683\nv -0.0583127 0.0845006 0.640951\nv -0.0810075 0.0824603 0.567973\nv -0.0347818 0.058339 0.594989\nv -0.031812 -0.0520134 0.636181\nv -0.0876079 -0.0656701 0.61341\nv -0.0905251 -0.101683 0.607529\nv -0.0378686 -0.0937434 0.629054\nv -0.0836617 -0.122507 0.579642\nv -0.0385351 -0.11728 0.594673\nv -0.0223295 0.0177081 0.586652\nv -0.0307538 0.0864766 0.665646\nv -0.0369098 0.125196 0.667078\nv -0.0659946 0.154643 0.629212\nv -0.0379446 0.159028 0.648136\nv -0.0287544 0.19984 0.620642\nv -0.0228205 0.245931 0.598298\nv -0.0444456 0.281523 0.558544\nv -0.0233467 0.287164 0.569581\nv -0.348774 0.267521 0.384632\nv -0.352083 0.30296 0.39367\nv -0.371253 0.315308 0.363077\nv -0.374871 0.266369 0.352501\nv -0.422202 0.335746 0.207253\nv -0.401928 0.429197 0.234116\nv -0.395345 0.264083 0.313998\nv -0.391071 0.32586 0.325679\nv -0.312703 0.275793 0.421661\nv -0.320315 0.291642 0.417107\nv -0.332077 0.295173 0.409057\nv -0.327599 0.271742 0.406824\nv -0.429802 0.244434 0.203979\nv -0.409282 0.332454 0.277442\nv -0.411848 0.257886 0.266369\nv -0.187414 -0.242265 0.510307\nv -0.193763 -0.283183 0.474066\nv -0.155254 -0.304954 0.501777\nv -0.149998 -0.264183 0.526518\nv -0.0567108 -0.227311 0.569523\nv -0.101124 -0.233508 0.561461\nv -0.11039 -0.27508 0.546021\nv -0.066205 -0.270351 0.564711\nv -0.154225 -0.138052 0.502391\nv -0.159867 -0.142787 0.513271\nv -0.15533 -0.142366 0.518626\nv -0.148566 -0.137426 0.506285\nv -0.160416 -0.138344 0.518258\nv -0.161965 -0.141513 0.511996\nv -0.110811 -0.126394 0.533276\nv -0.10089 -0.129879 0.583501\nv -0.0809374 -0.117865 0.558397\nv -0.263876 0.014785 0.500935\nv -0.26083 0.088932 0.49537\nv -0.279702 0.127055 0.470506\nv -0.207764 0.0867397 0.523776\nv -0.187729 0.0509786 0.529558\nv -0.232096 -0.0167025 0.518065\nv -0.344056 0.133304 0.417078\nv -0.302046 0.166376 0.445239\nv -0.292551 0.225429 0.44414\nv -0.316041 0.250468 0.418475\nv -0.335386 -0.250836 0.156385\nv -0.387207 -0.179618 0.074568\nv -0.353755 -0.194151 0.0276524\nv -0.292388 -0.279891 0.104617\nv -0.392211 0.205733 0.320201\nv -0.386651 0.150025 0.344942\nv -0.126064 0.567371 -0.651942\nv -0.117096 0.725914 -0.596082\nv -0.209068 0.754227 0.387245\nv -0.134091 -0.133281 0.515294\nv -0.132384 -0.133778 0.530774\nv -0.118289 -0.366228 0.490722\nv -0.0673742 -0.375085 0.505343\nv -0.0685259 -0.327012 0.553422\nv -0.117722 -0.319453 0.530388\nv -0.287793 -0.13528 0.424643\nv -0.375234 0.0965671 0.380457\nv -0.394351 0.054463 0.33218\nv -0.0714373 0.993797 -0.182751\nv -0.0825568 0.953558 -0.338084\nv -0.177458 0.935674 -0.330221\nv -0.176961 0.259482 0.501637\nv -0.139651 0.267463 0.490903\nv -0.141176 0.271537 0.486156\nv -0.175792 0.263446 0.495797\nv -0.139621 0.240295 0.49489\nv -0.181918 0.230053 0.49499\nv -0.335299 0.587722 0.356851\nv -0.311189 0.51838 0.416464\nv -0.263028 0.350391 0.495528\nv -0.252435 0.331198 0.496568\nv -0.111168 0.276448 0.500608\nv -0.113553 0.255671 0.49582\nv -0.124754 0.293525 0.500263\nv -0.124275 0.282616 0.489933\nv -0.138587 0.254671 0.496603\nv -0.17851 0.246346 0.500783\nv -0.120744 0.272286 0.476557\nv -0.150635 0.0843194 0.549231\nv -0.110981 -0.197039 0.578654\nv -0.145877 -0.226522 0.547184\nv -0.257825 -0.146365 0.464946\nv -0.181813 -0.015013 0.533586\nv -0.21057 0.0188715 0.525811\nv -0.169226 -0.14996 0.516989\nv -0.181743 -0.1588 0.515902\nv -0.175376 -0.168545 0.522911\nv -0.163813 -0.153415 0.52335\nv -0.140253 -0.128364 0.545887\nv -0.153091 -0.134363 0.527834\nv -0.414608 -0.0714286 0.0335337\nv -0.0376523 0.063203 0.628721\nv -0.0232707 0.0530365 0.640016\nv -0.190483 -0.134521 -0.42891\nv -0.190425 -0.0530365 -0.446291\nv -0.0856669 -0.0492716 -0.489617\nv -0.0841703 -0.13027 -0.463549\nv -0.238743 0.312729 0.498784\nv -0.236568 0.310718 0.495914\nv -0.245034 0.325784 0.495083\nv -0.120311 0.281967 0.47734\nv -0.176107 -0.207054 0.530523\nv -0.114635 -0.15994 0.588938\nv -0.0702155 -0.19877 0.595006\nv -0.0735478 -0.165324 0.619338\nv -0.0899814 0.151661 0.600396\nv -0.111016 0.0572925 0.58557\nv -0.101867 0.0715163 0.586237\nv -0.127064 0.0733753 0.597824\nv -0.136833 0.0543987 0.574241\nv -0.135833 0.107312 0.581379\nv -0.278287 0.38386 0.485911\nv -0.171226 -0.145371 0.517737\nv -0.0426215 -0.114106 0.575498\nv -0.0575293 -0.131258 0.610721\nv -0.0203535 0.0339429 0.602828\nv -0.224215 0.246978 0.496697\nv -0.219644 0.257664 0.498129\nv -0.308126 0.284604 0.426215\nv -0.296275 0.279026 0.430641\nv -0.291721 0.275554 0.437358\nv -0.286612 0.276705 0.435172\nv -0.291949 0.280143 0.428238\nv -0.065825 -0.384532 0.440825\nv -0.11702 -0.382428 0.436651\nv -0.374667 0.821265 -0.265393\nv -0.3198 0.831958 -0.392208\nv -0.362179 0.712818 -0.467507\nv -0.425879 0.698185 -0.319692\nv -0.269938 0.909215 -0.296313\nv -0.308015 0.900609 -0.210562\nv -0.440407 0.677046 -0.175192\nv -0.387417 0.807117 -0.128411\nv -0.312037 0.894728 -0.0788123\nv -0.0720161 -0.391612 0.376675\nv -0.127765 -0.376523 0.378341\nv -0.124801 0.303066 0.504835\nv -0.0997913 0.860855 -0.486022\nv -0.212687 0.850449 -0.463771\nv -0.245244 0.723306 -0.559461\nv -0.199083 0.0271847 -0.488407\nv -0.21986 0.118005 -0.554936\nv -0.10327 0.117479 -0.600127\nv -0.0928636 0.0273016 -0.53883\nv -0.389259 0.144254 -0.303446\nv -0.329178 0.130557 -0.444432\nv -0.359227 0.250316 -0.491237\nv -0.422325 0.258021 -0.333419\nv -0.123907 0.397932 -0.664658\nv -0.113699 0.240517 -0.645459\nv -0.381641 0.401913 -0.512072\nv -0.448592 0.395605 -0.3508\nv -0.450574 0.547705 -0.348333\nv -0.384366 0.562601 -0.506817\nv -0.462722 0.528827 -0.195952\nv -0.310604 0.866976 0.0721301\nv -0.372013 -0.183143 -0.115123\nv -0.387686 -0.0789994 -0.141781\nv -0.2476 0.197566 0.475487\nv -0.230342 0.231532 0.488372\nv -0.129238 -0.0890256 0.584927\nv -0.123544 -0.115971 0.574872\nv -0.114588 -0.128867 0.557082\nv -0.221702 0.122764 0.506442\nv -0.216107 0.26119 0.49413\nv -0.253242 0.263207 0.478422\nv -0.256568 0.260547 0.479737\nv -0.115342 0.273619 0.475323\nv -0.298743 0.299903 0.422953\nv -0.291698 0.283732 0.432722\nv -0.295854 0.288181 0.418253\nv -0.142059 0.263388 0.482491\nv -0.120428 0.267802 0.470325\nv -0.172108 0.256934 0.489641\nv -0.275083 0.271584 0.453242\nv -0.248582 0.25684 0.473757\nv -0.275001 0.268573 0.446274\nv -0.234253 0.331396 0.490634\nv -0.187624 0.326819 0.49717\nv -0.300292 0.274694 0.432944\nv -0.135658 -0.0739483 0.577444\nv -0.237428 0.052791 0.514919\nv -0.0645564 0.270789 0.544612\nv -0.373819 0.514195 0.287264\nv -0.321852 -0.214718 -0.338184\nv -0.348166 -0.27584 -0.333396\nv -0.352171 -0.333378 -0.190533\nv -0.354936 -0.247872 -0.205511\nv -0.0936937 -0.549137 0.186785\nv -0.35669 -0.197653 -0.0299733\nv -0.393228 -0.0876225 -0.0664009\nv -0.29161 -0.321499 0.0380294\nv -0.393638 -0.0904403 -0.014329\nv -0.241608 0.243201 -0.602916\nv -0.263209 0.569914 -0.609242\nv -0.349441 -0.283282 -0.0863831\nv -0.194821 -0.209504 -0.418674\nv -0.0862925 -0.206323 -0.448413\nv -0.261795 0.402579 -0.621448\nv -0.456233 0.372302 -0.191263\nv -0.455245 0.384813 -0.0591282\nv -0.408072 0.116608 0.297155\nv -0.298661 0.260278 0.439147\nv -0.287606 0.265861 0.450068\nv -0.279696 0.270216 0.454289\nv -0.162731 0.0172638 0.536515\nv -0.13087 -0.0222973 0.565699\nv -0.101475 0.0572691 0.580946\nv -0.0809198 0.301049 0.528407\nv -0.0556351 0.322972 0.54498\nv -0.272306 0.242932 0.464508\nv -0.262964 0.253017 0.476001\nv -0.233067 0.158607 0.487893\nv -0.412053 0.186142 0.273695\nv -0.154815 -0.0532762 0.55793\nv -0.0277489 0.331782 0.556427\nv -0.286179 0.277611 0.427928\nv -0.183941 -0.499632 0.122144\nv -0.331493 -0.386257 -0.0698735\nv -0.206238 -0.274279 -0.416026\nv -0.0915482 -0.274332 -0.437317\nv -0.277193 -0.438779 0.0481257\nv -0.484037 0.177414 -0.0276816\nv -0.458618 0.163319 -0.0553633\nv -0.437233 0.124752 -0.0367315\nv -0.471526 0.1616 -0.00366555\nv -0.476232 0.247018 0.00445479\nv -0.494987 0.232631 -0.0169773\nv -0.491035 0.317921 -0.0441971\nv -0.515688 0.298728 -0.0523583\nv -0.510175 0.332513 -0.1293\nv -0.532917 0.316524 -0.12405\nv -0.50993 0.303592 -0.186815\nv -0.534671 0.290233 -0.170849\nv -0.510152 0.231181 -0.21891\nv -0.537459 0.228895 -0.193058\nv -0.48934 0.122068 -0.20872\nv -0.519208 0.128879 -0.191363\nv -0.469632 0.0399528 -0.15424\nv -0.470766 -0.00661202 -0.0930419\nv -0.486142 0.00947665 -0.0819458\nv -0.495221 0.0472722 -0.1369\nv -0.459705 -0.0431682 -0.033446\nv -0.483546 -0.0248521 -0.0238816\nv -0.494011 0.289082 -0.0628932\nv -0.473502 0.238904 -0.0420457\nv -0.507246 0.300137 -0.117724\nv -0.512134 0.2833 -0.158502\nv -0.513712 0.235303 -0.176549\nv -0.50102 0.136093 -0.181582\nv -0.485095 0.0532704 -0.118549\nv -0.485253 0.0267755 -0.0671726\nv -0.481172 0.0136801 -0.012201\nv -0.456127 -0.0187428 0.0196958\nv -0.462909 0.027933 0.024969\nv -0.454923 0.0845591 -0.060163\nv -0.441284 0.0577602 -0.0294063\nv -0.440921 0.0840388 -0.0210813\nv -0.457712 0.18288 0.0414318\nv -0.458378 0.268123 0.0210228\nv -0.461588 0.318505 -0.044618\nv -0.468843 0.311858 -0.142898\nv -0.453707 0.232836 -0.195204\nv -0.436969 0.13182 -0.191047\nv -0.423167 0.0473306 -0.148288\nv -0.421945 -0.00467109 -0.089692\nv -0.423991 -0.0291198 -0.0260915\nv -0.429434 -0.0102776 0.0297746\nv -0.445242 0.0345158 0.0460211\nv -0.481617 0.0602039 -0.0524227\nv -0.474104 0.129276 -0.0866754\nv -0.480325 0.0824545 -0.101285\nv -0.469474 0.0446648 -0.013376\nv -0.478167 0.0776431 0.00467109\nv -0.503592 0.223961 -0.101887\nv -0.502575 0.131983 -0.147242\nv -0.453707 0.0999988 0.0450097\nv -0.413357 0.138549 -0.218945\nv -0.402232 0.0251035 -0.169299\nv -0.434023 0.249632 -0.229901\nv -0.0871226 -0.186639 0.484069\nv -0.139686 -0.173807 0.465537\nv -0.158481 -0.142278 0.458685\nv -0.0688299 0.0121893 0.376371\nv -0.150805 -0.116468 0.431278\nv -0.126228 -0.116368 0.360528\nv -0.142316 -0.166791 0.41184\nv -0.0730392 -0.218144 0.372349\nv -0.282087 0.293548 0.454716\nv -0.283513 0.320341 0.45129\nv -0.124398 0.285323 0.452968\nv -0.126795 0.269175 0.455978\nv -0.119353 0.275057 0.469524\nv -0.156265 0.2548 0.466332\nv -0.265074 0.27356 0.421036\nv -0.214762 0.253899 0.455218\nv -0.141855 0.312577 0.484315\nv -0.212745 0.255776 0.486875\nv -0.277117 0.302621 0.410811\nv -0.252014 0.333887 0.433371\nv -0.20141 0.342405 0.464461\nv -0.120767 0.295565 0.473184\nv -0.145333 0.322832 0.456154\nv -0.126041 0.301873 0.455785\nv -0.119879 0.284837 0.470541\nv -0.0516539 -0.100847 0.27211\nv -0.454245 -0.41571 -0.353027\nv -0.413392 -0.372097 -0.332203\nv -0.255785 -0.398019 -0.4467\nv -0.294685 -0.464338 -0.476902\nv -0.174388 -0.714777 0.156607\nv -0.0715543 -0.738454 0.180284\nv -0.0798266 -0.636725 0.177765\nv -0.171536 -0.601788 0.131147\nv -0.337345 -0.494639 -0.0546091\nv -0.355094 -0.419334 -0.180442\nv -0.379665 -0.504905 -0.184915\nv -0.373053 -0.619338 -0.0373044\nv -0.45328 -0.545816 -0.197379\nv -0.454128 -0.653065 -0.0942754\nv -0.0965876 -0.904778 0.254759\nv -0.0736004 -0.845567 0.20775\nv -0.172974 -0.81408 0.195975\nv -0.1973 -0.864375 0.243622\nv -0.520961 -0.488138 -0.3841\nv -0.556272 -0.584635 -0.21946\nv -0.439238 -0.799155 0.0975785\nv -0.381694 -0.748264 0.0442672\nv -0.45103 -0.731883 -0.0219173\nv -0.519067 -0.768135 -0.0077988\nv -0.273785 -0.806328 0.115322\nv -0.319391 -0.83802 0.183769\nv -0.163088 -0.604103 -0.559421\nv -0.356672 -0.543712 -0.525361\nv -0.131226 -0.496761 -0.498854\nv -0.114629 -0.410074 -0.45775\nv -0.546533 -0.697291 -0.117619\nv -0.100633 -0.33885 -0.437013\nv -0.22677 -0.331835 -0.424707\nv -0.274931 -0.684651 0.0790578\nv -0.28021 -0.553908 0.0669913\nv -0.378028 -0.321668 -0.326088\nv 0.172833 0.300014 0.41564\nv -0.171097 0.299996 0.415616\n# 1258 vertices\n\nvt  0.532 0.923 0.000\nvt  0.535 0.917 0.000\nvt  0.542 0.923 0.000\nvt  0.541 0.929 0.000\nvt  0.521 0.984 0.000\nvt  0.521 0.996 0.000\nvt  0.505 0.998 0.000\nvt  0.500 0.985 0.000\nvt  0.504 0.917 0.000\nvt  0.507 0.910 0.000\nvt  0.516 0.910 0.000\nvt  0.515 0.918 0.000\nvt  0.523 0.921 0.000\nvt  0.525 0.913 0.000\nvt  0.549 0.958 0.000\nvt  0.538 0.954 0.000\nvt  0.544 0.942 0.000\nvt  0.550 0.946 0.000\nvt  0.545 0.935 0.000\nvt  0.550 0.932 0.000\nvt  0.547 0.974 0.000\nvt  0.533 0.967 0.000\nvt  0.500 0.917 0.000\nvt  0.500 0.910 0.000\nvt  0.542 0.987 0.000\nvt  0.533 0.994 0.000\nvt  0.616 0.254 0.000\nvt  0.653 0.261 0.000\nvt  0.658 0.307 0.000\nvt  0.619 0.292 0.000\nvt  0.636 0.438 0.000\nvt  0.620 0.419 0.000\nvt  0.627 0.396 0.000\nvt  0.647 0.414 0.000\nvt  0.886 0.312 0.000\nvt  0.897 0.370 0.000\nvt  0.860 0.369 0.000\nvt  0.844 0.308 0.000\nvt  0.740 0.593 0.000\nvt  0.741 0.542 0.000\nvt  0.759 0.541 0.000\nvt  0.768 0.598 0.000\nvt  0.644 0.213 0.000\nvt  0.561 0.175 0.000\nvt  0.566 0.146 0.000\nvt  0.644 0.174 0.000\nvt  0.580 0.254 0.000\nvt  0.585 0.277 0.000\nvt  0.565 0.268 0.000\nvt  0.565 0.256 0.000\nvt  0.590 0.217 0.000\nvt  0.544 0.195 0.000\nvt  0.771 0.721 0.000\nvt  0.736 0.712 0.000\nvt  0.758 0.653 0.000\nvt  0.794 0.663 0.000\nvt  0.669 0.622 0.000\nvt  0.685 0.632 0.000\nvt  0.665 0.669 0.000\nvt  0.652 0.651 0.000\nvt  0.623 0.588 0.000\nvt  0.632 0.582 0.000\nvt  0.639 0.590 0.000\nvt  0.627 0.599 0.000\nvt  0.641 0.632 0.000\nvt  0.657 0.612 0.000\nvt  0.619 0.580 0.000\nvt  0.617 0.575 0.000\nvt  0.623 0.573 0.000\nvt  0.627 0.576 0.000\nvt  0.708 0.702 0.000\nvt  0.729 0.646 0.000\nvt  0.633 0.614 0.000\nvt  0.647 0.601 0.000\nvt  0.604 0.718 0.000\nvt  0.574 0.725 0.000\nvt  0.567 0.686 0.000\nvt  0.596 0.682 0.000\nvt  0.562 0.648 0.000\nvt  0.590 0.649 0.000\nvt  0.618 0.756 0.000\nvt  0.584 0.769 0.000\nvt  0.586 0.587 0.000\nvt  0.566 0.586 0.000\nvt  0.568 0.579 0.000\nvt  0.586 0.580 0.000\nvt  0.569 0.574 0.000\nvt  0.586 0.573 0.000\nvt  0.562 0.627 0.000\nvt  0.587 0.627 0.000\nvt  0.587 0.610 0.000\nvt  0.563 0.608 0.000\nvt  0.565 0.595 0.000\nvt  0.587 0.596 0.000\nvt  0.521 0.441 0.000\nvt  0.526 0.450 0.000\nvt  0.520 0.450 0.000\nvt  0.517 0.445 0.000\nvt  0.720 0.504 0.000\nvt  0.709 0.467 0.000\nvt  0.727 0.446 0.000\nvt  0.738 0.494 0.000\nvt  0.656 0.383 0.000\nvt  0.660 0.348 0.000\nvt  0.684 0.368 0.000\nvt  0.673 0.403 0.000\nvt  0.572 0.371 0.000\nvt  0.573 0.365 0.000\nvt  0.581 0.364 0.000\nvt  0.581 0.374 0.000\nvt  0.708 0.400 0.000\nvt  0.693 0.431 0.000\nvt  0.604 0.401 0.000\nvt  0.609 0.383 0.000\nvt  0.557 0.364 0.000\nvt  0.559 0.365 0.000\nvt  0.557 0.366 0.000\nvt  0.556 0.364 0.000\nvt  0.552 0.367 0.000\nvt  0.552 0.364 0.000\nvt  0.568 0.377 0.000\nvt  0.561 0.374 0.000\nvt  0.566 0.370 0.000\nvt  0.594 0.377 0.000\nvt  0.594 0.363 0.000\nvt  0.653 0.551 0.000\nvt  0.644 0.534 0.000\nvt  0.658 0.523 0.000\nvt  0.666 0.545 0.000\nvt  0.637 0.480 0.000\nvt  0.625 0.458 0.000\nvt  0.649 0.459 0.000\nvt  0.662 0.434 0.000\nvt  0.557 0.345 0.000\nvt  0.553 0.353 0.000\nvt  0.543 0.349 0.000\nvt  0.546 0.337 0.000\nvt  0.586 0.403 0.000\nvt  0.573 0.392 0.000\nvt  0.579 0.382 0.000\nvt  0.591 0.389 0.000\nvt  0.572 0.343 0.000\nvt  0.584 0.331 0.000\nvt  0.590 0.347 0.000\nvt  0.578 0.353 0.000\nvt  0.553 0.358 0.000\nvt  0.543 0.355 0.000\nvt  0.553 0.499 0.000\nvt  0.541 0.507 0.000\nvt  0.542 0.484 0.000\nvt  0.553 0.477 0.000\nvt  0.539 0.532 0.000\nvt  0.529 0.541 0.000\nvt  0.531 0.513 0.000\nvt  0.551 0.538 0.000\nvt  0.538 0.552 0.000\nvt  0.552 0.521 0.000\nvt  0.908 0.437 0.000\nvt  0.876 0.429 0.000\nvt  0.608 0.340 0.000\nvt  0.599 0.314 0.000\nvt  0.629 0.336 0.000\nvt  0.691 0.326 0.000\nvt  0.723 0.365 0.000\nvt  0.748 0.426 0.000\nvt  0.755 0.489 0.000\nvt  0.564 0.825 0.000\nvt  0.590 0.868 0.000\nvt  0.558 0.886 0.000\nvt  0.533 0.834 0.000\nvt  0.637 0.789 0.000\nvt  0.673 0.755 0.000\nvt  0.702 0.774 0.000\nvt  0.665 0.817 0.000\nvt  0.740 0.787 0.000\nvt  0.545 0.727 0.000\nvt  0.540 0.686 0.000\nvt  0.551 0.550 0.000\nvt  0.538 0.572 0.000\nvt  0.520 0.546 0.000\nvt  0.522 0.517 0.000\nvt  0.552 0.775 0.000\nvt  0.524 0.777 0.000\nvt  0.521 0.728 0.000\nvt  0.500 0.687 0.000\nvt  0.500 0.651 0.000\nvt  0.515 0.650 0.000\nvt  0.518 0.687 0.000\nvt  0.500 0.727 0.000\nvt  0.625 0.671 0.000\nvt  0.618 0.644 0.000\nvt  0.591 0.533 0.000\nvt  0.571 0.539 0.000\nvt  0.569 0.527 0.000\nvt  0.589 0.518 0.000\nvt  0.545 0.436 0.000\nvt  0.525 0.427 0.000\nvt  0.528 0.413 0.000\nvt  0.549 0.425 0.000\nvt  0.556 0.449 0.000\nvt  0.563 0.439 0.000\nvt  0.514 0.395 0.000\nvt  0.532 0.396 0.000\nvt  0.513 0.409 0.000\nvt  0.566 0.511 0.000\nvt  0.564 0.490 0.000\nvt  0.577 0.478 0.000\nvt  0.584 0.500 0.000\nvt  0.500 0.408 0.000\nvt  0.500 0.394 0.000\nvt  0.571 0.457 0.000\nvt  0.561 0.468 0.000\nvt  0.554 0.561 0.000\nvt  0.557 0.563 0.000\nvt  0.552 0.569 0.000\nvt  0.548 0.569 0.000\nvt  0.627 0.847 0.000\nvt  0.674 0.871 0.000\nvt  0.645 0.898 0.000\nvt  0.776 0.920 0.000\nvt  0.709 0.921 0.000\nvt  0.729 0.888 0.000\nvt  0.783 0.887 0.000\nvt  0.693 0.947 0.000\nvt  0.621 0.920 0.000\nvt  0.535 0.642 0.000\nvt  0.542 0.618 0.000\nvt  0.545 0.599 0.000\nvt  0.559 0.383 0.000\nvt  0.552 0.377 0.000\nvt  0.531 0.470 0.000\nvt  0.520 0.472 0.000\nvt  0.517 0.456 0.000\nvt  0.528 0.457 0.000\nvt  0.530 0.438 0.000\nvt  0.517 0.436 0.000\nvt  0.528 0.383 0.000\nvt  0.513 0.384 0.000\nvt  0.512 0.374 0.000\nvt  0.526 0.374 0.000\nvt  0.512 0.367 0.000\nvt  0.526 0.366 0.000\nvt  0.512 0.362 0.000\nvt  0.526 0.362 0.000\nvt  0.511 0.422 0.000\nvt  0.500 0.384 0.000\nvt  0.500 0.375 0.000\nvt  0.500 0.362 0.000\nvt  0.500 0.367 0.000\nvt  0.511 0.472 0.000\nvt  0.508 0.457 0.000\nvt  0.521 0.491 0.000\nvt  0.512 0.519 0.000\nvt  0.512 0.491 0.000\nvt  0.511 0.550 0.000\nvt  0.520 0.576 0.000\nvt  0.510 0.583 0.000\nvt  0.500 0.457 0.000\nvt  0.500 0.472 0.000\nvt  0.500 0.491 0.000\nvt  0.654 0.584 0.000\nvt  0.656 0.568 0.000\nvt  0.669 0.567 0.000\nvt  0.666 0.589 0.000\nvt  0.705 0.639 0.000\nvt  0.718 0.591 0.000\nvt  0.684 0.563 0.000\nvt  0.680 0.592 0.000\nvt  0.637 0.575 0.000\nvt  0.636 0.566 0.000\nvt  0.645 0.567 0.000\nvt  0.645 0.579 0.000\nvt  0.723 0.546 0.000\nvt  0.697 0.592 0.000\nvt  0.702 0.554 0.000\nvt  0.500 0.163 0.000\nvt  0.500 0.137 0.000\nvt  0.579 0.298 0.000\nvt  0.570 0.317 0.000\nvt  0.554 0.307 0.000\nvt  0.560 0.287 0.000\nvt  0.534 0.318 0.000\nvt  0.517 0.314 0.000\nvt  0.519 0.296 0.000\nvt  0.538 0.300 0.000\nvt  0.562 0.362 0.000\nvt  0.559 0.363 0.000\nvt  0.557 0.362 0.000\nvt  0.559 0.360 0.000\nvt  0.563 0.365 0.000\nvt  0.561 0.368 0.000\nvt  0.543 0.360 0.000\nvt  0.531 0.358 0.000\nvt  0.531 0.351 0.000\nvt  0.611 0.437 0.000\nvt  0.613 0.475 0.000\nvt  0.624 0.497 0.000\nvt  0.580 0.445 0.000\nvt  0.590 0.466 0.000\nvt  0.598 0.418 0.000\nvt  0.648 0.501 0.000\nvt  0.633 0.516 0.000\nvt  0.641 0.554 0.000\nvt  0.630 0.541 0.000\nvt  0.733 0.331 0.000\nvt  0.696 0.288 0.000\nvt  0.706 0.252 0.000\nvt  0.751 0.313 0.000\nvt  0.683 0.535 0.000\nvt  0.674 0.508 0.000\nvt  0.999 0.696 0.000\nvt  0.986 0.778 0.000\nvt  0.950 0.772 0.000\nvt  0.967 0.695 0.000\nvt  0.600 0.811 0.000\nvt  0.552 0.361 0.000\nvt  0.547 0.367 0.000\nvt  0.546 0.364 0.000\nvt  0.525 0.254 0.000\nvt  0.546 0.261 0.000\nvt  0.542 0.280 0.000\nvt  0.522 0.274 0.000\nvt  0.631 0.369 0.000\nvt  0.678 0.460 0.000\nvt  0.662 0.482 0.000\nvt  0.770 0.948 0.000\nvt  0.762 0.981 0.000\nvt  0.676 0.977 0.000\nvt  0.845 0.915 0.000\nvt  0.835 0.891 0.000\nvt  0.569 0.560 0.000\nvt  0.582 0.558 0.000\nvt  0.580 0.563 0.000\nvt  0.569 0.564 0.000\nvt  0.590 0.544 0.000\nvt  0.571 0.548 0.000\nvt  0.635 0.701 0.000\nvt  0.651 0.731 0.000\nvt  0.607 0.593 0.000\nvt  0.609 0.606 0.000\nvt  0.543 0.570 0.000\nvt  0.553 0.556 0.000\nvt  0.552 0.580 0.000\nvt  0.556 0.574 0.000\nvt  0.569 0.554 0.000\nvt  0.585 0.551 0.000\nvt  0.559 0.566 0.000\nvt  0.550 0.458 0.000\nvt  0.532 0.330 0.000\nvt  0.549 0.325 0.000\nvt  0.610 0.364 0.000\nvt  0.589 0.432 0.000\nvt  0.578 0.417 0.000\nvt  0.570 0.357 0.000\nvt  0.565 0.360 0.000\nvt  0.562 0.356 0.000\nvt  0.565 0.351 0.000\nvt  0.557 0.364 0.000\nvt  0.556 0.364 0.000\nvt  0.548 0.371 0.000\nvt  0.557 0.371 0.000\nvt  0.762 0.385 0.000\nvt  0.513 0.445 0.000\nvt  0.508 0.444 0.000\nvt  0.500 0.520 0.000\nvt  0.939 0.378 0.000\nvt  0.932 0.316 0.000\nvt  0.972 0.321 0.000\nvt  0.974 0.384 0.000\nvt  0.605 0.572 0.000\nvt  0.605 0.578 0.000\nvt  0.605 0.584 0.000\nvt  0.559 0.571 0.000\nvt  0.562 0.333 0.000\nvt  0.500 0.552 0.000\nvt  0.500 0.585 0.000\nvt  0.531 0.343 0.000\nvt  0.514 0.338 0.000\nvt  0.516 0.324 0.000\nvt  0.532 0.488 0.000\nvt  0.534 0.448 0.000\nvt  0.540 0.446 0.000\nvt  0.545 0.448 0.000\nvt  0.538 0.455 0.000\nvt  0.541 0.466 0.000\nvt  0.612 0.623 0.000\nvt  0.567 0.366 0.000\nvt  0.513 0.356 0.000\nvt  0.500 0.355 0.000\nvt  0.500 0.346 0.000\nvt  0.514 0.348 0.000\nvt  0.543 0.363 0.000\nvt  0.552 0.364 0.000\nvt  0.531 0.362 0.000\nvt  0.512 0.361 0.000\nvt  0.509 0.433 0.000\nvt  0.500 0.444 0.000\nvt  0.500 0.432 0.000\nvt  0.603 0.551 0.000\nvt  0.599 0.557 0.000\nvt  0.627 0.570 0.000\nvt  0.631 0.571 0.000\nvt  0.625 0.566 0.000\nvt  0.622 0.569 0.000\nvt  0.621 0.567 0.000\nvt  0.529 0.234 0.000\nvt  0.500 0.249 0.000\nvt  0.500 0.227 0.000\nvt  0.550 0.245 0.000\nvt  0.857 0.816 0.000\nvt  0.825 0.804 0.000\nvt  0.851 0.737 0.000\nvt  0.886 0.748 0.000\nvt  0.821 0.866 0.000\nvt  0.798 0.856 0.000\nvt  0.783 0.797 0.000\nvt  0.810 0.729 0.000\nvt  0.755 0.848 0.000\nvt  0.534 0.215 0.000\nvt  0.563 0.233 0.000\nvt  0.548 0.588 0.000\nvt  0.884 0.835 0.000\nvt  0.908 0.854 0.000\nvt  0.919 0.761 0.000\nvt  0.947 0.512 0.000\nvt  0.944 0.446 0.000\nvt  0.974 0.452 0.000\nvt  0.974 0.519 0.000\nvt  0.915 0.504 0.000\nvt  0.887 0.498 0.000\nvt  0.917 0.564 0.000\nvt  0.890 0.556 0.000\nvt  0.999 0.634 0.000\nvt  0.973 0.633 0.000\nvt  0.975 0.577 0.000\nvt  0.999 0.579 0.000\nvt  0.882 0.614 0.000\nvt  0.911 0.622 0.000\nvt  0.901 0.679 0.000\nvt  0.868 0.671 0.000\nvt  0.833 0.667 0.000\nvt  0.708 0.836 0.000\nvt  0.500 0.205 0.000\nvt  0.826 0.364 0.000\nvt  0.801 0.303 0.000\nvt  0.613 0.529 0.000\nvt  0.607 0.544 0.000\nvt  0.541 0.380 0.000\nvt  0.538 0.372 0.000\nvt  0.537 0.366 0.000\nvt  0.537 0.363 0.000\nvt  0.598 0.945 0.000\nvt  0.524 0.902 0.000\nvt  0.599 0.489 0.000\nvt  0.609 0.563 0.000\nvt  0.596 0.563 0.000\nvt  0.612 0.559 0.000\nvt  0.557 0.569 0.000\nvt  0.620 0.571 0.000\nvt  0.616 0.569 0.000\nvt  0.618 0.569 0.000\nvt  0.569 0.568 0.000\nvt  0.561 0.568 0.000\nvt  0.579 0.567 0.000\nvt  0.616 0.564 0.000\nvt  0.613 0.567 0.000\nvt  0.607 0.567 0.000\nvt  0.587 0.568 0.000\nvt  0.606 0.568 0.000\nvt  0.630 0.565 0.000\nvt  0.548 0.389 0.000\nvt  0.601 0.452 0.000\nvt  0.529 0.566 0.000\nvt  0.684 0.686 0.000\nvt  0.872 0.222 0.000\nvt  0.876 0.265 0.000\nvt  0.825 0.258 0.000\nvt  0.821 0.214 0.000\nvt  0.561 0.119 0.000\nvt  0.500 0.114 0.000\nvt  0.771 0.304 0.000\nvt  0.797 0.363 0.000\nvt  0.726 0.227 0.000\nvt  0.777 0.371 0.000\nvt  0.947 0.571 0.000\nvt  0.999 0.388 0.000\nvt  0.999 0.456 0.000\nvt  0.999 0.524 0.000\nvt  0.936 0.877 0.000\nvt  0.856 0.945 0.000\nvt  0.999 0.323 0.000\nvt  0.935 0.689 0.000\nvt  0.776 0.240 0.000\nvt  0.928 0.265 0.000\nvt  0.969 0.264 0.000\nvt  0.999 0.267 0.000\nvt  0.943 0.628 0.000\nvt  0.806 0.622 0.000\nvt  0.851 0.611 0.000\nvt  0.500 0.777 0.000\nvt  0.500 0.839 0.000\nvt  0.692 0.489 0.000\nvt  0.631 0.558 0.000\nvt  0.622 0.562 0.000\nvt  0.626 0.560 0.000\nvt  0.555 0.413 0.000\nvt  0.570 0.429 0.000\nvt  0.539 0.440 0.000\nvt  0.524 0.607 0.000\nvt  0.531 0.591 0.000\nvt  0.500 0.361 0.000\nvt  0.500 0.321 0.000\nvt  0.500 0.312 0.000\nvt  0.500 0.336 0.000\nvt  0.500 0.294 0.000\nvt  0.500 0.273 0.000\nvt  0.622 0.549 0.000\nvt  0.616 0.554 0.000\nvt  0.607 0.509 0.000\nvt  0.701 0.520 0.000\nvt  0.500 0.421 0.000\nvt  0.564 0.403 0.000\nvt  0.511 0.615 0.000\nvt  0.500 0.618 0.000\nvt  0.617 0.568 0.000\nvt  0.636 0.139 0.000\nvt  0.764 0.192 0.000\nvt  0.921 0.220 0.000\nvt  0.967 0.219 0.000\nvt  0.708 0.168 0.000\nvt  0.999 0.218 0.000\nvt  0.803 0.523 0.000\nvt  0.794 0.535 0.000\nvt  0.783 0.527 0.000\nvt  0.791 0.508 0.000\nvt  0.789 0.571 0.000\nvt  0.797 0.562 0.000\nvt  0.813 0.591 0.000\nvt  0.815 0.578 0.000\nvt  0.839 0.583 0.000\nvt  0.835 0.574 0.000\nvt  0.850 0.569 0.000\nvt  0.845 0.560 0.000\nvt  0.855 0.539 0.000\nvt  0.847 0.535 0.000\nvt  0.850 0.501 0.000\nvt  0.841 0.502 0.000\nvt  0.814 0.438 0.000\nvt  0.836 0.464 0.000\nvt  0.828 0.472 0.000\nvt  0.809 0.452 0.000\nvt  0.792 0.427 0.000\nvt  0.790 0.441 0.000\nvt  0.818 0.567 0.000\nvt  0.807 0.550 0.000\nvt  0.831 0.561 0.000\nvt  0.839 0.553 0.000\nvt  0.837 0.534 0.000\nvt  0.831 0.505 0.000\nvt  0.820 0.479 0.000\nvt  0.804 0.465 0.000\nvt  0.786 0.460 0.000\nvt  0.773 0.456 0.000\nvt  0.779 0.433 0.000\nvt  0.797 0.489 0.000\nvt  0.785 0.495 0.000\nvt  0.789 0.486 0.000\nvt  0.772 0.537 0.000\nvt  0.781 0.583 0.000\nvt  0.812 0.602 0.000\nvt  0.848 0.587 0.000\nvt  0.862 0.546 0.000\nvt  0.859 0.500 0.000\nvt  0.820 0.412 0.000\nvt  0.843 0.450 0.000\nvt  0.791 0.404 0.000\nvt  0.773 0.417 0.000\nvt  0.764 0.447 0.000\nvt  0.801 0.477 0.000\nvt  0.813 0.487 0.000\nvt  0.806 0.496 0.000\nvt  0.787 0.478 0.000\nvt  0.778 0.489 0.000\nvt  0.822 0.538 0.000\nvt  0.822 0.510 0.000\nvt  0.767 0.492 0.000\nvt  0.870 0.496 0.000\nvt  0.851 0.425 0.000\nvt  0.872 0.552 0.000\nvt  0.500 0.183 0.000\nvt  0.516 0.930 0.000\nvt  0.500 0.928 0.000\nvt  0.528 0.934 0.000\nvt  0.537 0.938 0.000\nvt  0.516 0.970 0.000\nvt  0.520 0.955 0.000\nvt  0.530 0.952 0.000\nvt  0.522 0.944 0.000\nvt  0.512 0.942 0.000\nvt  0.615 0.572 0.000\nvt  0.612 0.569 0.000\nvt  0.576 0.968 0.000\nvt  0.573 0.973 0.000\nvt  0.562 0.969 0.000\nvt  0.563 0.961 0.000\nvt  0.571 0.956 0.000\nvt  0.582 0.961 0.000\nvt  0.611 0.961 0.000\nvt  0.606 0.967 0.000\nvt  0.595 0.960 0.000\nvt  0.601 0.955 0.000\nvt  0.570 0.569 0.000\nvt  0.595 0.566 0.000\nvt  0.616 0.967 0.000\nvt  0.617 0.975 0.000\nvt  0.607 0.978 0.000\nvt  0.614 0.982 0.000\nvt  0.605 0.991 0.000\nvt  0.599 0.986 0.000\nvt  0.593 0.996 0.000\nvt  0.589 0.989 0.000\nvt  0.562 0.570 0.000\nvt  0.573 0.994 0.000\nvt  0.579 0.987 0.000\nvt  0.584 0.996 0.000\nvt  0.581 0.953 0.000\nvt  0.592 0.953 0.000\nvt  0.561 0.988 0.000\nvt  0.572 0.981 0.000\nvt  0.563 0.978 0.000\nvt  0.500 0.970 0.000\nvt  0.500 0.943 0.000\nvt  0.511 0.956 0.000\nvt  0.500 0.956 0.000\nvt  0.868 0.132 0.000\nvt  0.867 0.090 0.000\nvt  0.916 0.092 0.000\nvt  0.918 0.133 0.000\nvt  0.554 0.066 0.000\nvt  0.612 0.070 0.000\nvt  0.619 0.103 0.000\nvt  0.558 0.095 0.000\nvt  0.815 0.169 0.000\nvt  0.758 0.148 0.000\nvt  0.747 0.102 0.000\nvt  0.814 0.126 0.000\nvt  0.770 0.072 0.000\nvt  0.817 0.087 0.000\nvt  0.552 0.038 0.000\nvt  0.551 0.020 0.000\nvt  0.602 0.021 0.000\nvt  0.605 0.039 0.000\nvt  0.821 0.050 0.000\nvt  0.867 0.055 0.000\nvt  0.712 0.053 0.000\nvt  0.700 0.022 0.000\nvt  0.739 0.023 0.000\nvt  0.740 0.052 0.000\nvt  0.652 0.022 0.000\nvt  0.659 0.043 0.000\nvt  0.913 0.055 0.000\nvt  0.959 0.055 0.000\nvt  0.960 0.091 0.000\nvt  0.999 0.089 0.000\nvt  0.999 0.131 0.000\nvt  0.962 0.133 0.000\nvt  0.999 0.053 0.000\nvt  0.778 0.038 0.000\nvt  0.917 0.177 0.000\nvt  0.965 0.178 0.000\nvt  0.674 0.083 0.000\nvt  0.685 0.124 0.000\nvt  0.999 0.175 0.000\nvt  0.500 0.037 0.000\nvt  0.500 0.066 0.000\nvt  0.871 0.175 0.000\nvt  0.500 0.019 0.000\nvt  0.500 0.092 0.000\nvt  0.999 0.002 0.000\nvt  0.958 0.002 0.000\nvt  0.867 0.002 0.000\nvt  0.823 0.002 0.000\nvt  0.908 0.002 0.000\nvt  0.601 0.002 0.000\nvt  0.550 0.002 0.000\nvt  0.697 0.002 0.000\nvt  0.650 0.002 0.000\nvt  0.782 0.002 0.000\nvt  0.740 0.002 0.000\nvt  0.500 0.002 0.000\nvt  0.468 0.923 0.000\nvt  0.459 0.929 0.000\nvt  0.458 0.923 0.000\nvt  0.465 0.917 0.000\nvt  0.479 0.984 0.000\nvt  0.495 0.998 0.000\nvt  0.479 0.996 0.000\nvt  0.496 0.917 0.000\nvt  0.485 0.918 0.000\nvt  0.484 0.910 0.000\nvt  0.493 0.910 0.000\nvt  0.477 0.921 0.000\nvt  0.475 0.913 0.000\nvt  0.451 0.958 0.000\nvt  0.450 0.946 0.000\nvt  0.456 0.942 0.000\nvt  0.462 0.954 0.000\nvt  0.455 0.935 0.000\nvt  0.450 0.932 0.000\nvt  0.467 0.967 0.000\nvt  0.453 0.974 0.000\nvt  0.467 0.994 0.000\nvt  0.458 0.987 0.000\nvt  0.384 0.254 0.000\nvt  0.381 0.292 0.000\nvt  0.342 0.307 0.000\nvt  0.347 0.261 0.000\nvt  0.364 0.438 0.000\nvt  0.353 0.414 0.000\nvt  0.373 0.396 0.000\nvt  0.380 0.419 0.000\nvt  0.114 0.312 0.000\nvt  0.156 0.308 0.000\nvt  0.140 0.369 0.000\nvt  0.103 0.370 0.000\nvt  0.260 0.593 0.000\nvt  0.232 0.598 0.000\nvt  0.241 0.541 0.000\nvt  0.259 0.542 0.000\nvt  0.356 0.213 0.000\nvt  0.356 0.174 0.000\nvt  0.434 0.146 0.000\nvt  0.439 0.175 0.000\nvt  0.420 0.254 0.000\nvt  0.435 0.256 0.000\nvt  0.435 0.268 0.000\nvt  0.415 0.277 0.000\nvt  0.456 0.195 0.000\nvt  0.410 0.217 0.000\nvt  0.229 0.721 0.000\nvt  0.206 0.663 0.000\nvt  0.242 0.653 0.000\nvt  0.264 0.712 0.000\nvt  0.331 0.622 0.000\nvt  0.348 0.651 0.000\nvt  0.335 0.669 0.000\nvt  0.315 0.632 0.000\nvt  0.377 0.588 0.000\nvt  0.373 0.599 0.000\nvt  0.361 0.590 0.000\nvt  0.368 0.582 0.000\nvt  0.359 0.632 0.000\nvt  0.343 0.612 0.000\nvt  0.381 0.580 0.000\nvt  0.373 0.576 0.000\nvt  0.377 0.573 0.000\nvt  0.383 0.575 0.000\nvt  0.292 0.702 0.000\nvt  0.271 0.646 0.000\nvt  0.353 0.601 0.000\nvt  0.367 0.614 0.000\nvt  0.396 0.718 0.000\nvt  0.404 0.682 0.000\nvt  0.433 0.686 0.000\nvt  0.426 0.725 0.000\nvt  0.410 0.649 0.000\nvt  0.438 0.648 0.000\nvt  0.416 0.769 0.000\nvt  0.382 0.756 0.000\nvt  0.414 0.587 0.000\nvt  0.414 0.580 0.000\nvt  0.432 0.579 0.000\nvt  0.434 0.586 0.000\nvt  0.431 0.574 0.000\nvt  0.414 0.573 0.000\nvt  0.413 0.627 0.000\nvt  0.438 0.627 0.000\nvt  0.413 0.610 0.000\nvt  0.413 0.596 0.000\nvt  0.435 0.595 0.000\nvt  0.437 0.608 0.000\nvt  0.479 0.441 0.000\nvt  0.483 0.445 0.000\nvt  0.480 0.450 0.000\nvt  0.474 0.450 0.000\nvt  0.280 0.504 0.000\nvt  0.262 0.494 0.000\nvt  0.273 0.446 0.000\nvt  0.291 0.467 0.000\nvt  0.344 0.383 0.000\nvt  0.327 0.403 0.000\nvt  0.316 0.368 0.000\nvt  0.340 0.348 0.000\nvt  0.428 0.371 0.000\nvt  0.419 0.374 0.000\nvt  0.419 0.364 0.000\nvt  0.427 0.365 0.000\nvt  0.307 0.431 0.000\nvt  0.292 0.400 0.000\nvt  0.391 0.383 0.000\nvt  0.396 0.401 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.366 0.000\nvt  0.441 0.365 0.000\nvt  0.448 0.367 0.000\nvt  0.448 0.364 0.000\nvt  0.432 0.377 0.000\nvt  0.434 0.370 0.000\nvt  0.439 0.374 0.000\nvt  0.406 0.377 0.000\nvt  0.406 0.363 0.000\nvt  0.347 0.551 0.000\nvt  0.334 0.545 0.000\nvt  0.342 0.523 0.000\nvt  0.356 0.534 0.000\nvt  0.363 0.480 0.000\nvt  0.351 0.459 0.000\nvt  0.375 0.458 0.000\nvt  0.338 0.434 0.000\nvt  0.443 0.345 0.000\nvt  0.454 0.337 0.000\nvt  0.457 0.349 0.000\nvt  0.447 0.353 0.000\nvt  0.414 0.403 0.000\nvt  0.409 0.389 0.000\nvt  0.421 0.382 0.000\nvt  0.427 0.392 0.000\nvt  0.428 0.343 0.000\nvt  0.422 0.353 0.000\nvt  0.410 0.347 0.000\nvt  0.416 0.331 0.000\nvt  0.457 0.355 0.000\nvt  0.447 0.358 0.000\nvt  0.447 0.499 0.000\nvt  0.447 0.477 0.000\nvt  0.458 0.484 0.000\nvt  0.459 0.507 0.000\nvt  0.461 0.532 0.000\nvt  0.469 0.513 0.000\nvt  0.471 0.541 0.000\nvt  0.449 0.538 0.000\nvt  0.448 0.521 0.000\nvt  0.462 0.552 0.000\nvt  0.124 0.429 0.000\nvt  0.092 0.437 0.000\nvt  0.392 0.340 0.000\nvt  0.371 0.336 0.000\nvt  0.401 0.314 0.000\nvt  0.309 0.326 0.000\nvt  0.252 0.426 0.000\nvt  0.277 0.365 0.000\nvt  0.245 0.489 0.000\nvt  0.436 0.825 0.000\nvt  0.467 0.834 0.000\nvt  0.442 0.886 0.000\nvt  0.410 0.868 0.000\nvt  0.363 0.789 0.000\nvt  0.335 0.817 0.000\nvt  0.298 0.774 0.000\nvt  0.327 0.755 0.000\nvt  0.260 0.787 0.000\nvt  0.460 0.686 0.000\nvt  0.455 0.727 0.000\nvt  0.462 0.572 0.000\nvt  0.449 0.550 0.000\nvt  0.480 0.546 0.000\nvt  0.478 0.517 0.000\nvt  0.479 0.728 0.000\nvt  0.476 0.777 0.000\nvt  0.448 0.775 0.000\nvt  0.482 0.687 0.000\nvt  0.485 0.650 0.000\nvt  0.375 0.671 0.000\nvt  0.382 0.644 0.000\nvt  0.409 0.533 0.000\nvt  0.411 0.518 0.000\nvt  0.431 0.527 0.000\nvt  0.429 0.539 0.000\nvt  0.455 0.436 0.000\nvt  0.451 0.425 0.000\nvt  0.472 0.413 0.000\nvt  0.475 0.427 0.000\nvt  0.444 0.449 0.000\nvt  0.437 0.439 0.000\nvt  0.486 0.395 0.000\nvt  0.487 0.409 0.000\nvt  0.468 0.396 0.000\nvt  0.434 0.511 0.000\nvt  0.416 0.500 0.000\nvt  0.423 0.478 0.000\nvt  0.436 0.490 0.000\nvt  0.429 0.457 0.000\nvt  0.439 0.468 0.000\nvt  0.446 0.561 0.000\nvt  0.452 0.569 0.000\nvt  0.448 0.569 0.000\nvt  0.443 0.563 0.000\nvt  0.373 0.847 0.000\nvt  0.355 0.898 0.000\nvt  0.326 0.871 0.000\nvt  0.224 0.920 0.000\nvt  0.217 0.887 0.000\nvt  0.271 0.888 0.000\nvt  0.291 0.921 0.000\nvt  0.379 0.920 0.000\nvt  0.307 0.947 0.000\nvt  0.465 0.642 0.000\nvt  0.455 0.599 0.000\nvt  0.458 0.618 0.000\nvt  0.448 0.377 0.000\nvt  0.441 0.383 0.000\nvt  0.469 0.470 0.000\nvt  0.472 0.457 0.000\nvt  0.483 0.456 0.000\nvt  0.480 0.472 0.000\nvt  0.470 0.438 0.000\nvt  0.483 0.436 0.000\nvt  0.472 0.383 0.000\nvt  0.474 0.374 0.000\nvt  0.488 0.374 0.000\nvt  0.487 0.384 0.000\nvt  0.474 0.366 0.000\nvt  0.488 0.367 0.000\nvt  0.474 0.362 0.000\nvt  0.488 0.362 0.000\nvt  0.489 0.422 0.000\nvt  0.492 0.457 0.000\nvt  0.489 0.472 0.000\nvt  0.479 0.491 0.000\nvt  0.488 0.491 0.000\nvt  0.488 0.519 0.000\nvt  0.489 0.550 0.000\nvt  0.490 0.583 0.000\nvt  0.480 0.576 0.000\nvt  0.346 0.584 0.000\nvt  0.334 0.589 0.000\nvt  0.331 0.567 0.000\nvt  0.344 0.568 0.000\nvt  0.295 0.639 0.000\nvt  0.282 0.591 0.000\nvt  0.320 0.592 0.000\nvt  0.316 0.563 0.000\nvt  0.363 0.575 0.000\nvt  0.355 0.579 0.000\nvt  0.355 0.567 0.000\nvt  0.364 0.566 0.000\nvt  0.277 0.546 0.000\nvt  0.298 0.554 0.000\nvt  0.303 0.592 0.000\nvt  0.421 0.298 0.000\nvt  0.440 0.287 0.000\nvt  0.446 0.307 0.000\nvt  0.430 0.317 0.000\nvt  0.466 0.318 0.000\nvt  0.462 0.300 0.000\nvt  0.481 0.296 0.000\nvt  0.483 0.314 0.000\nvt  0.438 0.362 0.000\nvt  0.441 0.360 0.000\nvt  0.443 0.362 0.000\nvt  0.441 0.363 0.000\nvt  0.439 0.368 0.000\nvt  0.437 0.365 0.000\nvt  0.469 0.351 0.000\nvt  0.469 0.358 0.000\nvt  0.457 0.360 0.000\nvt  0.389 0.437 0.000\nvt  0.387 0.475 0.000\nvt  0.376 0.497 0.000\nvt  0.420 0.445 0.000\nvt  0.410 0.466 0.000\nvt  0.402 0.418 0.000\nvt  0.352 0.501 0.000\nvt  0.367 0.516 0.000\nvt  0.359 0.554 0.000\nvt  0.370 0.541 0.000\nvt  0.267 0.331 0.000\nvt  0.249 0.313 0.000\nvt  0.294 0.252 0.000\nvt  0.304 0.288 0.000\nvt  0.317 0.535 0.000\nvt  0.326 0.508 0.000\nvt  0.001 0.696 0.000\nvt  0.033 0.695 0.000\nvt  0.050 0.772 0.000\nvt  0.014 0.778 0.000\nvt  0.400 0.811 0.000\nvt  0.448 0.361 0.000\nvt  0.454 0.364 0.000\nvt  0.453 0.367 0.000\nvt  0.475 0.254 0.000\nvt  0.478 0.274 0.000\nvt  0.458 0.280 0.000\nvt  0.454 0.261 0.000\nvt  0.369 0.369 0.000\nvt  0.322 0.460 0.000\nvt  0.338 0.482 0.000\nvt  0.324 0.977 0.000\nvt  0.238 0.981 0.000\nvt  0.230 0.948 0.000\nvt  0.155 0.915 0.000\nvt  0.165 0.891 0.000\nvt  0.431 0.560 0.000\nvt  0.431 0.564 0.000\nvt  0.420 0.563 0.000\nvt  0.418 0.558 0.000\nvt  0.410 0.544 0.000\nvt  0.429 0.548 0.000\nvt  0.349 0.731 0.000\nvt  0.365 0.701 0.000\nvt  0.391 0.606 0.000\nvt  0.393 0.593 0.000\nvt  0.457 0.570 0.000\nvt  0.447 0.556 0.000\nvt  0.444 0.574 0.000\nvt  0.448 0.580 0.000\nvt  0.415 0.551 0.000\nvt  0.431 0.554 0.000\nvt  0.441 0.566 0.000\nvt  0.450 0.458 0.000\nvt  0.451 0.325 0.000\nvt  0.468 0.330 0.000\nvt  0.390 0.364 0.000\nvt  0.411 0.432 0.000\nvt  0.422 0.417 0.000\nvt  0.430 0.357 0.000\nvt  0.435 0.351 0.000\nvt  0.438 0.356 0.000\nvt  0.435 0.360 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.371 0.000\nvt  0.452 0.371 0.000\nvt  0.238 0.385 0.000\nvt  0.487 0.445 0.000\nvt  0.492 0.444 0.000\nvt  0.061 0.378 0.000\nvt  0.026 0.384 0.000\nvt  0.028 0.321 0.000\nvt  0.068 0.316 0.000\nvt  0.395 0.572 0.000\nvt  0.395 0.578 0.000\nvt  0.395 0.584 0.000\nvt  0.441 0.571 0.000\nvt  0.438 0.333 0.000\nvt  0.469 0.343 0.000\nvt  0.486 0.338 0.000\nvt  0.484 0.324 0.000\nvt  0.468 0.488 0.000\nvt  0.466 0.448 0.000\nvt  0.462 0.455 0.000\nvt  0.455 0.448 0.000\nvt  0.460 0.446 0.000\nvt  0.459 0.466 0.000\nvt  0.388 0.623 0.000\nvt  0.433 0.366 0.000\nvt  0.487 0.356 0.000\nvt  0.486 0.348 0.000\nvt  0.457 0.363 0.000\nvt  0.448 0.364 0.000\nvt  0.469 0.362 0.000\nvt  0.488 0.361 0.000\nvt  0.491 0.433 0.000\nvt  0.401 0.557 0.000\nvt  0.397 0.551 0.000\nvt  0.373 0.570 0.000\nvt  0.369 0.571 0.000\nvt  0.375 0.566 0.000\nvt  0.379 0.567 0.000\nvt  0.378 0.569 0.000\nvt  0.471 0.234 0.000\nvt  0.450 0.245 0.000\nvt  0.143 0.816 0.000\nvt  0.114 0.748 0.000\nvt  0.149 0.737 0.000\nvt  0.175 0.804 0.000\nvt  0.202 0.856 0.000\nvt  0.179 0.866 0.000\nvt  0.190 0.729 0.000\nvt  0.217 0.797 0.000\nvt  0.245 0.848 0.000\nvt  0.466 0.215 0.000\nvt  0.437 0.233 0.000\nvt  0.452 0.588 0.000\nvt  0.092 0.854 0.000\nvt  0.116 0.835 0.000\nvt  0.081 0.761 0.000\nvt  0.053 0.512 0.000\nvt  0.026 0.519 0.000\nvt  0.026 0.452 0.000\nvt  0.056 0.446 0.000\nvt  0.113 0.498 0.000\nvt  0.085 0.504 0.000\nvt  0.110 0.556 0.000\nvt  0.083 0.564 0.000\nvt  0.001 0.634 0.000\nvt  0.001 0.579 0.000\nvt  0.025 0.577 0.000\nvt  0.027 0.633 0.000\nvt  0.118 0.614 0.000\nvt  0.132 0.671 0.000\nvt  0.099 0.679 0.000\nvt  0.089 0.622 0.000\nvt  0.167 0.667 0.000\nvt  0.292 0.836 0.000\nvt  0.199 0.303 0.000\nvt  0.174 0.364 0.000\nvt  0.393 0.544 0.000\nvt  0.387 0.529 0.000\nvt  0.459 0.380 0.000\nvt  0.462 0.372 0.000\nvt  0.463 0.366 0.000\nvt  0.463 0.363 0.000\nvt  0.402 0.945 0.000\nvt  0.476 0.902 0.000\nvt  0.401 0.489 0.000\nvt  0.391 0.563 0.000\nvt  0.388 0.559 0.000\nvt  0.404 0.563 0.000\nvt  0.443 0.569 0.000\nvt  0.380 0.571 0.000\nvt  0.382 0.569 0.000\nvt  0.384 0.569 0.000\nvt  0.439 0.568 0.000\nvt  0.431 0.568 0.000\nvt  0.421 0.567 0.000\nvt  0.393 0.567 0.000\nvt  0.387 0.567 0.000\nvt  0.384 0.564 0.000\nvt  0.394 0.568 0.000\nvt  0.413 0.568 0.000\nvt  0.370 0.565 0.000\nvt  0.452 0.389 0.000\nvt  0.399 0.452 0.000\nvt  0.471 0.566 0.000\nvt  0.316 0.686 0.000\nvt  0.128 0.222 0.000\nvt  0.179 0.214 0.000\nvt  0.175 0.258 0.000\nvt  0.124 0.265 0.000\nvt  0.439 0.119 0.000\nvt  0.229 0.304 0.000\nvt  0.203 0.363 0.000\nvt  0.274 0.227 0.000\nvt  0.223 0.371 0.000\nvt  0.053 0.571 0.000\nvt  0.001 0.388 0.000\nvt  0.001 0.456 0.000\nvt  0.001 0.524 0.000\nvt  0.064 0.877 0.000\nvt  0.144 0.945 0.000\nvt  0.001 0.323 0.000\nvt  0.065 0.689 0.000\nvt  0.224 0.240 0.000\nvt  0.072 0.265 0.000\nvt  0.001 0.267 0.000\nvt  0.031 0.264 0.000\nvt  0.057 0.628 0.000\nvt  0.194 0.622 0.000\nvt  0.149 0.611 0.000\nvt  0.308 0.489 0.000\nvt  0.369 0.558 0.000\nvt  0.374 0.560 0.000\nvt  0.378 0.562 0.000\nvt  0.445 0.413 0.000\nvt  0.430 0.429 0.000\nvt  0.461 0.440 0.000\nvt  0.476 0.607 0.000\nvt  0.469 0.591 0.000\nvt  0.378 0.549 0.000\nvt  0.384 0.554 0.000\nvt  0.393 0.509 0.000\nvt  0.299 0.520 0.000\nvt  0.436 0.403 0.000\nvt  0.489 0.615 0.000\nvt  0.383 0.568 0.000\nvt  0.364 0.139 0.000\nvt  0.236 0.192 0.000\nvt  0.033 0.219 0.000\nvt  0.079 0.220 0.000\nvt  0.292 0.168 0.000\nvt  0.001 0.218 0.000\nvt  0.197 0.523 0.000\nvt  0.209 0.508 0.000\nvt  0.217 0.527 0.000\nvt  0.206 0.535 0.000\nvt  0.211 0.571 0.000\nvt  0.203 0.562 0.000\nvt  0.187 0.591 0.000\nvt  0.185 0.578 0.000\nvt  0.161 0.583 0.000\nvt  0.165 0.574 0.000\nvt  0.150 0.569 0.000\nvt  0.155 0.560 0.000\nvt  0.145 0.539 0.000\nvt  0.153 0.535 0.000\nvt  0.150 0.501 0.000\nvt  0.159 0.502 0.000\nvt  0.186 0.438 0.000\nvt  0.191 0.452 0.000\nvt  0.172 0.472 0.000\nvt  0.164 0.464 0.000\nvt  0.208 0.427 0.000\nvt  0.210 0.441 0.000\nvt  0.182 0.567 0.000\nvt  0.193 0.550 0.000\nvt  0.169 0.561 0.000\nvt  0.161 0.553 0.000\nvt  0.163 0.534 0.000\nvt  0.169 0.505 0.000\nvt  0.196 0.465 0.000\nvt  0.180 0.479 0.000\nvt  0.214 0.460 0.000\nvt  0.227 0.456 0.000\nvt  0.221 0.433 0.000\nvt  0.203 0.489 0.000\nvt  0.211 0.486 0.000\nvt  0.215 0.495 0.000\nvt  0.228 0.537 0.000\nvt  0.219 0.583 0.000\nvt  0.188 0.602 0.000\nvt  0.152 0.587 0.000\nvt  0.138 0.546 0.000\nvt  0.141 0.500 0.000\nvt  0.157 0.450 0.000\nvt  0.180 0.412 0.000\nvt  0.209 0.404 0.000\nvt  0.227 0.417 0.000\nvt  0.236 0.447 0.000\nvt  0.194 0.496 0.000\nvt  0.187 0.487 0.000\nvt  0.199 0.477 0.000\nvt  0.213 0.478 0.000\nvt  0.222 0.489 0.000\nvt  0.178 0.538 0.000\nvt  0.178 0.510 0.000\nvt  0.233 0.492 0.000\nvt  0.130 0.496 0.000\nvt  0.149 0.425 0.000\nvt  0.128 0.552 0.000\nvt  0.484 0.930 0.000\nvt  0.472 0.934 0.000\nvt  0.463 0.938 0.000\nvt  0.470 0.952 0.000\nvt  0.480 0.955 0.000\nvt  0.484 0.970 0.000\nvt  0.488 0.942 0.000\nvt  0.478 0.944 0.000\nvt  0.388 0.569 0.000\nvt  0.385 0.572 0.000\nvt  0.424 0.968 0.000\nvt  0.437 0.961 0.000\nvt  0.438 0.969 0.000\nvt  0.427 0.973 0.000\nvt  0.418 0.961 0.000\nvt  0.429 0.956 0.000\nvt  0.389 0.961 0.000\nvt  0.399 0.955 0.000\nvt  0.405 0.960 0.000\nvt  0.394 0.967 0.000\nvt  0.429 0.569 0.000\nvt  0.405 0.566 0.000\nvt  0.393 0.978 0.000\nvt  0.383 0.975 0.000\nvt  0.384 0.967 0.000\nvt  0.401 0.986 0.000\nvt  0.395 0.991 0.000\nvt  0.386 0.982 0.000\nvt  0.411 0.989 0.000\nvt  0.407 0.996 0.000\nvt  0.438 0.570 0.000\nvt  0.427 0.994 0.000\nvt  0.416 0.996 0.000\nvt  0.421 0.987 0.000\nvt  0.419 0.953 0.000\nvt  0.408 0.953 0.000\nvt  0.439 0.988 0.000\nvt  0.428 0.981 0.000\nvt  0.437 0.978 0.000\nvt  0.489 0.956 0.000\nvt  0.132 0.132 0.000\nvt  0.082 0.133 0.000\nvt  0.084 0.092 0.000\nvt  0.133 0.090 0.000\nvt  0.446 0.066 0.000\nvt  0.442 0.095 0.000\nvt  0.381 0.103 0.000\nvt  0.388 0.070 0.000\nvt  0.185 0.169 0.000\nvt  0.186 0.126 0.000\nvt  0.253 0.102 0.000\nvt  0.242 0.148 0.000\nvt  0.230 0.072 0.000\nvt  0.183 0.087 0.000\nvt  0.448 0.038 0.000\nvt  0.395 0.039 0.000\nvt  0.398 0.021 0.000\nvt  0.449 0.020 0.000\nvt  0.133 0.055 0.000\nvt  0.179 0.050 0.000\nvt  0.288 0.053 0.000\nvt  0.260 0.052 0.000\nvt  0.261 0.023 0.000\nvt  0.300 0.022 0.000\nvt  0.341 0.043 0.000\nvt  0.348 0.022 0.000\nvt  0.087 0.055 0.000\nvt  0.040 0.091 0.000\nvt  0.041 0.055 0.000\nvt  0.038 0.133 0.000\nvt  0.001 0.131 0.000\nvt  0.001 0.089 0.000\nvt  0.001 0.053 0.000\nvt  0.222 0.038 0.000\nvt  0.083 0.177 0.000\nvt  0.035 0.178 0.000\nvt  0.326 0.083 0.000\nvt  0.315 0.124 0.000\nvt  0.001 0.175 0.000\nvt  0.129 0.175 0.000\nvt  0.001 0.002 0.000\nvt  0.042 0.002 0.000\nvt  0.133 0.002 0.000\nvt  0.177 0.002 0.000\nvt  0.092 0.002 0.000\nvt  0.399 0.002 0.000\nvt  0.450 0.002 0.000\nvt  0.303 0.002 0.000\nvt  0.350 0.002 0.000\nvt  0.218 0.002 0.000\nvt  0.260 0.002 0.000\nvt  0.558 0.967 0.000\nvt  0.557 0.976 0.000\nvt  0.500 0.997 0.000\nvt  0.588 0.975 0.000\nvt  0.442 0.967 0.000\nvt  0.443 0.976 0.000\nvt  0.412 0.975 0.000\n# 1339 texture vertices\n\nvn  0.001 0.482 -0.876\nvn  -0.001 0.661 0.751\nvn  0.136 0.595 0.792\nvn  -0.203 0.679 0.706\nvn  -0.092 0.474 0.876\nvn  -0.184 0.792 0.581\nvn  -0.098 0.863 0.495\nvn  -0.449 0.820 0.356\nvn  -0.220 0.748 0.626\nvn  -0.560 0.798 -0.222\nvn  -0.233 0.531 -0.815\nvn  0.001 0.534 -0.845\nvn  -0.135 0.596 0.791\nvn  0.203 0.676 0.708\nvn  0.091 0.476 0.875\nvn  0.189 0.792 0.581\nvn  0.099 0.862 0.496\nvn  0.444 0.821 0.360\nvn  0.221 0.747 0.627\nvn  0.556 0.801 -0.221\nvn  0.228 0.532 -0.815\nvn  -0.002 0.536 -0.844\nvn  -0.574 0.744 -0.343\nvn  -0.485 0.523 -0.701\nvn  -0.121 0.869 -0.480\nvn  -0.215 0.930 -0.298\nvn  -0.000 -0.806 -0.591\nvn  -0.277 -0.779 -0.562\nvn  -0.258 -0.731 -0.632\nvn  -0.046 -0.809 -0.586\nvn  -0.210 0.565 -0.798\nvn  -0.094 0.624 -0.775\nvn  0.015 0.952 -0.307\nvn  0.045 0.919 -0.392\nvn  -0.099 0.857 -0.505\nvn  -0.379 0.493 -0.783\nvn  -0.947 0.285 -0.149\nvn  -0.809 -0.421 -0.411\nvn  -0.895 -0.443 -0.043\nvn  -0.999 -0.020 0.035\nvn  -0.359 0.933 -0.019\nvn  -0.809 0.586 0.047\nvn  -0.667 -0.516 -0.538\nvn  -0.726 -0.626 -0.285\nvn  -0.001 0.671 -0.741\nvn  -0.001 0.945 -0.327\nvn  -0.531 -0.632 -0.565\nvn  -0.618 -0.566 -0.546\nvn  0.800 -0.473 0.369\nvn  0.618 -0.771 0.151\nvn  0.693 -0.711 0.116\nvn  0.818 -0.467 0.335\nvn  0.849 -0.259 0.460\nvn  0.775 -0.130 0.619\nvn  0.667 -0.132 0.733\nvn  0.775 -0.270 0.571\nvn  0.958 -0.057 -0.280\nvn  0.763 0.033 -0.646\nvn  0.763 -0.153 -0.628\nvn  0.911 -0.129 -0.391\nvn  0.990 0.067 0.126\nvn  0.979 0.090 0.185\nvn  0.981 0.057 0.184\nvn  0.996 0.020 0.090\nvn  0.770 -0.392 0.504\nvn  0.657 -0.721 0.219\nvn  0.478 -0.656 0.584\nvn  0.599 -0.389 0.700\nvn  0.498 -0.846 0.192\nvn  0.537 -0.840 0.082\nvn  0.740 -0.557 0.378\nvn  0.668 -0.570 0.479\nvn  0.280 -0.914 0.294\nvn  0.421 -0.898 0.126\nvn  0.991 0.084 0.103\nvn  0.964 0.223 0.143\nvn  0.960 0.189 0.207\nvn  0.979 0.103 0.175\nvn  0.868 0.172 0.465\nvn  0.907 0.085 0.413\nvn  0.938 0.144 0.316\nvn  0.897 0.178 0.405\nvn  0.662 -0.174 0.729\nvn  0.583 -0.417 0.697\nvn  0.627 -0.449 0.637\nvn  0.685 -0.405 0.605\nvn  0.827 0.091 0.555\nvn  0.890 0.018 0.455\nvn  0.663 -0.395 0.636\nvn  0.606 -0.428 0.671\nvn  0.313 -0.735 0.602\nvn  -0.136 -0.864 0.485\nvn  0.951 0.158 0.267\nvn  0.964 0.113 0.241\nvn  0.731 -0.036 0.681\nvn  0.819 -0.134 0.558\nvn  0.546 0.270 0.793\nvn  0.602 0.237 0.763\nvn  0.444 0.233 0.865\nvn  0.353 0.173 0.920\nvn  0.240 -0.093 0.966\nvn  0.498 0.051 0.866\nvn  0.675 0.338 0.656\nvn  0.480 0.400 0.780\nvn  0.064 -0.572 0.818\nvn  0.126 -0.313 0.941\nvn  0.207 -0.613 0.763\nvn  0.221 -0.810 0.544\nvn  0.598 -0.694 -0.401\nvn  0.124 -0.977 -0.175\nvn  0.218 -0.333 0.917\nvn  0.377 -0.161 0.912\nvn  0.142 -0.210 0.967\nvn  0.256 -0.155 0.954\nvn  0.111 -0.351 0.930\nvn  0.107 -0.480 0.871\nvn  0.675 -0.732 -0.096\nvn  0.496 -0.844 0.206\nvn  -0.016 -0.986 0.167\nvn  0.304 -0.948 0.097\nvn  0.982 -0.082 0.171\nvn  0.963 -0.002 0.269\nvn  0.967 -0.134 0.216\nvn  0.969 -0.177 0.175\nvn  0.916 -0.244 0.319\nvn  0.853 -0.341 0.394\nvn  0.837 -0.365 0.407\nvn  0.886 -0.281 0.368\nvn  0.422 -0.292 0.858\nvn  0.039 -0.571 0.820\nvn  -0.011 -0.399 0.917\nvn  0.333 -0.349 0.876\nvn  0.935 -0.237 0.263\nvn  0.949 -0.159 0.273\nvn  0.697 -0.213 0.685\nvn  0.568 -0.123 0.814\nvn  -0.938 0.322 0.130\nvn  -0.609 -0.738 -0.291\nvn  -0.447 -0.857 -0.258\nvn  0.259 -0.528 0.809\nvn  0.137 -0.704 0.697\nvn  -0.107 -0.741 0.663\nvn  0.647 -0.296 0.703\nvn  0.603 -0.168 0.780\nvn  0.836 0.072 0.545\nvn  0.744 0.114 0.659\nvn  0.701 0.149 0.698\nvn  0.802 0.157 0.577\nvn  0.823 -0.080 0.562\nvn  0.690 0.142 0.710\nvn  0.628 0.036 0.778\nvn  0.894 -0.247 0.373\nvn  0.624 -0.153 0.766\nvn  0.661 0.110 0.742\nvn  0.712 0.424 0.559\nvn  0.701 0.284 0.654\nvn  0.504 -0.050 0.862\nvn  0.413 0.027 0.910\nvn  0.569 0.046 0.821\nvn  0.488 -0.134 0.862\nvn  0.411 -0.180 0.894\nvn  0.610 -0.024 0.792\nvn  0.747 -0.250 0.616\nvn  0.672 -0.313 0.671\nvn  0.536 0.762 0.363\nvn  0.559 0.768 0.312\nvn  0.802 0.272 0.531\nvn  0.618 0.206 0.759\nvn  0.717 0.383 0.583\nvn  0.780 0.464 0.420\nvn  0.617 0.401 0.678\nvn  0.658 0.397 0.640\nvn  0.672 0.440 0.596\nvn  0.501 0.314 0.807\nvn  0.612 0.527 0.589\nvn  0.679 0.320 0.661\nvn  0.732 -0.406 -0.547\nvn  0.885 -0.261 -0.386\nvn  0.842 -0.347 0.414\nvn  0.782 -0.349 0.517\nvn  0.784 -0.368 0.500\nvn  0.858 -0.453 0.244\nvn  0.953 -0.279 0.118\nvn  0.977 -0.189 0.104\nvn  0.989 -0.110 0.102\nvn  0.142 0.669 0.730\nvn  0.300 0.652 0.696\nvn  0.291 0.792 0.536\nvn  0.143 0.821 0.553\nvn  0.737 0.561 0.378\nvn  0.716 0.470 0.515\nvn  0.884 0.306 0.353\nvn  0.898 0.354 0.263\nvn  0.890 0.423 0.171\nvn  0.174 0.078 0.982\nvn  0.219 0.254 0.942\nvn  0.665 -0.104 0.739\nvn  0.671 0.390 0.631\nvn  0.596 0.435 0.675\nvn  0.636 0.467 0.614\nvn  0.076 0.244 0.967\nvn  0.261 0.437 0.861\nvn  0.107 0.440 0.892\nvn  0.011 0.082 0.997\nvn  0.005 0.082 0.997\nvn  0.028 -0.027 0.999\nvn  0.073 -0.057 0.996\nvn  0.006 0.228 0.974\nvn  0.683 0.140 0.717\nvn  0.724 0.233 0.650\nvn  0.400 0.338 0.852\nvn  0.270 0.126 0.955\nvn  0.357 0.433 0.828\nvn  0.503 0.485 0.716\nvn  0.536 0.133 0.834\nvn  0.416 -0.306 0.856\nvn  0.337 0.097 0.937\nvn  0.262 0.372 0.891\nvn  0.425 0.075 0.902\nvn  0.701 -0.147 0.698\nvn  -0.056 0.558 0.828\nvn  0.005 0.605 0.796\nvn  0.483 0.327 0.812\nvn  0.497 0.276 0.823\nvn  0.505 0.283 0.815\nvn  0.340 -0.030 0.940\nvn  0.332 0.066 0.941\nvn  0.026 0.644 0.765\nvn  0.021 0.538 0.843\nvn  0.170 -0.012 0.985\nvn  0.365 -0.067 0.929\nvn  0.826 -0.173 0.537\nvn  0.320 0.415 0.852\nvn  0.384 0.739 0.554\nvn  0.987 -0.013 0.160\nvn  0.495 0.720 0.487\nvn  0.490 0.830 0.268\nvn  0.279 0.906 0.317\nvn  0.431 0.899 -0.074\nvn  0.267 0.957 -0.112\nvn  0.283 0.953 0.107\nvn  0.471 0.877 0.092\nvn  0.132 0.985 0.113\nvn  0.135 0.931 0.339\nvn  0.190 -0.184 0.964\nvn  0.292 -0.372 0.881\nvn  0.307 -0.447 0.840\nvn  0.393 -0.580 0.713\nvn  0.524 -0.286 0.802\nvn  0.380 -0.582 0.719\nvn  0.697 0.212 0.685\nvn  0.603 0.070 0.795\nvn  0.558 -0.571 0.602\nvn  -0.089 -0.701 0.707\nvn  0.794 -0.345 0.500\nvn  0.345 -0.517 0.783\nvn  0.481 0.101 0.871\nvn  0.134 0.283 0.950\nvn  0.113 -0.558 0.822\nvn  -0.073 -0.993 0.089\nvn  -0.041 -0.994 0.103\nvn  0.084 -0.038 0.996\nvn  -0.012 -0.622 0.783\nvn  -0.002 0.254 0.967\nvn  0.004 -0.997 0.079\nvn  0.001 -0.832 -0.555\nvn  0.477 -0.363 0.801\nvn  0.414 0.160 0.896\nvn  0.395 0.485 0.780\nvn  0.611 0.484 0.627\nvn  0.406 0.510 0.758\nvn  0.375 0.498 0.782\nvn  0.555 0.314 0.770\nvn  0.349 0.411 0.842\nvn  0.012 0.247 0.969\nvn  0.002 -0.369 0.930\nvn  -0.003 0.509 0.861\nvn  0.876 -0.041 0.481\nvn  0.757 -0.214 0.618\nvn  0.737 -0.048 0.674\nvn  0.840 -0.012 0.542\nvn  0.960 0.137 0.243\nvn  0.969 0.103 0.226\nvn  0.909 0.015 0.417\nvn  0.906 0.015 0.423\nvn  0.676 -0.276 0.683\nvn  0.688 -0.223 0.691\nvn  0.691 0.035 0.722\nvn  0.719 -0.082 0.691\nvn  0.964 0.062 0.260\nvn  0.956 0.070 0.286\nvn  0.953 0.037 0.300\nvn  -0.003 -0.415 0.910\nvn  -0.001 -0.380 0.925\nvn  0.658 -0.419 0.625\nvn  0.735 -0.421 0.532\nvn  0.663 -0.303 0.685\nvn  0.550 -0.321 0.771\nvn  0.423 -0.236 0.875\nvn  0.326 -0.294 0.899\nvn  0.124 -0.396 0.910\nvn  0.218 -0.177 0.960\nvn  0.530 0.781 0.331\nvn  0.167 0.827 0.537\nvn  0.094 0.948 0.303\nvn  0.313 0.934 0.171\nvn  -0.406 -0.892 0.201\nvn  -0.743 0.107 0.661\nvn  0.455 0.704 0.546\nvn  0.288 0.957 0.025\nvn  0.245 0.958 0.150\nvn  0.532 -0.027 0.846\nvn  0.566 0.213 0.796\nvn  0.508 0.208 0.836\nvn  0.173 0.028 0.984\nvn  0.371 0.122 0.921\nvn  0.429 -0.045 0.902\nvn  0.614 0.165 0.772\nvn  0.737 0.157 0.657\nvn  0.726 0.057 0.685\nvn  0.662 0.061 0.747\nvn  0.845 -0.523 -0.112\nvn  0.845 -0.501 -0.185\nvn  0.744 -0.668 0.009\nvn  0.773 -0.630 0.079\nvn  0.889 0.108 0.445\nvn  0.899 0.077 0.430\nvn  0.184 0.204 -0.961\nvn  0.005 0.202 -0.979\nvn  -0.000 0.485 -0.875\nvn  0.159 0.484 -0.861\nvn  0.499 0.592 0.633\nvn  0.305 0.950 0.065\nvn  -0.274 -0.953 -0.127\nvn  0.245 -0.456 0.856\nvn  0.083 -0.881 0.465\nvn  0.435 -0.739 0.515\nvn  0.504 -0.429 0.750\nvn  0.818 -0.367 0.443\nvn  0.933 -0.162 0.322\nvn  0.872 0.029 0.489\nvn  0.002 0.994 0.113\nvn  0.133 0.983 -0.126\nvn  -0.001 0.992 -0.127\nvn  0.280 0.892 -0.356\nvn  0.126 0.916 -0.381\nvn  0.210 0.974 -0.083\nvn  -0.082 0.663 0.745\nvn  -0.059 0.391 0.919\nvn  0.111 0.992 -0.055\nvn  0.081 -0.190 0.978\nvn  0.035 0.076 0.996\nvn  0.852 0.236 0.467\nvn  0.775 0.219 0.593\nvn  0.505 -0.109 0.856\nvn  0.446 -0.314 0.838\nvn  0.511 0.200 0.836\nvn  0.623 -0.242 0.744\nvn  0.436 -0.554 0.709\nvn  0.599 -0.742 0.300\nvn  -0.036 0.177 0.984\nvn  -0.039 -0.159 0.987\nvn  0.308 0.942 -0.135\nvn  0.989 0.093 -0.111\nvn  0.477 -0.259 0.840\nvn  0.473 -0.423 0.773\nvn  0.774 -0.329 0.541\nvn  0.285 0.019 0.958\nvn  0.350 0.101 0.931\nvn  0.579 0.261 0.773\nvn  0.298 0.015 0.954\nvn  0.165 0.336 0.927\nvn  0.577 0.511 0.636\nvn  0.254 -0.834 0.490\nvn  -0.114 -0.925 0.363\nvn  0.941 -0.280 -0.188\nvn  0.460 -0.738 0.493\nvn  0.740 -0.635 0.221\nvn  0.003 0.529 0.849\nvn  0.206 -0.427 -0.881\nvn  0.497 -0.316 -0.808\nvn  0.457 -0.144 -0.878\nvn  0.179 -0.244 -0.953\nvn  -0.182 -0.980 -0.078\nvn  0.342 -0.427 0.837\nvn  0.424 -0.296 0.856\nvn  0.896 -0.357 -0.264\nvn  0.594 -0.104 0.798\nvn  0.012 0.528 0.849\nvn  0.042 0.469 0.882\nvn  0.624 0.102 0.775\nvn  0.324 -0.123 0.938\nvn  0.202 -0.638 0.743\nvn  0.714 0.512 0.477\nvn  0.433 -0.511 0.742\nvn  -0.350 -0.708 0.613\nvn  0.095 -0.410 0.907\nvn  0.622 -0.593 0.512\nvn  0.846 0.304 0.437\nvn  0.582 -0.043 0.812\nvn  -0.226 -0.380 0.897\nvn  0.215 0.644 0.734\nvn  0.123 0.952 0.280\nvn  -0.004 0.956 0.293\nvn  -0.005 0.635 0.772\nvn  0.325 -0.730 0.601\nvn  -0.017 -0.840 0.543\nvn  0.017 -0.788 0.616\nvn  0.294 -0.138 0.946\nvn  0.214 0.401 0.891\nvn  -0.150 0.490 0.859\nvn  0.573 -0.125 0.810\nvn  -0.134 0.957 0.258\nvn  0.252 0.828 0.501\nvn  -0.673 0.643 0.364\nvn  0.004 -0.960 0.279\nvn  0.032 -0.991 0.133\nvn  0.006 -0.908 0.419\nvn  0.180 -0.980 0.086\nvn  0.740 0.403 -0.538\nvn  0.627 0.652 -0.426\nvn  0.814 0.561 -0.149\nvn  0.925 0.321 -0.206\nvn  0.492 0.825 -0.280\nvn  0.649 0.757 -0.076\nvn  0.966 0.258 0.022\nvn  0.864 0.501 0.053\nvn  0.680 0.729 0.077\nvn  0.272 -0.962 -0.032\nvn  0.225 -0.968 0.111\nvn  0.288 -0.510 0.810\nvn  0.126 0.748 -0.651\nvn  0.340 0.725 -0.598\nvn  0.421 0.466 -0.778\nvn  0.205 -0.458 -0.865\nvn  0.489 -0.479 -0.729\nvn  0.500 -0.523 -0.690\nvn  0.210 -0.566 -0.798\nvn  0.895 -0.322 -0.309\nvn  0.759 -0.434 -0.485\nvn  0.797 -0.287 -0.532\nvn  0.937 -0.248 -0.245\nvn  -0.001 -0.238 -0.971\nvn  -0.000 -0.025 -1.000\nvn  0.194 -0.025 -0.981\nvn  0.201 -0.248 -0.948\nvn  0.969 0.094 -0.229\nvn  0.968 -0.101 -0.228\nvn  0.814 -0.088 -0.575\nvn  0.800 0.142 -0.583\nvn  0.998 0.061 -0.010\nvn  0.726 0.657 0.205\nvn  0.000 -0.985 0.174\nvn  0.985 -0.166 0.038\nvn  0.955 -0.220 -0.200\nvn  0.472 0.076 0.879\nvn  0.343 -0.235 0.909\nvn  0.464 -0.641 0.612\nvn  0.578 -0.186 0.795\nvn  -0.189 -0.982 0.010\nvn  0.004 0.938 0.345\nvn  0.002 0.829 0.559\nvn  0.445 0.232 0.865\nvn  0.463 0.340 0.818\nvn  -0.116 0.983 0.143\nvn  0.004 0.995 0.102\nvn  0.978 0.204 0.044\nvn  -0.967 -0.216 -0.137\nvn  -0.911 -0.347 0.224\nvn  -0.728 0.350 0.590\nvn  0.426 0.738 -0.523\nvn  0.618 0.786 0.011\nvn  0.151 0.857 -0.493\nvn  -0.333 0.912 -0.241\nvn  -0.277 0.956 0.095\nvn  -0.569 0.822 -0.032\nvn  -0.341 -0.671 -0.658\nvn  0.161 -0.736 -0.657\nvn  0.528 0.432 0.731\nvn  0.586 0.105 0.803\nvn  0.436 0.074 0.897\nvn  0.621 0.267 0.737\nvn  0.936 0.153 0.316\nvn  0.999 -0.010 0.042\nvn  0.826 0.281 -0.489\nvn  0.775 0.178 -0.606\nvn  0.995 -0.039 -0.095\nvn  0.005 -0.414 0.910\nvn  0.580 -0.243 0.778\nvn  0.938 -0.339 -0.068\nvn  0.925 -0.371 0.080\nvn  0.888 -0.269 0.373\nvn  0.923 -0.371 -0.106\nvn  0.494 -0.274 -0.825\nvn  -0.001 -0.456 -0.890\nvn  -0.002 -0.569 -0.822\nvn  -0.001 -0.452 -0.892\nvn  -0.003 0.749 -0.663\nvn  -0.000 0.920 -0.391\nvn  -0.001 -0.280 -0.960\nvn  0.470 0.194 -0.861\nvn  0.965 -0.123 0.234\nvn  0.400 -0.039 -0.916\nvn  0.142 -0.166 -0.976\nvn  -0.000 -0.194 -0.981\nvn  0.497 -0.049 -0.867\nvn  0.998 0.042 0.045\nvn  0.996 -0.037 -0.082\nvn  0.009 0.433 0.901\nvn  0.004 0.669 0.743\nvn  0.955 0.004 0.296\nvn  0.737 -0.001 0.675\nvn  0.707 0.177 0.684\nvn  0.484 0.627 0.610\nvn  0.515 0.250 0.820\nvn  0.360 0.121 0.925\nvn  -0.544 -0.573 0.613\nvn  0.382 -0.114 0.917\nvn  0.489 -0.108 0.866\nvn  -0.002 -0.670 0.742\nvn  0.002 -0.394 0.919\nvn  -0.004 -0.168 0.986\nvn  0.007 -0.109 0.994\nvn  0.009 -0.519 0.855\nvn  0.660 -0.118 0.742\nvn  0.621 -0.127 0.774\nvn  0.416 0.220 0.882\nvn  0.946 0.046 0.322\nvn  0.014 0.006 1.000\nvn  0.569 0.184 0.802\nvn  0.218 0.013 0.976\nvn  0.044 0.087 0.995\nvn  -0.419 0.862 0.284\nvn  0.647 -0.120 0.753\nvn  0.954 -0.017 0.301\nvn  0.352 0.140 -0.926\nvn  0.095 -0.050 -0.994\nvn  0.770 0.025 0.638\nvn  0.000 -0.078 -0.997\nvn  0.985 -0.172 0.009\nvn  0.920 -0.340 0.195\nvn  0.929 -0.331 -0.163\nvn  0.969 -0.237 0.074\nvn  0.969 -0.183 0.165\nvn  0.801 0.160 0.577\nvn  0.954 -0.021 0.301\nvn  0.293 0.803 0.520\nvn  0.977 0.170 0.129\nvn  0.134 0.985 -0.104\nvn  0.994 0.106 -0.036\nvn  0.099 0.675 -0.731\nvn  0.997 -0.079 -0.000\nvn  0.197 0.126 -0.972\nvn  0.978 -0.175 -0.110\nvn  0.110 -0.321 -0.941\nvn  0.939 -0.332 -0.089\nvn  0.400 -0.789 -0.467\nvn  0.171 -0.673 -0.720\nvn  0.931 -0.336 -0.144\nvn  0.854 -0.500 0.146\nvn  0.161 -0.985 -0.069\nvn  0.931 -0.304 -0.200\nvn  0.813 -0.565 -0.143\nvn  0.823 -0.546 0.154\nvn  0.795 -0.387 0.467\nvn  0.809 -0.168 0.563\nvn  0.826 0.053 0.562\nvn  0.925 0.261 0.275\nvn  0.990 0.071 0.119\nvn  0.951 0.129 0.281\nvn  0.810 -0.147 0.568\nvn  0.383 -0.603 0.699\nvn  0.769 0.635 0.079\nvn  0.786 0.352 0.508\nvn  0.919 0.082 -0.386\nvn  0.937 0.163 0.310\nvn  0.974 -0.026 0.224\nvn  0.787 0.550 0.279\nvn  0.517 0.758 -0.397\nvn  0.337 0.112 -0.935\nvn  0.221 -0.300 -0.928\nvn  0.395 -0.578 -0.714\nvn  0.521 -0.711 -0.472\nvn  0.432 -0.901 -0.043\nvn  0.826 -0.520 0.218\nvn  0.885 -0.217 0.412\nvn  0.786 -0.107 0.609\nvn  0.864 0.400 0.304\nvn  0.954 0.061 0.293\nvn  0.949 0.313 0.046\nvn  0.991 0.028 -0.131\nvn  0.945 -0.116 0.305\nvn  0.970 -0.241 0.032\nvn  0.946 -0.038 0.322\nvn  0.886 -0.270 -0.376\nvn  0.855 -0.272 -0.441\nvn  0.952 -0.122 -0.281\nvn  0.002 -0.883 0.469\nvn  -0.001 0.792 -0.611\nvn  -0.180 0.823 -0.539\nvn  -0.642 0.677 -0.360\nvn  -0.957 0.288 -0.031\nvn  -0.912 -0.300 0.281\nvn  -0.454 -0.866 0.207\nvn  -0.855 -0.043 0.517\nvn  -0.834 0.460 0.305\nvn  -0.242 0.911 0.334\nvn  -0.720 -0.667 -0.192\nvn  -0.762 -0.580 -0.288\nvn  0.452 0.774 0.444\nvn  0.857 0.048 0.513\nvn  0.966 0.131 0.225\nvn  0.211 0.953 0.219\nvn  -0.108 0.726 0.679\nvn  0.021 0.946 0.324\nvn  0.566 -0.691 -0.450\nvn  -0.068 0.939 -0.338\nvn  -0.261 -0.298 0.918\nvn  -0.200 -0.891 0.407\nvn  0.124 -0.991 0.059\nvn  0.913 -0.350 -0.211\nvn  0.488 -0.838 0.244\nvn  0.738 -0.593 0.322\nvn  0.994 -0.060 -0.087\nvn  -0.000 -0.981 0.193\nvn  0.000 0.974 0.227\nvn  -0.350 -0.016 0.936\nvn  0.000 -0.017 1.000\nvn  0.252 0.455 -0.854\nvn  0.774 0.620 -0.127\nvn  0.634 0.759 -0.148\nvn  0.192 0.569 -0.800\nvn  0.405 -0.094 0.909\nvn  0.031 0.149 0.988\nvn  0.360 0.283 0.889\nvn  0.469 0.080 0.880\nvn  0.769 0.452 0.452\nvn  0.946 0.185 0.266\nvn  0.893 0.181 0.413\nvn  0.654 0.429 0.623\nvn  0.506 0.610 0.610\nvn  0.436 0.659 0.613\nvn  0.160 0.558 0.814\nvn  -0.285 0.396 0.873\nvn  -0.223 0.539 0.812\nvn  0.037 0.570 0.821\nvn  0.623 0.727 -0.289\nvn  0.456 0.738 0.497\nvn  0.382 0.656 0.651\nvn  0.278 0.687 0.671\nvn  0.213 0.798 0.563\nvn  0.171 0.844 0.508\nvn  0.300 0.690 0.659\nvn  0.144 0.793 0.591\nvn  0.204 0.541 -0.816\nvn  -0.001 0.494 -0.870\nvn  0.029 0.458 -0.888\nvn  0.060 0.366 -0.929\nvn  0.000 0.421 -0.907\nvn  0.000 0.386 -0.922\nvn  0.001 0.455 -0.891\nvn  0.264 0.718 0.644\nvn  0.307 0.317 -0.897\nvn  0.056 0.164 -0.985\nvn  0.717 0.079 0.693\nvn  0.638 0.188 0.746\nvn  0.000 0.202 -0.979\nvn  0.006 -0.044 0.999\nvn  0.001 0.405 0.914\nvn  0.805 0.560 -0.194\nvn  0.002 0.627 0.779\nvn  0.010 -0.298 0.954\nvn  0.124 0.870 -0.477\nvn  0.488 0.530 -0.693\nvn  0.566 0.756 -0.329\nvn  0.213 0.932 -0.294\nvn  0.245 -0.741 -0.626\nvn  0.275 -0.782 -0.559\nvn  0.044 -0.811 -0.584\nvn  -0.012 0.949 -0.315\nvn  0.097 0.621 -0.778\nvn  0.215 0.561 -0.799\nvn  -0.030 0.913 -0.407\nvn  0.378 0.505 -0.776\nvn  0.084 0.865 -0.495\nvn  0.892 -0.451 -0.026\nvn  0.803 -0.447 -0.394\nvn  0.954 0.274 -0.123\nvn  0.998 -0.024 0.066\nvn  0.806 0.588 0.057\nvn  0.351 0.936 -0.012\nvn  0.662 -0.536 -0.524\nvn  0.725 -0.630 -0.278\nvn  0.524 -0.662 -0.536\nvn  0.620 -0.585 -0.522\nvn  -0.694 -0.711 0.115\nvn  -0.621 -0.770 0.148\nvn  -0.805 -0.470 0.362\nvn  -0.819 -0.465 0.335\nvn  -0.680 -0.145 0.719\nvn  -0.763 -0.140 0.631\nvn  -0.840 -0.272 0.470\nvn  -0.773 -0.256 0.580\nvn  -0.763 -0.155 -0.627\nvn  -0.763 0.034 -0.645\nvn  -0.958 -0.057 -0.281\nvn  -0.910 -0.129 -0.393\nvn  -0.983 0.060 0.175\nvn  -0.980 0.096 0.177\nvn  -0.990 0.069 0.123\nvn  -0.996 0.023 0.083\nvn  -0.484 -0.649 0.587\nvn  -0.662 -0.717 0.220\nvn  -0.775 -0.388 0.499\nvn  -0.606 -0.384 0.697\nvn  -0.748 -0.556 0.363\nvn  -0.539 -0.840 0.071\nvn  -0.496 -0.849 0.183\nvn  -0.668 -0.580 0.467\nvn  -0.280 -0.913 0.296\nvn  -0.424 -0.897 0.125\nvn  -0.960 0.187 0.209\nvn  -0.965 0.222 0.143\nvn  -0.991 0.084 0.104\nvn  -0.979 0.104 0.175\nvn  -0.940 0.170 0.295\nvn  -0.909 0.107 0.404\nvn  -0.862 0.204 0.464\nvn  -0.896 0.204 0.395\nvn  -0.570 -0.493 0.658\nvn  -0.531 -0.465 0.709\nvn  -0.651 -0.181 0.737\nvn  -0.688 -0.376 0.620\nvn  -0.892 0.030 0.452\nvn  -0.827 0.122 0.549\nvn  -0.345 -0.706 0.619\nvn  -0.566 -0.461 0.684\nvn  -0.543 -0.393 0.742\nvn  -0.097 -0.841 0.533\nvn  -0.964 0.119 0.237\nvn  -0.950 0.158 0.268\nvn  -0.733 -0.024 0.679\nvn  -0.825 -0.117 0.552\nvn  -0.442 0.232 0.866\nvn  -0.605 0.237 0.760\nvn  -0.556 0.267 0.787\nvn  -0.350 0.172 0.921\nvn  -0.239 -0.096 0.966\nvn  -0.501 0.068 0.863\nvn  -0.679 0.342 0.650\nvn  -0.486 0.403 0.776\nvn  -0.211 -0.600 0.772\nvn  -0.123 -0.334 0.934\nvn  -0.052 -0.530 0.847\nvn  -0.176 -0.798 0.577\nvn  -0.131 -0.968 -0.212\nvn  -0.598 -0.684 -0.418\nvn  -0.205 -0.329 0.922\nvn  -0.374 -0.151 0.915\nvn  -0.117 -0.376 0.919\nvn  -0.246 -0.160 0.956\nvn  -0.126 -0.268 0.955\nvn  -0.137 -0.531 0.837\nvn  0.062 -0.980 0.190\nvn  -0.478 -0.855 0.203\nvn  -0.669 -0.734 -0.114\nvn  -0.286 -0.955 0.083\nvn  -0.967 -0.136 0.215\nvn  -0.965 -0.005 0.263\nvn  -0.983 -0.085 0.164\nvn  -0.969 -0.182 0.170\nvn  -0.840 -0.358 0.408\nvn  -0.857 -0.341 0.386\nvn  -0.910 -0.256 0.326\nvn  -0.884 -0.284 0.371\nvn  0.022 -0.449 0.893\nvn  -0.046 -0.611 0.791\nvn  -0.478 -0.294 0.827\nvn  -0.375 -0.338 0.863\nvn  -0.935 -0.243 0.259\nvn  -0.949 -0.164 0.269\nvn  -0.736 -0.207 0.645\nvn  -0.587 -0.108 0.802\nvn  0.945 0.284 0.163\nvn  0.592 -0.756 -0.279\nvn  0.442 -0.866 -0.236\nvn  -0.053 -0.740 0.670\nvn  -0.228 -0.529 0.817\nvn  0.170 -0.772 0.613\nvn  -0.609 -0.162 0.777\nvn  -0.663 -0.292 0.690\nvn  -0.713 0.145 0.686\nvn  -0.759 0.059 0.648\nvn  -0.825 0.047 0.564\nvn  -0.809 0.158 0.566\nvn  -0.637 0.025 0.770\nvn  -0.687 0.129 0.715\nvn  -0.821 -0.086 0.564\nvn  -0.891 -0.252 0.378\nvn  -0.721 0.489 0.490\nvn  -0.698 0.164 0.697\nvn  -0.646 -0.143 0.750\nvn  -0.712 0.352 0.608\nvn  -0.567 0.074 0.821\nvn  -0.464 0.032 0.885\nvn  -0.518 -0.023 0.855\nvn  -0.550 -0.128 0.825\nvn  -0.756 -0.260 0.601\nvn  -0.645 -0.025 0.764\nvn  -0.437 -0.158 0.885\nvn  -0.687 -0.310 0.657\nvn  -0.541 0.781 0.313\nvn  -0.565 0.780 0.270\nvn  -0.712 0.385 0.587\nvn  -0.611 0.201 0.765\nvn  -0.859 0.335 0.388\nvn  -0.775 0.474 0.417\nvn  -0.673 0.387 0.630\nvn  -0.628 0.400 0.668\nvn  -0.676 0.438 0.592\nvn  -0.698 0.309 0.646\nvn  -0.622 0.535 0.573\nvn  -0.511 0.327 0.795\nvn  -0.733 -0.405 -0.547\nvn  -0.884 -0.261 -0.388\nvn  -0.791 -0.366 0.490\nvn  -0.793 -0.344 0.502\nvn  -0.844 -0.347 0.408\nvn  -0.858 -0.453 0.243\nvn  -0.953 -0.280 0.116\nvn  -0.976 -0.193 0.100\nvn  -0.989 -0.113 0.096\nvn  -0.289 0.792 0.537\nvn  -0.301 0.654 0.693\nvn  -0.134 0.672 0.728\nvn  -0.137 0.821 0.554\nvn  -0.884 0.305 0.354\nvn  -0.716 0.471 0.515\nvn  -0.736 0.562 0.377\nvn  -0.897 0.355 0.265\nvn  -0.890 0.422 0.171\nvn  -0.179 0.082 0.981\nvn  -0.216 0.250 0.944\nvn  -0.661 -0.125 0.740\nvn  -0.679 0.371 0.633\nvn  -0.636 0.460 0.620\nvn  -0.594 0.426 0.682\nvn  -0.258 0.436 0.862\nvn  -0.070 0.240 0.968\nvn  -0.095 0.440 0.893\nvn  -0.011 0.089 0.996\nvn  -0.069 -0.049 0.996\nvn  -0.719 0.247 0.649\nvn  -0.673 0.172 0.719\nvn  -0.353 0.447 0.822\nvn  -0.270 0.134 0.954\nvn  -0.440 0.328 0.836\nvn  -0.511 0.490 0.706\nvn  -0.342 0.114 0.933\nvn  -0.435 -0.298 0.849\nvn  -0.552 0.158 0.818\nvn  -0.273 0.369 0.888\nvn  -0.705 -0.192 0.683\nvn  -0.357 0.088 0.930\nvn  -0.499 0.346 0.795\nvn  0.009 0.585 0.811\nvn  0.086 0.584 0.807\nvn  -0.348 -0.035 0.937\nvn  -0.516 0.299 0.803\nvn  -0.512 0.295 0.806\nvn  -0.339 0.070 0.938\nvn  -0.348 -0.070 0.935\nvn  -0.148 -0.003 0.989\nvn  -0.349 0.750 0.561\nvn  -0.322 0.418 0.849\nvn  -0.890 -0.163 0.425\nvn  -0.990 -0.001 0.144\nvn  -0.500 0.824 0.267\nvn  -0.501 0.717 0.484\nvn  -0.285 0.905 0.315\nvn  -0.282 0.954 0.103\nvn  -0.268 0.957 -0.114\nvn  -0.433 0.898 -0.078\nvn  -0.473 0.876 0.093\nvn  -0.131 0.985 0.111\nvn  -0.127 0.932 0.339\nvn  -0.211 -0.186 0.960\nvn  -0.293 -0.359 0.886\nvn  -0.344 -0.465 0.816\nvn  -0.382 -0.591 0.710\nvn  -0.525 -0.255 0.812\nvn  -0.598 0.089 0.796\nvn  -0.688 0.244 0.683\nvn  -0.344 -0.576 0.742\nvn  -0.544 -0.583 0.603\nvn  0.098 -0.695 0.712\nvn  -0.805 -0.326 0.496\nvn  -0.132 0.306 0.943\nvn  -0.485 0.160 0.860\nvn  -0.351 -0.498 0.793\nvn  -0.141 -0.499 0.855\nvn  0.065 -0.990 0.123\nvn  0.037 -0.989 0.143\nvn  -0.065 -0.055 0.996\nvn  -0.473 -0.369 0.800\nvn  -0.396 0.179 0.900\nvn  -0.600 0.505 0.620\nvn  -0.387 0.499 0.776\nvn  -0.398 0.505 0.766\nvn  -0.358 0.488 0.796\nvn  -0.570 0.304 0.763\nvn  -0.317 0.412 0.854\nvn  -0.742 -0.129 0.658\nvn  -0.771 -0.207 0.602\nvn  -0.881 -0.036 0.472\nvn  -0.841 -0.052 0.538\nvn  -0.972 0.111 0.208\nvn  -0.961 0.151 0.230\nvn  -0.916 -0.004 0.402\nvn  -0.913 0.013 0.408\nvn  -0.689 0.026 0.724\nvn  -0.641 -0.316 0.699\nvn  -0.647 -0.304 0.699\nvn  -0.697 -0.094 0.711\nvn  -0.966 0.063 0.249\nvn  -0.963 0.075 0.259\nvn  -0.958 0.031 0.287\nvn  -0.681 -0.315 0.661\nvn  -0.745 -0.412 0.525\nvn  -0.666 -0.413 0.621\nvn  -0.548 -0.335 0.767\nvn  -0.107 -0.395 0.913\nvn  -0.299 -0.320 0.899\nvn  -0.418 -0.236 0.877\nvn  -0.210 -0.169 0.963\nvn  -0.090 0.952 0.291\nvn  -0.166 0.838 0.520\nvn  -0.523 0.797 0.302\nvn  -0.302 0.941 0.154\nvn  0.408 -0.888 0.211\nvn  0.735 0.117 0.668\nvn  -0.279 0.960 0.001\nvn  -0.468 0.706 0.531\nvn  -0.232 0.964 0.131\nvn  -0.555 -0.033 0.831\nvn  -0.517 0.199 0.833\nvn  -0.549 0.222 0.806\nvn  -0.376 0.125 0.918\nvn  -0.210 0.031 0.977\nvn  -0.435 -0.045 0.899\nvn  -0.739 0.154 0.656\nvn  -0.610 0.153 0.777\nvn  -0.663 0.041 0.748\nvn  -0.733 0.013 0.681\nvn  -0.744 -0.668 0.007\nvn  -0.845 -0.501 -0.187\nvn  -0.845 -0.522 -0.114\nvn  -0.774 -0.629 0.079\nvn  -0.897 0.040 0.440\nvn  -0.896 0.094 0.434\nvn  -0.179 0.204 -0.962\nvn  -0.157 0.488 -0.858\nvn  -0.506 0.590 0.630\nvn  -0.305 0.951 0.047\nvn  0.267 -0.958 -0.102\nvn  -0.432 -0.745 0.509\nvn  -0.075 -0.883 0.463\nvn  -0.236 -0.454 0.859\nvn  -0.504 -0.423 0.753\nvn  -0.821 -0.351 0.449\nvn  -0.876 0.033 0.481\nvn  -0.934 -0.155 0.322\nvn  -0.134 0.983 -0.126\nvn  -0.128 0.916 -0.381\nvn  -0.284 0.891 -0.353\nvn  0.055 0.396 0.917\nvn  0.092 0.644 0.760\nvn  -0.199 0.976 -0.093\nvn  -0.109 0.991 -0.072\nvn  -0.039 0.079 0.996\nvn  -0.081 -0.191 0.978\nvn  -0.854 0.239 0.462\nvn  -0.774 0.223 0.593\nvn  -0.502 -0.119 0.856\nvn  -0.403 -0.420 0.813\nvn  -0.680 -0.255 0.687\nvn  -0.525 0.172 0.834\nvn  -0.376 -0.531 0.759\nvn  -0.576 -0.754 0.316\nvn  0.040 0.159 0.986\nvn  0.036 -0.180 0.983\nvn  -0.308 0.943 -0.129\nvn  -0.983 0.074 -0.170\nvn  -0.456 -0.445 0.771\nvn  -0.476 -0.297 0.828\nvn  -0.788 -0.316 0.528\nvn  -0.393 0.095 0.915\nvn  -0.308 0.018 0.951\nvn  -0.125 0.331 0.935\nvn  -0.283 0.033 0.959\nvn  -0.598 0.322 0.734\nvn  -0.575 0.559 0.598\nvn  -0.216 -0.852 0.476\nvn  0.156 -0.927 0.342\nvn  -0.941 -0.282 -0.189\nvn  -0.739 -0.637 0.221\nvn  -0.469 -0.731 0.495\nvn  -0.458 -0.139 -0.878\nvn  -0.498 -0.315 -0.808\nvn  -0.210 -0.426 -0.880\nvn  -0.182 -0.243 -0.953\nvn  -0.334 -0.402 0.853\nvn  0.221 -0.960 -0.173\nvn  -0.414 -0.366 0.834\nvn  -0.902 -0.373 -0.218\nvn  -0.632 -0.114 0.767\nvn  -0.642 0.122 0.757\nvn  -0.194 -0.651 0.734\nvn  -0.351 -0.095 0.931\nvn  -0.707 0.530 0.467\nvn  -0.087 -0.550 0.831\nvn  0.352 -0.710 0.610\nvn  -0.500 -0.482 0.720\nvn  -0.653 -0.626 0.427\nvn  -0.856 0.328 0.399\nvn  -0.578 -0.029 0.816\nvn  0.275 -0.432 0.859\nvn  -0.123 0.953 0.277\nvn  -0.228 0.657 0.719\nvn  -0.298 -0.735 0.609\nvn  -0.300 -0.179 0.937\nvn  -0.219 0.400 0.890\nvn  -0.587 -0.175 0.791\nvn  0.175 0.460 0.870\nvn  -0.179 0.856 0.485\nvn  0.114 0.959 0.259\nvn  0.664 0.620 0.418\nvn  -0.026 -0.991 0.129\nvn  -0.184 -0.979 0.082\nvn  -0.810 0.566 -0.151\nvn  -0.628 0.654 -0.422\nvn  -0.741 0.405 -0.536\nvn  -0.924 0.322 -0.207\nvn  -0.493 0.823 -0.280\nvn  -0.648 0.758 -0.080\nvn  -0.966 0.258 0.022\nvn  -0.864 0.501 0.051\nvn  -0.679 0.730 0.075\nvn  -0.221 -0.970 0.105\nvn  -0.271 -0.962 -0.038\nvn  -0.376 -0.516 0.769\nvn  -0.124 0.748 -0.652\nvn  -0.339 0.727 -0.598\nvn  -0.420 0.469 -0.777\nvn  -0.500 -0.524 -0.690\nvn  -0.489 -0.481 -0.728\nvn  -0.206 -0.458 -0.865\nvn  -0.212 -0.565 -0.797\nvn  -0.893 -0.325 -0.312\nvn  -0.759 -0.435 -0.485\nvn  -0.796 -0.289 -0.532\nvn  -0.937 -0.249 -0.246\nvn  -0.193 -0.029 -0.981\nvn  -0.202 -0.249 -0.947\nvn  -0.814 -0.090 -0.574\nvn  -0.969 -0.102 -0.227\nvn  -0.969 0.093 -0.229\nvn  -0.801 0.142 -0.581\nvn  -0.998 0.061 -0.010\nvn  -0.718 0.664 0.209\nvn  -0.985 -0.168 0.036\nvn  -0.954 -0.222 -0.201\nvn  -0.451 0.039 0.891\nvn  -0.341 -0.253 0.905\nvn  -0.604 -0.144 0.784\nvn  -0.472 -0.641 0.606\nvn  0.107 -0.991 0.080\nvn  -0.463 0.274 0.843\nvn  -0.002 0.997 0.081\nvn  0.083 0.977 0.195\nvn  -0.466 0.366 0.805\nvn  -0.977 0.200 0.072\nvn  0.916 -0.331 0.226\nvn  0.929 -0.364 -0.067\nvn  0.728 0.359 0.584\nvn  -0.419 0.737 -0.531\nvn  -0.638 0.769 0.043\nvn  -0.146 0.857 -0.494\nvn  0.280 0.954 0.105\nvn  0.343 0.909 -0.237\nvn  0.546 0.838 -0.008\nvn  0.342 -0.678 -0.651\nvn  -0.159 -0.734 -0.660\nvn  -0.545 0.363 0.756\nvn  -0.599 0.165 0.783\nvn  -0.447 0.066 0.892\nvn  -0.645 0.255 0.721\nvn  -0.936 0.164 0.311\nvn  -0.776 0.182 -0.604\nvn  -0.827 0.285 -0.485\nvn  -0.999 -0.012 0.041\nvn  -0.995 -0.037 -0.093\nvn  -0.586 -0.252 0.770\nvn  -0.926 -0.370 0.079\nvn  -0.938 -0.339 -0.067\nvn  -0.889 -0.266 0.372\nvn  -0.922 -0.372 -0.106\nvn  -0.493 -0.275 -0.825\nvn  -0.473 0.194 -0.860\nvn  -0.965 -0.122 0.231\nvn  -0.401 -0.036 -0.915\nvn  -0.143 -0.164 -0.976\nvn  -0.496 -0.052 -0.867\nvn  -0.996 -0.037 -0.083\nvn  -0.998 0.042 0.045\nvn  -0.950 0.012 0.313\nvn  -0.733 -0.008 0.681\nvn  -0.670 0.247 0.700\nvn  -0.408 0.697 0.589\nvn  -0.330 0.155 0.931\nvn  -0.517 0.244 0.821\nvn  0.568 -0.625 0.535\nvn  -0.512 -0.108 0.852\nvn  -0.414 -0.112 0.903\nvn  -0.654 -0.140 0.743\nvn  -0.608 -0.086 0.789\nvn  -0.422 0.215 0.881\nvn  -0.943 0.031 0.332\nvn  -0.549 0.190 0.814\nvn  -0.193 0.018 0.981\nvn  0.358 0.872 0.335\nvn  -0.651 -0.118 0.750\nvn  -0.954 -0.010 0.300\nvn  -0.352 0.145 -0.925\nvn  -0.095 -0.049 -0.994\nvn  -0.769 0.031 0.639\nvn  -0.929 -0.329 -0.171\nvn  -0.923 -0.336 0.190\nvn  -0.985 -0.174 0.005\nvn  -0.970 -0.234 0.068\nvn  -0.801 0.162 0.576\nvn  -0.969 -0.184 0.166\nvn  -0.293 0.803 0.519\nvn  -0.954 -0.019 0.300\nvn  -0.133 0.986 -0.105\nvn  -0.976 0.175 0.130\nvn  -0.098 0.675 -0.732\nvn  -0.993 0.112 -0.041\nvn  -0.197 0.127 -0.972\nvn  -0.997 -0.077 -0.003\nvn  -0.112 -0.322 -0.940\nvn  -0.978 -0.176 -0.109\nvn  -0.171 -0.674 -0.719\nvn  -0.397 -0.789 -0.468\nvn  -0.937 -0.337 -0.091\nvn  -0.929 -0.341 -0.146\nvn  -0.158 -0.985 -0.070\nvn  -0.854 -0.500 0.145\nvn  -0.814 -0.564 -0.141\nvn  -0.931 -0.306 -0.199\nvn  -0.824 -0.545 0.156\nvn  -0.797 -0.383 0.466\nvn  -0.811 -0.165 0.562\nvn  -0.824 0.053 0.564\nvn  -0.926 0.257 0.275\nvn  -0.991 0.062 0.118\nvn  -0.952 0.122 0.281\nvn  -0.383 -0.604 0.699\nvn  -0.810 -0.150 0.567\nvn  -0.784 0.355 0.509\nvn  -0.761 0.645 0.076\nvn  -0.920 0.079 -0.385\nvn  -0.975 -0.023 0.222\nvn  -0.937 0.166 0.308\nvn  -0.787 0.551 0.279\nvn  -0.517 0.758 -0.396\nvn  -0.337 0.112 -0.935\nvn  -0.221 -0.301 -0.928\nvn  -0.395 -0.579 -0.714\nvn  -0.520 -0.711 -0.473\nvn  -0.426 -0.904 -0.044\nvn  -0.824 -0.523 0.219\nvn  -0.886 -0.220 0.409\nvn  -0.863 0.404 0.303\nvn  -0.782 -0.104 0.615\nvn  -0.953 0.066 0.297\nvn  -0.949 0.312 0.046\nvn  -0.991 0.025 -0.134\nvn  -0.944 -0.116 0.308\nvn  -0.971 -0.237 0.041\nvn  -0.947 -0.041 0.318\nvn  -0.854 -0.274 -0.443\nvn  -0.885 -0.271 -0.378\nvn  -0.952 -0.121 -0.282\nvn  0.180 0.824 -0.537\nvn  0.642 0.679 -0.355\nvn  0.956 0.291 -0.021\nvn  0.453 -0.867 0.208\nvn  0.910 -0.301 0.285\nvn  0.854 -0.043 0.518\nvn  0.833 0.459 0.308\nvn  0.241 0.911 0.334\nvn  0.731 -0.650 -0.206\nvn  0.760 -0.585 -0.282\nvn  -0.814 0.019 0.580\nvn  -0.563 0.638 0.526\nvn  -0.925 -0.012 0.381\nvn  -0.214 0.952 0.217\nvn  0.096 0.721 0.686\nvn  -0.027 0.945 0.325\nvn  -0.555 -0.678 -0.481\nvn  0.062 0.937 -0.343\nvn  0.240 -0.291 0.926\nvn  0.184 -0.889 0.419\nvn  -0.126 -0.990 0.061\nvn  -0.889 -0.369 -0.271\nvn  -0.506 -0.832 0.229\nvn  -0.808 -0.443 0.388\nvn  -0.993 -0.084 0.087\nvn  0.350 -0.016 0.937\nvn  -0.636 0.759 -0.140\nvn  -0.771 0.626 -0.115\nvn  -0.250 0.462 -0.851\nvn  -0.192 0.568 -0.801\nvn  -0.359 0.279 0.891\nvn  -0.026 0.144 0.989\nvn  -0.398 -0.100 0.912\nvn  -0.465 0.084 0.881\nvn  -0.895 0.186 0.405\nvn  -0.947 0.184 0.264\nvn  -0.761 0.459 0.458\nvn  -0.657 0.429 0.620\nvn  -0.426 0.660 0.618\nvn  -0.505 0.610 0.611\nvn  0.223 0.536 0.814\nvn  0.285 0.393 0.874\nvn  -0.163 0.555 0.815\nvn  -0.038 0.570 0.821\nvn  -0.628 0.723 -0.288\nvn  -0.458 0.737 0.497\nvn  -0.212 0.799 0.563\nvn  -0.278 0.687 0.672\nvn  -0.380 0.657 0.651\nvn  -0.170 0.846 0.506\nvn  -0.305 0.687 0.660\nvn  -0.144 0.795 0.589\nvn  0.001 0.494 -0.870\nvn  -0.208 0.539 -0.816\nvn  -0.027 0.458 -0.888\nvn  -0.057 0.367 -0.929\nvn  -0.262 0.718 0.645\nvn  -0.054 0.163 -0.985\nvn  -0.306 0.325 -0.895\nvn  -0.643 0.181 0.744\nvn  -0.717 0.083 0.692\nvn  -0.800 0.573 -0.178\nvn  0.296 -0.070 0.953\nvn  -0.319 -0.065 0.946\n# 1258 vertex normals\n\ng head\ns 1\nf 24/1/24 25/2/25 26/3/26\nf 24/1/24 26/3/26 23/4/23\nf 28/5/28 29/6/29 30/7/30\nf 28/5/28 30/7/30 27/8/27\nf 32/9/32 33/10/33 34/11/34\nf 32/9/32 34/11/34 31/12/31\nf 36/13/36 31/12/31 34/11/34\nf 36/13/36 34/11/34 35/14/35\nf 36/13/36 35/14/35 25/2/25\nf 36/13/36 25/2/25 24/1/24\nf 38/15/38 39/16/39 40/17/40\nf 38/15/38 40/17/40 37/18/37\nf 42/19/42 23/4/23 26/3/26\nf 42/19/42 26/3/26 41/20/41\nf 40/17/40 42/19/42 41/20/41\nf 40/17/40 41/20/41 37/18/37\nf 38/15/38 43/21/43 44/22/44\nf 38/15/38 44/22/44 39/16/39\nf 32/9/32 45/23/45 46/24/46\nf 32/9/32 46/24/46 33/10/33\nf 28/5/28 44/22/44 48/25/48\nf 28/5/28 48/25/48 47/26/47\nf 50/27/50 51/28/51 52/29/52\nf 50/27/50 52/29/52 49/30/49\nf 54/31/54 55/32/55 56/33/56\nf 54/31/54 56/33/56 53/34/53\nf 58/35/58 59/36/59 60/37/60\nf 58/35/58 60/37/60 57/38/57\nf 62/39/62 63/40/63 64/41/64\nf 62/39/62 64/41/64 61/42/61\nf 66/43/66 67/44/67 68/45/68\nf 66/43/66 68/45/68 65/46/65\nf 70/47/70 71/48/71 72/49/72\nf 70/47/70 72/49/72 69/50/69\nf 67/44/67 66/43/66 74/51/74\nf 67/44/67 74/51/74 73/52/73\nf 66/43/66 51/28/51 50/27/50\nf 66/43/66 50/27/50 74/51/74\nf 76/53/76 77/54/77 78/55/78\nf 76/53/76 78/55/78 75/56/75\nf 80/57/80 81/58/81 82/59/82\nf 80/57/80 82/59/82 79/60/79\nf 84/61/84 85/62/85 86/63/86\nf 84/61/84 86/63/86 83/64/83\nf 87/65/87 88/66/88 80/57/80\nf 87/65/87 80/57/80 79/60/79\nf 90/67/90 91/68/91 92/69/92\nf 90/67/90 92/69/92 89/70/89\nf 93/71/93 94/72/94 78/55/78\nf 93/71/93 78/55/78 77/54/77\nf 87/65/87 95/73/95 96/74/96\nf 87/65/87 96/74/96 88/66/88\nf 98/75/98 99/76/99 100/77/100\nf 98/75/98 100/77/100 97/78/97\nf 100/77/100 101/79/101 102/80/102\nf 100/77/100 102/80/102 97/78/97\nf 98/75/98 103/81/103 104/82/104\nf 98/75/98 104/82/104 99/76/99\nf 106/83/106 107/84/107 108/85/108\nf 106/83/106 108/85/108 105/86/105\nf 109/87/109 110/88/110 105/86/105\nf 109/87/109 105/86/105 108/85/108\nf 101/79/101 111/89/111 112/90/112\nf 101/79/101 112/90/112 102/80/102\nf 114/91/114 115/92/115 116/93/116\nf 114/91/114 116/93/116 113/94/113\nf 118/95/118 119/96/119 120/97/120\nf 118/95/118 120/97/120 117/98/117\nf 122/99/122 123/100/123 124/101/124\nf 122/99/122 124/101/124 121/102/121\nf 126/103/126 127/104/127 128/105/128\nf 126/103/126 128/105/128 125/106/125\nf 130/107/130 131/108/131 132/109/132\nf 130/107/130 132/109/132 129/110/129\nf 125/106/125 128/105/128 134/111/134\nf 125/106/125 134/111/134 133/112/133\nf 56/33/56 55/32/55 136/113/136\nf 56/33/56 136/113/136 135/114/135\nf 37/115/37 137/116/137 138/117/138\nf 37/115/37 138/117/138 38/118/38\nf 139/119/139 43/120/43 38/118/38\nf 139/119/139 38/118/38 138/117/138\nf 140/121/140 141/122/141 142/123/142\nf 140/121/140 142/123/142 130/107/130\nf 144/124/144 129/110/129 132/109/132\nf 144/124/144 132/109/132 143/125/143\nf 146/126/146 147/127/147 148/128/148\nf 146/126/146 148/128/148 145/129/145\nf 150/130/150 151/131/151 54/31/54\nf 150/130/150 54/31/54 149/132/149\nf 54/31/54 53/34/53 152/133/152\nf 54/31/54 152/133/152 149/132/149\nf 154/134/154 155/135/155 156/136/156\nf 154/134/154 156/136/156 153/137/153\nf 158/138/158 159/139/159 160/140/160\nf 158/138/158 160/140/160 157/141/157\nf 162/142/162 163/143/163 164/144/164\nf 162/142/162 164/144/164 161/145/161\nf 129/110/129 144/124/144 157/141/157\nf 129/110/129 157/141/157 160/140/160\nf 156/136/156 155/135/155 166/146/166\nf 156/136/156 166/146/166 165/147/165\nf 168/148/168 169/149/169 170/150/170\nf 168/148/168 170/150/170 167/151/167\nf 171/152/171 172/153/172 173/154/173\nf 171/152/171 173/154/173 169/149/169\nf 175/155/175 176/156/176 171/152/171\nf 175/155/175 171/152/171 174/157/174\nf 59/36/59 177/158/177 178/159/178\nf 59/36/59 178/159/178 60/37/60\nf 180/160/180 181/161/181 49/30/49\nf 180/160/180 49/30/49 179/162/179\nf 127/104/127 52/29/52 182/163/182\nf 127/104/127 182/163/182 128/105/128\nf 134/111/134 183/164/183 184/165/184\nf 134/111/134 184/165/184 124/101/124\nf 185/166/185 121/102/121 124/101/124\nf 185/166/185 124/101/124 184/165/184\nf 187/167/187 188/168/188 189/169/189\nf 187/167/187 189/169/189 186/170/186\nf 191/171/191 192/172/192 193/173/193\nf 191/171/191 193/173/193 190/174/190\nf 76/53/76 194/175/194 193/173/193\nf 76/53/76 193/173/193 77/54/77\nf 100/77/100 99/76/99 196/176/196\nf 100/77/100 196/176/196 195/177/195\nf 176/156/176 175/155/175 198/178/198\nf 176/156/176 198/178/198 197/179/197\nf 199/180/199 200/181/200 173/154/173\nf 199/180/199 173/154/173 172/153/172\nf 196/176/196 202/182/202 203/183/203\nf 196/176/196 203/183/203 201/184/201\nf 205/185/205 206/186/206 207/187/207\nf 205/185/205 207/187/207 204/188/204\nf 208/189/208 205/185/205 204/188/204\nf 208/189/208 204/188/204 201/184/201\nf 210/190/210 97/78/97 102/80/102\nf 210/190/210 102/80/102 209/191/209\nf 79/60/79 210/190/210 209/191/209\nf 79/60/79 209/191/209 87/65/87\nf 212/192/212 213/193/213 214/194/214\nf 212/192/212 214/194/214 211/195/211\nf 216/196/216 217/197/217 218/198/218\nf 216/196/216 218/198/218 215/199/215\nf 220/200/220 216/196/216 215/199/215\nf 220/200/220 215/199/215 219/201/219\nf 222/202/222 223/203/223 218/198/218\nf 222/202/222 218/198/218 221/204/221\nf 225/205/225 226/206/226 227/207/227\nf 225/205/225 227/207/227 224/208/224\nf 222/202/222 221/204/221 229/209/229\nf 222/202/222 229/209/229 228/210/228\nf 230/211/230 231/212/231 220/200/220\nf 230/211/230 220/200/220 219/201/219\nf 227/207/227 226/206/226 231/212/231\nf 227/207/227 231/212/231 230/211/230\nf 233/213/233 234/214/234 235/215/235\nf 233/213/233 235/215/235 232/216/232\nf 186/170/186 203/183/203 202/182/202\nf 186/170/186 202/182/202 187/167/187\nf 236/217/236 237/218/237 238/219/238\nf 236/217/236 238/219/238 188/168/188\nf 240/220/240 241/221/241 242/222/242\nf 240/220/240 242/222/242 239/223/239\nf 241/221/241 243/224/243 244/225/244\nf 241/221/241 244/225/244 238/219/238\nf 245/226/245 101/79/101 100/77/100\nf 245/226/245 100/77/100 195/177/195\nf 195/177/195 204/188/204 207/187/207\nf 195/177/195 207/187/207 245/226/245\nf 111/89/111 246/227/246 247/228/247\nf 111/89/111 247/228/247 115/92/115\nf 141/122/141 140/121/140 249/229/249\nf 141/122/141 249/229/249 248/230/248\nf 251/231/251 252/232/252 253/233/253\nf 251/231/251 253/233/253 250/234/250\nf 254/235/254 118/95/118 255/236/255\nf 254/235/254 255/236/255 217/197/217\nf 257/237/257 258/238/258 259/239/259\nf 257/237/257 259/239/259 256/240/256\nf 256/240/256 259/239/259 261/241/261\nf 256/240/256 261/241/261 260/242/260\nf 260/242/260 261/241/261 30/243/30\nf 260/242/260 30/243/30 29/244/29\nf 218/198/218 217/197/217 262/245/262\nf 218/198/218 262/245/262 221/204/221\nf 259/239/259 258/238/258 264/246/264\nf 259/239/259 264/246/264 263/247/263\nf 266/248/266 30/243/30 261/241/261\nf 266/248/266 261/241/261 265/249/265\nf 253/233/253 252/232/252 268/250/268\nf 253/233/253 268/250/268 267/251/267\nf 270/252/270 200/181/200 271/253/271\nf 270/252/270 271/253/271 269/254/269\nf 199/180/199 272/255/272 271/253/271\nf 199/180/199 271/253/271 200/181/200\nf 199/180/199 273/256/273 274/257/274\nf 199/180/199 274/257/274 272/255/272\nf 276/258/276 267/251/267 268/250/268\nf 276/258/276 268/250/268 275/259/275\nf 275/259/275 268/250/268 269/254/269\nf 275/259/275 269/254/269 277/260/277\nf 93/71/93 77/54/77 193/173/193\nf 93/71/93 193/173/193 192/172/192\nf 279/261/279 280/262/280 281/263/281\nf 279/261/279 281/263/281 278/264/278\nf 278/264/278 88/66/88 96/74/96\nf 278/264/278 96/74/96 279/261/279\nf 282/265/282 283/266/283 62/39/62\nf 282/265/282 62/39/62 94/72/94\nf 281/263/281 284/267/284 285/268/285\nf 281/263/281 285/268/285 278/264/278\nf 287/269/287 288/270/288 289/271/289\nf 287/269/287 289/271/289 286/272/286\nf 63/40/63 62/39/62 283/266/283\nf 63/40/63 283/266/283 290/273/290\nf 283/266/283 291/274/291 292/275/292\nf 283/266/283 292/275/292 290/273/290\nf 293/276/293 294/277/294 68/45/68\nf 293/276/293 68/45/68 67/44/67\nf 296/278/296 297/279/297 298/280/298\nf 296/278/296 298/280/298 295/281/295\nf 300/282/300 301/283/301 302/284/302\nf 300/282/300 302/284/302 299/285/299\nf 304/286/304 305/287/305 306/288/306\nf 304/286/304 306/288/306 303/289/303\nf 138/117/138 137/116/137 308/290/308\nf 138/117/138 308/290/308 307/291/307\nf 165/147/165 310/292/310 311/293/311\nf 165/147/165 311/293/311 309/294/309\nf 312/295/312 55/32/55 54/31/54\nf 312/295/312 54/31/54 151/131/151\nf 314/296/314 151/131/151 150/130/150\nf 314/296/314 150/130/150 313/297/313\nf 315/298/315 316/299/316 227/207/227\nf 315/298/315 227/207/227 230/211/230\nf 136/113/136 317/300/317 158/138/158\nf 136/113/136 158/138/158 157/141/157\nf 319/301/319 148/128/148 147/127/147\nf 319/301/319 147/127/147 318/302/318\nf 320/303/320 321/304/321 147/127/147\nf 320/303/320 147/127/147 146/126/146\nf 323/305/323 324/306/324 325/307/325\nf 323/305/323 325/307/325 322/308/322\nf 80/57/80 88/66/88 278/264/278\nf 80/57/80 278/264/278 285/268/285\nf 327/309/327 145/129/145 148/128/148\nf 327/309/327 148/128/148 326/310/326\nf 279/261/279 286/272/286 289/271/289\nf 279/261/279 289/271/289 280/262/280\nf 329/311/329 330/312/330 331/313/331\nf 329/311/329 331/313/331 328/314/328\nf 187/167/187 202/182/202 104/82/104\nf 187/167/187 104/82/104 332/315/332\nf 236/217/236 332/315/332 191/171/191\nf 236/217/236 191/171/191 190/174/190\nf 165/147/165 166/146/166 333/316/333\nf 165/147/165 333/316/333 310/292/310\nf 139/119/139 334/317/334 48/318/48\nf 139/119/139 48/318/48 43/120/43\nf 336/319/336 337/320/337 338/321/338\nf 336/319/336 338/321/338 335/322/335\nf 51/28/51 324/306/324 182/163/182\nf 51/28/51 182/163/182 52/29/52\nf 339/323/339 126/103/126 53/34/53\nf 339/323/339 53/34/53 56/33/56\nf 340/324/340 341/325/341 149/132/149\nf 340/324/340 149/132/149 152/133/152\nf 243/224/243 343/326/343 344/327/344\nf 243/224/243 344/327/344 342/328/342\nf 346/329/346 343/326/343 240/220/240\nf 346/329/346 240/220/240 345/330/345\nf 348/331/348 349/332/349 350/333/350\nf 348/331/348 350/333/350 347/334/347\nf 351/335/351 352/336/352 213/193/213\nf 351/335/351 213/193/213 212/192/212\nf 128/105/128 182/163/182 183/164/183\nf 128/105/128 183/164/183 134/111/134\nf 103/81/103 98/75/98 354/337/354\nf 103/81/103 354/337/354 353/338/353\nf 114/91/114 113/94/113 356/339/356\nf 114/91/114 356/339/356 355/340/355\nf 358/341/358 197/179/197 198/178/198\nf 358/341/358 198/178/198 357/342/357\nf 107/84/107 359/343/359 360/344/360\nf 107/84/107 360/344/360 108/85/108\nf 348/331/348 361/345/361 362/346/362\nf 348/331/348 362/346/362 349/332/349\nf 347/334/347 363/347/363 234/214/234\nf 347/334/347 234/214/234 348/331/348\nf 220/200/220 231/212/231 167/151/167\nf 220/200/220 167/151/167 364/348/364\nf 153/137/153 366/349/366 300/282/300\nf 153/137/153 300/282/300 365/350/365\nf 295/281/295 72/49/72 71/48/71\nf 295/281/295 71/48/71 296/278/296\nf 179/162/179 339/323/339 367/351/367\nf 179/162/179 367/351/367 180/160/180\nf 368/352/368 369/353/369 158/138/158\nf 368/352/368 158/138/158 317/300/317\nf 317/300/317 136/113/136 55/32/55\nf 317/300/317 55/32/55 312/295/312\nf 371/354/371 372/355/372 373/356/373\nf 371/354/371 373/356/373 370/357/370\nf 41/358/41 26/359/26 306/288/306\nf 41/358/41 306/288/306 305/287/305\nf 305/287/305 137/116/137 37/115/37\nf 305/287/305 37/115/37 41/358/41\nf 248/230/248 374/360/374 375/361/375\nf 248/230/248 375/361/375 141/122/141\nf 66/43/66 325/307/325 324/306/324\nf 66/43/66 324/306/324 51/28/51\nf 183/164/183 323/305/323 376/362/376\nf 183/164/183 376/362/376 184/165/184\nf 378/363/378 253/233/253 267/251/267\nf 378/363/378 267/251/267 377/364/377\nf 269/254/269 271/253/271 379/365/379\nf 269/254/269 379/365/379 277/260/277\nf 381/366/381 382/367/382 383/368/383\nf 381/366/381 383/368/383 380/369/380\nf 384/370/384 385/371/385 105/86/105\nf 384/370/384 105/86/105 110/88/110\nf 105/86/105 385/371/385 386/372/386\nf 105/86/105 386/372/386 106/83/106\nf 360/344/360 387/373/387 109/87/109\nf 360/344/360 109/87/109 108/85/108\nf 181/161/181 180/160/180 164/144/164\nf 181/161/181 164/144/164 163/143/163\nf 365/350/365 388/374/388 154/134/154\nf 365/350/365 154/134/154 153/137/153\nf 168/148/168 167/151/167 231/212/231\nf 168/148/168 231/212/231 226/206/226\nf 81/58/81 291/274/291 283/266/283\nf 81/58/81 283/266/283 282/265/282\nf 272/255/272 389/375/389 379/365/379\nf 272/255/272 379/365/379 271/253/271\nf 274/257/274 390/376/390 389/375/389\nf 274/257/274 389/375/389 272/255/272\nf 139/119/139 375/361/375 374/360/374\nf 139/119/139 374/360/374 334/317/334\nf 391/377/391 366/349/366 153/137/153\nf 391/377/391 153/137/153 156/136/156\nf 392/378/392 393/379/393 366/349/366\nf 392/378/392 366/349/366 391/377/391\nf 173/154/173 200/181/200 270/252/270\nf 173/154/173 270/252/270 394/380/394\nf 301/283/301 300/282/300 366/349/366\nf 301/283/301 366/349/366 393/379/393\nf 396/381/396 397/382/397 398/383/398\nf 396/381/396 398/383/398 395/384/395\nf 399/385/399 364/348/364 167/151/167\nf 399/385/399 167/151/167 170/150/170\nf 394/380/394 251/231/251 399/385/399\nf 394/380/394 399/385/399 170/150/170\nf 270/252/270 252/232/252 251/231/251\nf 270/252/270 251/231/251 394/380/394\nf 102/80/102 112/90/112 400/386/400\nf 102/80/102 400/386/400 209/191/209\nf 131/108/131 401/387/401 372/355/372\nf 131/108/131 372/355/372 371/354/371\nf 391/377/391 156/136/156 165/147/165\nf 391/377/391 165/147/165 309/294/309\nf 403/388/403 404/389/404 405/390/405\nf 403/388/403 405/390/405 402/391/402\nf 402/391/402 392/378/392 391/377/391\nf 402/391/402 391/377/391 309/294/309\nf 35/392/35 310/292/310 333/316/333\nf 35/392/35 333/316/333 25/393/25\nf 35/392/35 34/394/34 311/293/311\nf 35/392/35 311/293/311 310/292/310\nf 34/394/34 33/395/33 403/388/403\nf 34/394/34 403/388/403 311/293/311\nf 406/396/406 262/245/262 217/197/217\nf 406/396/406 217/197/217 255/236/255\nf 377/364/377 407/397/407 408/398/408\nf 377/364/377 408/398/408 406/396/406\nf 117/98/117 378/363/378 255/236/255\nf 117/98/117 255/236/255 118/95/118\nf 270/252/270 269/254/269 268/250/268\nf 270/252/270 268/250/268 252/232/252\nf 304/286/304 303/289/303 373/356/373\nf 304/286/304 373/356/373 372/355/372\nf 362/346/362 409/399/409 410/400/410\nf 362/346/362 410/400/410 349/332/349\nf 411/401/411 412/402/412 89/70/89\nf 411/401/411 89/70/89 92/69/92\nf 414/403/414 411/401/411 415/404/415\nf 414/403/414 415/404/415 413/405/413\nf 417/406/417 336/319/336 418/407/418\nf 417/406/417 418/407/418 416/408/416\nf 337/320/337 419/409/419 69/50/69\nf 337/320/337 69/50/69 72/49/72\nf 421/410/421 422/411/422 423/412/423\nf 421/410/421 423/412/423 420/413/420\nf 421/410/421 424/414/424 425/415/425\nf 421/410/421 425/415/425 422/411/422\nf 423/412/423 422/411/422 427/416/427\nf 423/412/423 427/416/427 426/417/426\nf 239/223/239 242/222/242 428/418/428\nf 239/223/239 428/418/428 425/415/425\nf 430/419/430 73/52/73 74/51/74\nf 430/419/430 74/51/74 429/420/429\nf 70/47/70 69/50/69 419/409/419\nf 70/47/70 419/409/419 429/420/429\nf 247/228/247 431/421/431 116/93/116\nf 247/228/247 116/93/116 115/92/115\nf 346/329/346 345/330/345 433/422/433\nf 346/329/346 433/422/433 432/423/432\nf 433/422/433 421/410/421 420/413/420\nf 433/422/433 420/413/420 434/424/434\nf 436/425/436 437/426/437 438/427/438\nf 436/425/436 438/427/438 435/428/435\nf 437/426/437 381/366/381 380/369/380\nf 437/426/437 380/369/380 438/427/438\nf 178/159/178 177/158/177 440/429/440\nf 178/159/178 440/429/440 439/430/439\nf 440/429/440 441/431/441 442/432/442\nf 440/429/440 442/432/442 439/430/439\nf 444/433/444 445/434/445 446/435/446\nf 444/433/444 446/435/446 443/436/443\nf 324/306/324 323/305/323 183/164/183\nf 324/306/324 183/164/183 182/163/182\nf 213/193/213 352/336/352 357/342/357\nf 213/193/213 357/342/357 198/178/198\nf 214/194/214 175/155/175 174/157/174\nf 214/194/214 174/157/174 225/205/225\nf 448/437/448 449/438/449 450/439/450\nf 448/437/448 450/439/450 447/440/447\nf 423/412/423 426/417/426 451/441/451\nf 423/412/423 451/441/451 447/440/447\nf 75/56/75 451/441/451 426/417/426\nf 75/56/75 426/417/426 76/53/76\nf 78/55/78 94/72/94 62/39/62\nf 78/55/78 62/39/62 61/42/61\nf 286/272/286 86/63/86 85/62/85\nf 286/272/286 85/62/85 287/269/287\nf 95/73/95 87/65/87 209/191/209\nf 95/73/95 209/191/209 400/386/400\nf 237/218/237 452/442/452 428/418/428\nf 237/218/237 428/418/428 242/222/242\nf 190/174/190 193/173/193 194/175/194\nf 190/174/190 194/175/194 452/442/452\nf 237/218/237 236/217/236 190/174/190\nf 237/218/237 190/174/190 452/442/452\nf 79/60/79 82/59/82 354/337/354\nf 79/60/79 354/337/354 210/190/210\nf 286/272/286 279/261/279 96/74/96\nf 286/272/286 96/74/96 86/63/86\nf 430/419/430 417/406/417 416/408/416\nf 430/419/430 416/408/416 453/443/453\nf 338/321/338 295/281/295 298/280/298\nf 338/321/338 298/280/298 299/285/299\nf 57/38/57 60/37/60 455/444/455\nf 57/38/57 455/444/455 454/445/454\nf 212/192/212 456/446/456 457/447/457\nf 212/192/212 457/447/457 351/335/351\nf 83/64/83 355/340/355 356/339/356\nf 83/64/83 356/339/356 84/61/84\nf 142/123/142 141/122/141 375/361/375\nf 142/123/142 375/361/375 307/291/307\nf 401/387/401 142/123/142 307/291/307\nf 401/387/401 307/291/307 308/290/308\nf 459/448/459 257/237/257 256/240/256\nf 459/448/459 256/240/256 458/449/458\nf 228/210/228 264/246/264 258/238/258\nf 228/210/228 258/238/258 222/202/222\nf 256/240/256 260/242/260 460/450/460\nf 256/240/256 460/450/460 458/449/458\nf 460/450/460 260/242/260 29/244/29\nf 460/450/460 29/244/29 47/451/47\nf 263/247/263 265/249/265 261/241/261\nf 263/247/263 261/241/261 259/239/259\nf 461/452/461 462/453/462 189/169/189\nf 461/452/461 189/169/189 244/225/244\nf 227/207/227 316/299/316 463/454/463\nf 227/207/227 463/454/463 224/208/224\nf 465/455/465 466/456/466 410/400/410\nf 465/455/465 410/400/410 464/457/464\nf 90/67/90 386/372/386 385/371/385\nf 90/67/90 385/371/385 91/68/91\nf 233/213/233 361/345/361 348/331/348\nf 233/213/233 348/331/348 234/214/234\nf 235/215/235 234/214/234 363/347/363\nf 235/215/235 363/347/363 467/458/467\nf 338/321/338 337/320/337 72/49/72\nf 338/321/338 72/49/72 295/281/295\nf 338/321/338 299/285/299 302/284/302\nf 338/321/338 302/284/302 335/322/335\nf 468/459/468 469/460/469 470/461/470\nf 468/459/468 470/461/470 415/404/415\nf 347/334/347 471/462/471 472/463/472\nf 347/334/347 472/463/472 363/347/363\nf 471/462/471 347/334/347 350/333/350\nf 471/462/471 350/333/350 473/464/473\nf 465/455/465 475/465/475 476/466/476\nf 465/455/465 476/466/476 474/467/474\nf 384/370/384 110/88/110 478/468/478\nf 384/370/384 478/468/478 477/469/477\nf 414/403/414 479/470/479 412/402/412\nf 414/403/414 412/402/412 411/401/411\nf 288/270/288 287/269/287 412/402/412\nf 288/270/288 412/402/412 479/470/479\nf 85/62/85 84/61/84 90/67/90\nf 85/62/85 90/67/90 89/70/89\nf 386/372/386 356/339/356 113/94/113\nf 386/372/386 113/94/113 106/83/106\nf 232/216/232 358/341/358 357/342/357\nf 232/216/232 357/342/357 233/213/233\nf 297/279/297 296/278/296 181/161/181\nf 297/279/297 181/161/181 163/143/163\nf 419/409/419 337/320/337 336/319/336\nf 419/409/419 336/319/336 417/406/417\nf 49/30/49 52/29/52 127/104/127\nf 49/30/49 127/104/127 179/162/179\nf 26/359/26 25/393/25 333/316/333\nf 26/359/26 333/316/333 306/288/306\nf 371/354/371 370/357/370 162/142/162\nf 371/354/371 162/142/162 161/145/161\nf 258/238/258 257/237/257 223/203/223\nf 258/238/258 223/203/223 222/202/222\nf 257/237/257 459/448/459 480/471/480\nf 257/237/257 480/471/480 223/203/223\nf 211/195/211 214/194/214 225/205/225\nf 211/195/211 225/205/225 224/208/224\nf 316/299/316 481/472/481 314/296/314\nf 316/299/316 314/296/314 463/454/463\nf 171/152/171 169/149/169 168/148/168\nf 171/152/171 168/148/168 174/157/174\nf 273/256/273 199/180/199 172/153/172\nf 273/256/273 172/153/172 482/473/482\nf 168/148/168 226/206/226 225/205/225\nf 168/148/168 225/205/225 174/157/174\nf 245/226/245 246/227/246 111/89/111\nf 245/226/245 111/89/111 101/79/101\nf 114/91/114 112/90/112 111/89/111\nf 114/91/114 111/89/111 115/92/115\nf 210/190/210 354/337/354 98/75/98\nf 210/190/210 98/75/98 97/78/97\nf 431/421/431 358/341/358 232/216/232\nf 431/421/431 232/216/232 359/343/359\nf 235/215/235 360/344/360 359/343/359\nf 235/215/235 359/343/359 232/216/232\nf 360/344/360 235/215/235 467/458/467\nf 360/344/360 467/458/467 387/373/387\nf 81/58/81 282/265/282 483/474/483\nf 81/58/81 483/474/483 82/59/82\nf 485/475/485 486/476/486 487/477/487\nf 485/475/485 487/477/487 484/478/484\nf 489/479/489 68/45/68 294/277/294\nf 489/479/489 294/277/294 488/480/488\nf 491/481/491 454/445/454 455/444/455\nf 491/481/491 455/444/455 490/482/490\nf 154/134/154 370/357/370 373/356/373\nf 154/134/154 373/356/373 155/135/155\nf 491/481/491 322/308/322 325/307/325\nf 491/481/491 325/307/325 492/483/492\nf 491/481/491 490/482/490 493/484/493\nf 491/481/491 493/484/493 322/308/322\nf 436/425/436 435/428/435 446/435/446\nf 436/425/436 446/435/446 494/485/494\nf 495/486/495 496/487/496 438/427/438\nf 495/486/495 438/427/438 380/369/380\nf 496/487/496 497/488/497 435/428/435\nf 496/487/496 435/428/435 438/427/438\nf 331/313/331 330/312/330 498/489/498\nf 331/313/331 498/489/498 432/423/432\nf 499/490/499 346/329/346 432/423/432\nf 499/490/499 432/423/432 498/489/498\nf 380/369/380 383/368/383 500/491/500\nf 380/369/380 500/491/500 495/486/495\nf 501/492/501 328/314/328 331/313/331\nf 501/492/501 331/313/331 434/424/434\nf 499/490/499 344/327/344 343/326/343\nf 499/490/499 343/326/343 346/329/346\nf 492/483/492 502/493/502 454/445/454\nf 492/483/492 454/445/454 491/481/491\nf 454/445/454 502/493/502 487/477/487\nf 454/445/454 487/477/487 57/38/57\nf 486/476/486 58/35/58 57/38/57\nf 486/476/486 57/38/57 487/477/487\nf 58/35/58 486/476/486 503/494/503\nf 58/35/58 503/494/503 382/367/382\nf 383/368/383 504/495/504 505/496/505\nf 383/368/383 505/496/505 500/491/500\nf 447/440/447 450/439/450 420/413/420\nf 447/440/447 420/413/420 423/412/423\nf 329/311/329 328/314/328 445/434/445\nf 329/311/329 445/434/445 444/433/444\nf 450/439/450 449/438/449 506/497/506\nf 450/439/450 506/497/506 501/492/501\nf 507/498/507 508/499/508 451/441/451\nf 507/498/507 451/441/451 75/56/75\nf 99/76/99 104/82/104 202/182/202\nf 99/76/99 202/182/202 196/176/196\nf 509/500/509 208/189/208 201/184/201\nf 509/500/509 201/184/201 203/183/203\nf 201/184/201 204/188/204 195/177/195\nf 201/184/201 195/177/195 196/176/196\nf 462/453/462 510/501/510 186/170/186\nf 462/453/462 186/170/186 189/169/189\nf 203/183/203 186/170/186 510/501/510\nf 203/183/203 510/501/510 509/500/509\nf 148/128/148 319/301/319 341/325/341\nf 148/128/148 341/325/341 326/310/326\nf 326/310/326 341/325/341 340/324/340\nf 326/310/326 340/324/340 511/502/511\nf 123/100/123 511/502/511 340/324/340\nf 123/100/123 340/324/340 133/112/133\nf 71/48/71 49/30/49 181/161/181\nf 71/48/71 181/161/181 296/278/296\nf 154/134/154 388/374/388 162/142/162\nf 154/134/154 162/142/162 370/357/370\nf 155/135/155 373/356/373 303/289/303\nf 155/135/155 303/289/303 166/146/166\nf 166/146/166 303/289/303 306/288/306\nf 166/146/166 306/288/306 333/316/333\nf 512/503/512 320/303/320 289/271/289\nf 512/503/512 289/271/289 288/270/288\nf 479/470/479 414/403/414 514/504/514\nf 479/470/479 514/504/514 513/505/513\nf 414/403/414 413/405/413 475/465/475\nf 414/403/414 475/465/475 514/504/514\nf 513/505/513 512/503/512 288/270/288\nf 513/505/513 288/270/288 479/470/479\nf 191/171/191 103/81/103 353/338/353\nf 191/171/191 353/338/353 192/172/192\nf 332/315/332 104/82/104 103/81/103\nf 332/315/332 103/81/103 191/171/191\nf 82/59/82 483/474/483 353/338/353\nf 82/59/82 353/338/353 354/337/354\nf 83/64/83 86/63/86 96/74/96\nf 83/64/83 96/74/96 95/73/95\nf 83/64/83 95/73/95 400/386/400\nf 83/64/83 400/386/400 355/340/355\nf 355/340/355 400/386/400 112/90/112\nf 355/340/355 112/90/112 114/91/114\nf 144/124/144 135/114/135 136/113/136\nf 144/124/144 136/113/136 157/141/157\nf 298/280/298 365/350/365 300/282/300\nf 298/280/298 300/282/300 299/285/299\nf 298/280/298 297/279/297 388/374/388\nf 298/280/298 388/374/388 365/350/365\nf 367/351/367 143/125/143 164/144/164\nf 367/351/367 164/144/164 180/160/180\nf 515/506/515 516/507/516 219/201/219\nf 515/506/515 219/201/219 215/199/215\nf 254/235/254 217/197/217 216/196/216\nf 254/235/254 216/196/216 517/508/517\nf 398/383/398 364/348/364 399/385/399\nf 398/383/398 399/385/399 395/384/395\nf 398/383/398 397/382/397 517/508/517\nf 398/383/398 517/508/517 216/196/216\nf 518/509/518 519/510/519 246/227/246\nf 518/509/518 246/227/246 245/226/245\nf 319/301/319 150/130/150 149/132/149\nf 319/301/319 149/132/149 341/325/341\nf 429/420/429 419/409/419 417/406/417\nf 429/420/429 417/406/417 430/419/430\nf 33/395/33 46/511/46 404/389/404\nf 33/395/33 404/389/404 403/388/403\nf 403/388/403 402/391/402 309/294/309\nf 403/388/403 309/294/309 311/293/311\nf 393/379/393 520/512/520 521/513/521\nf 393/379/393 521/513/521 301/283/301\nf 522/514/522 520/512/520 393/379/393\nf 522/514/522 393/379/393 392/378/392\nf 302/284/302 301/283/301 521/513/521\nf 302/284/302 521/513/521 523/515/523\nf 302/284/302 523/515/523 524/516/524\nf 302/284/302 524/516/524 335/322/335\nf 321/304/321 456/446/456 318/302/318\nf 321/304/321 318/302/318 147/127/147\nf 456/446/456 321/304/321 525/517/525\nf 456/446/456 525/517/525 457/447/457\nf 410/400/410 409/399/409 526/518/526\nf 410/400/410 526/518/526 464/457/464\nf 410/400/410 466/456/466 350/333/350\nf 410/400/410 350/333/350 349/332/349\nf 456/446/456 212/192/212 211/195/211\nf 456/446/456 211/195/211 527/519/527\nf 211/195/211 224/208/224 463/454/463\nf 211/195/211 463/454/463 527/519/527\nf 407/397/407 377/364/377 267/251/267\nf 407/397/407 267/251/267 276/258/276\nf 378/363/378 377/364/377 406/396/406\nf 378/363/378 406/396/406 255/236/255\nf 175/155/175 214/194/214 213/193/213\nf 175/155/175 213/193/213 198/178/198\nf 386/372/386 90/67/90 84/61/84\nf 386/372/386 84/61/84 356/339/356\nf 409/399/409 362/346/362 351/335/351\nf 409/399/409 351/335/351 457/447/457\nf 85/62/85 89/70/89 412/402/412\nf 85/62/85 412/402/412 287/269/287\nf 361/345/361 233/213/233 357/342/357\nf 361/345/361 357/342/357 352/336/352\nf 116/93/116 431/421/431 359/343/359\nf 116/93/116 359/343/359 107/84/107\nf 116/93/116 107/84/107 106/83/106\nf 116/93/116 106/83/106 113/94/113\nf 352/336/352 351/335/351 362/346/362\nf 352/336/352 362/346/362 361/345/361\nf 513/505/513 514/504/514 464/457/464\nf 513/505/513 464/457/464 526/518/526\nf 526/518/526 409/399/409 457/447/457\nf 526/518/526 457/447/457 525/517/525\nf 514/504/514 475/465/475 465/455/465\nf 514/504/514 465/455/465 464/457/464\nf 358/341/358 431/421/431 247/228/247\nf 358/341/358 247/228/247 197/179/197\nf 176/156/176 482/473/482 172/153/172\nf 176/156/176 172/153/172 171/152/171\nf 396/381/396 395/384/395 250/234/250\nf 396/381/396 250/234/250 119/96/119\nf 395/384/395 399/385/399 251/231/251\nf 395/384/395 251/231/251 250/234/250\nf 291/274/291 81/58/81 80/57/80\nf 291/274/291 80/57/80 285/268/285\nf 284/267/284 292/275/292 291/274/291\nf 284/267/284 291/274/291 285/268/285\nf 528/520/528 327/309/327 326/310/326\nf 528/520/528 326/310/326 511/502/511\nf 126/103/126 125/106/125 152/133/152\nf 126/103/126 152/133/152 53/34/53\nf 152/133/152 125/106/125 133/112/133\nf 152/133/152 133/112/133 340/324/340\nf 127/104/127 126/103/126 339/323/339\nf 127/104/127 339/323/339 179/162/179\nf 56/33/56 135/114/135 367/351/367\nf 56/33/56 367/351/367 339/323/339\nf 124/101/124 123/100/123 133/112/133\nf 124/101/124 133/112/133 134/111/134\nf 143/125/143 367/351/367 135/114/135\nf 143/125/143 135/114/135 144/124/144\nf 164/144/164 143/125/143 132/109/132\nf 164/144/164 132/109/132 161/145/161\nf 401/387/401 131/108/131 130/107/130\nf 401/387/401 130/107/130 142/123/142\nf 292/275/292 528/520/528 122/99/122\nf 292/275/292 122/99/122 290/273/290\nf 61/42/61 507/498/507 75/56/75\nf 61/42/61 75/56/75 78/55/78\nf 320/303/320 512/503/512 525/517/525\nf 320/303/320 525/517/525 321/304/321\nf 512/503/512 513/505/513 526/518/526\nf 512/503/512 526/518/526 525/517/525\nf 123/100/123 122/99/122 528/520/528\nf 123/100/123 528/520/528 511/502/511\nf 262/245/262 529/521/529 229/209/229\nf 262/245/262 229/209/229 221/204/221\nf 316/299/316 315/298/315 368/352/368\nf 316/299/316 368/352/368 481/472/481\nf 516/507/516 315/298/315 230/211/230\nf 516/507/516 230/211/230 219/201/219\nf 515/506/515 530/522/530 369/353/369\nf 515/506/515 369/353/369 516/507/516\nf 530/522/530 515/506/515 223/203/223\nf 530/522/530 223/203/223 480/471/480\nf 215/199/215 218/198/218 223/203/223\nf 215/199/215 223/203/223 515/506/515\nf 459/448/459 458/449/458 374/360/374\nf 459/448/459 374/360/374 248/230/248\nf 458/449/458 460/450/460 334/317/334\nf 458/449/458 334/317/334 374/360/374\nf 334/317/334 460/450/460 47/451/47\nf 334/317/334 47/451/47 48/318/48\nf 459/448/459 248/230/248 249/229/249\nf 459/448/459 249/229/249 480/471/480\nf 253/233/253 120/97/120 119/96/119\nf 253/233/253 119/96/119 250/234/250\nf 394/380/394 170/150/170 169/149/169\nf 394/380/394 169/149/169 173/154/173\nf 519/510/519 482/473/482 176/156/176\nf 519/510/519 176/156/176 197/179/197\nf 518/509/518 273/256/273 482/473/482\nf 518/509/518 482/473/482 519/510/519\nf 531/523/531 274/257/274 273/256/273\nf 531/523/531 273/256/273 518/509/518\nf 532/524/532 390/376/390 274/257/274\nf 532/524/532 274/257/274 531/523/531\nf 343/326/343 243/224/243 241/221/241\nf 343/326/343 241/221/241 240/220/240\nf 188/168/188 238/219/238 244/225/244\nf 188/168/188 244/225/244 189/169/189\nf 187/167/187 332/315/332 236/217/236\nf 187/167/187 236/217/236 188/168/188\nf 447/440/447 451/441/451 508/499/508\nf 447/440/447 508/499/508 448/437/448\nf 162/142/162 388/374/388 297/279/297\nf 162/142/162 297/279/297 163/143/163\nf 392/378/392 402/391/402 405/390/405\nf 392/378/392 405/390/405 522/514/522\nf 533/525/533 413/405/413 415/404/415\nf 533/525/533 415/404/415 470/461/470\nf 534/526/534 65/46/65 68/45/68\nf 534/526/534 68/45/68 489/479/489\nf 502/493/502 535/527/535 484/478/484\nf 502/493/502 484/478/484 487/477/487\nf 503/494/503 536/528/536 537/529/537\nf 503/494/503 537/529/537 504/495/504\nf 492/483/492 538/530/538 535/527/535\nf 492/483/492 535/527/535 502/493/502\nf 492/483/492 325/307/325 66/43/66\nf 492/483/492 66/43/66 65/46/65\nf 504/495/504 537/529/537 539/531/539\nf 504/495/504 539/531/539 505/496/505\nf 239/223/239 424/414/424 345/330/345\nf 239/223/239 345/330/345 240/220/240\nf 59/36/59 58/35/58 382/367/382\nf 59/36/59 382/367/382 381/366/381\nf 432/423/432 433/422/433 434/424/434\nf 432/423/432 434/424/434 331/313/331\nf 437/426/437 436/425/436 440/429/440\nf 437/426/437 440/429/440 177/158/177\nf 381/366/381 437/426/437 177/158/177\nf 381/366/381 177/158/177 59/36/59\nf 449/438/449 441/431/441 494/485/494\nf 449/438/449 494/485/494 506/497/506\nf 450/439/450 501/492/501 434/424/434\nf 450/439/450 434/424/434 420/413/420\nf 382/367/382 503/494/503 504/495/504\nf 382/367/382 504/495/504 383/368/383\nf 501/492/501 506/497/506 445/434/445\nf 501/492/501 445/434/445 328/314/328\nf 536/528/536 503/494/503 486/476/486\nf 536/528/536 486/476/486 485/475/485\nf 313/297/313 150/130/150 319/301/319\nf 313/297/313 319/301/319 318/302/318\nf 327/309/327 284/267/284 281/263/281\nf 327/309/327 281/263/281 145/129/145\nf 483/474/483 93/71/93 192/172/192\nf 483/474/483 192/172/192 353/338/353\nf 483/474/483 282/265/282 94/72/94\nf 483/474/483 94/72/94 93/71/93\nf 422/411/422 425/415/425 428/418/428\nf 422/411/422 428/418/428 427/416/427\nf 421/410/421 433/422/433 345/330/345\nf 421/410/421 345/330/345 424/414/424\nf 463/454/463 314/296/314 313/297/313\nf 463/454/463 313/297/313 527/519/527\nf 315/298/315 516/507/516 369/353/369\nf 315/298/315 369/353/369 368/352/368\nf 314/296/314 481/472/481 312/295/312\nf 314/296/314 312/295/312 151/131/151\nf 368/352/368 317/300/317 312/295/312\nf 368/352/368 312/295/312 481/472/481\nf 369/353/369 530/522/530 159/139/159\nf 369/353/369 159/139/159 158/138/158\nf 480/471/480 249/229/249 159/139/159\nf 480/471/480 159/139/159 530/522/530\nf 262/245/262 406/396/406 408/398/408\nf 262/245/262 408/398/408 529/521/529\nf 398/383/398 216/196/216 220/200/220\nf 398/383/398 220/200/220 364/348/364\nf 541/532/541 542/533/542 543/534/543\nf 541/532/541 543/534/543 540/535/540\nf 545/536/545 543/534/543 542/533/542\nf 545/536/545 542/533/542 544/537/544\nf 547/538/547 545/536/545 544/537/544\nf 547/538/547 544/537/544 546/539/546\nf 549/540/549 547/538/547 546/539/546\nf 549/540/549 546/539/546 548/541/548\nf 551/542/551 549/540/549 548/541/548\nf 551/542/551 548/541/548 550/543/550\nf 553/544/553 551/542/551 550/543/550\nf 553/544/553 550/543/550 552/545/552\nf 555/546/555 553/544/553 552/545/552\nf 555/546/555 552/545/552 554/547/554\nf 557/548/557 558/549/558 559/550/559\nf 557/548/557 559/550/559 556/551/556\nf 561/552/561 557/548/557 556/551/556\nf 561/552/561 556/551/556 560/553/560\nf 563/554/563 546/539/546 544/537/544\nf 563/554/563 544/537/544 562/555/562\nf 564/556/564 548/541/548 546/539/546\nf 564/556/564 546/539/546 563/554/563\nf 565/557/565 550/543/550 548/541/548\nf 565/557/565 548/541/548 564/556/564\nf 566/558/566 552/545/552 550/543/550\nf 566/558/566 550/543/550 565/557/565\nf 552/545/552 566/558/566 567/559/567\nf 552/545/552 567/559/567 554/547/554\nf 559/550/559 568/560/568 569/561/569\nf 559/550/559 569/561/569 556/551/556\nf 570/562/570 560/553/560 556/551/556\nf 570/562/570 556/551/556 569/561/569\nf 571/563/571 572/564/572 560/553/560\nf 571/563/571 560/553/560 570/562/570\nf 574/565/574 540/535/540 575/566/575\nf 574/565/574 575/566/575 573/567/573\nf 577/568/577 543/534/543 545/536/545\nf 577/568/577 545/536/545 576/569/576\nf 545/536/545 547/538/547 578/570/578\nf 545/536/545 578/570/578 576/569/576\nf 579/571/579 578/570/578 547/538/547\nf 579/571/579 547/538/547 549/540/549\nf 580/572/580 579/571/579 551/542/551\nf 580/572/580 551/542/551 553/544/553\nf 580/572/580 553/544/553 555/546/555\nf 580/572/580 555/546/555 581/573/581\nf 558/549/558 557/548/557 583/574/583\nf 558/549/558 583/574/583 582/575/582\nf 561/552/561 584/576/584 583/574/583\nf 561/552/561 583/574/583 557/548/557\nf 561/552/561 572/564/572 585/577/585\nf 561/552/561 585/577/585 584/576/584\nf 571/563/571 586/578/586 585/577/585\nf 571/563/571 585/577/585 572/564/572\nf 544/537/544 542/533/542 541/532/541\nf 544/537/544 541/532/541 562/555/562\nf 574/565/574 588/579/588 589/580/589\nf 574/565/574 589/580/589 587/581/587\nf 574/565/574 573/567/573 590/582/590\nf 574/565/574 590/582/590 588/579/588\nf 590/582/590 573/567/573 575/566/575\nf 590/582/590 575/566/575 591/583/591\nf 575/566/575 540/535/540 543/534/543\nf 575/566/575 543/534/543 591/583/591\nf 564/556/564 592/584/592 566/558/566\nf 564/556/564 566/558/566 565/557/565\nf 592/584/592 593/585/593 567/559/567\nf 592/584/592 567/559/567 566/558/566\nf 568/560/568 559/550/559 554/547/554\nf 568/560/568 554/547/554 567/559/567\nf 554/547/554 559/550/559 558/549/558\nf 554/547/554 558/549/558 555/546/555\nf 582/575/582 581/573/581 555/546/555\nf 582/575/582 555/546/555 558/549/558\nf 592/584/592 564/556/564 563/554/563\nf 592/584/592 563/554/563 562/555/562\nf 589/580/589 568/560/568 567/559/567\nf 589/580/589 567/559/567 593/585/593\nf 540/535/540 574/565/574 587/581/587\nf 540/535/540 587/581/587 541/532/541\nf 571/563/571 570/562/570 590/582/590\nf 571/563/571 590/582/590 591/583/591\nf 589/580/589 588/579/588 569/561/569\nf 589/580/589 569/561/569 568/560/568\nf 543/534/543 577/568/577 594/586/594\nf 543/534/543 594/586/594 591/583/591\nf 594/586/594 586/578/586 571/563/571\nf 594/586/594 571/563/571 591/583/591\nf 596/587/596 581/573/581 582/575/582\nf 596/587/596 582/575/582 595/588/595\nf 596/587/596 597/589/597 580/572/580\nf 596/587/596 580/572/580 581/573/581\nf 583/574/583 490/482/490 455/444/455\nf 583/574/583 455/444/455 595/588/595\nf 583/574/583 584/576/584 493/484/493\nf 583/574/583 493/484/493 490/482/490\nf 597/589/597 508/499/508 579/571/579\nf 597/589/597 579/571/579 580/572/580\nf 442/432/442 448/437/448 508/499/508\nf 442/432/442 508/499/508 597/589/597\nf 60/37/60 178/159/178 595/588/595\nf 60/37/60 595/588/595 455/444/455\nf 178/159/178 439/430/439 596/587/596\nf 178/159/178 596/587/596 595/588/595\nf 577/568/577 64/41/64 185/166/185\nf 577/568/577 185/166/185 594/586/594\nf 586/578/586 184/165/184 376/362/376\nf 586/578/586 376/362/376 585/577/585\nf 590/582/590 570/562/570 569/561/569\nf 590/582/590 569/561/569 588/579/588\nf 61/42/61 576/569/576 578/570/578\nf 61/42/61 578/570/578 507/498/507\nf 585/577/585 376/362/376 493/484/493\nf 585/577/585 493/484/493 584/576/584\nf 453/443/453 598/590/598 73/52/73\nf 453/443/453 73/52/73 430/419/430\nf 519/510/519 197/179/197 247/228/247\nf 519/510/519 247/228/247 246/227/246\nf 281/263/281 280/262/280 146/126/146\nf 281/263/281 146/126/146 145/129/145\nf 64/41/64 63/40/63 121/102/121\nf 64/41/64 121/102/121 185/166/185\nf 284/267/284 327/309/327 528/520/528\nf 284/267/284 528/520/528 292/275/292\nf 290/273/290 122/99/122 121/102/121\nf 290/273/290 121/102/121 63/40/63\nf 280/262/280 289/271/289 320/303/320\nf 280/262/280 320/303/320 146/126/146\nf 184/165/184 586/578/586 594/586/594\nf 184/165/184 594/586/594 185/166/185\nf 253/233/253 378/363/378 117/98/117\nf 253/233/253 117/98/117 120/97/120\nf 249/229/249 140/121/140 160/140/160\nf 249/229/249 160/140/160 159/139/159\nf 129/110/129 160/140/160 140/121/140\nf 129/110/129 140/121/140 130/107/130\nf 161/145/161 132/109/132 131/108/131\nf 161/145/161 131/108/131 371/354/371\nf 313/297/313 318/302/318 456/446/456\nf 313/297/313 456/446/456 527/519/527\nf 492/483/492 65/46/65 534/526/534\nf 492/483/492 534/526/534 538/530/538\nf 441/431/441 449/438/449 448/437/448\nf 441/431/441 448/437/448 442/432/442\nf 443/436/443 446/435/446 435/428/435\nf 443/436/443 435/428/435 497/488/497\nf 446/435/446 445/434/445 506/497/506\nf 446/435/446 506/497/506 494/485/494\nf 441/431/441 440/429/440 436/425/436\nf 441/431/441 436/425/436 494/485/494\nf 596/587/596 439/430/439 442/432/442\nf 596/587/596 442/432/442 597/589/597\nf 577/568/577 576/569/576 61/42/61\nf 577/568/577 61/42/61 64/41/64\nf 238/219/238 237/218/237 242/222/242\nf 238/219/238 242/222/242 241/221/241\nf 194/175/194 76/53/76 426/417/426\nf 194/175/194 426/417/426 427/416/427\nf 452/442/452 194/175/194 427/416/427\nf 452/442/452 427/416/427 428/418/428\nf 461/452/461 244/225/244 243/224/243\nf 461/452/461 243/224/243 342/328/342\nf 508/499/508 507/498/507 578/570/578\nf 508/499/508 578/570/578 579/571/579\nf 245/226/245 207/187/207 531/523/531\nf 245/226/245 531/523/531 518/509/518\nf 206/186/206 532/524/532 531/523/531\nf 206/186/206 531/523/531 207/187/207\nf 32/9/32 31/12/31 600/591/600\nf 32/9/32 600/591/600 599/592/599\nf 601/593/601 600/591/600 36/13/36\nf 601/593/601 36/13/36 24/1/24\nf 602/594/602 601/593/601 24/1/24\nf 602/594/602 24/1/24 23/4/23\nf 40/17/40 602/594/602 23/4/23\nf 40/17/40 23/4/23 42/19/42\nf 44/22/44 604/595/604 605/596/605\nf 44/22/44 605/596/605 603/597/603\nf 39/16/39 603/597/603 602/594/602\nf 39/16/39 602/594/602 40/17/40\nf 601/593/601 606/598/606 607/599/607\nf 601/593/601 607/599/607 600/591/600\nf 468/459/468 608/600/608 609/601/609\nf 468/459/468 609/601/609 469/460/469\nf 477/469/477 609/601/609 608/600/608\nf 477/469/477 608/600/608 384/370/384\nf 610/602/610 611/603/611 612/604/612\nf 610/602/610 612/604/612 472/605/472\nf 610/602/610 472/605/472 471/606/471\nf 610/602/610 471/606/471 613/607/613\nf 476/608/476 614/609/614 615/610/615\nf 476/608/476 615/610/615 474/611/474\nf 478/468/478 110/88/110 109/87/109\nf 478/468/478 109/87/109 616/612/616\nf 466/456/466 465/455/465 474/467/474\nf 466/456/466 474/467/474 617/613/617\nf 466/456/466 617/613/617 473/464/473\nf 466/456/466 473/464/473 350/333/350\nf 614/609/614 533/614/533 470/615/470\nf 614/609/614 470/615/470 618/616/618\nf 475/465/475 413/405/413 533/525/533\nf 475/465/475 533/525/533 476/466/476\nf 618/616/618 469/617/469 609/618/609\nf 618/616/618 609/618/609 619/619/619\nf 619/619/619 609/618/609 477/620/477\nf 619/619/619 477/620/477 620/621/620\nf 387/373/387 621/622/621 616/612/616\nf 387/373/387 616/612/616 109/87/109\nf 616/623/616 622/624/622 620/621/620\nf 616/623/616 620/621/620 478/625/478\nf 473/626/473 617/627/617 615/610/615\nf 473/626/473 615/610/615 613/607/613\nf 621/628/621 623/629/623 622/624/622\nf 621/628/621 622/624/622 616/623/616\nf 624/630/624 612/604/612 611/603/611\nf 624/630/624 611/603/611 623/629/623\nf 49/30/49 71/48/71 70/47/70\nf 49/30/49 70/47/70 50/27/50\nf 336/319/336 335/322/335 524/516/524\nf 336/319/336 524/516/524 418/407/418\nf 598/590/598 293/276/293 67/44/67\nf 598/590/598 67/44/67 73/52/73\nf 50/27/50 70/47/70 429/420/429\nf 50/27/50 429/420/429 74/51/74\nf 322/308/322 493/484/493 376/362/376\nf 322/308/322 376/362/376 323/305/323\nf 589/580/589 593/585/593 592/584/592\nf 589/580/589 592/584/592 587/581/587\nf 396/381/396 119/96/119 118/95/118\nf 396/381/396 118/95/118 254/235/254\nf 517/508/517 397/382/397 396/381/396\nf 517/508/517 396/381/396 254/235/254\nf 28/5/28 27/8/27 625/631/625\nf 28/5/28 625/631/625 604/595/604\nf 600/591/600 607/599/607 626/632/626\nf 600/591/600 626/632/626 599/592/599\nf 607/599/607 627/633/627 628/634/628\nf 607/599/607 628/634/628 626/632/626\nf 604/595/604 625/631/625 628/634/628\nf 604/595/604 628/634/628 627/633/627\nf 630/635/630 631/636/631 632/637/632\nf 630/635/630 632/637/632 629/638/629\nf 634/639/634 635/640/635 636/641/636\nf 634/639/634 636/641/636 633/642/633\nf 638/643/638 639/644/639 640/645/640\nf 638/643/638 640/645/640 637/646/637\nf 641/647/641 642/648/642 637/646/637\nf 641/647/641 637/646/637 640/645/640\nf 644/649/644 645/650/645 646/651/646\nf 644/649/644 646/651/646 643/652/643\nf 631/636/631 642/648/642 648/653/648\nf 631/636/631 648/653/648 647/654/647\nf 650/655/650 651/656/651 652/657/652\nf 650/655/650 652/657/652 649/658/649\nf 643/652/643 646/651/646 654/659/654\nf 643/652/643 654/659/654 653/660/653\nf 654/659/654 651/656/651 650/655/650\nf 654/659/654 650/655/650 653/660/653\nf 655/661/655 656/662/656 657/663/657\nf 655/661/655 657/663/657 632/637/632\nf 657/663/657 659/664/659 660/665/660\nf 657/663/657 660/665/660 658/666/658\nf 661/667/661 659/664/659 657/663/657\nf 661/667/661 657/663/657 656/662/656\nf 631/636/631 647/654/647 655/661/655\nf 631/636/631 655/661/655 632/637/632\nf 637/646/637 642/648/642 631/636/631\nf 637/646/637 631/636/631 630/635/630\nf 640/645/640 650/655/650 649/658/649\nf 640/645/640 649/658/649 641/647/641\nf 652/657/652 662/668/662 641/647/641\nf 652/657/652 641/647/641 649/658/649\nf 648/653/648 642/648/642 641/647/641\nf 648/653/648 641/647/641 662/668/662\nf 663/669/663 664/670/664 537/529/537\nf 663/669/663 537/529/537 536/528/536\nf 666/671/666 640/645/640 639/644/639\nf 666/671/666 639/644/639 665/672/665\nf 666/671/666 665/672/665 636/641/636\nf 666/671/666 636/641/636 635/640/635\nf 667/673/667 539/531/539 537/529/537\nf 667/673/667 537/529/537 664/670/664\nf 634/639/634 644/649/644 643/652/643\nf 634/639/634 643/652/643 635/640/635\nf 653/660/653 650/655/650 640/645/640\nf 653/660/653 640/645/640 666/671/666\nf 666/671/666 635/640/635 643/652/643\nf 666/671/666 643/652/643 653/660/653\nf 669/674/669 644/649/644 634/639/634\nf 669/674/669 634/639/634 668/675/668\nf 638/643/638 637/646/637 630/635/630\nf 638/643/638 630/635/630 670/676/670\nf 645/650/645 644/649/644 669/674/669\nf 645/650/645 669/674/669 671/677/671\nf 638/643/638 670/676/670 485/475/485\nf 638/643/638 485/475/485 484/478/484\nf 672/678/672 633/642/633 489/479/489\nf 672/678/672 489/479/489 488/480/488\nf 632/637/632 657/663/657 658/666/658\nf 632/637/632 658/666/658 629/638/629\nf 670/676/670 663/669/663 536/528/536\nf 670/676/670 536/528/536 485/475/485\nf 633/642/633 636/641/636 534/526/534\nf 633/642/633 534/526/534 489/479/489\nf 484/478/484 535/527/535 639/644/639\nf 484/478/484 639/644/639 638/643/638\nf 629/638/629 658/666/658 664/670/664\nf 629/638/629 664/670/664 663/669/663\nf 665/672/665 639/644/639 535/527/535\nf 665/672/665 535/527/535 538/530/538\nf 636/641/636 665/672/665 538/530/538\nf 636/641/636 538/530/538 534/526/534\nf 660/665/660 667/673/667 664/670/664\nf 660/665/660 664/670/664 658/666/658\nf 668/675/668 634/639/634 633/642/633\nf 668/675/668 633/642/633 672/678/672\nf 630/635/630 629/638/629 663/669/663\nf 630/635/630 663/669/663 670/676/670\nf 1/679/1 661/667/661 656/662/656\nf 1/679/1 656/662/656 22/680/22\nf 20/681/20 647/654/647 648/653/648\nf 20/681/20 648/653/648 18/682/18\nf 647/654/647 20/681/20 21/683/21\nf 647/654/647 21/683/21 655/661/655\nf 15/684/15 646/651/646 645/650/645\nf 15/684/15 645/650/645 13/685/13\nf 19/686/19 651/656/651 654/659/654\nf 19/686/19 654/659/654 14/687/14\nf 648/653/648 662/668/662 16/688/16\nf 648/653/648 16/688/16 18/682/18\nf 17/689/17 652/657/652 651/656/651\nf 17/689/17 651/656/651 19/686/19\nf 21/683/21 22/680/22 656/662/656\nf 21/683/21 656/662/656 655/661/655\nf 13/685/13 645/650/645 671/677/671\nf 13/685/13 671/677/671 2/690/2\nf 646/651/646 15/684/15 14/687/14\nf 646/651/646 14/687/14 654/659/654\nf 17/689/17 16/688/16 662/668/662\nf 17/689/17 662/668/662 652/657/652\nf 608/600/608 91/68/91 385/371/385\nf 608/600/608 385/371/385 384/370/384\nf 304/286/304 372/355/372 401/387/401\nf 304/286/304 401/387/401 308/290/308\nf 468/459/468 415/404/415 411/401/411\nf 468/459/468 411/401/411 92/69/92\nf 602/594/602 603/597/603 606/598/606\nf 602/594/602 606/598/606 601/593/601\nf 608/600/608 468/459/468 92/69/92\nf 608/600/608 92/69/92 91/68/91\nf 305/287/305 304/286/304 308/290/308\nf 305/287/305 308/290/308 137/116/137\nf 139/119/139 138/117/138 307/291/307\nf 139/119/139 307/291/307 375/361/375\nf 674/691/674 675/692/675 676/693/676\nf 674/691/674 676/693/676 673/694/673\nf 678/695/678 27/8/27 679/696/679\nf 678/695/678 679/696/679 677/697/677\nf 681/698/681 682/699/682 683/700/683\nf 681/698/681 683/700/683 680/701/680\nf 684/702/684 685/703/685 683/700/683\nf 684/702/684 683/700/683 682/699/682\nf 684/702/684 674/691/674 673/694/673\nf 684/702/684 673/694/673 685/703/685\nf 687/704/687 688/705/688 689/706/689\nf 687/704/687 689/706/689 686/707/686\nf 690/708/690 691/709/691 676/693/676\nf 690/708/690 676/693/676 675/692/675\nf 689/706/689 688/705/688 691/709/691\nf 689/706/689 691/709/691 690/708/690\nf 687/704/687 686/707/686 693/710/693\nf 687/704/687 693/710/693 692/711/692\nf 681/698/681 680/701/680 46/24/46\nf 681/698/681 46/24/46 45/23/45\nf 678/695/678 694/712/694 695/713/695\nf 678/695/678 695/713/695 693/710/693\nf 697/714/697 698/715/698 699/716/699\nf 697/714/697 699/716/699 696/717/696\nf 701/718/701 702/719/702 703/720/703\nf 701/718/701 703/720/703 700/721/700\nf 705/722/705 706/723/706 707/724/707\nf 705/722/705 707/724/707 704/725/704\nf 709/726/709 710/727/710 711/728/711\nf 709/726/709 711/728/711 708/729/708\nf 713/730/713 714/731/714 715/732/715\nf 713/730/713 715/732/715 712/733/712\nf 717/734/717 718/735/718 719/736/719\nf 717/734/717 719/736/719 716/737/716\nf 712/733/712 720/738/720 721/739/721\nf 712/733/712 721/739/721 713/730/713\nf 713/730/713 721/739/721 697/714/697\nf 713/730/713 697/714/697 696/717/696\nf 723/740/723 724/741/724 725/742/725\nf 723/740/723 725/742/725 722/743/722\nf 727/744/727 728/745/728 729/746/729\nf 727/744/727 729/746/729 726/747/726\nf 731/748/731 732/749/732 733/750/733\nf 731/748/731 733/750/733 730/751/730\nf 735/752/735 728/745/728 727/744/727\nf 735/752/735 727/744/727 734/753/734\nf 737/754/737 738/755/738 739/756/739\nf 737/754/737 739/756/739 736/757/736\nf 741/758/741 722/743/722 725/742/725\nf 741/758/741 725/742/725 740/759/740\nf 735/752/735 734/753/734 743/760/743\nf 735/752/735 743/760/743 742/761/742\nf 745/762/745 746/763/746 747/764/747\nf 745/762/745 747/764/747 744/765/744\nf 747/764/747 746/763/746 749/766/749\nf 747/764/747 749/766/749 748/767/748\nf 745/762/745 744/765/744 751/768/751\nf 745/762/745 751/768/751 750/769/750\nf 753/770/753 754/771/754 755/772/755\nf 753/770/753 755/772/755 752/773/752\nf 757/774/757 755/772/755 754/771/754\nf 757/774/757 754/771/754 756/775/756\nf 748/767/748 749/766/749 759/776/759\nf 748/767/748 759/776/759 758/777/758\nf 761/778/761 762/779/762 763/780/763\nf 761/778/761 763/780/763 760/781/760\nf 765/782/765 766/783/766 767/784/767\nf 765/782/765 767/784/767 764/785/764\nf 769/786/769 770/787/770 771/788/771\nf 769/786/769 771/788/771 768/789/768\nf 773/790/773 774/791/774 775/792/775\nf 773/790/773 775/792/775 772/793/772\nf 777/794/777 778/795/778 779/796/779\nf 777/794/777 779/796/779 776/797/776\nf 774/791/774 780/798/780 781/799/781\nf 774/791/774 781/799/781 775/792/775\nf 703/720/703 782/800/782 783/801/783\nf 703/720/703 783/801/783 700/721/700\nf 688/802/688 687/803/687 785/804/785\nf 688/802/688 785/804/785 784/805/784\nf 786/806/786 785/804/785 687/803/687\nf 786/806/786 687/803/687 692/807/692\nf 788/808/788 777/794/777 789/809/789\nf 788/808/788 789/809/789 787/810/787\nf 790/811/790 791/812/791 779/796/779\nf 790/811/790 779/796/779 778/795/778\nf 793/813/793 794/814/794 795/815/795\nf 793/813/793 795/815/795 792/816/792\nf 797/817/797 798/818/798 701/718/701\nf 797/817/797 701/718/701 796/819/796\nf 701/718/701 798/818/798 799/820/799\nf 701/718/701 799/820/799 702/719/702\nf 801/821/801 802/822/802 803/823/803\nf 801/821/801 803/823/803 800/824/800\nf 805/825/805 806/826/806 807/827/807\nf 805/825/805 807/827/807 804/828/804\nf 809/829/809 810/830/810 811/831/811\nf 809/829/809 811/831/811 808/832/808\nf 778/795/778 807/827/807 806/826/806\nf 778/795/778 806/826/806 790/811/790\nf 803/823/803 812/833/812 813/834/813\nf 803/823/803 813/834/813 800/824/800\nf 815/835/815 816/836/816 817/837/817\nf 815/835/815 817/837/817 814/838/814\nf 819/839/819 814/838/814 820/840/820\nf 819/839/819 820/840/820 818/841/818\nf 822/842/822 823/843/823 819/839/819\nf 822/842/822 819/839/819 821/844/821\nf 704/725/704 707/724/707 825/845/825\nf 704/725/704 825/845/825 824/846/824\nf 827/847/827 828/848/828 698/715/698\nf 827/847/827 698/715/698 826/849/826\nf 772/793/772 775/792/775 829/850/829\nf 772/793/772 829/850/829 699/716/699\nf 781/799/781 771/788/771 831/851/831\nf 781/799/781 831/851/831 830/852/830\nf 832/853/832 831/851/831 771/788/771\nf 832/853/832 771/788/771 770/787/770\nf 834/854/834 835/855/835 836/856/836\nf 834/854/834 836/856/836 833/857/833\nf 838/858/838 839/859/839 840/860/840\nf 838/858/838 840/860/840 837/861/837\nf 723/740/723 722/743/722 840/860/840\nf 723/740/723 840/860/840 841/862/841\nf 747/764/747 842/863/842 843/864/843\nf 747/764/747 843/864/843 744/765/744\nf 821/844/821 844/865/844 845/866/845\nf 821/844/821 845/866/845 822/842/822\nf 847/867/847 818/841/818 820/840/820\nf 847/867/847 820/840/820 846/868/846\nf 843/864/843 849/869/849 850/870/850\nf 843/864/843 850/870/850 848/871/848\nf 205/185/205 851/872/851 852/873/852\nf 205/185/205 852/873/852 206/186/206\nf 208/189/208 849/869/849 851/872/851\nf 208/189/208 851/872/851 205/185/205\nf 853/874/853 854/875/854 749/766/749\nf 853/874/853 749/766/749 746/763/746\nf 728/745/728 735/752/735 854/875/854\nf 728/745/728 854/875/854 853/874/853\nf 856/876/856 857/877/857 858/878/858\nf 856/876/856 858/878/858 855/879/855\nf 860/880/860 861/881/861 862/882/862\nf 860/880/860 862/882/862 859/883/859\nf 863/884/863 864/885/864 861/881/861\nf 863/884/863 861/881/861 860/880/860\nf 866/886/866 867/887/867 862/882/862\nf 866/886/866 862/882/862 865/888/865\nf 869/889/869 870/890/870 871/891/871\nf 869/889/869 871/891/871 868/892/868\nf 866/886/866 228/210/228 229/209/229\nf 866/886/866 229/209/229 867/887/867\nf 873/893/873 864/885/864 863/884/863\nf 873/893/873 863/884/863 872/894/872\nf 871/891/871 873/893/873 872/894/872\nf 871/891/871 872/894/872 868/892/868\nf 875/895/875 876/896/876 877/897/877\nf 875/895/875 877/897/877 874/898/874\nf 835/855/835 834/854/834 848/871/848\nf 835/855/835 848/871/848 850/870/850\nf 879/899/879 833/857/833 880/900/880\nf 879/899/879 880/900/880 878/901/878\nf 882/902/882 883/903/883 884/904/884\nf 882/902/882 884/904/884 881/905/881\nf 881/905/881 880/900/880 886/906/886\nf 881/905/881 886/906/886 885/907/885\nf 887/908/887 842/863/842 747/764/747\nf 887/908/887 747/764/747 748/767/748\nf 842/863/842 887/908/887 852/873/852\nf 842/863/842 852/873/852 851/872/851\nf 758/777/758 760/781/760 889/909/889\nf 758/777/758 889/909/889 888/910/888\nf 787/810/787 890/911/890 891/912/891\nf 787/810/787 891/912/891 788/808/788\nf 893/913/893 894/914/894 895/915/895\nf 893/913/893 895/915/895 892/916/892\nf 896/917/896 859/883/859 897/918/897\nf 896/917/896 897/918/897 765/782/765\nf 899/919/899 900/920/900 901/921/901\nf 899/919/899 901/921/901 898/922/898\nf 900/920/900 902/923/902 903/924/903\nf 900/920/900 903/924/903 901/921/901\nf 902/923/902 677/925/677 679/926/679\nf 902/923/902 679/926/679 903/924/903\nf 862/882/862 867/887/867 904/927/904\nf 862/882/862 904/927/904 859/883/859\nf 901/921/901 263/247/263 264/246/264\nf 901/921/901 264/246/264 898/922/898\nf 266/248/266 265/249/265 903/924/903\nf 266/248/266 903/924/903 679/926/679\nf 895/915/895 905/928/905 906/929/906\nf 895/915/895 906/929/906 892/916/892\nf 907/930/907 908/931/908 909/932/909\nf 907/930/907 909/932/909 846/868/846\nf 847/867/847 846/868/846 909/932/909\nf 847/867/847 909/932/909 910/933/910\nf 847/867/847 910/933/910 912/934/912\nf 847/867/847 912/934/912 911/935/911\nf 276/258/276 275/259/275 906/929/906\nf 276/258/276 906/929/906 905/928/905\nf 275/259/275 277/260/277 908/931/908\nf 275/259/275 908/931/908 906/929/906\nf 741/758/741 837/861/837 840/860/840\nf 741/758/741 840/860/840 722/743/722\nf 914/936/914 915/937/915 916/938/916\nf 914/936/914 916/938/916 913/939/913\nf 915/937/915 914/936/914 743/760/743\nf 915/937/915 743/760/743 734/753/734\nf 918/940/918 740/759/740 709/726/709\nf 918/940/918 709/726/709 917/941/917\nf 916/938/916 915/937/915 920/942/920\nf 916/938/916 920/942/920 919/943/919\nf 922/944/922 923/945/923 924/946/924\nf 922/944/922 924/946/924 921/947/921\nf 708/729/708 925/948/925 917/941/917\nf 708/729/708 917/941/917 709/726/709\nf 917/941/917 925/948/925 927/949/927\nf 917/941/917 927/949/927 926/950/926\nf 293/276/293 712/733/712 715/732/715\nf 293/276/293 715/732/715 294/277/294\nf 929/951/929 930/952/930 931/953/931\nf 929/951/929 931/953/931 928/954/928\nf 933/955/933 934/956/934 935/957/935\nf 933/955/933 935/957/935 932/958/932\nf 937/959/937 938/960/938 939/961/939\nf 937/959/937 939/961/939 936/962/936\nf 785/804/785 940/963/940 941/964/941\nf 785/804/785 941/964/941 784/805/784\nf 812/833/812 943/965/943 944/966/944\nf 812/833/812 944/966/944 942/967/942\nf 945/968/945 796/819/796 701/718/701\nf 945/968/945 701/718/701 700/721/700\nf 946/969/946 947/970/947 797/817/797\nf 946/969/946 797/817/797 796/819/796\nf 949/971/949 873/893/873 871/891/871\nf 949/971/949 871/891/871 948/972/948\nf 783/801/783 806/826/806 805/825/805\nf 783/801/783 805/825/805 950/973/950\nf 951/974/951 952/975/952 792/816/792\nf 951/974/951 792/816/792 795/815/795\nf 954/976/954 793/813/793 792/816/792\nf 954/976/954 792/816/792 953/977/953\nf 956/978/956 957/979/957 958/980/958\nf 956/978/956 958/980/958 955/981/955\nf 727/744/727 920/942/920 915/937/915\nf 727/744/727 915/937/915 734/753/734\nf 959/982/959 960/983/960 795/815/795\nf 959/982/959 795/815/795 794/814/794\nf 914/936/914 913/939/913 924/946/924\nf 914/936/914 924/946/924 923/945/923\nf 329/984/329 961/985/961 962/986/962\nf 329/984/329 962/986/962 330/987/330\nf 834/854/834 963/988/963 751/768/751\nf 834/854/834 751/768/751 848/871/848\nf 879/899/879 839/859/839 838/858/838\nf 879/899/879 838/858/838 963/988/963\nf 812/833/812 942/967/942 964/989/964\nf 812/833/812 964/989/964 813/834/813\nf 786/806/786 692/807/692 695/990/695\nf 786/806/786 695/990/695 965/991/965\nf 967/992/967 968/993/968 969/994/969\nf 967/992/967 969/994/969 966/995/966\nf 696/717/696 699/716/699 829/850/829\nf 696/717/696 829/850/829 955/981/955\nf 970/996/970 703/720/703 702/719/702\nf 970/996/970 702/719/702 773/790/773\nf 972/997/972 799/820/799 798/818/798\nf 972/997/972 798/818/798 971/998/971\nf 885/907/885 342/999/342 344/1000/344\nf 885/907/885 344/1000/344 973/1001/973\nf 974/1002/974 975/1003/975 882/902/882\nf 974/1002/974 882/902/882 973/1001/973\nf 977/1004/977 978/1005/978 979/1006/979\nf 977/1004/977 979/1006/979 976/1007/976\nf 981/1008/981 856/876/856 855/879/855\nf 981/1008/981 855/879/855 980/1009/980\nf 775/792/775 781/799/781 830/852/830\nf 775/792/775 830/852/830 829/850/829\nf 750/769/750 982/1010/982 983/1011/983\nf 750/769/750 983/1011/983 745/762/745\nf 761/778/761 984/1012/984 985/1013/985\nf 761/778/761 985/1013/985 762/779/762\nf 986/1014/986 987/1015/987 845/866/845\nf 986/1014/986 845/866/845 844/865/844\nf 752/773/752 755/772/755 989/1016/989\nf 752/773/752 989/1016/989 988/1017/988\nf 977/1004/977 976/1007/976 991/1018/991\nf 977/1004/977 991/1018/991 990/1019/990\nf 978/1005/978 977/1004/977 874/898/874\nf 978/1005/978 874/898/874 992/1020/992\nf 863/884/863 993/1021/993 816/836/816\nf 863/884/863 816/836/816 872/894/872\nf 802/822/802 995/1022/995 933/955/933\nf 802/822/802 933/955/933 994/1023/994\nf 930/952/930 929/951/929 716/737/716\nf 930/952/930 716/737/716 719/736/719\nf 828/848/828 827/847/827 996/1024/996\nf 828/848/828 996/1024/996 970/996/970\nf 998/1025/998 950/973/950 805/825/805\nf 998/1025/998 805/825/805 997/1026/997\nf 950/973/950 945/968/945 700/721/700\nf 950/973/950 700/721/700 783/801/783\nf 1000/1027/1000 1001/1028/1001 1002/1029/1002\nf 1000/1027/1000 1002/1029/1002 999/1030/999\nf 691/1031/691 936/962/936 939/961/939\nf 691/1031/691 939/961/939 676/1032/676\nf 936/962/936 691/1031/691 688/802/688\nf 936/962/936 688/802/688 784/805/784\nf 890/911/890 787/810/787 1004/1033/1004\nf 890/911/890 1004/1033/1004 1003/1034/1003\nf 713/730/713 696/717/696 955/981/955\nf 713/730/713 955/981/955 958/980/958\nf 830/852/830 831/851/831 1005/1035/1005\nf 830/852/830 1005/1035/1005 956/978/956\nf 1006/1036/1006 1007/1037/1007 905/928/905\nf 1006/1036/1006 905/928/905 895/915/895\nf 908/931/908 277/260/277 379/365/379\nf 908/931/908 379/365/379 909/932/909\nf 1009/1038/1009 1010/1039/1010 1011/1040/1011\nf 1009/1038/1009 1011/1040/1011 1008/1041/1008\nf 1013/1042/1013 756/775/756 754/771/754\nf 1013/1042/1013 754/771/754 1012/1043/1012\nf 754/771/754 753/770/753 1014/1044/1014\nf 754/771/754 1014/1044/1014 1012/1043/1012\nf 989/1016/989 755/772/755 757/774/757\nf 989/1016/989 757/774/757 1015/1045/1015\nf 826/849/826 808/832/808 811/831/811\nf 826/849/826 811/831/811 827/847/827\nf 995/1022/995 802/822/802 801/821/801\nf 995/1022/995 801/821/801 1016/1046/1016\nf 815/835/815 868/892/868 872/894/872\nf 815/835/815 872/894/872 816/836/816\nf 726/747/726 918/940/918 917/941/917\nf 726/747/726 917/941/917 926/950/926\nf 910/933/910 909/932/909 379/365/379\nf 910/933/910 379/365/379 389/375/389\nf 912/934/912 910/933/910 389/375/389\nf 912/934/912 389/375/389 390/376/390\nf 786/806/786 965/991/965 1003/1034/1003\nf 786/806/786 1003/1034/1003 1004/1033/1004\nf 1017/1047/1017 803/823/803 802/822/802\nf 1017/1047/1017 802/822/802 994/1023/994\nf 1019/1048/1019 1017/1047/1017 994/1023/994\nf 1019/1048/1019 994/1023/994 1018/1049/1018\nf 820/840/820 1020/1050/1020 907/930/907\nf 820/840/820 907/930/907 846/868/846\nf 932/958/932 1018/1049/1018 994/1023/994\nf 932/958/932 994/1023/994 933/955/933\nf 1022/1051/1022 1023/1052/1023 1024/1053/1024\nf 1022/1051/1022 1024/1053/1024 1021/1054/1021\nf 1025/1055/1025 817/837/817 816/836/816\nf 1025/1055/1025 816/836/816 993/1021/993\nf 1020/1050/1020 817/837/817 1025/1055/1025\nf 1020/1050/1020 1025/1055/1025 893/913/893\nf 907/930/907 1020/1050/1020 893/913/893\nf 907/930/907 893/913/893 892/916/892\nf 749/766/749 854/875/854 1026/1056/1026\nf 749/766/749 1026/1056/1026 759/776/759\nf 776/797/776 1000/1027/1000 999/1030/999\nf 776/797/776 999/1030/999 1027/1057/1027\nf 1017/1047/1017 943/965/943 812/833/812\nf 1017/1047/1017 812/833/812 803/823/803\nf 1028/1058/1028 1029/1059/1029 405/390/405\nf 1028/1058/1028 405/390/405 404/389/404\nf 1029/1059/1029 943/965/943 1017/1047/1017\nf 1029/1059/1029 1017/1047/1017 1019/1048/1019\nf 685/1060/685 673/1061/673 964/989/964\nf 685/1060/685 964/989/964 942/967/942\nf 685/1060/685 942/967/942 944/966/944\nf 685/1060/685 944/966/944 683/1062/683\nf 683/1062/683 944/966/944 1028/1058/1028\nf 683/1062/683 1028/1058/1028 680/1063/680\nf 1030/1064/1030 897/918/897 859/883/859\nf 1030/1064/1030 859/883/859 904/927/904\nf 1007/1037/1007 1030/1064/1030 408/398/408\nf 1007/1037/1007 408/398/408 407/397/407\nf 766/783/766 765/782/765 897/918/897\nf 766/783/766 897/918/897 1006/1036/1006\nf 907/930/907 892/916/892 906/929/906\nf 907/930/907 906/929/906 908/931/908\nf 937/959/937 999/1030/999 1002/1029/1002\nf 937/959/937 1002/1029/1002 938/960/938\nf 991/1018/991 976/1007/976 1032/1065/1032\nf 991/1018/991 1032/1065/1032 1031/1066/1031\nf 1034/1067/1034 739/756/739 738/755/738\nf 1034/1067/1034 738/755/738 1033/1068/1033\nf 1035/1069/1035 1036/1070/1036 1037/1071/1037\nf 1035/1069/1035 1037/1071/1037 1034/1067/1034\nf 1038/1072/1038 416/408/416 418/407/418\nf 1038/1072/1038 418/407/418 967/992/967\nf 966/995/966 719/736/719 718/735/718\nf 966/995/966 718/735/718 1039/1073/1039\nf 1041/1074/1041 1042/1075/1042 1043/1076/1043\nf 1041/1074/1041 1043/1076/1043 1040/1077/1040\nf 1041/1074/1041 1040/1077/1040 1045/1078/1045\nf 1041/1074/1041 1045/1078/1045 1044/1079/1044\nf 1043/1076/1043 1046/1080/1046 1047/1081/1047\nf 1043/1076/1043 1047/1081/1047 1040/1077/1040\nf 883/903/883 1045/1078/1045 1048/1082/1048\nf 883/903/883 1048/1082/1048 884/904/884\nf 1049/1083/1049 1050/1084/1050 721/739/721\nf 1049/1083/1049 721/739/721 720/738/720\nf 717/734/717 1050/1084/1050 1039/1073/1039\nf 717/734/717 1039/1073/1039 718/735/718\nf 889/909/889 760/781/760 763/780/763\nf 889/909/889 763/780/763 1051/1085/1051\nf 974/1002/974 1052/1086/1052 1053/1087/1053\nf 974/1002/974 1053/1087/1053 975/1003/975\nf 1053/1087/1053 1054/1088/1054 1042/1075/1042\nf 1053/1087/1053 1042/1075/1042 1041/1074/1041\nf 1056/1089/1056 1057/1090/1057 1058/1091/1058\nf 1056/1089/1056 1058/1091/1058 1055/1092/1055\nf 1055/1092/1055 1058/1091/1058 1010/1039/1010\nf 1055/1092/1055 1010/1039/1010 1009/1038/1009\nf 825/845/825 1059/1093/1059 1060/1094/1060\nf 825/845/825 1060/1094/1060 824/846/824\nf 1060/1094/1060 1059/1093/1059 1062/1095/1062\nf 1060/1094/1060 1062/1095/1062 1061/1096/1061\nf 444/1097/444 443/1098/443 1064/1099/1064\nf 444/1097/444 1064/1099/1064 1063/1100/1063\nf 955/981/955 829/850/829 830/852/830\nf 955/981/955 830/852/830 956/978/956\nf 855/879/855 845/866/845 987/1015/987\nf 855/879/855 987/1015/987 980/1009/980\nf 858/878/858 869/889/869 823/843/823\nf 858/878/858 823/843/823 822/842/822\nf 1066/1101/1066 1067/1102/1067 1068/1103/1068\nf 1066/1101/1066 1068/1103/1068 1065/1104/1065\nf 1043/1076/1043 1067/1102/1067 1069/1105/1069\nf 1043/1076/1043 1069/1105/1069 1046/1080/1046\nf 724/741/724 723/740/723 1046/1080/1046\nf 724/741/724 1046/1080/1046 1069/1105/1069\nf 725/742/725 710/727/710 709/726/709\nf 725/742/725 709/726/709 740/759/740\nf 923/945/923 922/944/922 730/751/730\nf 923/945/923 730/751/730 733/750/733\nf 742/761/742 1026/1056/1026 854/875/854\nf 742/761/742 854/875/854 735/752/735\nf 878/901/878 884/904/884 1048/1082/1048\nf 878/901/878 1048/1082/1048 1070/1106/1070\nf 839/859/839 1070/1106/1070 841/862/841\nf 839/859/839 841/862/841 840/860/840\nf 878/901/878 1070/1106/1070 839/859/839\nf 878/901/878 839/859/839 879/899/879\nf 728/745/728 853/874/853 983/1011/983\nf 728/745/728 983/1011/983 729/746/729\nf 923/945/923 733/750/733 743/760/743\nf 923/945/923 743/760/743 914/936/914\nf 1049/1083/1049 453/443/453 416/408/416\nf 1049/1083/1049 416/408/416 1038/1072/1038\nf 969/994/969 934/956/934 931/953/931\nf 969/994/969 931/953/931 930/952/930\nf 706/723/706 1071/1107/1071 1072/1108/1072\nf 706/723/706 1072/1108/1072 707/724/707\nf 856/876/856 981/1008/981 1074/1109/1074\nf 856/876/856 1074/1109/1074 1073/1110/1073\nf 732/749/732 731/748/731 985/1013/985\nf 732/749/732 985/1013/985 984/1012/984\nf 789/809/789 940/963/940 1004/1033/1004\nf 789/809/789 1004/1033/1004 787/810/787\nf 1027/1057/1027 941/964/941 940/963/940\nf 1027/1057/1027 940/963/940 789/809/789\nf 1075/1111/1075 1076/1112/1076 900/920/900\nf 1075/1111/1075 900/920/900 899/919/899\nf 228/210/228 866/886/866 898/922/898\nf 228/210/228 898/922/898 264/246/264\nf 900/920/900 1076/1112/1076 1077/1113/1077\nf 900/920/900 1077/1113/1077 902/923/902\nf 1077/1113/1077 694/1114/694 677/925/677\nf 1077/1113/1077 677/925/677 902/923/902\nf 263/247/263 901/921/901 903/924/903\nf 263/247/263 903/924/903 265/249/265\nf 461/1115/461 886/906/886 836/856/836\nf 461/1115/461 836/856/836 462/1116/462\nf 871/891/871 870/890/870 1078/1117/1078\nf 871/891/871 1078/1117/1078 948/972/948\nf 1080/1118/1080 1081/1119/1081 1032/1065/1032\nf 1080/1118/1080 1032/1065/1032 1079/1120/1079\nf 737/754/737 736/757/736 1012/1043/1012\nf 737/754/737 1012/1043/1012 1014/1044/1014\nf 875/895/875 874/898/874 977/1004/977\nf 875/895/875 977/1004/977 990/1019/990\nf 877/897/877 1082/1121/1082 992/1020/992\nf 877/897/877 992/1020/992 874/898/874\nf 969/994/969 930/952/930 719/736/719\nf 969/994/969 719/736/719 966/995/966\nf 969/994/969 968/993/968 935/957/935\nf 969/994/969 935/957/935 934/956/934\nf 1084/1122/1084 1037/1071/1037 1085/1123/1085\nf 1084/1122/1084 1085/1123/1085 1083/1124/1083\nf 978/1005/978 992/1020/992 1087/1125/1087\nf 978/1005/978 1087/1125/1087 1086/1126/1086\nf 1086/1126/1086 1088/1127/1088 979/1006/979\nf 1086/1126/1086 979/1006/979 978/1005/978\nf 1080/1118/1080 1090/1128/1090 1091/1129/1091\nf 1080/1118/1080 1091/1129/1091 1089/1130/1089\nf 1013/1042/1013 1092/1131/1092 1093/1132/1093\nf 1013/1042/1013 1093/1132/1093 756/775/756\nf 1035/1069/1035 1034/1067/1034 1033/1068/1033\nf 1035/1069/1035 1033/1068/1033 1094/1133/1094\nf 921/947/921 1094/1133/1094 1033/1068/1033\nf 921/947/921 1033/1068/1033 922/944/922\nf 730/751/730 738/755/738 737/754/737\nf 730/751/730 737/754/737 731/748/731\nf 1014/1044/1014 753/770/753 762/779/762\nf 1014/1044/1014 762/779/762 985/1013/985\nf 876/896/876 875/895/875 987/1015/987\nf 876/896/876 987/1015/987 986/1014/986\nf 928/954/928 808/832/808 826/849/826\nf 928/954/928 826/849/826 929/951/929\nf 1039/1073/1039 1038/1072/1038 967/992/967\nf 1039/1073/1039 967/992/967 966/995/966\nf 698/715/698 828/848/828 772/793/772\nf 698/715/698 772/793/772 699/716/699\nf 676/1032/676 939/961/939 964/989/964\nf 676/1032/676 964/989/964 673/1061/673\nf 1000/1027/1000 810/830/810 809/829/809\nf 1000/1027/1000 809/829/809 1001/1028/1001\nf 898/922/898 866/886/866 865/888/865\nf 898/922/898 865/888/865 899/919/899\nf 899/919/899 865/888/865 1095/1134/1095\nf 899/919/899 1095/1134/1095 1075/1111/1075\nf 857/877/857 870/890/870 869/889/869\nf 857/877/857 869/889/869 858/878/858\nf 948/972/948 1078/1117/1078 946/969/946\nf 948/972/948 946/969/946 1096/1135/1096\nf 819/839/819 823/843/823 815/835/815\nf 819/839/819 815/835/815 814/838/814\nf 911/935/911 1097/1136/1097 818/841/818\nf 911/935/911 818/841/818 847/867/847\nf 815/835/815 823/843/823 869/889/869\nf 815/835/815 869/889/869 868/892/868\nf 887/908/887 748/767/748 758/777/758\nf 887/908/887 758/777/758 888/910/888\nf 761/778/761 760/781/760 758/777/758\nf 761/778/761 758/777/758 759/776/759\nf 853/874/853 746/763/746 745/762/745\nf 853/874/853 745/762/745 983/1011/983\nf 1051/1085/1051 988/1017/988 876/896/876\nf 1051/1085/1051 876/896/876 986/1014/986\nf 877/897/877 876/896/876 988/1017/988\nf 877/897/877 988/1017/988 989/1016/989\nf 989/1016/989 1015/1045/1015 1082/1121/1082\nf 989/1016/989 1082/1121/1082 877/897/877\nf 726/747/726 729/746/729 1098/1137/1098\nf 726/747/726 1098/1137/1098 918/940/918\nf 1100/1138/1100 1101/1139/1101 1102/1140/1102\nf 1100/1138/1100 1102/1140/1102 1099/1141/1099\nf 1103/1142/1103 488/480/488 294/277/294\nf 1103/1142/1103 294/277/294 715/732/715\nf 1104/1143/1104 1105/1144/1105 1072/1108/1072\nf 1104/1143/1104 1072/1108/1072 1071/1107/1071\nf 801/821/801 800/824/800 1002/1029/1002\nf 801/821/801 1002/1029/1002 1001/1028/1001\nf 1104/1143/1104 1106/1145/1106 958/980/958\nf 1104/1143/1104 958/980/958 957/979/957\nf 1104/1143/1104 957/979/957 1107/1146/1107\nf 1104/1143/1104 1107/1146/1107 1105/1144/1105\nf 1056/1089/1056 1108/1147/1108 1064/1099/1064\nf 1056/1089/1056 1064/1099/1064 1057/1090/1057\nf 495/1148/495 1010/1039/1010 1058/1091/1058\nf 495/1148/495 1058/1091/1058 496/1149/496\nf 496/1149/496 1058/1091/1058 1057/1090/1057\nf 496/1149/496 1057/1090/1057 497/1150/497\nf 962/986/962 1052/1086/1052 498/1151/498\nf 962/986/962 498/1151/498 330/987/330\nf 499/1152/499 498/1151/498 1052/1086/1052\nf 499/1152/499 1052/1086/1052 974/1002/974\nf 1010/1039/1010 495/1148/495 500/1153/500\nf 1010/1039/1010 500/1153/500 1011/1040/1011\nf 1109/1154/1109 1054/1088/1054 962/986/962\nf 1109/1154/1109 962/986/962 961/985/961\nf 499/1152/499 974/1002/974 973/1001/973\nf 499/1152/499 973/1001/973 344/1000/344\nf 1106/1145/1106 1104/1143/1104 1071/1107/1071\nf 1106/1145/1106 1071/1107/1071 1110/1155/1110\nf 1071/1107/1071 706/723/706 1102/1140/1102\nf 1071/1107/1071 1102/1140/1102 1110/1155/1110\nf 1099/1141/1099 1102/1140/1102 706/723/706\nf 1099/1141/1099 706/723/706 705/722/705\nf 705/722/705 1008/1041/1008 1111/1156/1111\nf 705/722/705 1111/1156/1111 1099/1141/1099\nf 1011/1040/1011 500/1153/500 505/1157/505\nf 1011/1040/1011 505/1157/505 1112/1158/1112\nf 1067/1102/1067 1043/1076/1043 1042/1075/1042\nf 1067/1102/1067 1042/1075/1042 1068/1103/1068\nf 329/984/329 444/1097/444 1063/1100/1063\nf 329/984/329 1063/1100/1063 961/985/961\nf 1068/1103/1068 1109/1154/1109 1113/1159/1113\nf 1068/1103/1068 1113/1159/1113 1065/1104/1065\nf 1115/1160/1115 724/741/724 1069/1105/1069\nf 1115/1160/1115 1069/1105/1069 1114/1161/1114\nf 744/765/744 843/864/843 848/871/848\nf 744/765/744 848/871/848 751/768/751\nf 509/500/509 850/870/850 849/869/849\nf 509/500/509 849/869/849 208/189/208\nf 849/869/849 843/864/843 842/863/842\nf 849/869/849 842/863/842 851/872/851\nf 462/1116/462 836/856/836 835/855/835\nf 462/1116/462 835/855/835 510/501/510\nf 850/870/850 509/500/509 510/501/510\nf 850/870/850 510/501/510 835/855/835\nf 795/815/795 960/983/960 971/998/971\nf 795/815/795 971/998/971 951/974/951\nf 960/983/960 1116/1162/1116 972/997/972\nf 960/983/960 972/997/972 971/998/971\nf 768/789/768 780/798/780 972/997/972\nf 768/789/768 972/997/972 1116/1162/1116\nf 716/737/716 929/951/929 826/849/826\nf 716/737/716 826/849/826 698/715/698\nf 801/821/801 1001/1028/1001 809/829/809\nf 801/821/801 809/829/809 1016/1046/1016\nf 800/824/800 813/834/813 938/960/938\nf 800/824/800 938/960/938 1002/1029/1002\nf 813/834/813 964/989/964 939/961/939\nf 813/834/813 939/961/939 938/960/938\nf 1117/1163/1117 921/947/921 924/946/924\nf 1117/1163/1117 924/946/924 954/976/954\nf 1094/1133/1094 1118/1164/1118 1119/1165/1119\nf 1094/1133/1094 1119/1165/1119 1035/1069/1035\nf 1035/1069/1035 1119/1165/1119 1089/1130/1089\nf 1035/1069/1035 1089/1130/1089 1036/1070/1036\nf 1118/1164/1118 1094/1133/1094 921/947/921\nf 1118/1164/1118 921/947/921 1117/1163/1117\nf 838/858/838 837/861/837 982/1010/982\nf 838/858/838 982/1010/982 750/769/750\nf 963/988/963 838/858/838 750/769/750\nf 963/988/963 750/769/750 751/768/751\nf 729/746/729 983/1011/983 982/1010/982\nf 729/746/729 982/1010/982 1098/1137/1098\nf 732/749/732 742/761/742 743/760/743\nf 732/749/732 743/760/743 733/750/733\nf 732/749/732 984/1012/984 1026/1056/1026\nf 732/749/732 1026/1056/1026 742/761/742\nf 984/1012/984 761/778/761 759/776/759\nf 984/1012/984 759/776/759 1026/1056/1026\nf 790/811/790 806/826/806 783/801/783\nf 790/811/790 783/801/783 782/800/782\nf 931/953/931 934/956/934 933/955/933\nf 931/953/931 933/955/933 995/1022/995\nf 931/953/931 995/1022/995 1016/1046/1016\nf 931/953/931 1016/1046/1016 928/954/928\nf 996/1024/996 827/847/827 811/831/811\nf 996/1024/996 811/831/811 791/812/791\nf 1121/1166/1121 861/881/861 864/885/864\nf 1121/1166/1121 864/885/864 1120/1167/1120\nf 896/917/896 1122/1168/1122 860/880/860\nf 896/917/896 860/880/860 859/883/859\nf 1024/1053/1024 1023/1052/1023 1025/1055/1025\nf 1024/1053/1024 1025/1055/1025 993/1021/993\nf 1024/1053/1024 860/880/860 1122/1168/1122\nf 1024/1053/1024 1122/1168/1122 1021/1054/1021\nf 1124/1169/1124 887/908/887 888/910/888\nf 1124/1169/1124 888/910/888 1123/1170/1123\nf 951/974/951 971/998/971 798/818/798\nf 951/974/951 798/818/798 797/817/797\nf 1050/1084/1050 1049/1083/1049 1038/1072/1038\nf 1050/1084/1050 1038/1072/1038 1039/1073/1039\nf 680/1063/680 1028/1058/1028 404/389/404\nf 680/1063/680 404/389/404 46/511/46\nf 1028/1058/1028 944/966/944 943/965/943\nf 1028/1058/1028 943/965/943 1029/1059/1029\nf 1018/1049/1018 932/958/932 521/513/521\nf 1018/1049/1018 521/513/521 520/512/520\nf 522/514/522 1019/1048/1019 1018/1049/1018\nf 522/514/522 1018/1049/1018 520/512/520\nf 935/957/935 523/515/523 521/513/521\nf 935/957/935 521/513/521 932/958/932\nf 935/957/935 968/993/968 524/516/524\nf 935/957/935 524/516/524 523/515/523\nf 953/977/953 792/816/792 952/975/952\nf 953/977/953 952/975/952 1073/1110/1073\nf 1073/1110/1073 1074/1109/1074 1125/1171/1125\nf 1073/1110/1073 1125/1171/1125 953/977/953\nf 1032/1065/1032 1081/1119/1081 1126/1172/1126\nf 1032/1065/1032 1126/1172/1126 1031/1066/1031\nf 1032/1065/1032 976/1007/976 979/1006/979\nf 1032/1065/1032 979/1006/979 1079/1120/1079\nf 1073/1110/1073 1127/1173/1127 857/877/857\nf 1073/1110/1073 857/877/857 856/876/856\nf 857/877/857 1127/1173/1127 1078/1117/1078\nf 857/877/857 1078/1117/1078 870/890/870\nf 407/397/407 276/258/276 905/928/905\nf 407/397/407 905/928/905 1007/1037/1007\nf 1006/1036/1006 897/918/897 1030/1064/1030\nf 1006/1036/1006 1030/1064/1030 1007/1037/1007\nf 822/842/822 845/866/845 855/879/855\nf 822/842/822 855/879/855 858/878/858\nf 1014/1044/1014 985/1013/985 731/748/731\nf 1014/1044/1014 731/748/731 737/754/737\nf 1031/1066/1031 1074/1109/1074 981/1008/981\nf 1031/1066/1031 981/1008/981 991/1018/991\nf 730/751/730 922/944/922 1033/1068/1033\nf 730/751/730 1033/1068/1033 738/755/738\nf 990/1019/990 980/1009/980 987/1015/987\nf 990/1019/990 987/1015/987 875/895/875\nf 763/780/763 752/773/752 988/1017/988\nf 763/780/763 988/1017/988 1051/1085/1051\nf 763/780/763 762/779/762 753/770/753\nf 763/780/763 753/770/753 752/773/752\nf 980/1009/980 990/1019/990 991/1018/991\nf 980/1009/980 991/1018/991 981/1008/981\nf 1118/1164/1118 1126/1172/1126 1081/1119/1081\nf 1118/1164/1118 1081/1119/1081 1119/1165/1119\nf 1126/1172/1126 1125/1171/1125 1074/1109/1074\nf 1126/1172/1126 1074/1109/1074 1031/1066/1031\nf 1119/1165/1119 1081/1119/1081 1080/1118/1080\nf 1119/1165/1119 1080/1118/1080 1089/1130/1089\nf 986/1014/986 844/865/844 889/909/889\nf 986/1014/986 889/909/889 1051/1085/1051\nf 821/844/821 819/839/819 818/841/818\nf 821/844/821 818/841/818 1097/1136/1097\nf 1022/1051/1022 764/785/764 894/914/894\nf 1022/1051/1022 894/914/894 1023/1052/1023\nf 1023/1052/1023 894/914/894 893/913/893\nf 1023/1052/1023 893/913/893 1025/1055/1025\nf 926/950/926 920/942/920 727/744/727\nf 926/950/926 727/744/727 726/747/726\nf 919/943/919 920/942/920 926/950/926\nf 919/943/919 926/950/926 927/949/927\nf 1128/1174/1128 1116/1162/1116 960/983/960\nf 1128/1174/1128 960/983/960 959/982/959\nf 773/790/773 702/719/702 799/820/799\nf 773/790/773 799/820/799 774/791/774\nf 799/820/799 972/997/972 780/798/780\nf 799/820/799 780/798/780 774/791/774\nf 772/793/772 828/848/828 970/996/970\nf 772/793/772 970/996/970 773/790/773\nf 703/720/703 970/996/970 996/1024/996\nf 703/720/703 996/1024/996 782/800/782\nf 771/788/771 781/799/781 780/798/780\nf 771/788/771 780/798/780 768/789/768\nf 791/812/791 790/811/790 782/800/782\nf 791/812/791 782/800/782 996/1024/996\nf 811/831/811 810/830/810 779/796/779\nf 811/831/811 779/796/779 791/812/791\nf 1027/1057/1027 789/809/789 777/794/777\nf 1027/1057/1027 777/794/777 776/797/776\nf 927/949/927 925/948/925 769/786/769\nf 927/949/927 769/786/769 1128/1174/1128\nf 710/727/710 725/742/725 724/741/724\nf 710/727/710 724/741/724 1115/1160/1115\nf 954/976/954 953/977/953 1125/1171/1125\nf 954/976/954 1125/1171/1125 1117/1163/1117\nf 1117/1163/1117 1125/1171/1125 1126/1172/1126\nf 1117/1163/1117 1126/1172/1126 1118/1164/1118\nf 768/789/768 1116/1162/1116 1128/1174/1128\nf 768/789/768 1128/1174/1128 769/786/769\nf 904/927/904 867/887/867 229/209/229\nf 904/927/904 229/209/229 529/521/529\nf 948/972/948 1096/1135/1096 998/1025/998\nf 948/972/948 998/1025/998 949/971/949\nf 1120/1167/1120 864/885/864 873/893/873\nf 1120/1167/1120 873/893/873 949/971/949\nf 1121/1166/1121 1120/1167/1120 997/1026/997\nf 1121/1166/1121 997/1026/997 1129/1175/1129\nf 1129/1175/1129 1095/1134/1095 865/888/865\nf 1129/1175/1129 865/888/865 1121/1166/1121\nf 861/881/861 1121/1166/1121 865/888/865\nf 861/881/861 865/888/865 862/882/862\nf 1075/1111/1075 890/911/890 1003/1034/1003\nf 1075/1111/1075 1003/1034/1003 1076/1112/1076\nf 1076/1112/1076 1003/1034/1003 965/991/965\nf 1076/1112/1076 965/991/965 1077/1113/1077\nf 965/991/965 695/990/695 694/1114/694\nf 965/991/965 694/1114/694 1077/1113/1077\nf 1075/1111/1075 1095/1134/1095 891/912/891\nf 1075/1111/1075 891/912/891 890/911/890\nf 895/915/895 894/914/894 764/785/764\nf 895/915/895 764/785/764 767/784/767\nf 1020/1050/1020 820/840/820 814/838/814\nf 1020/1050/1020 814/838/814 817/837/817\nf 1123/1170/1123 844/865/844 821/844/821\nf 1123/1170/1123 821/844/821 1097/1136/1097\nf 1124/1169/1124 1123/1170/1123 1097/1136/1097\nf 1124/1169/1124 1097/1136/1097 911/935/911\nf 1130/1176/1130 1124/1169/1124 911/935/911\nf 1130/1176/1130 911/935/911 912/934/912\nf 532/524/532 1130/1176/1130 912/934/912\nf 532/524/532 912/934/912 390/376/390\nf 973/1001/973 882/902/882 881/905/881\nf 973/1001/973 881/905/881 885/907/885\nf 833/857/833 836/856/836 886/906/886\nf 833/857/833 886/906/886 880/900/880\nf 834/854/834 833/857/833 879/899/879\nf 834/854/834 879/899/879 963/988/963\nf 1067/1102/1067 1066/1101/1066 1114/1161/1114\nf 1067/1102/1067 1114/1161/1114 1069/1105/1069\nf 809/829/809 808/832/808 928/954/928\nf 809/829/809 928/954/928 1016/1046/1016\nf 1019/1048/1019 522/514/522 405/390/405\nf 1019/1048/1019 405/390/405 1029/1059/1029\nf 1131/1177/1131 1085/1123/1085 1037/1071/1037\nf 1131/1177/1131 1037/1071/1037 1036/1070/1036\nf 1132/1178/1132 1103/1142/1103 715/732/715\nf 1132/1178/1132 715/732/715 714/731/714\nf 1110/1155/1110 1102/1140/1102 1101/1139/1101\nf 1110/1155/1110 1101/1139/1101 1133/1179/1133\nf 1111/1156/1111 1112/1158/1112 1135/1180/1135\nf 1111/1156/1111 1135/1180/1135 1134/1181/1134\nf 1106/1145/1106 1110/1155/1110 1133/1179/1133\nf 1106/1145/1106 1133/1179/1133 1136/1182/1136\nf 1106/1145/1106 714/731/714 713/730/713\nf 1106/1145/1106 713/730/713 958/980/958\nf 1112/1158/1112 505/1157/505 539/1183/539\nf 1112/1158/1112 539/1183/539 1135/1180/1135\nf 883/903/883 882/902/882 975/1003/975\nf 883/903/883 975/1003/975 1044/1079/1044\nf 704/725/704 1009/1038/1009 1008/1041/1008\nf 704/725/704 1008/1041/1008 705/722/705\nf 1052/1086/1052 962/986/962 1054/1088/1054\nf 1052/1086/1052 1054/1088/1054 1053/1087/1053\nf 1055/1092/1055 824/846/824 1060/1094/1060\nf 1055/1092/1055 1060/1094/1060 1056/1089/1056\nf 1009/1038/1009 704/725/704 824/846/824\nf 1009/1038/1009 824/846/824 1055/1092/1055\nf 1065/1104/1065 1113/1159/1113 1108/1147/1108\nf 1065/1104/1065 1108/1147/1108 1061/1096/1061\nf 1068/1103/1068 1042/1075/1042 1054/1088/1054\nf 1068/1103/1068 1054/1088/1054 1109/1154/1109\nf 1008/1041/1008 1011/1040/1011 1112/1158/1112\nf 1008/1041/1008 1112/1158/1112 1111/1156/1111\nf 1109/1154/1109 961/985/961 1063/1100/1063\nf 1109/1154/1109 1063/1100/1063 1113/1159/1113\nf 1134/1181/1134 1100/1138/1100 1099/1141/1099\nf 1134/1181/1134 1099/1141/1099 1111/1156/1111\nf 947/970/947 952/975/952 951/974/951\nf 947/970/947 951/974/951 797/817/797\nf 959/982/959 794/814/794 916/938/916\nf 959/982/959 916/938/916 919/943/919\nf 1098/1137/1098 982/1010/982 837/861/837\nf 1098/1137/1098 837/861/837 741/758/741\nf 1098/1137/1098 741/758/741 740/759/740\nf 1098/1137/1098 740/759/740 918/940/918\nf 1040/1077/1040 1047/1081/1047 1048/1082/1048\nf 1040/1077/1040 1048/1082/1048 1045/1078/1045\nf 1041/1074/1041 1044/1079/1044 975/1003/975\nf 1041/1074/1041 975/1003/975 1053/1087/1053\nf 1078/1117/1078 1127/1173/1127 947/970/947\nf 1078/1117/1078 947/970/947 946/969/946\nf 949/971/949 998/1025/998 997/1026/997\nf 949/971/949 997/1026/997 1120/1167/1120\nf 946/969/946 796/819/796 945/968/945\nf 946/969/946 945/968/945 1096/1135/1096\nf 998/1025/998 1096/1135/1096 945/968/945\nf 998/1025/998 945/968/945 950/973/950\nf 997/1026/997 805/825/805 804/828/804\nf 997/1026/997 804/828/804 1129/1175/1129\nf 1095/1134/1095 1129/1175/1129 804/828/804\nf 1095/1134/1095 804/828/804 891/912/891\nf 904/927/904 529/521/529 408/398/408\nf 904/927/904 408/398/408 1030/1064/1030\nf 1024/1053/1024 993/1021/993 863/884/863\nf 1024/1053/1024 863/884/863 860/880/860\nf 1138/1184/1138 1139/1185/1139 1140/1186/1140\nf 1138/1184/1138 1140/1186/1140 1137/1187/1137\nf 1141/1188/1141 1142/1189/1142 1137/1187/1137\nf 1141/1188/1141 1137/1187/1137 1140/1186/1140\nf 1143/1190/1143 1144/1191/1144 1142/1189/1142\nf 1143/1190/1143 1142/1189/1142 1141/1188/1141\nf 1145/1192/1145 1146/1193/1146 1144/1191/1144\nf 1145/1192/1145 1144/1191/1144 1143/1190/1143\nf 1147/1194/1147 1148/1195/1148 1146/1193/1146\nf 1147/1194/1147 1146/1193/1146 1145/1192/1145\nf 1149/1196/1149 1150/1197/1150 1148/1195/1148\nf 1149/1196/1149 1148/1195/1148 1147/1194/1147\nf 1151/1198/1151 1152/1199/1152 1150/1197/1150\nf 1151/1198/1151 1150/1197/1150 1149/1196/1149\nf 1154/1200/1154 1155/1201/1155 1156/1202/1156\nf 1154/1200/1154 1156/1202/1156 1153/1203/1153\nf 1157/1204/1157 1158/1205/1158 1155/1201/1155\nf 1157/1204/1157 1155/1201/1155 1154/1200/1154\nf 1159/1206/1159 1160/1207/1160 1142/1189/1142\nf 1159/1206/1159 1142/1189/1142 1144/1191/1144\nf 1161/1208/1161 1159/1206/1159 1144/1191/1144\nf 1161/1208/1161 1144/1191/1144 1146/1193/1146\nf 1162/1209/1162 1161/1208/1161 1146/1193/1146\nf 1162/1209/1162 1146/1193/1146 1148/1195/1148\nf 1163/1210/1163 1162/1209/1162 1148/1195/1148\nf 1163/1210/1163 1148/1195/1148 1150/1197/1150\nf 1150/1197/1150 1152/1199/1152 1164/1211/1164\nf 1150/1197/1150 1164/1211/1164 1163/1210/1163\nf 1156/1202/1156 1155/1201/1155 1166/1212/1166\nf 1156/1202/1156 1166/1212/1166 1165/1213/1165\nf 1167/1214/1167 1166/1212/1166 1155/1201/1155\nf 1167/1214/1167 1155/1201/1155 1158/1205/1158\nf 1169/1215/1169 1167/1214/1167 1158/1205/1158\nf 1169/1215/1169 1158/1205/1158 1168/1216/1168\nf 1170/1217/1170 1171/1218/1171 1172/1219/1172\nf 1170/1217/1170 1172/1219/1172 1139/1185/1139\nf 1173/1220/1173 1174/1221/1174 1141/1188/1141\nf 1173/1220/1173 1141/1188/1141 1140/1186/1140\nf 1141/1188/1141 1174/1221/1174 1175/1222/1175\nf 1141/1188/1141 1175/1222/1175 1143/1190/1143\nf 1176/1223/1176 1145/1192/1145 1143/1190/1143\nf 1176/1223/1176 1143/1190/1143 1175/1222/1175\nf 1177/1224/1177 1149/1196/1149 1147/1194/1147\nf 1177/1224/1177 1147/1194/1147 1176/1223/1176\nf 1177/1224/1177 1178/1225/1178 1151/1198/1151\nf 1177/1224/1177 1151/1198/1151 1149/1196/1149\nf 1153/1203/1153 1179/1226/1179 1180/1227/1180\nf 1153/1203/1153 1180/1227/1180 1154/1200/1154\nf 1157/1204/1157 1154/1200/1154 1180/1227/1180\nf 1157/1204/1157 1180/1227/1180 1181/1228/1181\nf 1157/1204/1157 1181/1228/1181 1182/1229/1182\nf 1157/1204/1157 1182/1229/1182 1168/1216/1168\nf 1169/1215/1169 1168/1216/1168 1182/1229/1182\nf 1169/1215/1169 1182/1229/1182 1183/1230/1183\nf 1142/1189/1142 1160/1207/1160 1138/1184/1138\nf 1142/1189/1142 1138/1184/1138 1137/1187/1137\nf 1170/1217/1170 1185/1231/1185 1186/1232/1186\nf 1170/1217/1170 1186/1232/1186 1184/1233/1184\nf 1170/1217/1170 1184/1233/1184 1187/1234/1187\nf 1170/1217/1170 1187/1234/1187 1171/1218/1171\nf 1187/1234/1187 1188/1235/1188 1172/1219/1172\nf 1187/1234/1187 1172/1219/1172 1171/1218/1171\nf 1172/1219/1172 1188/1235/1188 1140/1186/1140\nf 1172/1219/1172 1140/1186/1140 1139/1185/1139\nf 1161/1208/1161 1162/1209/1162 1163/1210/1163\nf 1161/1208/1161 1163/1210/1163 1189/1236/1189\nf 1189/1236/1189 1163/1210/1163 1164/1211/1164\nf 1189/1236/1189 1164/1211/1164 1190/1237/1190\nf 1165/1213/1165 1164/1211/1164 1152/1199/1152\nf 1165/1213/1165 1152/1199/1152 1156/1202/1156\nf 1152/1199/1152 1151/1198/1151 1153/1203/1153\nf 1152/1199/1152 1153/1203/1153 1156/1202/1156\nf 1179/1226/1179 1153/1203/1153 1151/1198/1151\nf 1179/1226/1179 1151/1198/1151 1178/1225/1178\nf 1189/1236/1189 1160/1207/1160 1159/1206/1159\nf 1189/1236/1189 1159/1206/1159 1161/1208/1161\nf 1186/1232/1186 1190/1237/1190 1164/1211/1164\nf 1186/1232/1186 1164/1211/1164 1165/1213/1165\nf 1139/1185/1139 1138/1184/1138 1185/1231/1185\nf 1139/1185/1139 1185/1231/1185 1170/1217/1170\nf 1169/1215/1169 1188/1235/1188 1187/1234/1187\nf 1169/1215/1169 1187/1234/1187 1167/1214/1167\nf 1186/1232/1186 1165/1213/1165 1166/1212/1166\nf 1186/1232/1186 1166/1212/1166 1184/1233/1184\nf 1140/1186/1140 1188/1235/1188 1191/1238/1191\nf 1140/1186/1140 1191/1238/1191 1173/1220/1173\nf 1191/1238/1191 1188/1235/1188 1169/1215/1169\nf 1191/1238/1191 1169/1215/1169 1183/1230/1183\nf 1192/1239/1192 1193/1240/1193 1179/1226/1179\nf 1192/1239/1192 1179/1226/1179 1178/1225/1178\nf 1192/1239/1192 1178/1225/1178 1177/1224/1177\nf 1192/1239/1192 1177/1224/1177 1194/1241/1194\nf 1180/1227/1180 1193/1240/1193 1072/1108/1072\nf 1180/1227/1180 1072/1108/1072 1105/1144/1105\nf 1180/1227/1180 1105/1144/1105 1107/1146/1107\nf 1180/1227/1180 1107/1146/1107 1181/1228/1181\nf 1194/1241/1194 1177/1224/1177 1176/1223/1176\nf 1194/1241/1194 1176/1223/1176 1114/1161/1114\nf 1062/1095/1062 1194/1241/1194 1114/1161/1114\nf 1062/1095/1062 1114/1161/1114 1066/1101/1066\nf 707/724/707 1072/1108/1072 1193/1240/1193\nf 707/724/707 1193/1240/1193 825/845/825\nf 825/845/825 1193/1240/1193 1192/1239/1192\nf 825/845/825 1192/1239/1192 1059/1093/1059\nf 1173/1220/1173 1191/1238/1191 832/853/832\nf 1173/1220/1173 832/853/832 711/728/711\nf 1183/1230/1183 1182/1229/1182 1005/1035/1005\nf 1183/1230/1183 1005/1035/1005 831/851/831\nf 1187/1234/1187 1184/1233/1184 1166/1212/1166\nf 1187/1234/1187 1166/1212/1166 1167/1214/1167\nf 710/727/710 1115/1160/1115 1175/1222/1175\nf 710/727/710 1175/1222/1175 1174/1221/1174\nf 1182/1229/1182 1181/1228/1181 1107/1146/1107\nf 1182/1229/1182 1107/1146/1107 1005/1035/1005\nf 453/443/453 1049/1083/1049 720/738/720\nf 453/443/453 720/738/720 598/590/598\nf 1123/1170/1123 888/910/888 889/909/889\nf 1123/1170/1123 889/909/889 844/865/844\nf 916/938/916 794/814/794 793/813/793\nf 916/938/916 793/813/793 913/939/913\nf 711/728/711 832/853/832 770/787/770\nf 711/728/711 770/787/770 708/729/708\nf 919/943/919 927/949/927 1128/1174/1128\nf 919/943/919 1128/1174/1128 959/982/959\nf 925/948/925 708/729/708 770/787/770\nf 925/948/925 770/787/770 769/786/769\nf 913/939/913 793/813/793 954/976/954\nf 913/939/913 954/976/954 924/946/924\nf 831/851/831 832/853/832 1191/1238/1191\nf 831/851/831 1191/1238/1191 1183/1230/1183\nf 895/915/895 767/784/767 766/783/766\nf 895/915/895 766/783/766 1006/1036/1006\nf 891/912/891 804/828/804 807/827/807\nf 891/912/891 807/827/807 788/808/788\nf 778/795/778 777/794/777 788/808/788\nf 778/795/778 788/808/788 807/827/807\nf 810/830/810 1000/1027/1000 776/797/776\nf 810/830/810 776/797/776 779/796/779\nf 947/970/947 1127/1173/1127 1073/1110/1073\nf 947/970/947 1073/1110/1073 952/975/952\nf 1106/1145/1106 1136/1182/1136 1132/1178/1132\nf 1106/1145/1106 1132/1178/1132 714/731/714\nf 1061/1096/1061 1062/1095/1062 1066/1101/1066\nf 1061/1096/1061 1066/1101/1066 1065/1104/1065\nf 443/1098/443 497/1150/497 1057/1090/1057\nf 443/1098/443 1057/1090/1057 1064/1099/1064\nf 1064/1099/1064 1108/1147/1108 1113/1159/1113\nf 1064/1099/1064 1113/1159/1113 1063/1100/1063\nf 1061/1096/1061 1108/1147/1108 1056/1089/1056\nf 1061/1096/1061 1056/1089/1056 1060/1094/1060\nf 1192/1239/1192 1194/1241/1194 1062/1095/1062\nf 1192/1239/1192 1062/1095/1062 1059/1093/1059\nf 1173/1220/1173 711/728/711 710/727/710\nf 1173/1220/1173 710/727/710 1174/1221/1174\nf 880/900/880 881/905/881 884/904/884\nf 880/900/880 884/904/884 878/901/878\nf 841/862/841 1047/1081/1047 1046/1080/1046\nf 841/862/841 1046/1080/1046 723/740/723\nf 1070/1106/1070 1048/1082/1048 1047/1081/1047\nf 1070/1106/1070 1047/1081/1047 841/862/841\nf 461/1115/461 342/999/342 885/907/885\nf 461/1115/461 885/907/885 886/906/886\nf 1114/1161/1114 1176/1223/1176 1175/1222/1175\nf 1114/1161/1114 1175/1222/1175 1115/1160/1115\nf 887/908/887 1124/1169/1124 1130/1176/1130\nf 887/908/887 1130/1176/1130 852/873/852\nf 206/186/206 852/873/852 1130/1176/1130\nf 206/186/206 1130/1176/1130 532/524/532\nf 681/698/681 599/592/599 1195/1242/1195\nf 681/698/681 1195/1242/1195 682/699/682\nf 1196/1243/1196 674/691/674 684/702/684\nf 1196/1243/1196 684/702/684 1195/1242/1195\nf 1197/1244/1197 675/692/675 674/691/674\nf 1197/1244/1197 674/691/674 1196/1243/1196\nf 689/706/689 690/708/690 675/692/675\nf 689/706/689 675/692/675 1197/1244/1197\nf 693/710/693 1199/1245/1199 1200/1246/1200\nf 693/710/693 1200/1246/1200 1198/1247/1198\nf 686/707/686 689/706/689 1197/1244/1197\nf 686/707/686 1197/1244/1197 1199/1245/1199\nf 1196/1243/1196 1195/1242/1195 1202/1248/1202\nf 1196/1243/1196 1202/1248/1202 1201/1249/1201\nf 1084/1122/1084 1083/1124/1083 1204/1250/1204\nf 1084/1122/1084 1204/1250/1204 1203/1251/1203\nf 1092/1131/1092 1013/1042/1013 1203/1251/1203\nf 1092/1131/1092 1203/1251/1203 1204/1250/1204\nf 1206/1252/1206 1087/1253/1087 1207/1254/1207\nf 1206/1252/1206 1207/1254/1207 1205/1255/1205\nf 1206/1252/1206 1208/1256/1208 1086/1257/1086\nf 1206/1252/1206 1086/1257/1086 1087/1253/1087\nf 1091/1258/1091 1090/1259/1090 1210/1260/1210\nf 1091/1258/1091 1210/1260/1210 1209/1261/1209\nf 1093/1132/1093 1211/1262/1211 757/774/757\nf 1093/1132/1093 757/774/757 756/775/756\nf 1079/1120/1079 1212/1263/1212 1090/1128/1090\nf 1079/1120/1079 1090/1128/1090 1080/1118/1080\nf 1079/1120/1079 979/1006/979 1088/1127/1088\nf 1079/1120/1079 1088/1127/1088 1212/1263/1212\nf 1209/1261/1209 1213/1264/1213 1085/1265/1085\nf 1209/1261/1209 1085/1265/1085 1131/1266/1131\nf 1089/1130/1089 1091/1129/1091 1131/1177/1131\nf 1089/1130/1089 1131/1177/1131 1036/1070/1036\nf 1213/1264/1213 1214/1267/1214 1204/1268/1204\nf 1213/1264/1213 1204/1268/1204 1083/1269/1083\nf 1214/1267/1214 1215/1270/1215 1092/1271/1092\nf 1214/1267/1214 1092/1271/1092 1204/1268/1204\nf 1015/1045/1015 757/774/757 1211/1262/1211\nf 1015/1045/1015 1211/1262/1211 1216/1272/1216\nf 1211/1273/1211 1093/1274/1093 1215/1270/1215\nf 1211/1273/1211 1215/1270/1215 1217/1275/1217\nf 1088/1276/1088 1208/1256/1208 1210/1260/1210\nf 1088/1276/1088 1210/1260/1210 1212/1277/1212\nf 1216/1278/1216 1211/1273/1211 1217/1275/1217\nf 1216/1278/1216 1217/1275/1217 1218/1279/1218\nf 1219/1280/1219 1218/1279/1218 1205/1255/1205\nf 1219/1280/1219 1205/1255/1205 1207/1254/1207\nf 698/715/698 697/714/697 717/734/717\nf 698/715/698 717/734/717 716/737/716\nf 967/992/967 418/407/418 524/516/524\nf 967/992/967 524/516/524 968/993/968\nf 598/590/598 720/738/720 712/733/712\nf 598/590/598 712/733/712 293/276/293\nf 697/714/697 721/739/721 1050/1084/1050\nf 697/714/697 1050/1084/1050 717/734/717\nf 957/979/957 956/978/956 1005/1035/1005\nf 957/979/957 1005/1035/1005 1107/1146/1107\nf 1186/1232/1186 1185/1231/1185 1189/1236/1189\nf 1186/1232/1186 1189/1236/1189 1190/1237/1190\nf 1022/1051/1022 896/917/896 765/782/765\nf 1022/1051/1022 765/782/765 764/785/764\nf 1122/1168/1122 896/917/896 1022/1051/1022\nf 1122/1168/1122 1022/1051/1022 1021/1054/1021\nf 678/695/678 1198/1247/1198 625/631/625\nf 678/695/678 625/631/625 27/8/27\nf 1195/1242/1195 599/592/599 626/632/626\nf 1195/1242/1195 626/632/626 1202/1248/1202\nf 1202/1248/1202 626/632/626 628/634/628\nf 1202/1248/1202 628/634/628 1220/1281/1220\nf 1198/1247/1198 1220/1281/1220 628/634/628\nf 1198/1247/1198 628/634/628 625/631/625\nf 1222/1282/1222 1223/1283/1223 1224/1284/1224\nf 1222/1282/1222 1224/1284/1224 1221/1285/1221\nf 1226/1286/1226 1227/1287/1227 1228/1288/1228\nf 1226/1286/1226 1228/1288/1228 1225/1289/1225\nf 1230/1290/1230 1231/1291/1231 1232/1292/1232\nf 1230/1290/1230 1232/1292/1232 1229/1293/1229\nf 1234/1294/1234 1232/1292/1232 1231/1291/1231\nf 1234/1294/1234 1231/1291/1231 1233/1295/1233\nf 1236/1296/1236 1237/1297/1237 1238/1298/1238\nf 1236/1296/1236 1238/1298/1238 1235/1299/1235\nf 1221/1285/1221 1239/1300/1239 1240/1301/1240\nf 1221/1285/1221 1240/1301/1240 1233/1295/1233\nf 1242/1302/1242 1243/1303/1243 1244/1304/1244\nf 1242/1302/1242 1244/1304/1244 1241/1305/1241\nf 1237/1297/1237 1245/1306/1245 1246/1307/1246\nf 1237/1297/1237 1246/1307/1246 1238/1298/1238\nf 1246/1307/1246 1245/1306/1245 1242/1302/1242\nf 1246/1307/1246 1242/1302/1242 1241/1305/1241\nf 1248/1308/1248 1224/1284/1224 1249/1309/1249\nf 1248/1308/1248 1249/1309/1249 1247/1310/1247\nf 1249/1309/1249 1250/1311/1250 660/1312/660\nf 1249/1309/1249 660/1312/660 659/1313/659\nf 661/1314/661 1247/1310/1247 1249/1309/1249\nf 661/1314/661 1249/1309/1249 659/1313/659\nf 1221/1285/1221 1224/1284/1224 1248/1308/1248\nf 1221/1285/1221 1248/1308/1248 1239/1300/1239\nf 1231/1291/1231 1222/1282/1222 1221/1285/1221\nf 1231/1291/1231 1221/1285/1221 1233/1295/1233\nf 1232/1292/1232 1234/1294/1234 1243/1303/1243\nf 1232/1292/1232 1243/1303/1243 1242/1302/1242\nf 1244/1304/1244 1243/1303/1243 1234/1294/1234\nf 1244/1304/1244 1234/1294/1234 1251/1315/1251\nf 1240/1301/1240 1251/1315/1251 1234/1294/1234\nf 1240/1301/1240 1234/1294/1234 1233/1295/1233\nf 1253/1316/1253 1134/1181/1134 1135/1180/1135\nf 1253/1316/1253 1135/1180/1135 1252/1317/1252\nf 1254/1318/1254 1255/1319/1255 1229/1293/1229\nf 1254/1318/1254 1229/1293/1229 1232/1292/1232\nf 1254/1318/1254 1225/1289/1225 1228/1288/1228\nf 1254/1318/1254 1228/1288/1228 1255/1319/1255\nf 667/1320/667 1252/1317/1252 1135/1180/1135\nf 667/1320/667 1135/1180/1135 539/1183/539\nf 1226/1286/1226 1225/1289/1225 1237/1297/1237\nf 1226/1286/1226 1237/1297/1237 1236/1296/1236\nf 1245/1306/1245 1254/1318/1254 1232/1292/1232\nf 1245/1306/1245 1232/1292/1232 1242/1302/1242\nf 1254/1318/1254 1245/1306/1245 1237/1297/1237\nf 1254/1318/1254 1237/1297/1237 1225/1289/1225\nf 669/674/669 668/675/668 1226/1286/1226\nf 669/674/669 1226/1286/1226 1236/1296/1236\nf 1230/1290/1230 1256/1321/1256 1222/1282/1222\nf 1230/1290/1230 1222/1282/1222 1231/1291/1231\nf 1235/1299/1235 671/677/671 669/674/669\nf 1235/1299/1235 669/674/669 1236/1296/1236\nf 1230/1290/1230 1101/1139/1101 1100/1138/1100\nf 1230/1290/1230 1100/1138/1100 1256/1321/1256\nf 672/678/672 488/480/488 1103/1142/1103\nf 672/678/672 1103/1142/1103 1227/1287/1227\nf 1224/1284/1224 1223/1283/1223 1250/1311/1250\nf 1224/1284/1224 1250/1311/1250 1249/1309/1249\nf 1256/1321/1256 1100/1138/1100 1134/1181/1134\nf 1256/1321/1256 1134/1181/1134 1253/1316/1253\nf 1227/1287/1227 1103/1142/1103 1132/1178/1132\nf 1227/1287/1227 1132/1178/1132 1228/1288/1228\nf 1101/1139/1101 1230/1290/1230 1229/1293/1229\nf 1101/1139/1101 1229/1293/1229 1133/1179/1133\nf 1223/1283/1223 1253/1316/1253 1252/1317/1252\nf 1223/1283/1223 1252/1317/1252 1250/1311/1250\nf 1255/1319/1255 1136/1182/1136 1133/1179/1133\nf 1255/1319/1255 1133/1179/1133 1229/1293/1229\nf 1228/1288/1228 1132/1178/1132 1136/1182/1136\nf 1228/1288/1228 1136/1182/1136 1255/1319/1255\nf 660/1312/660 1250/1311/1250 1252/1317/1252\nf 660/1312/660 1252/1317/1252 667/1320/667\nf 668/675/668 672/678/672 1227/1287/1227\nf 668/675/668 1227/1287/1227 1226/1286/1226\nf 1222/1282/1222 1256/1321/1256 1253/1316/1253\nf 1222/1282/1222 1253/1316/1253 1223/1283/1223\nf 1/1322/1 12/1323/12 1247/1310/1247\nf 1/1322/1 1247/1310/1247 661/1314/661\nf 10/1324/10 8/1325/8 1240/1301/1240\nf 10/1324/10 1240/1301/1240 1239/1300/1239\nf 1239/1300/1239 1248/1308/1248 11/1326/11\nf 1239/1300/1239 11/1326/11 10/1324/10\nf 5/1327/5 3/1328/3 1235/1299/1235\nf 5/1327/5 1235/1299/1235 1238/1298/1238\nf 9/1329/9 4/1330/4 1246/1307/1246\nf 9/1329/9 1246/1307/1246 1241/1305/1241\nf 1240/1301/1240 8/1325/8 6/1331/6\nf 1240/1301/1240 6/1331/6 1251/1315/1251\nf 7/1332/7 9/1329/9 1241/1305/1241\nf 7/1332/7 1241/1305/1241 1244/1304/1244\nf 11/1326/11 1248/1308/1248 1247/1310/1247\nf 11/1326/11 1247/1310/1247 12/1323/12\nf 3/1328/3 2/690/2 671/677/671\nf 3/1328/3 671/677/671 1235/1299/1235\nf 1238/1298/1238 1246/1307/1246 4/1330/4\nf 1238/1298/1238 4/1330/4 5/1327/5\nf 7/1332/7 1244/1304/1244 1251/1315/1251\nf 7/1332/7 1251/1315/1251 6/1331/6\nf 1203/1251/1203 1013/1042/1013 1012/1043/1012\nf 1203/1251/1203 1012/1043/1012 736/757/736\nf 937/959/937 941/964/941 1027/1057/1027\nf 937/959/937 1027/1057/1027 999/1030/999\nf 1084/1122/1084 739/756/739 1034/1067/1034\nf 1084/1122/1084 1034/1067/1034 1037/1071/1037\nf 1197/1244/1197 1196/1243/1196 1201/1249/1201\nf 1197/1244/1197 1201/1249/1201 1199/1245/1199\nf 1203/1251/1203 736/757/736 739/756/739\nf 1203/1251/1203 739/756/739 1084/1122/1084\nf 936/962/936 784/805/784 941/964/941\nf 936/962/936 941/964/941 937/959/937\nf 786/806/786 1004/1033/1004 940/963/940\nf 786/806/786 940/963/940 785/804/785\nf 467/1333/467 612/604/612 387/1334/387\nf 612/604/612 624/630/624 387/1334/387\nf 621/628/621 387/1334/387 624/630/624\nf 604/595/604 44/22/44 28/5/28\nf 472/605/472 612/604/612 467/1333/467\nf 29/6/29 28/5/28 47/26/47\nf 43/21/43 48/25/48 44/22/44\nf 30/7/30 266/1335/266 27/8/27\nf 424/414/424 239/223/239 425/415/425\nf 467/458/467 363/347/363 472/463/472\nf 561/552/561 560/553/560 572/564/572\nf 549/540/549 551/542/551 579/571/579\nf 583/574/583 595/588/595 582/575/582\nf 31/12/31 36/13/36 600/591/600\nf 39/16/39 44/22/44 603/597/603\nf 32/9/32 599/592/599 45/23/45\nf 473/626/473 613/607/613 471/606/471\nf 477/620/477 478/625/478 620/621/620\nf 474/611/474 615/610/615 617/627/617\nf 1257/1336/1257 614/609/614 618/616/618\nf 1257/1336/1257 620/621/620 622/624/622\nf 1257/1336/1257 618/616/618 619/619/619\nf 1257/1336/1257 613/607/613 615/610/615\nf 614/609/614 1257/1336/1257 615/610/615\nf 622/624/622 623/629/623 1257/1336/1257\nf 1257/1336/1257 623/629/623 611/603/611\nf 624/630/624 623/629/623 621/628/621\nf 469/617/469 618/616/618 470/615/470\nf 614/609/614 476/608/476 533/614/533\nf 610/602/610 1257/1336/1257 611/603/611\nf 613/607/613 1257/1336/1257 610/602/610\nf 620/621/620 1257/1336/1257 619/619/619\nf 541/532/541 592/584/592 562/555/562\nf 541/532/541 587/581/587 592/584/592\nf 627/633/627 607/599/607 605/596/605\nf 627/633/627 605/596/605 604/595/604\nf 605/596/605 606/598/606 603/597/603\nf 607/599/607 606/598/606 605/596/605\nf 1207/1254/1207 1082/1337/1082 1015/1338/1015\nf 1219/1280/1219 1207/1254/1207 1015/1338/1015\nf 1015/1338/1015 1216/1278/1216 1219/1280/1219\nf 693/710/693 1198/1247/1198 678/695/678\nf 1207/1254/1207 1087/1253/1087 1082/1337/1082\nf 678/695/678 677/697/677 694/712/694\nf 695/713/695 692/711/692 693/710/693\nf 266/1335/266 679/696/679 27/8/27\nf 883/903/883 1044/1079/1044 1045/1078/1045\nf 992/1020/992 1082/1121/1082 1087/1125/1087\nf 1158/1205/1158 1157/1204/1157 1168/1216/1168\nf 1147/1194/1147 1145/1192/1145 1176/1223/1176\nf 1193/1240/1193 1180/1227/1180 1179/1226/1179\nf 684/702/684 682/699/682 1195/1242/1195\nf 693/710/693 686/707/686 1199/1245/1199\nf 599/592/599 681/698/681 45/23/45\nf 1208/1256/1208 1088/1276/1088 1086/1257/1086\nf 1093/1274/1093 1092/1271/1092 1215/1270/1215\nf 1210/1260/1210 1090/1259/1090 1212/1277/1212\nf 1209/1261/1209 1258/1339/1258 1213/1264/1213\nf 1215/1270/1215 1258/1339/1258 1217/1275/1217\nf 1213/1264/1213 1258/1339/1258 1214/1267/1214\nf 1208/1256/1208 1258/1339/1258 1210/1260/1210\nf 1258/1339/1258 1209/1261/1209 1210/1260/1210\nf 1218/1279/1218 1217/1275/1217 1258/1339/1258\nf 1218/1279/1218 1258/1339/1258 1205/1255/1205\nf 1218/1279/1218 1219/1280/1219 1216/1278/1216\nf 1213/1264/1213 1083/1269/1083 1085/1265/1085\nf 1091/1258/1091 1209/1261/1209 1131/1266/1131\nf 1258/1339/1258 1206/1252/1206 1205/1255/1205\nf 1258/1339/1258 1208/1256/1208 1206/1252/1206\nf 1258/1339/1258 1215/1270/1215 1214/1267/1214\nf 1189/1236/1189 1138/1184/1138 1160/1207/1160\nf 1185/1231/1185 1138/1184/1138 1189/1236/1189\nf 1202/1248/1202 1220/1281/1220 1200/1246/1200\nf 1200/1246/1200 1220/1281/1220 1198/1247/1198\nf 1201/1249/1201 1200/1246/1200 1199/1245/1199\nf 1201/1249/1201 1202/1248/1202 1200/1246/1200\n# 2492 faces\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1]),\n\t\t\ty = float.Parse (strItems [2]),\n\t\t\tz = float.Parse (strItems [3])\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 4: Perspective projection**\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\n# The goal\n\nIn previous lessons we rendered our model in orthographic projection by simply forgetting the z-coordinate. The goal for today is to learn how to draw in perspective:\n\n![  ](./img/lesson4_the_goal.png)\n\n# 2D geometry: Linear transformations\n\nA linear transformation on a plane can be represented by a corresponding matrix. If we take a point `(x,y)` then its transformation can be written as follows:\n\n![  ](./img/lesson4_formula1.svg)\n\nThe simplest (not degenerate) transformation is the identity, it does not move any point:\n\n![  ](./img/lesson4_formula_2d_identity.svg)\n\nDiagonal coefficients of the matrix give scaling along coordinate axes. Let us illustrate it, if we take the following transformation:\n\n![  ](./img/lesson4_formula_2d_scale.svg)\n\nThen the white object (the white square with one corner chopped) will be transformed into the yellow one. Red and green line segments give unit length vectors aligned with `x` and `y`, respectively. All the images for this article were generated using this code:\n\n```csharp\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n\nMatrix4 Projection (float coeff)\n{\n    var projection = Matrix4.Identity ();\n    projection [3, 2] = coeff;\n    return projection;\n}\n\nVec4f Embed4D (Vec3f v, float fill = 1)\n{\n    return new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n}\n\nVec3f Project3D (Vec4f v)\n{\n    return new Vec3f { x = v.x, y = v.y, z = v.z };\n}\n\nFunc<Vec4f, Vec3f> map = v => Project3D(v/v.h);\nvoid RenderAxes (Image image)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n\n    // draw the axes\n    var x = new Vec3f { x = 1 };\n    var y = new Vec3f { y = 1 };\n    var o = new Vec3f ();\n    o = map(Mult(vp, Embed4D(o)));\n    x = map(Mult(vp, Embed4D(x)));\n    y = map(Mult(vp, Embed4D(y)));\n    Line(image, o, x, Color.Red);\n    Line(image, o, y, Color.Green);\n}\n\nvar cube = Model.FromFile(\"obj/cube.obj\");\nvoid RenderCube(Image image, Matrix4 deformation, Color color)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n    var face = cube.Faces[0];\n    var faceLen = face.Vertices.Length;\n\n    for(int j=0; j<faceLen; j++) {\n        var wp0 = cube.Vertices[face.Vertices [j]];\n        var wp1 = cube.Vertices[face.Vertices [(j+1) % faceLen]];\n\n        var sp0 = map(Mult(vp*deformation, Embed4D(wp0)));\n        var sp1 = map(Mult(vp*deformation, Embed4D(wp1)));\n        Line(image, sp0, sp1, color);\n    }\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Zoom(1f), color: Color.White);\n// draw the deformed model\nRenderCube(image, deformation: Matrix4.Zoom(1.5f), color: Color.Yellow); \n\nimage.VerticalFlip ();\nimage\n```\n\nWhy do we bother with matrices? Because it is handy. First of all, in matrix form we can express a transformation of the entire object like this:\n\n![  ](img/lesson4_formula_2d_scale32.svg)\n\nIn this expression the transformation matrix is the same as in the previous one, but the 2x5 matrix is nothing else but the vertices of our squarish object. We simply took all the vertices in an array, multiplied it by the transformation matrix and obtained the transformed object. Cool, is not it?\n\nWell, the true reason hides here: very, very often we wish to transform our object with many transformations in a row. Imagine that in your source code you write transformation functions like:\n\n```csharp\n// vec2 foo(vec2 p) return vec2(ax+by, cx+dy);\n// vec2 bar(vec2 p) return vec2(ex+fy, gx+hy);\n// [..]\n// for (each p in object) {\n//     p = foo(bar(p));\n// }\n```\n\nThis code performs two linear transformations for each vertex of our object, and often we count those vertices in millions. And tens of transformations in a row is not a rare case, resulting in tens millions of operations, really expensive. In matrix form we can pre-multiply all the transformation matrices and to transform our object one time. For an expression with multiplications only we can put parentheses where we want, can we?\n\nOkay, let us continue. We know that diagonal coefficients of the matrix scale our world along the coordinate axes. What other coefficients are responsible for? Let us consider the following transformation:\n\n![  ](./img/lesson4_formula_2d_tr_example1.svg)\n\nHere is its action on our object:\n\n```csharp\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Identity(), color: Color.White);\n\nvar deformation = Matrix4.Identity ();\ndeformation[0, 1] = 1/3f;\nRenderCube(image, deformation, Color.Yellow); // draw the deformed model\n\nimage.VerticalFlip();\nimage\n```\n\nIt is a simple shearing along the x-axis. Another anti-diagonal element shears our space along the y-axis. Thus, there are two base linear transformations on a plane: scaling and shearing. Many readers react: wait, what about rotations?!\n\nIt turns out that any rotation (around the origin) can be represented as a composite action of three shears, here the white object is transformed to the red one, then to the green one and finally to the blue:\n\n![](./img/lesson4_formula_rotation.png)\n\nBut those are intricate details, to keep the things simple, a rotation matrix can be written directly (do you remember the pre-multiplication trick?):\n\n![  ](img/lesson4_formula_rotation.svg)\n\nWe can multiply the matrices in any order, but let us remember that the multiplication for matrices is not commutative:\n\n![  ](img/lesson4_formula_noncomutative.svg)\n\nIt makes sense: to shear an object and then to rotate it is not the same as to rotate it and then to shear it!\n\n```csharp\nfloat DegToRad (float degAngle)\n{\n    return degAngle * (float)Math.PI / 180;\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nvar angle = DegToRad(30);\n\nvar rotation = Matrix4.RotationZ(angle);\nvar shear = Matrix4.Identity ();\nshear[0, 1] = 1/3f;\n\nRenderCube(image, deformation: rotation * shear, color: Color.Green);\nRenderCube(image, deformation: shear * rotation, color: Color.Red);\n\nimage.VerticalFlip();\nimage\n```\n\n# 2D affine transformations\n\nSo, any linear transformation on a plane is a composition of scale and shear transformations. And it means that we can do any linear transformation we want, the origin wont ever move! Those possibilities are great, but if we can not perform simple translations, our life will be miserable. Can we? Okay, translations are not linear, no problem, let us try to append translations after performing the linear part:\n\n![  ](./img/lesson4_formula_translation.svg)\n\nThis expression is really cool, we can rotate, we can scale, shear and translate. However. Let us recall that we are interested in composing multiple transformation, here is what a composition of two transformations look like (remember, we need to compose dozes of those?):\n\n![  ](./img/lesson4_formula_composition.svg)\n\nIt is starting to look ugly even for a single composition, add more and things get even worse.\n\n# Homogeneous coordinates\n\nOkay, now it is the time for the black magic. Imagine that i add one column and one row to our transformation matrix (thus making it 3x3) and append one coordinate always equal to 1 to our vector to be transformed:\n\n![  ](./img/lesson4_formula_3d.svg)\n\nIf we multiply this matrix and the vector augmented by 1 we get another vector with 1 in the last component, but the other two components have exactly the shape we would like! Magic.\n\nIn fact, the idea is really simple. Parallel translations are not linear in the 2D space. So we embed our 2D into 3D space (by simply adding 1 for the 3rd component). It means that our 2D space is the plane z=1 in the 3D space. Then we perform a linear 3D transformation and project the result onto our 2D physical plane. Parallel translations have not become linear, but the pipeline is simple.\n\nHow do we project 3D back onto the 2D plane? Simply by dividing by the 3d component:\n\n![  ](./img/lesson4_formula_project.svg)\n\n## Wait a second, it is forbidden to divide by zero!\n\nWho said this? \\[Shoots\\] Let us recall the pipeline:\n\n* We embed 2D into 3D by putting it inside the plane z=3\n\n* We do whatever we want in 3d\n\n* For every point we want to project from 3D into 2D we draw a straight line between the origin and the point to project and then we find its intersection with the plane z=1.\n\nIn this image our 2D plane is in magenta, the point `(x,y,z)` is projected onto `(x/z, y/z)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nLet us imagine a vertical rail through the point `(x,y,1)`. Where will be projected the point `(x,y,1)`? Doh, onto `(x,y)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nNow let us descend on the rail, for example, the point `(x,y,1/2)` is projected onto `(2x, 2y)`:\n\n![](./img/lesson4_sketch3.png)\n\nLet us continue, point `(x,y,1/4)` becomes `(4x, 4y)`:\n\n![](./img/lesson4_sketch4.png)\n\nIf we continue the process, approaching to `z=0`, then the projection goes farther from the origin in the direction `(x,y)`. In other words, point `(x,y,0)` is projected onto an infinitely far point in the direction `(x,y)`. What is it? Right, it is simply a vector!\n\nHomogeneous coordinates allow to distinguish between a vector and a point. If a programmer writes `vec2(x,y)`, is it a vector or a point? Hard to say. In homogeneous coordinates all things with `z=0` are vectors, all the rest are points. Look: `vector + vector = vector`. `vector - vector = vector`. `point + vector = point`. Great, is not it?\n\n## A composite transformation\n\nAs i said before, we should be able to accumulate dozens of transformations. Why? Let us imagine we need to rotate an object (2D) around a point `(x0,y0)`. How to do it? Well, we could look up for formulas somewhere, or we can do it by hand, we have all the tools we need!\n\nWe know to rotate around the origin, we know how to translate. It is all we need: translate `(x0,y0)` into the origin, rotate, un-translate, done:\n\n![  ](img/lesson4_formula_rotate_xy.svg)\n\nIn 3D sequences of actions will be a bit longer, but the idea is the same: we need to know few basic transformations and with their aid we can represent any composed action.\n\n# Wait a minute, may I touch this magical bottom row of the 3x3 matrix?\n\nSure thing! Let us apply the following transformation to our standard squarish object:\n\n![  ](./img/lesson4_matrix_third_line.svg)\n\nRecall that the original object is in white, unit axis vectors are in red and green:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nimage.VerticalFlip ();\nimage\n```\n\nHere is the transformed object:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\n\nvar deformation = Matrix4.Identity ();\ndeformation[3, 0] = -1/5f;\nRenderCube(image, deformation, color: Color.Red);\n\nimage.VerticalFlip ();\nimage\n```\n\nAnd here another kind of magic (white!) happens. Do you remember our y-buffer exercise? Here we will do the same: we project our 2D object onto the vertical line `x=0`. Let us harden the rules a bit: we have to use a central projection, our camera is in the point `(5,0)` and is pointed onto the origin. To find the projection we need to trace straight lines between the camera and the points to be projected (yellow) and to find the intersection with the screen line (white vertical).\n\n![  ](./img/lesson4_sketch5.png)\n\nNow i replace the original object with the transformed one, but i do not touch the yellow lines we drew before:\n\n![  ](./img/lesson4_sketch6.png)\n\nIf we project the red object onto the screen using **standard orthogonal projection**, then we find exactly the same points! Let us look closely how the transformation works: all vertical segments are transformed into vertical segments, but those close to the camera are stretched and those far from the camera are shrunk. If we choose the coefficient correctly (in our transformation matrix it is the -1/5 coefficient), we obtain an image in perspective (central) projection!\n\n# Time to work in full 3D\n\nLet us explain the magic. As for 2D affine transformations, for 3D affine transformations we will use homogeneous coordinates: a point `(x,y,z)` is augmented with 1`(x,y,z,1)`, then we transform it in 4D and project back to 3D. For example, if we take the following transformation:\n\n![  ](./img/lesson4_formula_4d_1.svg)\n\nThe retro-projection gives us the following 3D coordinages:\n\n![  ](./img/lesson4_formula_central_project.svg)\n\nLet us remember this result, but put it aside for a while. Let us return to the standard definition of the central projection, without any fancy stuff as 4D transformations. Given a point `P=(x,y,z)` we want to project it onto the plane z=0, the camera is on the z-axis in the point `(0,0,c)`:\n\n![](./img/lesson4_sketch7.png)\n\nTriangles ABC and ODC are similar. It means that we can write the following: |AB|/|AC|=|OD|/|OC| => x/(c-z) = x'/c. In other words:\n\n![ ](./img/lesson4_formula_x.svg)\n\nBy doing the same reasoning for triangles CPB and CP'D, it is easy to find the following expression:\n\n![](./img/lesson4_formula_y.svg)\n\nIt is really similar to the result we put aside few moments ago, but there we got the result by a single matrix multiplication. We got the law for the coefficient: `r = -1/c`\n\n# Let us sum up: the main formula for today\n\n*If you simply copy-paste this formula without understanding the above material, I hate you.*\n\nSo, if we want to compute a central projection with a camera **(important!) camera located on the z-axis with distance c from the origin**, then we embed the point into 4D by augmenting it with 1, then we multiply it with the following matrix, and retro-project it into 3D.\n\n![  ](./img/lesson4_formula_last.svg)\n\nWe deformed our object in a way, that simply forgetting its z-coordinate we will get a drawing in a perspective. If we want to use the z-buffer, then, naturally, do not forget the z:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\nvar camera = new Vec3f { z = 3 };\nvar projection = Projection(-1/camera.z);\nvar viewPort   = Viewport(width/8, height/8, width*3/4, height*3/4);\n\nFunc<Vec3f, Vec3f> map = v => {\n    var r4 = Mult (viewPort * projection, Embed4D (v));\n    var r = Project3D (r4 / r4.h);\n    r.x = (int)(r.x + 0.5f);\n    r.y = (int)(r.y + 0.5f);\n    return r;\n};\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n    x = v.x * (texture.Width - 1),\n    y = v.y * (texture.Height - 1)\n};\n\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nVec2f[] uv = new Vec2f [3];\n\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/lesson1.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/lesson2.csx",
    "content": "using static Geometry;\n\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\n\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n\tLine(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n\tLine(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n\tLine(image, t[0], t[1], color);\n\tLine(image, t[1], t[2], color);\n\tLine(image, t[2], t[0], color);\n}\n\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/lesson2.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\nusing static Geometry;\n```\n\n# Lesson 2: Triangle rasterization and back face culling\n\n# Old-school method: Line sweeping\n\nThus, the task is to draw two-dimensional triangles. For motivated students it normally takes a couple of hours, even if they are bad programmers. Last time we saw Bresenham’s line drawing algorithm. Today’s task is to draw a filled triangle. Funny enough, but this task is not trivial. I don’t know why, but I know that it’s true. Most of my students struggle with this simple task. So, the initial stub will look like this:\n\n```csharp\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n    Line(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n    Line(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    Line(image, t[0], t[1], color);\n    Line(image, t[1], t[2], color);\n    Line(image, t[2], t[0], color);\n}\n\nVec2i[] t0 = {\n    new Vec2i { x = 10, y = 70 },\n    new Vec2i { x = 50, y = 160 },\n    new Vec2i { x = 70, y = 80 }\n};\nVec2i[] t1 = {\n    new Vec2i { x = 180, y = 50 },\n    new Vec2i { x = 150, y = 1 },\n    new Vec2i { x = 70, y = 180 }\n};\nVec2i[] t2 = {\n    new Vec2i { x = 180, y = 150 },\n    new Vec2i { x = 120, y = 160 },\n    new Vec2i { x = 130, y = 180 }\n};\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThe code is simple: I provide three triangles for the initial debugging of your code. If we invoke `Line` inside the triangle function, we’ll get the contour of the triangle. How to draw a filled triangle?\n\nA good method of drawing a triangle must have the following features:\n\n* It should be (surprise!) simple and fast.\n\n\n* It should be symmetrical: the picture should not depend on the order of vertices passed to the drawing function.\n\n\n* If two triangles have two common vertices, there should be no holes between them because of rasterization rounding.\n\nWe could add more requirements, but let’s do with these ones. Traditionally a line sweeping is used:\n\n1. Sort vertices of the triangle by their y-coordinates\n\n2. Rasterize simultaneously the left and the right sides of the triangle\n\n3. Draw a horizontal line segment between the left and the right boundary points\n\nAt this point my students start to lose the firm ground: which segment is the left one, which one is right? Besides, there are three segments in a triangle... Usually, after this introduction I leave my students for about an hour: once again, reading my code is much less valuable than comparing your own code with mine.\n\n`[One hour passes]`\n\nHow do I draw a triangle? Once again, if you have a better method, I’d be glad to adopt it. Let us assume that we have three points of the triangle: `t0`, `t1`, `t2`, they are sorted in ascending order by the y-coordinate. Then, the boundary A is between `t0` and `t2`, boundary B is between `t0` and `t1`, and then between `t1` and `t2`.\n\n```csharp\nvoid OrderByY (Vec2i[] t)\n{\n    if(t[0].y > t[1].y) Swap(t, 0, 1);\n    if(t[1].y > t[2].y) Swap(t, 1, 2);\n    if(t[0].y > t[1].y) Swap(t, 0, 1);   \n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    Line(image, t[0], t[1], Color.Green);\n    Line(image, t[1], t[2], Color.Green);\n    Line(image, t[2], t[0], Color.Red);    \n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\n// Here boundary A is red, and boundary B is green.\nimage.VerticalFlip ();\nimage\n```\n\nUnfortunately, boundary B is made of two parts. Let us draw the bottom half of the triangle by cutting it horizontally:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        image[A.x, y] = Color.Red; \n        image[B.x, y] = Color.Green; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNote that the segments are not continuous. Last time when we drew straight lines we struggled to get continuous segments and here I did not bother with rotating the image (remember the xy swapping?). Why? We fill the triangles aftewards, that’s why. If we connect the corresponding pairs of points by horizontal lines, the gaps disappear:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        Line(image, A, B, Color.White);\n        image[B.x, y] = Color.Green; \n        image[A.x, y] = Color.Red; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNow, let us draw the second (upper) half of the triangle. We can do this by adding a second loop:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    \n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n    \n    float height_21 = t[2].y - t[1].y;\n    for(int y=t[1].y; y<=t[2].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[1].y) / height_21; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[1].x + (int)((t[2].x-t[1].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThis could be enough, but I dislike to see the same code twice. That is why we will make it a bit less readable, but more handy for modifications/maintaining:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    // I dont care about degenerate triangles\n    if(t[0].y == t[1].y && t[1].y == t[2].y)\n        return;\n\n    OrderByY(t);\n\n    float height_10 = t[1].y - t[0].y;\n    float total_height = t[2].y - t[0].y;\n    for(int i=0; i<total_height; i++) {\n        bool second_half = i > t[1].y - t[0].y || t[1].y == t[0].y;\n        float segment_height = second_half ? t[2].y-t[1].y : t[1].y-t[0].y;\n        var alpha = i / total_height;\n        // be careful with divisions by zero\n        var beta = (i - (second_half ? t[1].y-t[0].y : 0)) / segment_height;\n        Vec2i A = new Vec2i {\n            x = t[0].x + (int)((t[2].x-t[0].x)*alpha),\n            y = t[0].y + i\n        };\n        Vec2i B = new Vec2i {\n            x = second_half ? t[1].x + (int)((t[2].x-t[1].x)*beta) : t[0].x + (int)((t[1].x-t[0].x)*beta),\n            y = t[0].y + i\n        };\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, t[0].y + i] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\n# The method I adopt for my code\n\nWhile not being really complicated, the source code for the line sweeping is a bit messy. Moreover, it is really an old-school approach designed for mono-thread CPU programming. Let us take a look at the following pseudo-code:\n\n```csharp\n// triangle(Vec2i[] points) { \n//     Vec2i bbox[2] = find_bounding_box(points); \n//     for (each pixel in the bounding box) { \n//         if (inside(points, pixel)) { \n//             put_pixel(pixel); \n//         } \n//     } \n// }\n```\n\nDo you like it? I do. It is really easy to find a bounding box. It is certainly no problem to check whether a point belongs a 2D triangle (or any convex polygon).\n\n*Off Topic: if I have to implement some code to check whether a point belongs to a polygon, and this program will run on a plane, I will never get on this plane. Turns out, it is a surprisingly difficult task to solve this problem reliably. But here we just painting pixels. I am okay with that.*\n\nThere is another thing I like about this pseudocode: a neophyte in programming accepts it with enthusiasm, more experienced programmers often chuckle: “*What an idiot wrote it?*”. And an expert in computer graphics programming will shrug his shoulders and say: “*Well, that’s how it works in real life*”. Massively parallel computations in thousands of threads (i’m talking about regular consumer computers here) change the way of thinking.\n\nOkay, let us start: first of all we need to know what the [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) are. Given a 2D triangle ABC and a point P, all in old good Cartesian coordinates `(xy)`. Our goal is to find barycentric coordinates of the point P with respect to the triangle ABC. It means that we look for three numbers `(1 − u − v,u,v)` such that we can find the point P as follows:\n\n![ ](./img/lesson2_f1.png)\n\nWhile being a bit frightening at the first glance, it is really simple: imagine that we put three weights `(1−u−v,u,v)` at the vertices A, B and C, respectively. Then the barycenter of the system is exactly in the point P. We can say the same thing with other words: the point P has coordinates `(u,v)` in the (oblique) basis (A,![](./img/lesson2_ab.png),![](./img/lesson2_ac.png)):\n\n![ ](./img/lesson2_f2.png)\n\nSo, we have vectors ![](./img/lesson2_ab.png)￼, ![](./img/lesson2_ac.png)￼ and ![￼](./img/lesson2_ap.png), we need to find two real numbers u and v respecting the following constraint:\n\n![ ](./img/lesson2_f3.png)\n\nIt is a simple vector equation, or a linear system of two equations with two variables:\n\n![ ](./img/lesson2_f4.png)\n\nI am lazy and do not want to solve linear systems in a scholar way. Let us write it in matrix form:\n\n![ ](./img/lesson2_f5.png)\n\nIt means that we are looking for a vector `(u,v,1)` that is orthogonal to `(￼ABx,AC￼x,￼PAx)` and `(￼ABy,AC￼y,PA￼y)` *at the same time*! I hope you see [where I am heading](https://en.wikipedia.org/wiki/Cross_product). That is a small hint: to find an intersection of two straight lines in a plane (that is exactly what we did here), it is sufficient to compute one cross product. By the way, test yourself: how do we find an equation of a line passing through two given points?\n\nSo, let us program our new rasterization routine: we iterate through all pixels of a bounding box for a given triangle. For each pixel we compute its barycentric coordinates. If it has at least one negative component, then the pixel is outside of the triangle. Probably it is more clear to see the program directly:\n\n```csharp\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}\n```\n\n# Flat shading render\n\nWe already know how to draw a model with empty triangles. Let us fill them with a random color. This will help us to see how well we have encoded filling of triangles. Here is the code:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\n// Map world coordinates [-1..-1] to screen coordinates [0..width]\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*image.Width/2),\n    y = (int)((v.y+1)*image.Height/2)\n};\n\nvar rnd = new Random();\nFunc<byte> rndByte = () => (byte)rnd.Next(255);\nFunc<Color> rndColor = () => new Color(rndByte(), rndByte(), rndByte()); \n\nvar coordinates = new Vec3f[3];\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        var v = headModel.Vertices[vIndex];\n        coordinates[i] = map(v);\n    }    \n    Triangle(image, coordinates, rndColor());\n}\n\nimage.VerticalFlip ();\nimage\n```\n\nLet us get rid of these clown-colors and put some lighting. Captain Obvious: ”*At the same light intensity, the polygon is illuminated most brightly when it is orthogonal to the light direction.*”\n\nLet us compare:\n\n![ ](./img/lesson2_light1.jpeg)\n\n![](./img/lesson2_light2.jpeg)\n\nWe get zero illumination if the polygon is parallel to the vector of light. To paraphrase: the intensity of illumination is equal to the scalar product of the light vector and the normal to the given triangle. The normal to the triangle can be calculated simply as the [cross product](https://en.wikipedia.org/wiki/Cross_product) of its two sides.\n\nAs a side note, at this course we will perform linear computations on the colors. However `(128,128,128)` color is not half as bright as `(255, 255, 255)`. We are going to ignore gamma correction and tolerate the incorrectness of the brightness of our colors.\n\n```csharp\nvar image = new Image (width, height, Format.BGR);\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\nforeach (var face in headModel.Faces) {\n    for (int i = 0; i < 3; i++) {\n        var vIndex = face.Vertices [i];\n        world [i] = headModel.Vertices [vIndex];\n        screen [i] = map (world [i]);\n    }\n\n    var n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n    var intensivity = Dot (n, light_dir);\n    if (intensivity > 0)\n        Triangle (image, screen, Color.White * intensivity);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/lesson3.csx",
    "content": "using static Geometry;\n\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nfloat [] InitZBuffer (Image image)\n{\n\tvar zbuffer = new float [image.Width * image.Height];\n\tfor (int idx = 0; idx < zbuffer.Length; idx++)\n\t\tzbuffer [idx] = float.NegativeInfinity;\n\treturn zbuffer;\n}\n\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n\tvar ab = b - a;\n\tvar ac = c - a;\n\tvar pa = a - p;\n\n\tvar r = Cross (new Vec3f {\n\t\tx = ab.x,\n\t\ty = ac.x,\n\t\tz = pa.x\n\t}, new Vec3f {\n\t\tx = ab.y,\n\t\ty = ac.y,\n\t\tz = pa.y\n\t});\n\n\t// triangle is degenerate, in this case return smth with negative coordinates\n\t// dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n\tif ((int)r.z == 0)\n\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\treturn new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n\tVec3f t0 = coordinates [0];\n\tVec3f t1 = coordinates [1];\n\tVec3f t2 = coordinates [2];\n\n\tvar pMax = new Vec2i {\n\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t};\n\tvar pMin = new Vec2i {\n\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t};\n\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\tx = x + 0.5f,\n\t\t\t\ty = y + 0.5f\n\t\t\t};\n\t\t\tvar bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\tcontinue;\n\n\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\tvar u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n\t\t\tvar v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\tzbuffer [idx] = z;\n\n\t\t\t\tvar color = texture [u, v];\n\t\t\t\timage [x, y] = color * intensivity;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/lesson3.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\nusing static Geometry;\n```\n\n# **Lesson 3: Hidden faces removal (z buffer)**\n\n# Introduction\n\nHello, let me introduce you my friend z-buffer of a black guy. He will help us get rid of the visual artifacts of the hidden faces removal we had during the last lesson.\n\n![](./img/lesson3_face1.png)\n\nBy the way, i'd like to mention that this model i use heavily in the course is created by [Vidar Rapp](https://se.linkedin.com/in/vidarrapp). He kindely granted me a permission to use it for teaching rendering basics and i vandalized it, but i promise you to give back the eyes to the guy.\n\nWell, back to the topic, in theory we could just draw all the triangles without discarding any. If we do it properly starting rear-to-front, the front facets will erase the back ones. It is called the [painter's algorithm](http://en.wikipedia.org/wiki/Painter%27s_algorithm). Unfortunately, it comes along with a high computational cost: for each camera movement we need to re-sort all the scene. And then there are dynamic scenes... And this is not even the main problem. The main problem is it is not always possible to determine the correct order.\n\n# **Let us try to render a simple scene**\n\nImagine a simple scene made of three triangles: the camera looks up-to-down, we project the colored triangles onto the white screen:\n\n![ ](./img/lesson3_scene1.png)\n\nThe render should look like this:\n\n![ ](./img/lesson3_scene2.png)\n\nBlue facet - is it behind or in front of the red one? The painter's algorithm does not work here. It is possible to split blue facet in two (one in front of the red facet and one behind). And then the one in front of the red one is to be split in two - one in front of the green triangle and one behind... I think you get the problem: in scenes with millions of triangles it is really expensive to compute. It is possible to use [BSP trees](https://en.wikipedia.org/wiki/Binary_space_partitioning) to get it done. By the way, this data structure is constant for moving camera, but it is really messy. And the life is too short to get it messy.\n\n# **Even simpler: let us lose a dimension. Y-buffer!**\n\nLet us lose a dimension for a while and to cut the above scene along the yellow plane:\n\n![ ](./img/lesson3_scene3.png)\n\nI mean, now our scene is made of three line segments (intersection of the yellow plane and each of the triangles), and the final render has a normal width but 1 pixel height:\n\n![ ](./img/lesson3_scene4.png)\n\nOur scene is two-dimensional, so it is easy to draw it using the line() function we programmed in the very first lesson.\n\n```csharp\nvar scene = new Image (800, 500, Format.BGR);\n\n// scene \"2d mesh\"\nLine(scene, new Vec2i {x=20, y=34}, new Vec2i {x=744, y=400}, Color.Red);\nLine(scene, new Vec2i {x=120, y=434}, new Vec2i {x=444, y=400}, Color.Green);\nLine(scene, new Vec2i {x=330, y=463}, new Vec2i {x=594, y=200}, Color.Blue);\n\n// screen line\nLine(scene, new Vec2i {x=10, y=10}, new Vec2i{x=790, y=10}, Color.White);\n\nscene.VerticalFlip(); // I want to have the origin at the left bottom corner of the image\nscene // This is how our 2D scene looks like if we look at it sideways:\n```\n\nLet us render it. Recall that the render is 1 pixel height. In my source code I create images 16 pixels height for the ease of reading on high resolution screens. `Rasterize()` function writes only in the first line of the image `render`\n\n```csharp\nvoid Rasterize(Image image, Vec2i p0, Vec2i p1, int[] ybuffer, Color color)\n{\n    if (p0.x>p1.x)\n        Swap(ref p0, ref p1);\n    \n    for (int x=p0.x; x<=p1.x; x++) {\n        float t = (x-p0.x)/(float)(p1.x-p0.x);\n        var y = (int)(p0.y*(1-t) + p1.y*t);\n        if (ybuffer[x] < y) {\n            ybuffer[x] = y;\n            image[x, 0] = color;\n        }\n    }\n}\n\nvar ybuffer = new int [width];\nfor (int i = 0; i < width; i++)\n    ybuffer[i] = int.MinValue;\n\nvar render = new Image (width, 16, Format.BGR);\nRasterize(render, new Vec2i{x=20,y=34}, new Vec2i{x=744, y=400}, ybuffer, Color.Red);\nRasterize(render, new Vec2i{x=120, y=434}, new Vec2i{x=444,y=400}, ybuffer, Color.Green);\nRasterize(render, new Vec2i{x=330, y=463}, new Vec2i{x=594,y=200}, ybuffer, Color.Blue);\n\nrender\n```\n\nIt is really-really simple: I iterate through all x-coordinates between `p0.x` and `p1.x` and compute the corresponding y-coordinate of the segment. Then I check what we got in our array `ybuffer` with current `x` index. If the current `y`-value is closer to the camera than the value in the `ybuffer`, then I draw it on the screen and update the `ybuffer`.\n\nLet us see it step-by-step. After calling `Rasterize()` on the first (red) segment this is our memory:\n\nscreen:![](./img/lesson3_rasterize1.png)\n\nybuffer: ![ ](./img/lesson3_rasterize2.png)\n\nHere the magenta color indicates the minus infinity, those are places corresponding to the screen we did not touch. All the rest is shown in the shades of gray: clear colors are close to the camera, dark colors far from the camera.\n\nThen we draw the green segment.\n\nscreen:![ ](./img/lesson3_rasterize3.png)\n\nybuffer:![ ](./img/lesson3_rasterize4.png)\n\nAnd finally the blue one.\n\nscreen:![ ](./img/lesson3_rasterize5.png)\n\nybuffer:![ ](./img/lesson3_rasterize6.png)\n\nCongratulations, we just drew a 2D scene on a 1D screen! Let us admire once again the render: ![ ](./img/lesson3_rasterize7.png)\n\n# Back to 3D\n\nSo, for drawing on a 2D screen the z-buffer must be two-dimensional:\n\n`var zbuffer = new int[width * height];`\n\nPersonally I pack a two-dimensional buffer into a one-dimensional, the conversion is trivial:\n\n`var idx = x + y* width;`\n\nand the back one:\n\n`var x = idx % width;`\\\n`var y = idx % width;`\n\nThen in the code I simply iterate through all the triangles and call the rasterizer function with current triangle and a reference to the z-buffer.\n\nThe only difficulty is how to compute the z-value of a pixel we want to draw. Let us recall how we computed the y-value in the y-buffer example:\n\n`int y = p0.y*(1-t) + p1.y*t;`\n\nWhat is the nature of the `t` variable? It turns out that `(1-t, t)` are barycentric coordinates of the point `(x,y)` with respect to the segment `p0, p1: (x,y) = p0*(1-t) + p1*t`. So the idea is to take the barycentric coordinates version of triangle rasterization, and for every pixel we want to draw simply to multiply its barycentric coordinates by the z-values of the vertices of the triangle we rasterize:\n\n```csharp\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - p;\n\n    var r = Cross (new Vec3f {\n        x = ab.x,\n        y = ac.x,\n        z = pa.x\n    }, new Vec3f {\n        x = ab.y,\n        y = ac.y,\n        z = pa.y\n    });\n\n    // triangle is degenerate, in this case return smth with negative coordinates\n    // dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n    if ((int)r.z == 0)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n    return new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D (t0), Project2D (t1), Project2D (t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n\nfloat [] InitZBuffer (Image image)\n{\n    var zbuffer = new float [image.Width * image.Height];\n    for (int idx = 0; idx < zbuffer.Length; idx++)\n        zbuffer [idx] = float.NegativeInfinity;\n    return zbuffer;\n}\n\nvar image = new Image(width, height, Format.BGR);\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*(image.Width-1)/2 + 0.5f),\n    y = (int)((v.y+1)*(image.Height-1)/2 + 0.5f),\n    z = v.z\n};\n\nvar zbuffer = InitZBuffer(image);\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = headModel.Vertices[vIndex];\n        screen[i] = map(world[i]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, Color.White * intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Okay, we just interpolated the z-values. What else can we do?\n\nTexture!\n\nIn the `.obj` file we have lines starting with `vt u v`, they give an array of texture coordinates. The number in the middle (between the slashes) in the facet lines\\\n`f x/x/x x/x/x x/x/x` are the texture coordinates of this vertex of this triangle. Interpolate it inside the triangle, multiply by the width-height of the texture image and you will get the color to put in your render.\n\n```csharp\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n            var v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n\n                var color = texture [u, v];\n                image [x, y] = color * intensivity;\n            }\n        }\n    }\n}\n\nvar image = new Image(width, height, Format.BGR);\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nFunc<Vec3f, Vec2f> uvMap = v => new Vec2f {\n    x = v.x * (headTexture.Width - 1),\n    y = v.y * (headTexture.Height - 1)\n}; \n\nvar zbuffer = InitZBuffer(image);\nvar uv = new Vec2f[3];\nvar model = headModel;\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/lesson4.csx",
    "content": "Vec2f[] uv = new Vec2f [3];\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n\tx = v.x * (texture.Width - 1),\n\ty = v.y * (texture.Height - 1)\n};\n\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n\tvar depth = 255f;\n\n\tvar m = Matrix4.Identity ();\n\tm [0, 3] = x + w / 2f;\n\tm [1, 3] = y + h / 2f;\n\tm [2, 3] = depth / 2f;\n\n\tm [0, 0] = w / 2f;\n\tm [1, 1] = h / 2f;\n\tm [2, 2] = depth / 2f;\n\treturn m;\n}\n\nMatrix4 Projection (float coeff)\n{\n\tvar projection = Matrix4.Identity ();\n\tprojection [3, 2] = coeff;\n\treturn projection;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson4.workbook/obj/cube.obj",
    "content": "v -1 -1  1\nv  1 -1  1\nv  1  0  1\nv  0  1  1\nv -1  1  1\nv  1  1  0\nv -1 -1 -1\nv  1 -1 -1\nv  1  1 -1\nv -1  1 -1\n\nf 1/-1/-1 2/-1/-1 3/-1/-1 4/-1/-1 5/-1/-1\nf 4/-1/-1 3/-1/-1 6/-1/-1\nf 1/-1/-1 7/-1/-1 8/-1/-1 2/-1/-1\nf 1/-1/-1 5/-1/-1 10/-1/-1 7/-1/-1\nf 5/-1/-1 4/-1/-1 6/-1/-1 9/-1/-1 10/-1/-1\nf 2/-1/-1 8/-1/-1 9/-1/-1 6/-1/-1 3/-1/-1\nf 7/-1/-1 10/-1/-1 9/-1/-1 8/-1/-1\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1]),\n\t\t\ty = float.Parse (strItems [2]),\n\t\t\tz = float.Parse (strItems [3])\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# Lesson 5: Moving the camera\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\n# Change of basis in 3D space\n\nIn Euclidean space coordinates can be given by a point (the origin) and a basis. What does it mean that point P has coordinates `(x,y,z)` in the frame `(O, i,j,k)`? It means that the vector OP can be expressed as follows:\n\n![  ](./img/lesson5_basis.svg)\n\nNow image that we have another frame `(O', i',j',k')`. How do we transform coordinates given in one frame to another? First of all let us note that since `(i,j,k)` and `(i',j',k')` are bases of 3D, there exists a (non degenerate) matrix M such that:\n\n![  ](./img/lesson5_new_basis.svg)\n\nLet us draw an illustration:\n\n![](./img/lesson5_sketch1.png)\n\nThen let us re-express the vector OP:\n\n![  ](./img/lesson5_change_basis1.svg)\n\nNow let us substitute `(i',j',k')` in the right part with the change of basis matrix:\n\n![  ](./img/lesson5_change_basis2.svg)\n\nAnd it gives us the formula to transform coordinates from one frame to another:\n\n![  ](./img/lesson5_change_basis3.svg)\n\n# Let us create our own gluLookAt\n\nOpenGL and, as a consequence, our tiny renderer are able to draw scenes **only with the camera located on the z-axis.** If we want to move the camera, no problem, we can move all the scene, leaving the camera immobile.\n\nLet us put the problem this way: we want to draw a scene with a camera situated in point **e**(eye), the camera should be pointed to the point **c** (center) in such way that a given vector **u**(up) is to be vertical in the final render.\n\nHere is an illustration:\n\n![  ](./img/lesson5_change_basis4.png)\n\n```csharp\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n    var z = (eye - center).Normalize ();\n    var x = Cross (up, z).Normalize ();\n    var y = Cross (z, x).Normalize ();\n\n    var Minv = Matrix4.Identity ();\n    Minv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n    Minv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n    Minv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n    var Tr = Matrix4.Identity ();\n    Tr [0, 3] = -center.x;\n    Tr [1, 3] = -center.y;\n    Tr [2, 3] = -center.y;\n\n    return Minv * Tr;\n}\n```\n\nNote that `z'` is given by the vector **`ce`** (do not forget to normalize it, it helps later). How do we compute `x'`? Simply by a cross product between **`u`** and **`z'`**. Then we compute `y'`, such that it is orthogonal to already calculated `x'` and `z'` (let me remind you that in our problem settings \\*\\*`ce` \\*\\*and **`u`** are not necessarily orthogonal). The very last step is a translation of the origin to the center **c** and our transformation matrix is ready. Now it suffices to get any point with coordinates `(x,y,z,1)` in the model frame, multiply it by the matrix ModelView and we get the coordinates in the camera frame! By the way, the name ModelView comes from OpenGL terminology.\n\n# Viewport\n\nIf you followed this course from the beginning, you should remember strange lines like this one:\n\n```csharp\n// x = (v.x+1)*(width-1)/2\n// y = (v.y+1)*(height-1)/2\n```\n\nWhat does it mean? It means that i have a point Vec2f v, it belongs to the square \\[-1,1\\]\\*\\[-1,1\\]. I want to draw it in the image of (width, height) dimensions. Value (v.x\\+1) is varying between 0 and 2, (v.x\\+1)/2 between 0 and 1, and (v.x\\+1)\\*width/2 sweeps all the image. Thus we effectively mapped the bi-unit square onto the image.\n\nBut now we are getting rid of these ugly constructs, and i want to rewrite all the computiations in the matrix form. Let us consider the following C# code:\n\n```csharp\n/*\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n*/\n```\n\nThis code creates this matrix:\n\n![  ](./img/lesson5_viewport.svg)\n\nIt means that the bi-unit cube \\[-1,1\\]*\\[-1,1\\]*\\[-1,1\\] is mapped onto the screen cube \\[0,w\\]*\\[0,h\\]*\\[0,d\\]. Right, cube, and not a rectangle, this is because of the depth computations with the z-buffer. Here d is the resolution of the z-buffer. I like to have it equal to 255 because of simplicity of dumping black-and-white images of the z-buffer for debugging.\n\nIn the OpenGL terminology this matrix is called viewport matrix.\n\n# Chain of coordinate transformations\n\nSo, let us sum up. Our models (characters, for example) are created in their own local frame (**object coordinates**). They are inserted into a scene expressed in **world coordinates**. The transformation from one to another is made with matrix **Model**. Then, we want to express it in the camera frame (**eye coordinates**), the transformation is called **View**. Then, we deform the scene to create a perspective deformation with **Projection** matrix (lesson 4), this matrix transforms the scene to so-called **clip coordinates**. Finally, we draw the scene, and the matrix transforming clip coordinates to the **screen coordinates** is called **Viewport**.\n\nAgain, if we read a point **v** from the .obj file, then to draw it on the screen it undergoes the following chain of transformations:\n\nViewport \\* Projection \\* View \\* Model \\* v\n\nAs i draw a single object only, the matrix Model is equal to identity, and i merged it with the matrix View:\n\n```csharp\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n// draw the model\nvar modelView  = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1/(eye-center).Norm());\n\nFunc<Vec3f, Vec3f> map = v => {\n\tvar r4 = Mult (viewPort * projection * modelView, Embed4D (v));\n\tvar r = Project3D (r4 / r4.h);\n\tr.x = (int)(r.x + 0.5f);\n\tr.y = (int)(r.y + 0.5f);\n\treturn r;\n};\n\nvar image = new Image(width, height, Format.BGR);\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Transformation of normal vectors\n\nThere is a widely-known fact:\n\n* If we have a model and its normal vectors are given by the artist AND this model is transformed with an affine mapping, then normal vectors are to be transformed with a mapping, equal to the transposition of the inverse matrix of the original mapping matrix\n\nWhat-what-what?! I met quite a few programmers who know this fact, but it remains a black magic for them. In fact, it is not so complicated. Take a pencil and draw a 2D triangle `(0,0)`, `(0,1)`, `(1,0)` and a vector **n**, normal to the hypothenuse. Naturally, **n** is equal to `(1,1)`. Then let us stretch all the y-coordinates by a factor of 2, leaving x-coordinates intact. Thus, our triangle becomes `(0,0)`, `(0,2)`, `(1,0)`. If we transform the vector **n** in the same way, it becomes `(1, 2)` and it is no longer orthogonal to the transformed edge of the triangle.\n\nThus, to remove all the black magic fog, we need to understand one simple thing: **we do not need to simply transform normal vectors (as they can become not normal anymore), we need to compute (new) normal vectors to the transformed model.**\n\nBack to 3D, we have a vector **n** = (A,B,C). We know that the plane passing through the origin and having **n** for its normal, has an equation `Ax+By+Cz=0`. Let us write it in the matrix form (i do it in homogeneous coordinates from the beginning):\n\n![  ](./img/lesson5_transform_normal1.png)\n\nRecall that `(A,B,C)` - is a vector, so we augment it with 0 when embedding into the 4D, and `(x,y,z)` is augmented with 1 since it is a point.\n\nLet us insert an identity matrix in between (inverse to M multiplied by M is equal to identity):\n\n![  ](./img/lesson5_transform_normal2.png)\n\nThe expression in right parentheses - are for the transformed points of the object. In the left - are for normal vectors to the transformed object! In standard convention we usually write coordinates as columns (please let us not raise all the stuff about contra- and co-variant vectors), so we can rewrite the previous expression as follows:\n\n![  ](./img/lesson5_transform_normal2.png)\n\nAnd the left parentheses tell us that a normal to the transformed object can be computed from the old normal by applying the inverse transpose matrix of the affine mapping.\n\nPlease note that if our transformation matrix M is a composition of uniform scalings, rotations and translations, then M is equal to its inverse transpose, since inverse and transpose are cancelling each other in this case. But since our matrices include perspective deformations, usually this trick does not help.\n\nIn the current code we do not use the transformation of normal vectors, but in the next lesson it will be very, very handy.\n\nHappy coding!\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson1.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson2.csx",
    "content": "using static Geometry;\n\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\n\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n\tLine(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n\tLine(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n\tLine(image, t[0], t[1], color);\n\tLine(image, t[1], t[2], color);\n\tLine(image, t[2], t[0], color);\n}\n\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson2.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\nusing static Geometry;\n```\n\n# Lesson 2: Triangle rasterization and back face culling\n\n# Old-school method: Line sweeping\n\nThus, the task is to draw two-dimensional triangles. For motivated students it normally takes a couple of hours, even if they are bad programmers. Last time we saw Bresenham’s line drawing algorithm. Today’s task is to draw a filled triangle. Funny enough, but this task is not trivial. I don’t know why, but I know that it’s true. Most of my students struggle with this simple task. So, the initial stub will look like this:\n\n```csharp\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n    Line(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n    Line(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    Line(image, t[0], t[1], color);\n    Line(image, t[1], t[2], color);\n    Line(image, t[2], t[0], color);\n}\n\nVec2i[] t0 = {\n    new Vec2i { x = 10, y = 70 },\n    new Vec2i { x = 50, y = 160 },\n    new Vec2i { x = 70, y = 80 }\n};\nVec2i[] t1 = {\n    new Vec2i { x = 180, y = 50 },\n    new Vec2i { x = 150, y = 1 },\n    new Vec2i { x = 70, y = 180 }\n};\nVec2i[] t2 = {\n    new Vec2i { x = 180, y = 150 },\n    new Vec2i { x = 120, y = 160 },\n    new Vec2i { x = 130, y = 180 }\n};\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThe code is simple: I provide three triangles for the initial debugging of your code. If we invoke `Line` inside the triangle function, we’ll get the contour of the triangle. How to draw a filled triangle?\n\nA good method of drawing a triangle must have the following features:\n\n* It should be (surprise!) simple and fast.\n\n\n* It should be symmetrical: the picture should not depend on the order of vertices passed to the drawing function.\n\n\n* If two triangles have two common vertices, there should be no holes between them because of rasterization rounding.\n\nWe could add more requirements, but let’s do with these ones. Traditionally a line sweeping is used:\n\n1. Sort vertices of the triangle by their y-coordinates\n\n2. Rasterize simultaneously the left and the right sides of the triangle\n\n3. Draw a horizontal line segment between the left and the right boundary points\n\nAt this point my students start to lose the firm ground: which segment is the left one, which one is right? Besides, there are three segments in a triangle... Usually, after this introduction I leave my students for about an hour: once again, reading my code is much less valuable than comparing your own code with mine.\n\n`[One hour passes]`\n\nHow do I draw a triangle? Once again, if you have a better method, I’d be glad to adopt it. Let us assume that we have three points of the triangle: `t0`, `t1`, `t2`, they are sorted in ascending order by the y-coordinate. Then, the boundary A is between `t0` and `t2`, boundary B is between `t0` and `t1`, and then between `t1` and `t2`.\n\n```csharp\nvoid OrderByY (Vec2i[] t)\n{\n    if(t[0].y > t[1].y) Swap(t, 0, 1);\n    if(t[1].y > t[2].y) Swap(t, 1, 2);\n    if(t[0].y > t[1].y) Swap(t, 0, 1);   \n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    Line(image, t[0], t[1], Color.Green);\n    Line(image, t[1], t[2], Color.Green);\n    Line(image, t[2], t[0], Color.Red);    \n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\n// Here boundary A is red, and boundary B is green.\nimage.VerticalFlip ();\nimage\n```\n\nUnfortunately, boundary B is made of two parts. Let us draw the bottom half of the triangle by cutting it horizontally:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        image[A.x, y] = Color.Red; \n        image[B.x, y] = Color.Green; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNote that the segments are not continuous. Last time when we drew straight lines we struggled to get continuous segments and here I did not bother with rotating the image (remember the xy swapping?). Why? We fill the triangles aftewards, that’s why. If we connect the corresponding pairs of points by horizontal lines, the gaps disappear:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        Line(image, A, B, Color.White);\n        image[B.x, y] = Color.Green; \n        image[A.x, y] = Color.Red; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNow, let us draw the second (upper) half of the triangle. We can do this by adding a second loop:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    \n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n    \n    float height_21 = t[2].y - t[1].y;\n    for(int y=t[1].y; y<=t[2].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[1].y) / height_21; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[1].x + (int)((t[2].x-t[1].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThis could be enough, but I dislike to see the same code twice. That is why we will make it a bit less readable, but more handy for modifications/maintaining:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    // I dont care about degenerate triangles\n    if(t[0].y == t[1].y && t[1].y == t[2].y)\n        return;\n\n    OrderByY(t);\n\n    float height_10 = t[1].y - t[0].y;\n    float total_height = t[2].y - t[0].y;\n    for(int i=0; i<total_height; i++) {\n        bool second_half = i > t[1].y - t[0].y || t[1].y == t[0].y;\n        float segment_height = second_half ? t[2].y-t[1].y : t[1].y-t[0].y;\n        var alpha = i / total_height;\n        // be careful with divisions by zero\n        var beta = (i - (second_half ? t[1].y-t[0].y : 0)) / segment_height;\n        Vec2i A = new Vec2i {\n            x = t[0].x + (int)((t[2].x-t[0].x)*alpha),\n            y = t[0].y + i\n        };\n        Vec2i B = new Vec2i {\n            x = second_half ? t[1].x + (int)((t[2].x-t[1].x)*beta) : t[0].x + (int)((t[1].x-t[0].x)*beta),\n            y = t[0].y + i\n        };\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, t[0].y + i] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\n# The method I adopt for my code\n\nWhile not being really complicated, the source code for the line sweeping is a bit messy. Moreover, it is really an old-school approach designed for mono-thread CPU programming. Let us take a look at the following pseudo-code:\n\n```csharp\n// triangle(Vec2i[] points) { \n//     Vec2i bbox[2] = find_bounding_box(points); \n//     for (each pixel in the bounding box) { \n//         if (inside(points, pixel)) { \n//             put_pixel(pixel); \n//         } \n//     } \n// }\n```\n\nDo you like it? I do. It is really easy to find a bounding box. It is certainly no problem to check whether a point belongs a 2D triangle (or any convex polygon).\n\n*Off Topic: if I have to implement some code to check whether a point belongs to a polygon, and this program will run on a plane, I will never get on this plane. Turns out, it is a surprisingly difficult task to solve this problem reliably. But here we just painting pixels. I am okay with that.*\n\nThere is another thing I like about this pseudocode: a neophyte in programming accepts it with enthusiasm, more experienced programmers often chuckle: “*What an idiot wrote it?*”. And an expert in computer graphics programming will shrug his shoulders and say: “*Well, that’s how it works in real life*”. Massively parallel computations in thousands of threads (i’m talking about regular consumer computers here) change the way of thinking.\n\nOkay, let us start: first of all we need to know what the [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) are. Given a 2D triangle ABC and a point P, all in old good Cartesian coordinates `(xy)`. Our goal is to find barycentric coordinates of the point P with respect to the triangle ABC. It means that we look for three numbers `(1 − u − v,u,v)` such that we can find the point P as follows:\n\n![ ](./img/lesson2_f1.png)\n\nWhile being a bit frightening at the first glance, it is really simple: imagine that we put three weights `(1−u−v,u,v)` at the vertices A, B and C, respectively. Then the barycenter of the system is exactly in the point P. We can say the same thing with other words: the point P has coordinates `(u,v)` in the (oblique) basis (A,![](./img/lesson2_ab.png),![](./img/lesson2_ac.png)):\n\n![ ](./img/lesson2_f2.png)\n\nSo, we have vectors ![](./img/lesson2_ab.png)￼, ![](./img/lesson2_ac.png)￼ and ![￼](./img/lesson2_ap.png), we need to find two real numbers u and v respecting the following constraint:\n\n![ ](./img/lesson2_f3.png)\n\nIt is a simple vector equation, or a linear system of two equations with two variables:\n\n![ ](./img/lesson2_f4.png)\n\nI am lazy and do not want to solve linear systems in a scholar way. Let us write it in matrix form:\n\n![ ](./img/lesson2_f5.png)\n\nIt means that we are looking for a vector `(u,v,1)` that is orthogonal to `(￼ABx,AC￼x,￼PAx)` and `(￼ABy,AC￼y,PA￼y)` *at the same time*! I hope you see [where I am heading](https://en.wikipedia.org/wiki/Cross_product). That is a small hint: to find an intersection of two straight lines in a plane (that is exactly what we did here), it is sufficient to compute one cross product. By the way, test yourself: how do we find an equation of a line passing through two given points?\n\nSo, let us program our new rasterization routine: we iterate through all pixels of a bounding box for a given triangle. For each pixel we compute its barycentric coordinates. If it has at least one negative component, then the pixel is outside of the triangle. Probably it is more clear to see the program directly:\n\n```csharp\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}\n```\n\n# Flat shading render\n\nWe already know how to draw a model with empty triangles. Let us fill them with a random color. This will help us to see how well we have encoded filling of triangles. Here is the code:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\n// Map world coordinates [-1..-1] to screen coordinates [0..width]\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*image.Width/2),\n    y = (int)((v.y+1)*image.Height/2)\n};\n\nvar rnd = new Random();\nFunc<byte> rndByte = () => (byte)rnd.Next(255);\nFunc<Color> rndColor = () => new Color(rndByte(), rndByte(), rndByte()); \n\nvar coordinates = new Vec3f[3];\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        var v = headModel.Vertices[vIndex];\n        coordinates[i] = map(v);\n    }    \n    Triangle(image, coordinates, rndColor());\n}\n\nimage.VerticalFlip ();\nimage\n```\n\nLet us get rid of these clown-colors and put some lighting. Captain Obvious: ”*At the same light intensity, the polygon is illuminated most brightly when it is orthogonal to the light direction.*”\n\nLet us compare:\n\n![ ](./img/lesson2_light1.jpeg)\n\n![](./img/lesson2_light2.jpeg)\n\nWe get zero illumination if the polygon is parallel to the vector of light. To paraphrase: the intensity of illumination is equal to the scalar product of the light vector and the normal to the given triangle. The normal to the triangle can be calculated simply as the [cross product](https://en.wikipedia.org/wiki/Cross_product) of its two sides.\n\nAs a side note, at this course we will perform linear computations on the colors. However `(128,128,128)` color is not half as bright as `(255, 255, 255)`. We are going to ignore gamma correction and tolerate the incorrectness of the brightness of our colors.\n\n```csharp\nvar image = new Image (width, height, Format.BGR);\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\nforeach (var face in headModel.Faces) {\n    for (int i = 0; i < 3; i++) {\n        var vIndex = face.Vertices [i];\n        world [i] = headModel.Vertices [vIndex];\n        screen [i] = map (world [i]);\n    }\n\n    var n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n    var intensivity = Dot (n, light_dir);\n    if (intensivity > 0)\n        Triangle (image, screen, Color.White * intensivity);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson3.csx",
    "content": "using static Geometry;\n\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nfloat [] InitZBuffer (Image image)\n{\n\tvar zbuffer = new float [image.Width * image.Height];\n\tfor (int idx = 0; idx < zbuffer.Length; idx++)\n\t\tzbuffer [idx] = float.NegativeInfinity;\n\treturn zbuffer;\n}\n\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n\tvar ab = b - a;\n\tvar ac = c - a;\n\tvar pa = a - p;\n\n\tvar r = Cross (new Vec3f {\n\t\tx = ab.x,\n\t\ty = ac.x,\n\t\tz = pa.x\n\t}, new Vec3f {\n\t\tx = ab.y,\n\t\ty = ac.y,\n\t\tz = pa.y\n\t});\n\n\t// triangle is degenerate, in this case return smth with negative coordinates\n\t// dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n\tif ((int)r.z == 0)\n\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\treturn new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n\tVec3f t0 = coordinates [0];\n\tVec3f t1 = coordinates [1];\n\tVec3f t2 = coordinates [2];\n\n\tvar pMax = new Vec2i {\n\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t};\n\tvar pMin = new Vec2i {\n\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t};\n\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\tx = x + 0.5f,\n\t\t\t\ty = y + 0.5f\n\t\t\t};\n\t\t\tvar bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\tcontinue;\n\n\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\tvar u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n\t\t\tvar v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\tzbuffer [idx] = z;\n\n\t\t\t\tvar color = texture [u, v];\n\t\t\t\timage [x, y] = color * intensivity;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson3.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\nusing static Geometry;\n```\n\n# **Lesson 3: Hidden faces removal (z buffer)**\n\n# Introduction\n\nHello, let me introduce you my friend z-buffer of a black guy. He will help us get rid of the visual artifacts of the hidden faces removal we had during the last lesson.\n\n![](./img/lesson3_face1.png)\n\nBy the way, i'd like to mention that this model i use heavily in the course is created by [Vidar Rapp](https://se.linkedin.com/in/vidarrapp). He kindely granted me a permission to use it for teaching rendering basics and i vandalized it, but i promise you to give back the eyes to the guy.\n\nWell, back to the topic, in theory we could just draw all the triangles without discarding any. If we do it properly starting rear-to-front, the front facets will erase the back ones. It is called the [painter's algorithm](http://en.wikipedia.org/wiki/Painter%27s_algorithm). Unfortunately, it comes along with a high computational cost: for each camera movement we need to re-sort all the scene. And then there are dynamic scenes... And this is not even the main problem. The main problem is it is not always possible to determine the correct order.\n\n# **Let us try to render a simple scene**\n\nImagine a simple scene made of three triangles: the camera looks up-to-down, we project the colored triangles onto the white screen:\n\n![ ](./img/lesson3_scene1.png)\n\nThe render should look like this:\n\n![ ](./img/lesson3_scene2.png)\n\nBlue facet - is it behind or in front of the red one? The painter's algorithm does not work here. It is possible to split blue facet in two (one in front of the red facet and one behind). And then the one in front of the red one is to be split in two - one in front of the green triangle and one behind... I think you get the problem: in scenes with millions of triangles it is really expensive to compute. It is possible to use [BSP trees](https://en.wikipedia.org/wiki/Binary_space_partitioning) to get it done. By the way, this data structure is constant for moving camera, but it is really messy. And the life is too short to get it messy.\n\n# **Even simpler: let us lose a dimension. Y-buffer!**\n\nLet us lose a dimension for a while and to cut the above scene along the yellow plane:\n\n![ ](./img/lesson3_scene3.png)\n\nI mean, now our scene is made of three line segments (intersection of the yellow plane and each of the triangles), and the final render has a normal width but 1 pixel height:\n\n![ ](./img/lesson3_scene4.png)\n\nOur scene is two-dimensional, so it is easy to draw it using the line() function we programmed in the very first lesson.\n\n```csharp\nvar scene = new Image (800, 500, Format.BGR);\n\n// scene \"2d mesh\"\nLine(scene, new Vec2i {x=20, y=34}, new Vec2i {x=744, y=400}, Color.Red);\nLine(scene, new Vec2i {x=120, y=434}, new Vec2i {x=444, y=400}, Color.Green);\nLine(scene, new Vec2i {x=330, y=463}, new Vec2i {x=594, y=200}, Color.Blue);\n\n// screen line\nLine(scene, new Vec2i {x=10, y=10}, new Vec2i{x=790, y=10}, Color.White);\n\nscene.VerticalFlip(); // I want to have the origin at the left bottom corner of the image\nscene // This is how our 2D scene looks like if we look at it sideways:\n```\n\nLet us render it. Recall that the render is 1 pixel height. In my source code I create images 16 pixels height for the ease of reading on high resolution screens. `Rasterize()` function writes only in the first line of the image `render`\n\n```csharp\nvoid Rasterize(Image image, Vec2i p0, Vec2i p1, int[] ybuffer, Color color)\n{\n    if (p0.x>p1.x)\n        Swap(ref p0, ref p1);\n    \n    for (int x=p0.x; x<=p1.x; x++) {\n        float t = (x-p0.x)/(float)(p1.x-p0.x);\n        var y = (int)(p0.y*(1-t) + p1.y*t);\n        if (ybuffer[x] < y) {\n            ybuffer[x] = y;\n            image[x, 0] = color;\n        }\n    }\n}\n\nvar ybuffer = new int [width];\nfor (int i = 0; i < width; i++)\n    ybuffer[i] = int.MinValue;\n\nvar render = new Image (width, 16, Format.BGR);\nRasterize(render, new Vec2i{x=20,y=34}, new Vec2i{x=744, y=400}, ybuffer, Color.Red);\nRasterize(render, new Vec2i{x=120, y=434}, new Vec2i{x=444,y=400}, ybuffer, Color.Green);\nRasterize(render, new Vec2i{x=330, y=463}, new Vec2i{x=594,y=200}, ybuffer, Color.Blue);\n\nrender\n```\n\nIt is really-really simple: I iterate through all x-coordinates between `p0.x` and `p1.x` and compute the corresponding y-coordinate of the segment. Then I check what we got in our array `ybuffer` with current `x` index. If the current `y`-value is closer to the camera than the value in the `ybuffer`, then I draw it on the screen and update the `ybuffer`.\n\nLet us see it step-by-step. After calling `Rasterize()` on the first (red) segment this is our memory:\n\nscreen:![](./img/lesson3_rasterize1.png)\n\nybuffer: ![ ](./img/lesson3_rasterize2.png)\n\nHere the magenta color indicates the minus infinity, those are places corresponding to the screen we did not touch. All the rest is shown in the shades of gray: clear colors are close to the camera, dark colors far from the camera.\n\nThen we draw the green segment.\n\nscreen:![ ](./img/lesson3_rasterize3.png)\n\nybuffer:![ ](./img/lesson3_rasterize4.png)\n\nAnd finally the blue one.\n\nscreen:![ ](./img/lesson3_rasterize5.png)\n\nybuffer:![ ](./img/lesson3_rasterize6.png)\n\nCongratulations, we just drew a 2D scene on a 1D screen! Let us admire once again the render: ![ ](./img/lesson3_rasterize7.png)\n\n# Back to 3D\n\nSo, for drawing on a 2D screen the z-buffer must be two-dimensional:\n\n`var zbuffer = new int[width * height];`\n\nPersonally I pack a two-dimensional buffer into a one-dimensional, the conversion is trivial:\n\n`var idx = x + y* width;`\n\nand the back one:\n\n`var x = idx % width;`\\\n`var y = idx % width;`\n\nThen in the code I simply iterate through all the triangles and call the rasterizer function with current triangle and a reference to the z-buffer.\n\nThe only difficulty is how to compute the z-value of a pixel we want to draw. Let us recall how we computed the y-value in the y-buffer example:\n\n`int y = p0.y*(1-t) + p1.y*t;`\n\nWhat is the nature of the `t` variable? It turns out that `(1-t, t)` are barycentric coordinates of the point `(x,y)` with respect to the segment `p0, p1: (x,y) = p0*(1-t) + p1*t`. So the idea is to take the barycentric coordinates version of triangle rasterization, and for every pixel we want to draw simply to multiply its barycentric coordinates by the z-values of the vertices of the triangle we rasterize:\n\n```csharp\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - p;\n\n    var r = Cross (new Vec3f {\n        x = ab.x,\n        y = ac.x,\n        z = pa.x\n    }, new Vec3f {\n        x = ab.y,\n        y = ac.y,\n        z = pa.y\n    });\n\n    // triangle is degenerate, in this case return smth with negative coordinates\n    // dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n    if ((int)r.z == 0)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n    return new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D (t0), Project2D (t1), Project2D (t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n\nfloat [] InitZBuffer (Image image)\n{\n    var zbuffer = new float [image.Width * image.Height];\n    for (int idx = 0; idx < zbuffer.Length; idx++)\n        zbuffer [idx] = float.NegativeInfinity;\n    return zbuffer;\n}\n\nvar image = new Image(width, height, Format.BGR);\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*(image.Width-1)/2 + 0.5f),\n    y = (int)((v.y+1)*(image.Height-1)/2 + 0.5f),\n    z = v.z\n};\n\nvar zbuffer = InitZBuffer(image);\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = headModel.Vertices[vIndex];\n        screen[i] = map(world[i]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, Color.White * intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Okay, we just interpolated the z-values. What else can we do?\n\nTexture!\n\nIn the `.obj` file we have lines starting with `vt u v`, they give an array of texture coordinates. The number in the middle (between the slashes) in the facet lines\\\n`f x/x/x x/x/x x/x/x` are the texture coordinates of this vertex of this triangle. Interpolate it inside the triangle, multiply by the width-height of the texture image and you will get the color to put in your render.\n\n```csharp\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n            var v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n\n                var color = texture [u, v];\n                image [x, y] = color * intensivity;\n            }\n        }\n    }\n}\n\nvar image = new Image(width, height, Format.BGR);\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nFunc<Vec3f, Vec2f> uvMap = v => new Vec2f {\n    x = v.x * (headTexture.Width - 1),\n    y = v.y * (headTexture.Height - 1)\n}; \n\nvar zbuffer = InitZBuffer(image);\nvar uv = new Vec2f[3];\nvar model = headModel;\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson4.csx",
    "content": "Vec2f[] uv = new Vec2f [3];\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n\tx = v.x * (texture.Width - 1),\n\ty = v.y * (texture.Height - 1)\n};\n\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n\tvar depth = 255f;\n\n\tvar m = Matrix4.Identity ();\n\tm [0, 3] = x + w / 2f;\n\tm [1, 3] = y + h / 2f;\n\tm [2, 3] = depth / 2f;\n\n\tm [0, 0] = w / 2f;\n\tm [1, 1] = h / 2f;\n\tm [2, 2] = depth / 2f;\n\treturn m;\n}\n\nMatrix4 Projection (float coeff)\n{\n\tvar projection = Matrix4.Identity ();\n\tprojection [3, 2] = coeff;\n\treturn projection;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson4.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 4: Perspective projection**\n\n# The goal\n\nIn previous lessons we rendered our model in orthographic projection by simply forgetting the z-coordinate. The goal for today is to learn how to draw in perspective:\n\n![  ](./img/lesson4_the_goal.png)\n\n# 2D geometry: Linear transformations\n\nA linear transformation on a plane can be represented by a corresponding matrix. If we take a point `(x,y)` then its transformation can be written as follows:\n\n![  ](./img/lesson4_formula1.svg)\n\nThe simplest (not degenerate) transformation is the identity, it does not move any point:\n\n![  ](./img/lesson4_formula_2d_identity.svg)\n\nDiagonal coefficients of the matrix give scaling along coordinate axes. Let us illustrate it, if we take the following transformation:\n\n![  ](./img/lesson4_formula_2d_scale.svg)\n\nThen the white object (the white square with one corner chopped) will be transformed into the yellow one. Red and green line segments give unit length vectors aligned with `x` and `y`, respectively. All the images for this article were generated using this code:\n\n```csharp\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n\nMatrix4 Projection (float coeff)\n{\n    var projection = Matrix4.Identity ();\n    projection [3, 2] = coeff;\n    return projection;\n}\n\nVec4f Embed4D (Vec3f v, float fill = 1)\n{\n    return new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n}\n\nVec3f Project3D (Vec4f v)\n{\n    return new Vec3f { x = v.x, y = v.y, z = v.z };\n}\n\nFunc<Vec4f, Vec3f> map = v => Project3D(v/v.h);\nvoid RenderAxes (Image image)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n\n    // draw the axes\n    var x = new Vec3f { x = 1 };\n    var y = new Vec3f { y = 1 };\n    var o = new Vec3f ();\n    o = map(Mult(vp, Embed4D(o)));\n    x = map(Mult(vp, Embed4D(x)));\n    y = map(Mult(vp, Embed4D(y)));\n    Line(image, o, x, Color.Red);\n    Line(image, o, y, Color.Green);\n}\n\nvar cube = Model.FromFile(\"obj/cube.obj\");\nvoid RenderCube(Image image, Matrix4 deformation, Color color)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n    var face = cube.Faces[0];\n    var faceLen = face.Vertices.Length;\n\n    for(int j=0; j<faceLen; j++) {\n        var wp0 = cube.Vertices[face.Vertices [j]];\n        var wp1 = cube.Vertices[face.Vertices [(j+1) % faceLen]];\n\n        var sp0 = map(Mult(vp*deformation, Embed4D(wp0)));\n        var sp1 = map(Mult(vp*deformation, Embed4D(wp1)));\n        Line(image, sp0, sp1, color);\n    }\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Zoom(1f), color: Color.White);\n// draw the deformed model\nRenderCube(image, deformation: Matrix4.Zoom(1.5f), color: Color.Yellow); \n\nimage.VerticalFlip ();\nimage\n```\n\nWhy do we bother with matrices? Because it is handy. First of all, in matrix form we can express a transformation of the entire object like this:\n\n![  ](img/lesson4_formula_2d_scale32.svg)\n\nIn this expression the transformation matrix is the same as in the previous one, but the 2x5 matrix is nothing else but the vertices of our squarish object. We simply took all the vertices in an array, multiplied it by the transformation matrix and obtained the transformed object. Cool, is not it?\n\nWell, the true reason hides here: very, very often we wish to transform our object with many transformations in a row. Imagine that in your source code you write transformation functions like:\n\n```csharp\n// vec2 foo(vec2 p) return vec2(ax+by, cx+dy);\n// vec2 bar(vec2 p) return vec2(ex+fy, gx+hy);\n// [..]\n// for (each p in object) {\n//     p = foo(bar(p));\n// }\n```\n\nThis code performs two linear transformations for each vertex of our object, and often we count those vertices in millions. And tens of transformations in a row is not a rare case, resulting in tens millions of operations, really expensive. In matrix form we can pre-multiply all the transformation matrices and to transform our object one time. For an expression with multiplications only we can put parentheses where we want, can we?\n\nOkay, let us continue. We know that diagonal coefficients of the matrix scale our world along the coordinate axes. What other coefficients are responsible for? Let us consider the following transformation:\n\n![  ](./img/lesson4_formula_2d_tr_example1.svg)\n\nHere is its action on our object:\n\n```csharp\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Identity(), color: Color.White);\n\nvar deformation = Matrix4.Identity ();\ndeformation[0, 1] = 1/3f;\nRenderCube(image, deformation, Color.Yellow); // draw the deformed model\n\nimage.VerticalFlip();\nimage\n```\n\nIt is a simple shearing along the x-axis. Another anti-diagonal element shears our space along the y-axis. Thus, there are two base linear transformations on a plane: scaling and shearing. Many readers react: wait, what about rotations?!\n\nIt turns out that any rotation (around the origin) can be represented as a composite action of three shears, here the white object is transformed to the red one, then to the green one and finally to the blue:\n\n![](./img/lesson4_formula_rotation.png)\n\nBut those are intricate details, to keep the things simple, a rotation matrix can be written directly (do you remember the pre-multiplication trick?):\n\n![  ](img/lesson4_formula_rotation.svg)\n\nWe can multiply the matrices in any order, but let us remember that the multiplication for matrices is not commutative:\n\n![  ](img/lesson4_formula_noncomutative.svg)\n\nIt makes sense: to shear an object and then to rotate it is not the same as to rotate it and then to shear it!\n\n```csharp\nfloat DegToRad (float degAngle)\n{\n    return degAngle * (float)Math.PI / 180;\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nvar angle = DegToRad(30);\n\nvar rotation = Matrix4.RotationZ(angle);\nvar shear = Matrix4.Identity ();\nshear[0, 1] = 1/3f;\n\nRenderCube(image, deformation: rotation * shear, color: Color.Green);\nRenderCube(image, deformation: shear * rotation, color: Color.Red);\n\nimage.VerticalFlip();\nimage\n```\n\n# 2D affine transformations\n\nSo, any linear transformation on a plane is a composition of scale and shear transformations. And it means that we can do any linear transformation we want, the origin wont ever move! Those possibilities are great, but if we can not perform simple translations, our life will be miserable. Can we? Okay, translations are not linear, no problem, let us try to append translations after performing the linear part:\n\n![  ](./img/lesson4_formula_translation.svg)\n\nThis expression is really cool, we can rotate, we can scale, shear and translate. However. Let us recall that we are interested in composing multiple transformation, here is what a composition of two transformations look like (remember, we need to compose dozes of those?):\n\n![  ](./img/lesson4_formula_composition.svg)\n\nIt is starting to look ugly even for a single composition, add more and things get even worse.\n\n# Homogeneous coordinates\n\nOkay, now it is the time for the black magic. Imagine that i add one column and one row to our transformation matrix (thus making it 3x3) and append one coordinate always equal to 1 to our vector to be transformed:\n\n![  ](./img/lesson4_formula_3d.svg)\n\nIf we multiply this matrix and the vector augmented by 1 we get another vector with 1 in the last component, but the other two components have exactly the shape we would like! Magic.\n\nIn fact, the idea is really simple. Parallel translations are not linear in the 2D space. So we embed our 2D into 3D space (by simply adding 1 for the 3rd component). It means that our 2D space is the plane z=1 in the 3D space. Then we perform a linear 3D transformation and project the result onto our 2D physical plane. Parallel translations have not become linear, but the pipeline is simple.\n\nHow do we project 3D back onto the 2D plane? Simply by dividing by the 3d component:\n\n![  ](./img/lesson4_formula_project.svg)\n\n## Wait a second, it is forbidden to divide by zero!\n\nWho said this? \\[Shoots\\] Let us recall the pipeline:\n\n* We embed 2D into 3D by putting it inside the plane z=3\n\n* We do whatever we want in 3d\n\n* For every point we want to project from 3D into 2D we draw a straight line between the origin and the point to project and then we find its intersection with the plane z=1.\n\nIn this image our 2D plane is in magenta, the point `(x,y,z)` is projected onto `(x/z, y/z)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nLet us imagine a vertical rail through the point `(x,y,1)`. Where will be projected the point `(x,y,1)`? Doh, onto `(x,y)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nNow let us descend on the rail, for example, the point `(x,y,1/2)` is projected onto `(2x, 2y)`:\n\n![](./img/lesson4_sketch3.png)\n\nLet us continue, point `(x,y,1/4)` becomes `(4x, 4y)`:\n\n![](./img/lesson4_sketch4.png)\n\nIf we continue the process, approaching to `z=0`, then the projection goes farther from the origin in the direction `(x,y)`. In other words, point `(x,y,0)` is projected onto an infinitely far point in the direction `(x,y)`. What is it? Right, it is simply a vector!\n\nHomogeneous coordinates allow to distinguish between a vector and a point. If a programmer writes `vec2(x,y)`, is it a vector or a point? Hard to say. In homogeneous coordinates all things with `z=0` are vectors, all the rest are points. Look: `vector + vector = vector`. `vector - vector = vector`. `point + vector = point`. Great, is not it?\n\n## A composite transformation\n\nAs i said before, we should be able to accumulate dozens of transformations. Why? Let us imagine we need to rotate an object (2D) around a point `(x0,y0)`. How to do it? Well, we could look up for formulas somewhere, or we can do it by hand, we have all the tools we need!\n\nWe know to rotate around the origin, we know how to translate. It is all we need: translate `(x0,y0)` into the origin, rotate, un-translate, done:\n\n![  ](img/lesson4_formula_rotate_xy.svg)\n\nIn 3D sequences of actions will be a bit longer, but the idea is the same: we need to know few basic transformations and with their aid we can represent any composed action.\n\n# Wait a minute, may I touch this magical bottom row of the 3x3 matrix?\n\nSure thing! Let us apply the following transformation to our standard squarish object:\n\n![  ](./img/lesson4_matrix_third_line.svg)\n\nRecall that the original object is in white, unit axis vectors are in red and green:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nimage.VerticalFlip ();\nimage\n```\n\nHere is the transformed object:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\n\nvar deformation = Matrix4.Identity ();\ndeformation[3, 0] = -1/5f;\nRenderCube(image, deformation, color: Color.Red);\n\nimage.VerticalFlip ();\nimage\n```\n\nAnd here another kind of magic (white!) happens. Do you remember our y-buffer exercise? Here we will do the same: we project our 2D object onto the vertical line `x=0`. Let us harden the rules a bit: we have to use a central projection, our camera is in the point `(5,0)` and is pointed onto the origin. To find the projection we need to trace straight lines between the camera and the points to be projected (yellow) and to find the intersection with the screen line (white vertical).\n\n![  ](./img/lesson4_sketch5.png)\n\nNow i replace the original object with the transformed one, but i do not touch the yellow lines we drew before:\n\n![  ](./img/lesson4_sketch6.png)\n\nIf we project the red object onto the screen using **standard orthogonal projection**, then we find exactly the same points! Let us look closely how the transformation works: all vertical segments are transformed into vertical segments, but those close to the camera are stretched and those far from the camera are shrunk. If we choose the coefficient correctly (in our transformation matrix it is the -1/5 coefficient), we obtain an image in perspective (central) projection!\n\n# Time to work in full 3D\n\nLet us explain the magic. As for 2D affine transformations, for 3D affine transformations we will use homogeneous coordinates: a point `(x,y,z)` is augmented with 1`(x,y,z,1)`, then we transform it in 4D and project back to 3D. For example, if we take the following transformation:\n\n![  ](./img/lesson4_formula_4d_1.svg)\n\nThe retro-projection gives us the following 3D coordinages:\n\n![  ](./img/lesson4_formula_central_project.svg)\n\nLet us remember this result, but put it aside for a while. Let us return to the standard definition of the central projection, without any fancy stuff as 4D transformations. Given a point `P=(x,y,z)` we want to project it onto the plane z=0, the camera is on the z-axis in the point `(0,0,c)`:\n\n![](./img/lesson4_sketch7.png)\n\nTriangles ABC and ODC are similar. It means that we can write the following: |AB|/|AC|=|OD|/|OC| => x/(c-z) = x'/c. In other words:\n\n![ ](./img/lesson4_formula_x.svg)\n\nBy doing the same reasoning for triangles CPB and CP'D, it is easy to find the following expression:\n\n![](./img/lesson4_formula_y.svg)\n\nIt is really similar to the result we put aside few moments ago, but there we got the result by a single matrix multiplication. We got the law for the coefficient: `r = -1/c`\n\n# Let us sum up: the main formula for today\n\n*If you simply copy-paste this formula without understanding the above material, I hate you.*\n\nSo, if we want to compute a central projection with a camera **(important!) camera located on the z-axis with distance c from the origin**, then we embed the point into 4D by augmenting it with 1, then we multiply it with the following matrix, and retro-project it into 3D.\n\n![  ](./img/lesson4_formula_last.svg)\n\nWe deformed our object in a way, that simply forgetting its z-coordinate we will get a drawing in a perspective. If we want to use the z-buffer, then, naturally, do not forget the z:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\nvar camera = new Vec3f { z = 3 };\nvar projection = Projection(-1/camera.z);\nvar viewPort   = Viewport(width/8, height/8, width*3/4, height*3/4);\n\nFunc<Vec3f, Vec3f> map = v => {\n    var r4 = Mult (viewPort * projection, Embed4D (v));\n    var r = Project3D (r4 / r4.h);\n    r.x = (int)(r.x + 0.5f);\n    r.y = (int)(r.y + 0.5f);\n    return r;\n};\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n    x = v.x * (texture.Width - 1),\n    y = v.y * (texture.Height - 1)\n};\n\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nVec2f[] uv = new Vec2f [3];\n\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/lesson5.csx",
    "content": "using static Geometry;\n\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n\tvar z = (eye - center).Normalize ();\n\tvar x = Cross (up, z).Normalize ();\n\tvar y = Cross (z, x).Normalize ();\n\n\tvar Minv = Matrix4.Identity ();\n\tMinv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n\tMinv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n\tMinv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n\tvar Tr = Matrix4.Identity ();\n\tTr [0, 3] = -center.x;\n\tTr [1, 3] = -center.y;\n\tTr [2, 3] = -center.y;\n\n\treturn Minv * Tr;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson5.workbook/obj/african_head.obj",
    "content": "v -0.000581696 -0.734665 -0.623267\nv 0.000283538 -1 0.286843\nv -0.117277 -0.973564 0.306907\nv -0.382144 -0.890788 0.221243\nv -0.247144 -0.942602 0.276051\nv -0.656078 -0.718512 -0.109025\nv -0.609847 -0.786562 0.0198068\nv -0.66248 -0.632053 -0.244271\nv -0.511812 -0.845392 0.127809\nv -0.609326 -0.569868 -0.41571\nv -0.426949 -0.649767 -0.567143\nv -0.201076 -0.720822 -0.633205\nv 0.117382 -0.973645 0.306766\nv 0.382454 -0.890869 0.221097\nv 0.247512 -0.942667 0.275986\nv 0.656371 -0.718624 -0.109224\nv 0.610273 -0.786562 0.0197893\nv 0.66248 -0.631463 -0.244119\nv 0.511631 -0.845357 0.127832\nv 0.608654 -0.568839 -0.416318\nv 0.424663 -0.649937 -0.567418\nv 0.198972 -0.720968 -0.633141\nv 0.153371 -0.140519 0.477416\nv 0.134781 -0.14723 0.48805\nv 0.131261 -0.132153 0.49872\nv 0.14749 -0.135105 0.489565\nv 0.000686924 -0.0534984 0.505694\nv 0.075062 -0.0473306 0.49955\nv 0.0695841 -0.0997942 0.550277\nv 0.0302569 -0.0971868 0.55389\nv 0.0745124 -0.135953 0.523215\nv 0.0354892 -0.12785 0.535159\nv 0.0389268 -0.109557 0.550558\nv 0.0734835 -0.11538 0.538029\nv 0.106386 -0.125623 0.51513\nv 0.107415 -0.144295 0.5047\nv 0.15968 -0.130861 0.484794\nv 0.156224 -0.123705 0.486735\nv 0.15792 -0.107798 0.4677\nv 0.163784 -0.126996 0.470144\nv 0.154687 -0.134655 0.486373\nv 0.160668 -0.135649 0.476189\nv 0.143433 -0.119034 0.499854\nv 0.131606 -0.0726738 0.476148\nv -0.000260156 -0.124553 0.539058\nv -0.000646004 -0.110651 0.55444\nv 0.100423 -0.10574 0.537643\nv 0.126128 -0.115784 0.515598\nv 0.250944 -0.275583 0.380381\nv 0.221602 -0.335752 0.330174\nv 0.275434 -0.301318 0.24751\nv 0.307699 -0.239869 0.292356\nv 0.332124 -0.0415605 0.412962\nv 0.319444 0.00732526 0.451091\nv 0.28667 -0.025805 0.481549\nv 0.297006 -0.0758717 0.454242\nv 0.357953 -0.159928 -0.223225\nv 0.303981 -0.144611 -0.343644\nv 0.296386 -0.0547553 -0.357792\nv 0.357339 -0.0633433 -0.24278\nv 0.45086 0.331215 0.047962\nv 0.438899 0.336167 0.131147\nv 0.447405 0.226107 0.139349\nv 0.455613 0.205353 0.0827643\nv 0.197493 -0.411308 0.138256\nv 0.204911 -0.353378 0.2082\nv 0.102001 -0.419375 0.24969\nv 0.0995867 -0.475697 0.20834\nv 0.150133 -0.372261 0.431226\nv 0.176423 -0.362054 0.392056\nv 0.196019 -0.326474 0.426929\nv 0.154611 -0.348549 0.463444\nv 0.0892273 -0.391968 0.303592\nv 0.159013 -0.363737 0.305077\nv 0.455712 0.508986 -0.0641442\nv 0.432146 0.648411 -0.0417475\nv 0.417051 0.611568 0.0817295\nv 0.44205 0.483438 0.0478626\nv 0.3446 0.43288 0.398633\nv 0.372358 0.383369 0.353998\nv 0.388341 0.404485 0.306953\nv 0.355059 0.467372 0.356967\nv 0.305162 0.338815 0.458112\nv 0.298579 0.319803 0.456627\nv 0.313422 0.304568 0.427776\nv 0.323711 0.315968 0.429291\nv 0.33161 0.397557 0.430226\nv 0.354427 0.359727 0.390478\nv 0.304162 0.291952 0.432377\nv 0.292662 0.309771 0.452991\nv 0.282934 0.292496 0.4562\nv 0.292025 0.281663 0.435178\nv 0.397344 0.565249 0.192585\nv 0.42257 0.455996 0.145494\nv 0.317848 0.364866 0.448834\nv 0.340595 0.337517 0.417978\nv 0.243227 0.479439 0.494236\nv 0.250155 0.546138 0.465934\nv 0.179019 0.560251 0.511681\nv 0.170173 0.4781 0.536229\nv 0.162386 0.410407 0.547009\nv 0.235031 0.427051 0.517018\nv 0.271745 0.634415 0.42162\nv 0.196896 0.657291 0.472505\nv 0.186589 0.312952 0.511073\nv 0.189518 0.32493 0.514165\nv 0.146286 0.31277 0.509009\nv 0.144959 0.300178 0.501713\nv 0.143965 0.300412 0.49409\nv 0.187203 0.310596 0.506407\nv 0.157744 0.364614 0.528804\nv 0.216697 0.382527 0.516083\nv 0.194441 0.332425 0.515989\nv 0.204286 0.349818 0.516732\nv 0.156254 0.334062 0.519579\nv 0.151565 0.320341 0.513961\nv 0.0431068 0.071791 0.618005\nv 0.0477954 0.0867105 0.593486\nv 0.0780844 0.0816652 0.602518\nv 0.0574124 0.0746147 0.621185\nv 0.448253 0.130656 0.149533\nv 0.431801 0.159355 0.215905\nv 0.422792 0.0771637 0.237185\nv 0.428691 0.0348783 0.166914\nv 0.365073 -0.0526507 0.316126\nv 0.326974 -0.104793 0.373068\nv 0.312773 -0.172965 0.33446\nv 0.368107 -0.126698 0.269222\nv 0.203695 -0.131796 0.523934\nv 0.180463 -0.136479 0.525396\nv 0.182848 -0.14892 0.516989\nv 0.204163 -0.152533 0.514914\nv 0.39379 0.00616771 0.269368\nv 0.40177 -0.0591341 0.209048\nv 0.26083 -0.0996422 0.484274\nv 0.250406 -0.0552171 0.50321\nv 0.15851 -0.136292 0.498474\nv 0.155032 -0.134684 0.502964\nv 0.145006 -0.133819 0.514504\nv 0.171033 -0.12032 0.538263\nv 0.158849 -0.127938 0.534943\nv 0.167969 -0.138075 0.523788\nv 0.232061 -0.151474 0.497024\nv 0.23074 -0.117128 0.507191\nv 0.365798 0.221617 0.362743\nv 0.342501 0.235507 0.392185\nv 0.325951 0.202558 0.415114\nv 0.359268 0.178677 0.383229\nv 0.352369 0.0489033 0.417452\nv 0.322262 0.0907619 0.44953\nv 0.295322 0.04895 0.483251\nv 0.367108 0.00328555 0.369771\nv 0.138972 -0.18796 0.555521\nv 0.161562 -0.177794 0.535913\nv 0.154015 -0.155093 0.536392\nv 0.136131 -0.156414 0.558491\nv 0.220263 -0.08194 0.518603\nv 0.202088 -0.0486753 0.52791\nv 0.17564 -0.0814314 0.545822\nv 0.193131 -0.106435 0.533575\nv 0.199492 -0.169714 0.509722\nv 0.190033 -0.188183 0.514668\nv 0.207302 -0.213011 0.492721\nv 0.222415 -0.183044 0.489617\nv 0.125088 -0.132884 0.551294\nv 0.144497 -0.139192 0.530254\nv 0.135014 0.119128 0.544717\nv 0.119534 0.149685 0.554253\nv 0.096915 0.171211 0.569382\nv 0.112553 0.137432 0.569616\nv 0.0878476 0.217858 0.555667\nv 0.0649773 0.232128 0.568628\nv 0.073466 0.185119 0.584571\nv 0.116359 0.191199 0.548932\nv 0.111419 0.228591 0.524951\nv 0.0858774 0.255408 0.530312\nv 0.301408 0.0368718 -0.387812\nv 0.366839 0.037626 -0.269538\nv 0.272125 -0.199781 0.399533\nv 0.246349 -0.195514 0.453266\nv 0.223339 -0.243049 0.450553\nv 0.364021 -0.197455 0.21335\nv 0.411416 -0.124798 0.140589\nv 0.431568 -0.0028997 0.0907502\nv 0.449346 0.11075 0.0889086\nv 0.0649948 0.777167 0.432594\nv 0.133465 0.770619 0.418569\nv 0.14341 0.869244 0.301253\nv 0.0689586 0.877043 0.315395\nv 0.305372 0.809321 0.22043\nv 0.289307 0.723856 0.335524\nv 0.355187 0.660735 0.264773\nv 0.372264 0.728258 0.148528\nv 0.382308 0.7766 0.0116631\nv 0.0971488 0.470588 0.557912\nv 0.110788 0.565185 0.534317\nv 0.100113 0.277828 0.510938\nv 0.10966 0.248679 0.503771\nv 0.0443988 0.240822 0.58581\nv 0.0522151 0.193614 0.604337\nv 0.052601 0.564735 0.541859\nv 0.123726 0.667896 0.498907\nv 0.0597976 0.671147 0.508711\nv 0.0466729 0.466215 0.561034\nv 0.000423846 0.462807 0.558988\nv -0.00017831 0.388326 0.563478\nv 0.0352086 0.389069 0.560584\nv 0.000833078 0.56384 0.544139\nv 0.295773 0.426823 0.470722\nv 0.301706 0.464689 0.451056\nv 0.189957 0.181465 0.501181\nv 0.186163 0.208931 0.491956\nv 0.141574 0.222722 0.500509\nv 0.146526 0.195338 0.518293\nv 0.111986 0.0116865 0.562811\nv 0.111343 0.0404672 0.565769\nv 0.0577164 0.0420398 0.577988\nv 0.0656438 -0.00796249 0.596918\nv 0.147695 0.0440509 0.537258\nv 0.144778 0.0631738 0.538491\nv 0.0268719 -0.0140834 0.602378\nv 0.0270356 -0.0372401 0.622027\nv 0.0876429 -0.0456996 0.601127\nv 0.183093 0.146552 0.519439\nv 0.148589 0.164593 0.536819\nv 0.147344 0.131095 0.542934\nv 0.176733 0.112264 0.532435\nv -0.000394618 -0.0441035 0.617625\nv -0.000260156 -0.0187662 0.600677\nv 0.165058 0.0770935 0.530856\nv 0.148554 0.0982976 0.535562\nv 0.116476 0.272829 0.494797\nv 0.119084 0.26261 0.493569\nv 0.120873 0.268971 0.480883\nv 0.11761 0.27287 0.484221\nv 0.224695 0.848444 0.271198\nv 0.231324 0.918189 0.121063\nv 0.14614 0.9439 0.150241\nv 0.241894 0.945736 -0.185803\nv 0.156043 0.976475 -0.183418\nv 0.146906 0.980702 -0.0177607\nv 0.23195 0.948285 -0.0402158\nv 0.0684324 0.995189 -0.00981573\nv 0.0682103 0.955014 0.162933\nv 0.0891571 0.383649 0.555118\nv 0.110613 0.336412 0.528863\nv 0.122749 0.310759 0.512914\nv 0.147081 -0.111919 0.55631\nv 0.158656 -0.0994551 0.55786\nv 0.0939743 0.0869969 0.616333\nv 0.101206 0.119326 0.615532\nv 0.0670469 0.122121 0.645885\nv 0.0560853 0.0831385 0.640601\nv 0.0795284 0.0820978 0.567845\nv 0.0337354 0.0564741 0.595059\nv 0.0854448 -0.103577 0.606979\nv 0.0826211 -0.0671141 0.612931\nv 0.0280704 -0.0555854 0.637736\nv 0.0319698 -0.0970874 0.628212\nv 0.0789964 -0.121811 0.579602\nv 0.0327415 -0.116959 0.594106\nv 0.0216981 0.0173339 0.585915\nv -0.00123062 -0.095585 0.625704\nv -0.000511542 -0.0598999 0.637227\nv -0.00157555 -0.115643 0.593966\nv -0.000219233 -0.0988881 0.554498\nv 0.0291929 0.0853015 0.665324\nv 0.0352671 0.124524 0.666125\nv 0.0371846 0.159004 0.648446\nv 0.0654158 0.154462 0.629171\nv 0.0280178 0.19967 0.620548\nv 0.0221015 0.245843 0.59797\nv 0.0432997 0.281499 0.556866\nv 0.0222008 0.28717 0.567459\nv -0.000400465 0.125745 0.673871\nv -0.00057585 0.0822265 0.675105\nv -0.000347849 0.160916 0.656029\nv 0.367195 0.315074 0.363767\nv 0.346658 0.302744 0.393991\nv 0.344389 0.266656 0.384439\nv 0.371726 0.266504 0.352507\nv 0.40246 0.429197 0.234116\nv 0.422126 0.335763 0.207276\nv 0.393316 0.264083 0.313887\nv 0.387102 0.325737 0.325369\nv 0.3274 0.295928 0.408636\nv 0.316392 0.29076 0.418709\nv 0.3085 0.274624 0.423199\nv 0.323636 0.272379 0.406602\nv 0.429381 0.244458 0.204002\nv 0.407084 0.332408 0.277313\nv 0.410597 0.257869 0.266264\nv -0.0012657 -0.456867 0.290093\nv -0.00137093 -0.520579 0.266159\nv 0.154137 -0.304206 0.500479\nv 0.193482 -0.282873 0.473493\nv 0.186367 -0.242201 0.509588\nv 0.148993 -0.26399 0.525367\nv 0.110332 -0.274916 0.545857\nv 0.099347 -0.233134 0.560204\nv 0.0558865 -0.227615 0.569605\nv 0.0659185 -0.270006 0.563817\nv 0.154687 -0.142577 0.51838\nv 0.159498 -0.143009 0.513072\nv 0.154646 -0.138239 0.502496\nv 0.149045 -0.137596 0.50639\nv 0.15958 -0.138174 0.517463\nv 0.161574 -0.141559 0.511657\nv 0.0940387 -0.129288 0.582226\nv 0.109215 -0.12609 0.531844\nv 0.0782715 -0.117578 0.557129\nv 0.264817 0.0151299 0.501573\nv 0.280122 0.127096 0.47057\nv 0.262508 0.0886748 0.494464\nv 0.187613 0.050926 0.529248\nv 0.207829 0.0868157 0.523449\nv 0.231821 -0.0170182 0.518246\nv 0.304138 0.164985 0.443485\nv 0.343004 0.132813 0.418235\nv 0.313621 0.250742 0.418382\nv 0.290815 0.22492 0.444303\nv 0.355269 -0.194146 0.0276407\nv 0.388534 -0.179618 0.0746089\nv 0.336544 -0.25083 0.156379\nv 0.29365 -0.279868 0.104617\nv 0.389288 0.153006 0.345258\nv 0.39155 0.205715 0.320166\nv 0.127262 0.566927 -0.64996\nv 0.000868155 0.562946 -0.661419\nv 0.000850617 0.724441 -0.605705\nv 0.118774 0.725955 -0.596105\nv 0.21095 0.754513 0.387525\nv 0.133734 -0.133188 0.514651\nv 0.131302 -0.13393 0.53047\nv 0.0671053 -0.326445 0.551902\nv 0.0661056 -0.374553 0.504765\nv 0.117289 -0.365439 0.489939\nv 0.116552 -0.318792 0.528974\nv 0.288249 -0.135286 0.424736\nv 0.39393 0.0544045 0.33225\nv 0.374655 0.0965379 0.38044\nv 0.000792155 1 -0.0074948\nv 0.0731795 0.993937 -0.182792\nv 0.000868155 0.999152 -0.181886\nv 0.179405 0.936399 -0.330549\nv 0.0842755 0.953459 -0.338026\nv 0.141767 0.271455 0.486238\nv 0.139978 0.267433 0.490862\nv 0.175908 0.259465 0.501362\nv 0.175312 0.263359 0.495861\nv 0.181597 0.230187 0.495539\nv 0.140253 0.240576 0.495341\nv 0.336982 0.587763 0.356927\nv 0.312043 0.518258 0.416183\nv 0.259971 0.350203 0.495411\nv 0.250763 0.331028 0.496036\nv 0.114179 0.255893 0.495902\nv 0.111069 0.276518 0.499456\nv 0.125433 0.293116 0.500415\nv 0.124965 0.282353 0.489968\nv 0.13906 0.254928 0.497457\nv 0.17737 0.2462 0.50062\nv 0.121796 0.272327 0.47658\nv 0.149548 0.0847578 0.549377\nv 0.142825 -0.226381 0.544992\nv 0.106181 -0.197232 0.576871\nv 0.258193 -0.146669 0.465227\nv 0.2105 0.0188071 0.525711\nv 0.181041 -0.0155508 0.531721\nv 0.173453 -0.168949 0.5218\nv 0.180322 -0.15877 0.514949\nv 0.168554 -0.150118 0.516667\nv 0.163082 -0.153579 0.523344\nv 0.139124 -0.128733 0.545343\nv 0.152348 -0.134468 0.527471\nv 0.416192 -0.0714636 0.0335278\nv 0.0220956 0.0520719 0.640232\nv 0.0361615 0.0619695 0.628476\nv -0.000283541 0.202056 0.62768\nv 0.0869063 -0.0493125 -0.489641\nv 0.192289 -0.0534399 -0.447186\nv 0.192003 -0.134672 -0.429197\nv 0.0851642 -0.130335 -0.46373\nv 0.236434 0.310245 0.495686\nv 0.237714 0.31211 0.497539\nv 0.244636 0.32534 0.496212\nv 0.121253 0.281932 0.477293\nv 0.173149 -0.207241 0.528208\nv -0.000242618 0.247989 0.603612\nv -0.00037708 0.28838 0.571697\nv 0.108496 -0.160507 0.588207\nv 0.0613995 -0.166388 0.620127\nv 0.0634222 -0.199565 0.59462\nv 0.0893734 0.151176 0.600127\nv 0.122124 0.0729427 0.596088\nv 0.0993528 0.072475 0.584781\nv 0.108315 0.0599584 0.583916\nv 0.133524 0.0551528 0.575778\nv 0.13315 0.107517 0.580426\nv 0.274937 0.384257 0.485735\nv 0.170606 -0.145383 0.517205\nv 0.0464391 -0.130399 0.611931\nv 0.0392892 -0.113439 0.575094\nv -0.00161647 -0.112428 0.579865\nv -0.00351648 -0.131685 0.617859\nv 0.0194356 0.03489 0.601858\nv -0.000564158 0.0478802 0.644208\nv -2.04632e-05 0.0350303 0.598835\nv 0.222163 0.246884 0.4972\nv 0.217802 0.257547 0.498129\nv 0.293159 0.278716 0.430419\nv 0.302852 0.281932 0.427367\nv 0.285209 0.277366 0.434932\nv 0.289307 0.275834 0.436551\nv 0.290061 0.280494 0.427963\nv -0.000225079 -0.384287 0.444245\nv 0.0651001 -0.383883 0.440585\nv -0.000891543 -0.364076 0.502426\nv 0.116576 -0.381784 0.436341\nv 0.363734 0.712842 -0.467571\nv 0.32166 0.832542 -0.392653\nv 0.376508 0.821429 -0.265451\nv 0.427095 0.698004 -0.319575\nv 0.27178 0.90956 -0.29643\nv 0.310423 0.901357 -0.210644\nv 0.441869 0.677005 -0.175175\nv 0.389019 0.807076 -0.128411\nv 0.313311 0.894506 -0.0788532\nv 0.12783 -0.376125 0.378248\nv 0.0722266 -0.391483 0.37664\nv 0.125579 0.302411 0.505741\nv 0.101656 0.861358 -0.486525\nv 0.214084 0.849981 -0.463327\nv 0.2467 0.723207 -0.559263\nv 0.104913 0.117397 -0.600268\nv 0.221579 0.117865 -0.555159\nv 0.200848 0.0268164 -0.488992\nv 0.0944011 0.0271204 -0.539134\nv 0.391141 0.144178 -0.303545\nv 0.331241 0.130393 -0.444613\nv 0.360829 0.250357 -0.491155\nv 0.424003 0.258021 -0.333419\nv 0.000868155 0.23912 -0.655479\nv 0.00089154 0.393909 -0.675105\nv 0.125626 0.397949 -0.664716\nv 0.115418 0.240453 -0.645617\nv 0.452175 0.547687 -0.348309\nv 0.450217 0.395605 -0.350776\nv 0.383015 0.40193 -0.511868\nv 0.3854 0.562496 -0.506472\nv 0.464078 0.52881 -0.195929\nv 0.311698 0.866351 0.071908\nv -9.64635e-05 -0.406882 0.376985\nv 0.373883 -0.18312 -0.115123\nv 0.389189 -0.0789467 -0.141776\nv 0.247109 0.197607 0.47589\nv 0.22891 0.231497 0.489717\nv 0.121077 -0.116725 0.574393\nv 0.125626 -0.0895459 0.583057\nv 0.110548 -0.128452 0.555428\nv 0.000710309 0.959638 0.167019\nv 0.000710309 0.881206 0.320973\nv 0.224163 0.124079 0.505215\nv 0.255305 0.260798 0.480649\nv 0.25188 0.263516 0.478322\nv 0.214891 0.26119 0.49413\nv 0.116476 0.273741 0.475423\nv 0.290704 0.283902 0.433377\nv 0.29641 0.299523 0.422813\nv 0.29406 0.288222 0.418078\nv 0.142655 0.263364 0.482467\nv 0.121638 0.267831 0.470296\nv 0.171711 0.256898 0.489693\nv 0.246864 0.257401 0.473821\nv 0.274311 0.271648 0.453301\nv 0.274539 0.26862 0.446654\nv 0.233686 0.331104 0.49074\nv 0.187548 0.326632 0.49682\nv 0.296971 0.273928 0.433476\nv 0.134067 -0.0744861 0.577333\nv 0.237434 0.052867 0.514604\nv 0.0637905 0.27076 0.54346\nv 0.375421 0.514218 0.287328\nv 0.353808 -0.333437 -0.190615\nv 0.349365 -0.276331 -0.333858\nv 0.323337 -0.214946 -0.338453\nv 0.356725 -0.247925 -0.205557\nv -0.000330311 -0.581268 0.237302\nv 0.092922 -0.548418 0.185458\nv 0.394783 -0.0876049 -0.0664009\nv 0.358315 -0.197624 -0.02995\nv 0.292785 -0.321493 0.0377429\nv 0.395175 -0.0904345 -0.0143524\nv 0.243385 0.243183 -0.602957\nv 0.000587539 -0.0451091 -0.498205\nv 0.000751232 0.030862 -0.55154\nv 0.000809694 0.11928 -0.61144\nv 0.000850617 0.862837 -0.491295\nv 0.000868155 0.958527 -0.339277\nv 0.000423846 -0.128189 -0.469085\nv 0.264186 0.56961 -0.608026\nv 0.35127 -0.283317 -0.0863656\nv 0.196201 -0.209591 -0.418785\nv 0.0873097 -0.206341 -0.44839\nv 0.000488154 -0.206259 -0.449945\nv 0.263397 0.402579 -0.621226\nv 0.456683 0.384813 -0.0591516\nv 0.457776 0.372302 -0.191281\nv 0.000850617 0.671351 0.512487\nv 0.000809694 0.77919 0.437668\nv 0.408656 0.116286 0.298547\nv 0.295913 0.259781 0.439334\nv 0.285355 0.265481 0.449775\nv 0.278766 0.270035 0.454663\nv 0.128946 -0.0227065 0.564741\nv 0.16203 0.016989 0.534633\nv 0.0985987 0.0583799 0.58087\nv 0.0538462 0.323165 0.543729\nv 0.0794758 0.301522 0.528465\nv -0.00330601 -0.197759 0.600525\nv -0.000511542 -0.225551 0.572931\nv -0.00456879 -0.164231 0.628277\nv -0.000336157 -0.26392 0.574381\nv -0.000768774 -0.325515 0.55686\nv 0.269921 0.242499 0.464742\nv 0.260573 0.253022 0.476072\nv 0.235066 0.15963 0.493271\nv 0.411369 0.186119 0.273583\nv 0.000178307 0.0131539 0.584682\nv 0.153436 -0.0554568 0.55786\nv 0.0264569 0.331747 0.554112\nv -0.000342003 0.332998 0.557743\nv 0.285589 0.277974 0.428156\nv 0.184795 -0.499655 0.1217\nv 0.332808 -0.386298 -0.0699261\nv 0.20739 -0.274419 -0.415909\nv 0.0927467 -0.274308 -0.43723\nv 0.278029 -0.438791 0.0475586\nv 0.000505693 -0.27722 -0.43768\nv 0.438191 0.12488 -0.0367783\nv 0.460214 0.163208 -0.055258\nv 0.485388 0.177437 -0.0277343\nv 0.472304 0.161641 -0.00367724\nv 0.496244 0.232684 -0.0170708\nv 0.477425 0.247036 0.00446648\nv 0.517015 0.298681 -0.0523876\nv 0.492233 0.31788 -0.0441737\nv 0.53425 0.316407 -0.124009\nv 0.511491 0.332595 -0.129276\nv 0.535904 0.290111 -0.170685\nv 0.511128 0.30365 -0.186838\nv 0.538611 0.228878 -0.193017\nv 0.511286 0.231199 -0.218992\nv 0.520242 0.128838 -0.191421\nv 0.490433 0.122168 -0.208603\nv 0.487562 0.00951757 -0.0819458\nv 0.472286 -0.00658864 -0.0930419\nv 0.47079 0.0399937 -0.154257\nv 0.496437 0.0472722 -0.136917\nv 0.485142 -0.0247586 -0.0238758\nv 0.46129 -0.0429694 -0.0334343\nv 0.474888 0.238927 -0.0419989\nv 0.495232 0.289088 -0.0628581\nv 0.508398 0.299996 -0.11766\nv 0.51311 0.283323 -0.158478\nv 0.514642 0.235303 -0.176531\nv 0.501751 0.136134 -0.181559\nv 0.486025 0.0533522 -0.11859\nv 0.486451 0.0268164 -0.067155\nv 0.482529 0.0136625 -0.0120607\nv 0.464265 0.0280383 0.0249515\nv 0.457519 -0.0185791 0.0196256\nv 0.442769 0.0582571 -0.0293244\nv 0.45632 0.0847169 -0.0600578\nv 0.442465 0.0842785 -0.0209644\nv 0.459612 0.268106 0.0209995\nv 0.458559 0.182857 0.0414318\nv 0.463026 0.318488 -0.0446005\nv 0.470222 0.311835 -0.142898\nv 0.455063 0.232836 -0.195221\nv 0.43839 0.13186 -0.191088\nv 0.424564 0.0473131 -0.148417\nv 0.423447 -0.00471202 -0.0897563\nv 0.425377 -0.0292075 -0.0262143\nv 0.430714 -0.0102191 0.0297161\nv 0.446335 0.0345567 0.0460036\nv 0.475607 0.129364 -0.0864649\nv 0.482611 0.0600636 -0.0525396\nv 0.481517 0.0827175 -0.101349\nv 0.470503 0.0444835 -0.0133527\nv 0.479278 0.0776957 0.00471786\nv 0.504692 0.223938 -0.101723\nv 0.50375 0.131866 -0.1473\nv 0.45452 0.100016 0.0450097\nv 0.403623 0.0251386 -0.16934\nv 0.414719 0.138607 -0.218957\nv 0.435461 0.249632 -0.229924\nv -0.000201695 -0.407876 0.310666\nv 0.000347846 -0.171521 0.505794\nv 0.0884205 -0.186598 0.484028\nv 0.141147 -0.173807 0.465513\nv 0.159878 -0.142255 0.458644\nv 0.152483 -0.116468 0.431278\nv 0.0708352 0.0121893 0.376371\nv 0.128069 -0.116368 0.360528\nv 0.143994 -0.166791 0.41184\nv 0.0748398 -0.218144 0.372349\nv 0.280941 0.292858 0.454897\nv 0.281356 0.319879 0.451494\nv 0.127268 0.269088 0.455435\nv 0.116921 0.284697 0.447653\nv 0.119996 0.274998 0.469126\nv 0.15699 0.254759 0.466326\nv 0.265916 0.273601 0.421176\nv 0.214885 0.253946 0.455259\nv 0.141223 0.313133 0.482117\nv 0.211436 0.255823 0.486852\nv 0.277135 0.302686 0.410799\nv 0.252505 0.333881 0.433599\nv 0.202023 0.342182 0.464578\nv 0.11989 0.295816 0.471196\nv 0.146526 0.322539 0.455943\nv 0.126292 0.301838 0.454973\nv 0.119744 0.284878 0.469419\nv 0.00103185 0.0191579 0.374711\nv 0.000909079 -0.205715 0.379849\nv 0.0536357 -0.100847 0.27211\nv 0.00103185 -0.098929 0.27128\nv 0.255463 -0.398733 -0.446098\nv 0.412907 -0.372688 -0.332858\nv 0.452596 -0.41557 -0.353559\nv 0.293329 -0.465367 -0.476007\nv 0.0815337 -0.637104 0.176286\nv 0.0726358 -0.738524 0.179519\nv 0.174763 -0.714911 0.155526\nv 0.172032 -0.601823 0.129884\nv 0.380782 -0.504069 -0.184377\nv 0.357368 -0.419095 -0.180384\nv 0.337538 -0.494803 -0.0548371\nv 0.372989 -0.619402 -0.0373571\nv 0.453578 -0.652661 -0.0939539\nv 0.452351 -0.545892 -0.196981\nv 0.173576 -0.814197 0.195654\nv 0.0739044 -0.845866 0.20734\nv 0.0964414 -0.904976 0.254455\nv 0.197703 -0.864562 0.243353\nv 0.519564 -0.487407 -0.384801\nv 0.555004 -0.584226 -0.219366\nv 0.451357 -0.731555 -0.0215899\nv 0.382594 -0.74824 0.0443666\nv 0.439805 -0.799196 0.0975376\nv 0.519108 -0.768071 -0.00769357\nv 0.274837 -0.806199 0.115503\nv 0.320508 -0.838061 0.183769\nv 0.354533 -0.544232 -0.525256\nv 0.162503 -0.604343 -0.559076\nv 0.131098 -0.496837 -0.498761\nv 0.115161 -0.410103 -0.457756\nv -0.00017831 -0.492774 -0.504192\nv 2.046e-05 -0.40666 -0.465186\nv -0.000482311 -0.600531 -0.555322\nv 0.546217 -0.696736 -0.117257\nv 0.22746 -0.332063 -0.424345\nv 0.101627 -0.33885 -0.437002\nv 0.280193 -0.554165 0.0658922\nv 0.274843 -0.684891 0.0781517\nv 0.000347846 -0.34199 -0.438165\nv 0.000733693 -0.746364 0.176765\nv 0.000312769 -0.874904 0.179121\nv 0.378648 -0.322586 -0.326994\nv -0.000114002 -0.940246 0.234262\nv 0.000979233 -0.650317 0.207112\nv -0.130513 -0.13217 0.498924\nv -0.133687 -0.14723 0.488109\nv -0.15222 -0.140519 0.477457\nv -0.14666 -0.13514 0.489746\nv -0.0697653 -0.0999404 0.550318\nv -0.0736414 -0.0473131 0.499649\nv -0.0305784 -0.0972511 0.55389\nv -0.0396517 -0.109762 0.550014\nv -0.0358517 -0.127727 0.53534\nv -0.0742493 -0.135994 0.523315\nv -0.0733373 -0.115561 0.537643\nv -0.106766 -0.144336 0.504823\nv -0.106281 -0.125786 0.515779\nv -0.156505 -0.107798 0.467782\nv -0.155611 -0.123682 0.486899\nv -0.159311 -0.130796 0.484958\nv -0.162872 -0.126996 0.470243\nv -0.159919 -0.135625 0.47627\nv -0.154055 -0.134696 0.486513\nv -0.142597 -0.118993 0.499994\nv -0.130051 -0.0726738 0.476189\nv -0.10054 -0.105798 0.538111\nv -0.125684 -0.115824 0.51596\nv -0.274604 -0.301394 0.247527\nv -0.220831 -0.335775 0.330215\nv -0.250102 -0.275554 0.380393\nv -0.3066 -0.239804 0.292309\nv -0.284302 -0.0258401 0.479772\nv -0.319479 0.00809111 0.449577\nv -0.331873 -0.0412272 0.412243\nv -0.293674 -0.0747667 0.452418\nv -0.294668 -0.0547787 -0.357622\nv -0.302063 -0.144319 -0.34334\nv -0.356012 -0.159916 -0.223184\nv -0.355474 -0.0633082 -0.24271\nv -0.447241 0.22613 0.139332\nv -0.437922 0.336149 0.131124\nv -0.449486 0.331215 0.047962\nv -0.454982 0.205353 0.0827818\nv -0.103311 -0.419241 0.249936\nv -0.203701 -0.353384 0.208147\nv -0.196966 -0.411506 0.138841\nv -0.101797 -0.475733 0.208638\nv -0.196499 -0.327216 0.427455\nv -0.176283 -0.362363 0.392138\nv -0.150331 -0.372548 0.431378\nv -0.155575 -0.349484 0.46435\nv -0.0890109 -0.391945 0.303855\nv -0.158306 -0.363848 0.305182\nv -0.415613 0.611627 0.0817705\nv -0.430808 0.648493 -0.0417066\nv -0.45411 0.508986 -0.0641209\nv -0.440308 0.483438 0.0478393\nv -0.389808 0.40462 0.306977\nv -0.375935 0.38348 0.354021\nv -0.34643 0.433026 0.398499\nv -0.354807 0.467378 0.356891\nv -0.317409 0.30382 0.429121\nv -0.30173 0.320499 0.456861\nv -0.309295 0.339493 0.457756\nv -0.328406 0.316144 0.429519\nv -0.358297 0.360101 0.389344\nv -0.335684 0.397733 0.427864\nv -0.285156 0.29304 0.457387\nv -0.294212 0.310695 0.451757\nv -0.307675 0.294425 0.430781\nv -0.29475 0.281949 0.435698\nv -0.421091 0.455996 0.145494\nv -0.395403 0.565208 0.19252\nv -0.321999 0.364421 0.449238\nv -0.345494 0.336792 0.417218\nv -0.178165 0.560672 0.512335\nv -0.249354 0.546354 0.466589\nv -0.243286 0.479638 0.494943\nv -0.170168 0.4781 0.536796\nv -0.164123 0.410647 0.547114\nv -0.236966 0.427297 0.516007\nv -0.270669 0.634748 0.422187\nv -0.195815 0.657882 0.47347\nv -0.14597 0.313039 0.508126\nv -0.18946 0.324971 0.513312\nv -0.186823 0.312829 0.511757\nv -0.144895 0.300213 0.501871\nv -0.186911 0.310514 0.506612\nv -0.143462 0.300341 0.494353\nv -0.160048 0.365076 0.528073\nv -0.219468 0.382854 0.516404\nv -0.15782 0.334506 0.520076\nv -0.205952 0.349935 0.517012\nv -0.195236 0.332495 0.516264\nv -0.151653 0.320785 0.513142\nv -0.0805691 0.0827468 0.603261\nv -0.0493739 0.08878 0.593591\nv -0.0448723 0.0732117 0.617958\nv -0.0594819 0.0761932 0.621314\nv -0.422927 0.0771812 0.237185\nv -0.432205 0.159355 0.215905\nv -0.448112 0.130656 0.149516\nv -0.4282 0.0348607 0.166897\nv -0.311779 -0.172912 0.334378\nv -0.324787 -0.103758 0.371735\nv -0.364851 -0.052639 0.316097\nv -0.367254 -0.126698 0.269146\nv -0.183918 -0.149136 0.51793\nv -0.182024 -0.137865 0.527822\nv -0.205163 -0.131463 0.524127\nv -0.205514 -0.152071 0.514943\nv -0.39379 0.00614433 0.269368\nv -0.400951 -0.0591282 0.208995\nv -0.261011 -0.0993382 0.483865\nv -0.25102 -0.0551177 0.50328\nv -0.158849 -0.136444 0.499199\nv -0.155155 -0.134784 0.503397\nv -0.145304 -0.133848 0.514902\nv -0.160802 -0.128394 0.536919\nv -0.173424 -0.121349 0.541327\nv -0.169156 -0.138478 0.524928\nv -0.232096 -0.116964 0.50767\nv -0.232727 -0.151188 0.49696\nv -0.326085 0.202611 0.415651\nv -0.34094 0.235683 0.392156\nv -0.367727 0.221336 0.359031\nv -0.358829 0.177595 0.3841\nv -0.295603 0.0501836 0.478632\nv -0.32232 0.0902006 0.449922\nv -0.351843 0.04895 0.416686\nv -0.367248 0.00336155 0.369624\nv -0.156137 -0.154941 0.536878\nv -0.165134 -0.177028 0.538193\nv -0.144573 -0.187364 0.558725\nv -0.140533 -0.155882 0.559046\nv -0.17761 -0.0804258 0.547933\nv -0.201667 -0.0484356 0.526945\nv -0.22024 -0.0817529 0.517585\nv -0.195826 -0.106131 0.536439\nv -0.207794 -0.213087 0.493049\nv -0.191711 -0.188305 0.515551\nv -0.201111 -0.170071 0.510745\nv -0.223385 -0.183243 0.490178\nv -0.128595 -0.132761 0.551212\nv -0.145777 -0.139513 0.530605\nv -0.0971664 0.171538 0.569909\nv -0.120048 0.150182 0.555387\nv -0.13557 0.119437 0.545004\nv -0.113103 0.137432 0.569453\nv -0.0653573 0.232432 0.569575\nv -0.08745 0.217992 0.556468\nv -0.0739395 0.185388 0.584933\nv -0.0855266 0.255554 0.53095\nv -0.110583 0.228714 0.525501\nv -0.115915 0.191404 0.5495\nv -0.300099 0.0366964 -0.387999\nv -0.364734 0.0377897 -0.269357\nv -0.223181 -0.243207 0.45081\nv -0.246139 -0.195666 0.45347\nv -0.271201 -0.199869 0.399446\nv -0.362846 -0.197443 0.213286\nv -0.410176 -0.124757 0.140565\nv -0.430404 -0.00290555 0.0907385\nv -0.448779 0.11075 0.0889086\nv -0.142135 0.869847 0.301633\nv -0.132167 0.771303 0.419317\nv -0.0633989 0.777407 0.43288\nv -0.0675789 0.877324 0.315577\nv -0.353469 0.660735 0.264732\nv -0.2875 0.723792 0.335465\nv -0.30353 0.809117 0.220313\nv -0.37099 0.728422 0.148627\nv -0.381016 0.776764 0.0117274\nv -0.0996744 0.472587 0.557146\nv -0.109525 0.565325 0.53475\nv -0.100294 0.277787 0.511248\nv -0.108689 0.248457 0.503268\nv -0.0528874 0.193947 0.604898\nv -0.0453926 0.241125 0.586705\nv -0.12255 0.668732 0.500514\nv -0.0511336 0.564922 0.542589\nv -0.0582191 0.671655 0.50974\nv -0.0440363 0.465776 0.561151\nv -0.0361966 0.388923 0.562367\nv -0.301894 0.466338 0.448542\nv -0.295831 0.424807 0.472166\nv -0.140867 0.22264 0.499754\nv -0.185742 0.209381 0.492394\nv -0.186338 0.179495 0.502724\nv -0.145859 0.19535 0.519018\nv -0.0600022 0.0437294 0.578309\nv -0.113337 0.0407946 0.564875\nv -0.114196 0.0121659 0.564255\nv -0.0686019 -0.00676987 0.598064\nv -0.143661 0.0637116 0.537807\nv -0.147607 0.0440217 0.535469\nv -0.0907706 -0.0459919 0.600525\nv -0.0300113 -0.0346152 0.623594\nv -0.028047 -0.0138554 0.603173\nv -0.148028 0.131527 0.5437\nv -0.148519 0.164868 0.537322\nv -0.183164 0.146873 0.520193\nv -0.176978 0.112363 0.532908\nv -0.147823 0.0979234 0.535574\nv -0.165064 0.0766492 0.532955\nv -0.120107 0.268649 0.480825\nv -0.118558 0.262394 0.493353\nv -0.115979 0.27287 0.494434\nv -0.116476 0.272952 0.483859\nv -0.229115 0.916634 0.120496\nv -0.223379 0.848952 0.271461\nv -0.145146 0.945128 0.150709\nv -0.145409 0.980883 -0.0176788\nv -0.154278 0.976311 -0.1834\nv -0.240088 0.945514 -0.185786\nv -0.230512 0.948548 -0.0401515\nv -0.0669533 0.995411 -0.00979819\nv -0.0669124 0.955581 0.163097\nv -0.0891746 0.383199 0.554861\nv -0.112226 0.336757 0.527307\nv -0.123381 0.311174 0.513382\nv -0.149484 -0.111966 0.558549\nv -0.160264 -0.0991219 0.559216\nv -0.0695139 0.122828 0.646821\nv -0.103574 0.1197 0.616608\nv -0.0967747 0.0873945 0.617683\nv -0.0583127 0.0845006 0.640951\nv -0.0810075 0.0824603 0.567973\nv -0.0347818 0.058339 0.594989\nv -0.031812 -0.0520134 0.636181\nv -0.0876079 -0.0656701 0.61341\nv -0.0905251 -0.101683 0.607529\nv -0.0378686 -0.0937434 0.629054\nv -0.0836617 -0.122507 0.579642\nv -0.0385351 -0.11728 0.594673\nv -0.0223295 0.0177081 0.586652\nv -0.0307538 0.0864766 0.665646\nv -0.0369098 0.125196 0.667078\nv -0.0659946 0.154643 0.629212\nv -0.0379446 0.159028 0.648136\nv -0.0287544 0.19984 0.620642\nv -0.0228205 0.245931 0.598298\nv -0.0444456 0.281523 0.558544\nv -0.0233467 0.287164 0.569581\nv -0.348774 0.267521 0.384632\nv -0.352083 0.30296 0.39367\nv -0.371253 0.315308 0.363077\nv -0.374871 0.266369 0.352501\nv -0.422202 0.335746 0.207253\nv -0.401928 0.429197 0.234116\nv -0.395345 0.264083 0.313998\nv -0.391071 0.32586 0.325679\nv -0.312703 0.275793 0.421661\nv -0.320315 0.291642 0.417107\nv -0.332077 0.295173 0.409057\nv -0.327599 0.271742 0.406824\nv -0.429802 0.244434 0.203979\nv -0.409282 0.332454 0.277442\nv -0.411848 0.257886 0.266369\nv -0.187414 -0.242265 0.510307\nv -0.193763 -0.283183 0.474066\nv -0.155254 -0.304954 0.501777\nv -0.149998 -0.264183 0.526518\nv -0.0567108 -0.227311 0.569523\nv -0.101124 -0.233508 0.561461\nv -0.11039 -0.27508 0.546021\nv -0.066205 -0.270351 0.564711\nv -0.154225 -0.138052 0.502391\nv -0.159867 -0.142787 0.513271\nv -0.15533 -0.142366 0.518626\nv -0.148566 -0.137426 0.506285\nv -0.160416 -0.138344 0.518258\nv -0.161965 -0.141513 0.511996\nv -0.110811 -0.126394 0.533276\nv -0.10089 -0.129879 0.583501\nv -0.0809374 -0.117865 0.558397\nv -0.263876 0.014785 0.500935\nv -0.26083 0.088932 0.49537\nv -0.279702 0.127055 0.470506\nv -0.207764 0.0867397 0.523776\nv -0.187729 0.0509786 0.529558\nv -0.232096 -0.0167025 0.518065\nv -0.344056 0.133304 0.417078\nv -0.302046 0.166376 0.445239\nv -0.292551 0.225429 0.44414\nv -0.316041 0.250468 0.418475\nv -0.335386 -0.250836 0.156385\nv -0.387207 -0.179618 0.074568\nv -0.353755 -0.194151 0.0276524\nv -0.292388 -0.279891 0.104617\nv -0.392211 0.205733 0.320201\nv -0.386651 0.150025 0.344942\nv -0.126064 0.567371 -0.651942\nv -0.117096 0.725914 -0.596082\nv -0.209068 0.754227 0.387245\nv -0.134091 -0.133281 0.515294\nv -0.132384 -0.133778 0.530774\nv -0.118289 -0.366228 0.490722\nv -0.0673742 -0.375085 0.505343\nv -0.0685259 -0.327012 0.553422\nv -0.117722 -0.319453 0.530388\nv -0.287793 -0.13528 0.424643\nv -0.375234 0.0965671 0.380457\nv -0.394351 0.054463 0.33218\nv -0.0714373 0.993797 -0.182751\nv -0.0825568 0.953558 -0.338084\nv -0.177458 0.935674 -0.330221\nv -0.176961 0.259482 0.501637\nv -0.139651 0.267463 0.490903\nv -0.141176 0.271537 0.486156\nv -0.175792 0.263446 0.495797\nv -0.139621 0.240295 0.49489\nv -0.181918 0.230053 0.49499\nv -0.335299 0.587722 0.356851\nv -0.311189 0.51838 0.416464\nv -0.263028 0.350391 0.495528\nv -0.252435 0.331198 0.496568\nv -0.111168 0.276448 0.500608\nv -0.113553 0.255671 0.49582\nv -0.124754 0.293525 0.500263\nv -0.124275 0.282616 0.489933\nv -0.138587 0.254671 0.496603\nv -0.17851 0.246346 0.500783\nv -0.120744 0.272286 0.476557\nv -0.150635 0.0843194 0.549231\nv -0.110981 -0.197039 0.578654\nv -0.145877 -0.226522 0.547184\nv -0.257825 -0.146365 0.464946\nv -0.181813 -0.015013 0.533586\nv -0.21057 0.0188715 0.525811\nv -0.169226 -0.14996 0.516989\nv -0.181743 -0.1588 0.515902\nv -0.175376 -0.168545 0.522911\nv -0.163813 -0.153415 0.52335\nv -0.140253 -0.128364 0.545887\nv -0.153091 -0.134363 0.527834\nv -0.414608 -0.0714286 0.0335337\nv -0.0376523 0.063203 0.628721\nv -0.0232707 0.0530365 0.640016\nv -0.190483 -0.134521 -0.42891\nv -0.190425 -0.0530365 -0.446291\nv -0.0856669 -0.0492716 -0.489617\nv -0.0841703 -0.13027 -0.463549\nv -0.238743 0.312729 0.498784\nv -0.236568 0.310718 0.495914\nv -0.245034 0.325784 0.495083\nv -0.120311 0.281967 0.47734\nv -0.176107 -0.207054 0.530523\nv -0.114635 -0.15994 0.588938\nv -0.0702155 -0.19877 0.595006\nv -0.0735478 -0.165324 0.619338\nv -0.0899814 0.151661 0.600396\nv -0.111016 0.0572925 0.58557\nv -0.101867 0.0715163 0.586237\nv -0.127064 0.0733753 0.597824\nv -0.136833 0.0543987 0.574241\nv -0.135833 0.107312 0.581379\nv -0.278287 0.38386 0.485911\nv -0.171226 -0.145371 0.517737\nv -0.0426215 -0.114106 0.575498\nv -0.0575293 -0.131258 0.610721\nv -0.0203535 0.0339429 0.602828\nv -0.224215 0.246978 0.496697\nv -0.219644 0.257664 0.498129\nv -0.308126 0.284604 0.426215\nv -0.296275 0.279026 0.430641\nv -0.291721 0.275554 0.437358\nv -0.286612 0.276705 0.435172\nv -0.291949 0.280143 0.428238\nv -0.065825 -0.384532 0.440825\nv -0.11702 -0.382428 0.436651\nv -0.374667 0.821265 -0.265393\nv -0.3198 0.831958 -0.392208\nv -0.362179 0.712818 -0.467507\nv -0.425879 0.698185 -0.319692\nv -0.269938 0.909215 -0.296313\nv -0.308015 0.900609 -0.210562\nv -0.440407 0.677046 -0.175192\nv -0.387417 0.807117 -0.128411\nv -0.312037 0.894728 -0.0788123\nv -0.0720161 -0.391612 0.376675\nv -0.127765 -0.376523 0.378341\nv -0.124801 0.303066 0.504835\nv -0.0997913 0.860855 -0.486022\nv -0.212687 0.850449 -0.463771\nv -0.245244 0.723306 -0.559461\nv -0.199083 0.0271847 -0.488407\nv -0.21986 0.118005 -0.554936\nv -0.10327 0.117479 -0.600127\nv -0.0928636 0.0273016 -0.53883\nv -0.389259 0.144254 -0.303446\nv -0.329178 0.130557 -0.444432\nv -0.359227 0.250316 -0.491237\nv -0.422325 0.258021 -0.333419\nv -0.123907 0.397932 -0.664658\nv -0.113699 0.240517 -0.645459\nv -0.381641 0.401913 -0.512072\nv -0.448592 0.395605 -0.3508\nv -0.450574 0.547705 -0.348333\nv -0.384366 0.562601 -0.506817\nv -0.462722 0.528827 -0.195952\nv -0.310604 0.866976 0.0721301\nv -0.372013 -0.183143 -0.115123\nv -0.387686 -0.0789994 -0.141781\nv -0.2476 0.197566 0.475487\nv -0.230342 0.231532 0.488372\nv -0.129238 -0.0890256 0.584927\nv -0.123544 -0.115971 0.574872\nv -0.114588 -0.128867 0.557082\nv -0.221702 0.122764 0.506442\nv -0.216107 0.26119 0.49413\nv -0.253242 0.263207 0.478422\nv -0.256568 0.260547 0.479737\nv -0.115342 0.273619 0.475323\nv -0.298743 0.299903 0.422953\nv -0.291698 0.283732 0.432722\nv -0.295854 0.288181 0.418253\nv -0.142059 0.263388 0.482491\nv -0.120428 0.267802 0.470325\nv -0.172108 0.256934 0.489641\nv -0.275083 0.271584 0.453242\nv -0.248582 0.25684 0.473757\nv -0.275001 0.268573 0.446274\nv -0.234253 0.331396 0.490634\nv -0.187624 0.326819 0.49717\nv -0.300292 0.274694 0.432944\nv -0.135658 -0.0739483 0.577444\nv -0.237428 0.052791 0.514919\nv -0.0645564 0.270789 0.544612\nv -0.373819 0.514195 0.287264\nv -0.321852 -0.214718 -0.338184\nv -0.348166 -0.27584 -0.333396\nv -0.352171 -0.333378 -0.190533\nv -0.354936 -0.247872 -0.205511\nv -0.0936937 -0.549137 0.186785\nv -0.35669 -0.197653 -0.0299733\nv -0.393228 -0.0876225 -0.0664009\nv -0.29161 -0.321499 0.0380294\nv -0.393638 -0.0904403 -0.014329\nv -0.241608 0.243201 -0.602916\nv -0.263209 0.569914 -0.609242\nv -0.349441 -0.283282 -0.0863831\nv -0.194821 -0.209504 -0.418674\nv -0.0862925 -0.206323 -0.448413\nv -0.261795 0.402579 -0.621448\nv -0.456233 0.372302 -0.191263\nv -0.455245 0.384813 -0.0591282\nv -0.408072 0.116608 0.297155\nv -0.298661 0.260278 0.439147\nv -0.287606 0.265861 0.450068\nv -0.279696 0.270216 0.454289\nv -0.162731 0.0172638 0.536515\nv -0.13087 -0.0222973 0.565699\nv -0.101475 0.0572691 0.580946\nv -0.0809198 0.301049 0.528407\nv -0.0556351 0.322972 0.54498\nv -0.272306 0.242932 0.464508\nv -0.262964 0.253017 0.476001\nv -0.233067 0.158607 0.487893\nv -0.412053 0.186142 0.273695\nv -0.154815 -0.0532762 0.55793\nv -0.0277489 0.331782 0.556427\nv -0.286179 0.277611 0.427928\nv -0.183941 -0.499632 0.122144\nv -0.331493 -0.386257 -0.0698735\nv -0.206238 -0.274279 -0.416026\nv -0.0915482 -0.274332 -0.437317\nv -0.277193 -0.438779 0.0481257\nv -0.484037 0.177414 -0.0276816\nv -0.458618 0.163319 -0.0553633\nv -0.437233 0.124752 -0.0367315\nv -0.471526 0.1616 -0.00366555\nv -0.476232 0.247018 0.00445479\nv -0.494987 0.232631 -0.0169773\nv -0.491035 0.317921 -0.0441971\nv -0.515688 0.298728 -0.0523583\nv -0.510175 0.332513 -0.1293\nv -0.532917 0.316524 -0.12405\nv -0.50993 0.303592 -0.186815\nv -0.534671 0.290233 -0.170849\nv -0.510152 0.231181 -0.21891\nv -0.537459 0.228895 -0.193058\nv -0.48934 0.122068 -0.20872\nv -0.519208 0.128879 -0.191363\nv -0.469632 0.0399528 -0.15424\nv -0.470766 -0.00661202 -0.0930419\nv -0.486142 0.00947665 -0.0819458\nv -0.495221 0.0472722 -0.1369\nv -0.459705 -0.0431682 -0.033446\nv -0.483546 -0.0248521 -0.0238816\nv -0.494011 0.289082 -0.0628932\nv -0.473502 0.238904 -0.0420457\nv -0.507246 0.300137 -0.117724\nv -0.512134 0.2833 -0.158502\nv -0.513712 0.235303 -0.176549\nv -0.50102 0.136093 -0.181582\nv -0.485095 0.0532704 -0.118549\nv -0.485253 0.0267755 -0.0671726\nv -0.481172 0.0136801 -0.012201\nv -0.456127 -0.0187428 0.0196958\nv -0.462909 0.027933 0.024969\nv -0.454923 0.0845591 -0.060163\nv -0.441284 0.0577602 -0.0294063\nv -0.440921 0.0840388 -0.0210813\nv -0.457712 0.18288 0.0414318\nv -0.458378 0.268123 0.0210228\nv -0.461588 0.318505 -0.044618\nv -0.468843 0.311858 -0.142898\nv -0.453707 0.232836 -0.195204\nv -0.436969 0.13182 -0.191047\nv -0.423167 0.0473306 -0.148288\nv -0.421945 -0.00467109 -0.089692\nv -0.423991 -0.0291198 -0.0260915\nv -0.429434 -0.0102776 0.0297746\nv -0.445242 0.0345158 0.0460211\nv -0.481617 0.0602039 -0.0524227\nv -0.474104 0.129276 -0.0866754\nv -0.480325 0.0824545 -0.101285\nv -0.469474 0.0446648 -0.013376\nv -0.478167 0.0776431 0.00467109\nv -0.503592 0.223961 -0.101887\nv -0.502575 0.131983 -0.147242\nv -0.453707 0.0999988 0.0450097\nv -0.413357 0.138549 -0.218945\nv -0.402232 0.0251035 -0.169299\nv -0.434023 0.249632 -0.229901\nv -0.0871226 -0.186639 0.484069\nv -0.139686 -0.173807 0.465537\nv -0.158481 -0.142278 0.458685\nv -0.0688299 0.0121893 0.376371\nv -0.150805 -0.116468 0.431278\nv -0.126228 -0.116368 0.360528\nv -0.142316 -0.166791 0.41184\nv -0.0730392 -0.218144 0.372349\nv -0.282087 0.293548 0.454716\nv -0.283513 0.320341 0.45129\nv -0.124398 0.285323 0.452968\nv -0.126795 0.269175 0.455978\nv -0.119353 0.275057 0.469524\nv -0.156265 0.2548 0.466332\nv -0.265074 0.27356 0.421036\nv -0.214762 0.253899 0.455218\nv -0.141855 0.312577 0.484315\nv -0.212745 0.255776 0.486875\nv -0.277117 0.302621 0.410811\nv -0.252014 0.333887 0.433371\nv -0.20141 0.342405 0.464461\nv -0.120767 0.295565 0.473184\nv -0.145333 0.322832 0.456154\nv -0.126041 0.301873 0.455785\nv -0.119879 0.284837 0.470541\nv -0.0516539 -0.100847 0.27211\nv -0.454245 -0.41571 -0.353027\nv -0.413392 -0.372097 -0.332203\nv -0.255785 -0.398019 -0.4467\nv -0.294685 -0.464338 -0.476902\nv -0.174388 -0.714777 0.156607\nv -0.0715543 -0.738454 0.180284\nv -0.0798266 -0.636725 0.177765\nv -0.171536 -0.601788 0.131147\nv -0.337345 -0.494639 -0.0546091\nv -0.355094 -0.419334 -0.180442\nv -0.379665 -0.504905 -0.184915\nv -0.373053 -0.619338 -0.0373044\nv -0.45328 -0.545816 -0.197379\nv -0.454128 -0.653065 -0.0942754\nv -0.0965876 -0.904778 0.254759\nv -0.0736004 -0.845567 0.20775\nv -0.172974 -0.81408 0.195975\nv -0.1973 -0.864375 0.243622\nv -0.520961 -0.488138 -0.3841\nv -0.556272 -0.584635 -0.21946\nv -0.439238 -0.799155 0.0975785\nv -0.381694 -0.748264 0.0442672\nv -0.45103 -0.731883 -0.0219173\nv -0.519067 -0.768135 -0.0077988\nv -0.273785 -0.806328 0.115322\nv -0.319391 -0.83802 0.183769\nv -0.163088 -0.604103 -0.559421\nv -0.356672 -0.543712 -0.525361\nv -0.131226 -0.496761 -0.498854\nv -0.114629 -0.410074 -0.45775\nv -0.546533 -0.697291 -0.117619\nv -0.100633 -0.33885 -0.437013\nv -0.22677 -0.331835 -0.424707\nv -0.274931 -0.684651 0.0790578\nv -0.28021 -0.553908 0.0669913\nv -0.378028 -0.321668 -0.326088\nv 0.172833 0.300014 0.41564\nv -0.171097 0.299996 0.415616\n# 1258 vertices\n\nvt  0.532 0.923 0.000\nvt  0.535 0.917 0.000\nvt  0.542 0.923 0.000\nvt  0.541 0.929 0.000\nvt  0.521 0.984 0.000\nvt  0.521 0.996 0.000\nvt  0.505 0.998 0.000\nvt  0.500 0.985 0.000\nvt  0.504 0.917 0.000\nvt  0.507 0.910 0.000\nvt  0.516 0.910 0.000\nvt  0.515 0.918 0.000\nvt  0.523 0.921 0.000\nvt  0.525 0.913 0.000\nvt  0.549 0.958 0.000\nvt  0.538 0.954 0.000\nvt  0.544 0.942 0.000\nvt  0.550 0.946 0.000\nvt  0.545 0.935 0.000\nvt  0.550 0.932 0.000\nvt  0.547 0.974 0.000\nvt  0.533 0.967 0.000\nvt  0.500 0.917 0.000\nvt  0.500 0.910 0.000\nvt  0.542 0.987 0.000\nvt  0.533 0.994 0.000\nvt  0.616 0.254 0.000\nvt  0.653 0.261 0.000\nvt  0.658 0.307 0.000\nvt  0.619 0.292 0.000\nvt  0.636 0.438 0.000\nvt  0.620 0.419 0.000\nvt  0.627 0.396 0.000\nvt  0.647 0.414 0.000\nvt  0.886 0.312 0.000\nvt  0.897 0.370 0.000\nvt  0.860 0.369 0.000\nvt  0.844 0.308 0.000\nvt  0.740 0.593 0.000\nvt  0.741 0.542 0.000\nvt  0.759 0.541 0.000\nvt  0.768 0.598 0.000\nvt  0.644 0.213 0.000\nvt  0.561 0.175 0.000\nvt  0.566 0.146 0.000\nvt  0.644 0.174 0.000\nvt  0.580 0.254 0.000\nvt  0.585 0.277 0.000\nvt  0.565 0.268 0.000\nvt  0.565 0.256 0.000\nvt  0.590 0.217 0.000\nvt  0.544 0.195 0.000\nvt  0.771 0.721 0.000\nvt  0.736 0.712 0.000\nvt  0.758 0.653 0.000\nvt  0.794 0.663 0.000\nvt  0.669 0.622 0.000\nvt  0.685 0.632 0.000\nvt  0.665 0.669 0.000\nvt  0.652 0.651 0.000\nvt  0.623 0.588 0.000\nvt  0.632 0.582 0.000\nvt  0.639 0.590 0.000\nvt  0.627 0.599 0.000\nvt  0.641 0.632 0.000\nvt  0.657 0.612 0.000\nvt  0.619 0.580 0.000\nvt  0.617 0.575 0.000\nvt  0.623 0.573 0.000\nvt  0.627 0.576 0.000\nvt  0.708 0.702 0.000\nvt  0.729 0.646 0.000\nvt  0.633 0.614 0.000\nvt  0.647 0.601 0.000\nvt  0.604 0.718 0.000\nvt  0.574 0.725 0.000\nvt  0.567 0.686 0.000\nvt  0.596 0.682 0.000\nvt  0.562 0.648 0.000\nvt  0.590 0.649 0.000\nvt  0.618 0.756 0.000\nvt  0.584 0.769 0.000\nvt  0.586 0.587 0.000\nvt  0.566 0.586 0.000\nvt  0.568 0.579 0.000\nvt  0.586 0.580 0.000\nvt  0.569 0.574 0.000\nvt  0.586 0.573 0.000\nvt  0.562 0.627 0.000\nvt  0.587 0.627 0.000\nvt  0.587 0.610 0.000\nvt  0.563 0.608 0.000\nvt  0.565 0.595 0.000\nvt  0.587 0.596 0.000\nvt  0.521 0.441 0.000\nvt  0.526 0.450 0.000\nvt  0.520 0.450 0.000\nvt  0.517 0.445 0.000\nvt  0.720 0.504 0.000\nvt  0.709 0.467 0.000\nvt  0.727 0.446 0.000\nvt  0.738 0.494 0.000\nvt  0.656 0.383 0.000\nvt  0.660 0.348 0.000\nvt  0.684 0.368 0.000\nvt  0.673 0.403 0.000\nvt  0.572 0.371 0.000\nvt  0.573 0.365 0.000\nvt  0.581 0.364 0.000\nvt  0.581 0.374 0.000\nvt  0.708 0.400 0.000\nvt  0.693 0.431 0.000\nvt  0.604 0.401 0.000\nvt  0.609 0.383 0.000\nvt  0.557 0.364 0.000\nvt  0.559 0.365 0.000\nvt  0.557 0.366 0.000\nvt  0.556 0.364 0.000\nvt  0.552 0.367 0.000\nvt  0.552 0.364 0.000\nvt  0.568 0.377 0.000\nvt  0.561 0.374 0.000\nvt  0.566 0.370 0.000\nvt  0.594 0.377 0.000\nvt  0.594 0.363 0.000\nvt  0.653 0.551 0.000\nvt  0.644 0.534 0.000\nvt  0.658 0.523 0.000\nvt  0.666 0.545 0.000\nvt  0.637 0.480 0.000\nvt  0.625 0.458 0.000\nvt  0.649 0.459 0.000\nvt  0.662 0.434 0.000\nvt  0.557 0.345 0.000\nvt  0.553 0.353 0.000\nvt  0.543 0.349 0.000\nvt  0.546 0.337 0.000\nvt  0.586 0.403 0.000\nvt  0.573 0.392 0.000\nvt  0.579 0.382 0.000\nvt  0.591 0.389 0.000\nvt  0.572 0.343 0.000\nvt  0.584 0.331 0.000\nvt  0.590 0.347 0.000\nvt  0.578 0.353 0.000\nvt  0.553 0.358 0.000\nvt  0.543 0.355 0.000\nvt  0.553 0.499 0.000\nvt  0.541 0.507 0.000\nvt  0.542 0.484 0.000\nvt  0.553 0.477 0.000\nvt  0.539 0.532 0.000\nvt  0.529 0.541 0.000\nvt  0.531 0.513 0.000\nvt  0.551 0.538 0.000\nvt  0.538 0.552 0.000\nvt  0.552 0.521 0.000\nvt  0.908 0.437 0.000\nvt  0.876 0.429 0.000\nvt  0.608 0.340 0.000\nvt  0.599 0.314 0.000\nvt  0.629 0.336 0.000\nvt  0.691 0.326 0.000\nvt  0.723 0.365 0.000\nvt  0.748 0.426 0.000\nvt  0.755 0.489 0.000\nvt  0.564 0.825 0.000\nvt  0.590 0.868 0.000\nvt  0.558 0.886 0.000\nvt  0.533 0.834 0.000\nvt  0.637 0.789 0.000\nvt  0.673 0.755 0.000\nvt  0.702 0.774 0.000\nvt  0.665 0.817 0.000\nvt  0.740 0.787 0.000\nvt  0.545 0.727 0.000\nvt  0.540 0.686 0.000\nvt  0.551 0.550 0.000\nvt  0.538 0.572 0.000\nvt  0.520 0.546 0.000\nvt  0.522 0.517 0.000\nvt  0.552 0.775 0.000\nvt  0.524 0.777 0.000\nvt  0.521 0.728 0.000\nvt  0.500 0.687 0.000\nvt  0.500 0.651 0.000\nvt  0.515 0.650 0.000\nvt  0.518 0.687 0.000\nvt  0.500 0.727 0.000\nvt  0.625 0.671 0.000\nvt  0.618 0.644 0.000\nvt  0.591 0.533 0.000\nvt  0.571 0.539 0.000\nvt  0.569 0.527 0.000\nvt  0.589 0.518 0.000\nvt  0.545 0.436 0.000\nvt  0.525 0.427 0.000\nvt  0.528 0.413 0.000\nvt  0.549 0.425 0.000\nvt  0.556 0.449 0.000\nvt  0.563 0.439 0.000\nvt  0.514 0.395 0.000\nvt  0.532 0.396 0.000\nvt  0.513 0.409 0.000\nvt  0.566 0.511 0.000\nvt  0.564 0.490 0.000\nvt  0.577 0.478 0.000\nvt  0.584 0.500 0.000\nvt  0.500 0.408 0.000\nvt  0.500 0.394 0.000\nvt  0.571 0.457 0.000\nvt  0.561 0.468 0.000\nvt  0.554 0.561 0.000\nvt  0.557 0.563 0.000\nvt  0.552 0.569 0.000\nvt  0.548 0.569 0.000\nvt  0.627 0.847 0.000\nvt  0.674 0.871 0.000\nvt  0.645 0.898 0.000\nvt  0.776 0.920 0.000\nvt  0.709 0.921 0.000\nvt  0.729 0.888 0.000\nvt  0.783 0.887 0.000\nvt  0.693 0.947 0.000\nvt  0.621 0.920 0.000\nvt  0.535 0.642 0.000\nvt  0.542 0.618 0.000\nvt  0.545 0.599 0.000\nvt  0.559 0.383 0.000\nvt  0.552 0.377 0.000\nvt  0.531 0.470 0.000\nvt  0.520 0.472 0.000\nvt  0.517 0.456 0.000\nvt  0.528 0.457 0.000\nvt  0.530 0.438 0.000\nvt  0.517 0.436 0.000\nvt  0.528 0.383 0.000\nvt  0.513 0.384 0.000\nvt  0.512 0.374 0.000\nvt  0.526 0.374 0.000\nvt  0.512 0.367 0.000\nvt  0.526 0.366 0.000\nvt  0.512 0.362 0.000\nvt  0.526 0.362 0.000\nvt  0.511 0.422 0.000\nvt  0.500 0.384 0.000\nvt  0.500 0.375 0.000\nvt  0.500 0.362 0.000\nvt  0.500 0.367 0.000\nvt  0.511 0.472 0.000\nvt  0.508 0.457 0.000\nvt  0.521 0.491 0.000\nvt  0.512 0.519 0.000\nvt  0.512 0.491 0.000\nvt  0.511 0.550 0.000\nvt  0.520 0.576 0.000\nvt  0.510 0.583 0.000\nvt  0.500 0.457 0.000\nvt  0.500 0.472 0.000\nvt  0.500 0.491 0.000\nvt  0.654 0.584 0.000\nvt  0.656 0.568 0.000\nvt  0.669 0.567 0.000\nvt  0.666 0.589 0.000\nvt  0.705 0.639 0.000\nvt  0.718 0.591 0.000\nvt  0.684 0.563 0.000\nvt  0.680 0.592 0.000\nvt  0.637 0.575 0.000\nvt  0.636 0.566 0.000\nvt  0.645 0.567 0.000\nvt  0.645 0.579 0.000\nvt  0.723 0.546 0.000\nvt  0.697 0.592 0.000\nvt  0.702 0.554 0.000\nvt  0.500 0.163 0.000\nvt  0.500 0.137 0.000\nvt  0.579 0.298 0.000\nvt  0.570 0.317 0.000\nvt  0.554 0.307 0.000\nvt  0.560 0.287 0.000\nvt  0.534 0.318 0.000\nvt  0.517 0.314 0.000\nvt  0.519 0.296 0.000\nvt  0.538 0.300 0.000\nvt  0.562 0.362 0.000\nvt  0.559 0.363 0.000\nvt  0.557 0.362 0.000\nvt  0.559 0.360 0.000\nvt  0.563 0.365 0.000\nvt  0.561 0.368 0.000\nvt  0.543 0.360 0.000\nvt  0.531 0.358 0.000\nvt  0.531 0.351 0.000\nvt  0.611 0.437 0.000\nvt  0.613 0.475 0.000\nvt  0.624 0.497 0.000\nvt  0.580 0.445 0.000\nvt  0.590 0.466 0.000\nvt  0.598 0.418 0.000\nvt  0.648 0.501 0.000\nvt  0.633 0.516 0.000\nvt  0.641 0.554 0.000\nvt  0.630 0.541 0.000\nvt  0.733 0.331 0.000\nvt  0.696 0.288 0.000\nvt  0.706 0.252 0.000\nvt  0.751 0.313 0.000\nvt  0.683 0.535 0.000\nvt  0.674 0.508 0.000\nvt  0.999 0.696 0.000\nvt  0.986 0.778 0.000\nvt  0.950 0.772 0.000\nvt  0.967 0.695 0.000\nvt  0.600 0.811 0.000\nvt  0.552 0.361 0.000\nvt  0.547 0.367 0.000\nvt  0.546 0.364 0.000\nvt  0.525 0.254 0.000\nvt  0.546 0.261 0.000\nvt  0.542 0.280 0.000\nvt  0.522 0.274 0.000\nvt  0.631 0.369 0.000\nvt  0.678 0.460 0.000\nvt  0.662 0.482 0.000\nvt  0.770 0.948 0.000\nvt  0.762 0.981 0.000\nvt  0.676 0.977 0.000\nvt  0.845 0.915 0.000\nvt  0.835 0.891 0.000\nvt  0.569 0.560 0.000\nvt  0.582 0.558 0.000\nvt  0.580 0.563 0.000\nvt  0.569 0.564 0.000\nvt  0.590 0.544 0.000\nvt  0.571 0.548 0.000\nvt  0.635 0.701 0.000\nvt  0.651 0.731 0.000\nvt  0.607 0.593 0.000\nvt  0.609 0.606 0.000\nvt  0.543 0.570 0.000\nvt  0.553 0.556 0.000\nvt  0.552 0.580 0.000\nvt  0.556 0.574 0.000\nvt  0.569 0.554 0.000\nvt  0.585 0.551 0.000\nvt  0.559 0.566 0.000\nvt  0.550 0.458 0.000\nvt  0.532 0.330 0.000\nvt  0.549 0.325 0.000\nvt  0.610 0.364 0.000\nvt  0.589 0.432 0.000\nvt  0.578 0.417 0.000\nvt  0.570 0.357 0.000\nvt  0.565 0.360 0.000\nvt  0.562 0.356 0.000\nvt  0.565 0.351 0.000\nvt  0.557 0.364 0.000\nvt  0.556 0.364 0.000\nvt  0.548 0.371 0.000\nvt  0.557 0.371 0.000\nvt  0.762 0.385 0.000\nvt  0.513 0.445 0.000\nvt  0.508 0.444 0.000\nvt  0.500 0.520 0.000\nvt  0.939 0.378 0.000\nvt  0.932 0.316 0.000\nvt  0.972 0.321 0.000\nvt  0.974 0.384 0.000\nvt  0.605 0.572 0.000\nvt  0.605 0.578 0.000\nvt  0.605 0.584 0.000\nvt  0.559 0.571 0.000\nvt  0.562 0.333 0.000\nvt  0.500 0.552 0.000\nvt  0.500 0.585 0.000\nvt  0.531 0.343 0.000\nvt  0.514 0.338 0.000\nvt  0.516 0.324 0.000\nvt  0.532 0.488 0.000\nvt  0.534 0.448 0.000\nvt  0.540 0.446 0.000\nvt  0.545 0.448 0.000\nvt  0.538 0.455 0.000\nvt  0.541 0.466 0.000\nvt  0.612 0.623 0.000\nvt  0.567 0.366 0.000\nvt  0.513 0.356 0.000\nvt  0.500 0.355 0.000\nvt  0.500 0.346 0.000\nvt  0.514 0.348 0.000\nvt  0.543 0.363 0.000\nvt  0.552 0.364 0.000\nvt  0.531 0.362 0.000\nvt  0.512 0.361 0.000\nvt  0.509 0.433 0.000\nvt  0.500 0.444 0.000\nvt  0.500 0.432 0.000\nvt  0.603 0.551 0.000\nvt  0.599 0.557 0.000\nvt  0.627 0.570 0.000\nvt  0.631 0.571 0.000\nvt  0.625 0.566 0.000\nvt  0.622 0.569 0.000\nvt  0.621 0.567 0.000\nvt  0.529 0.234 0.000\nvt  0.500 0.249 0.000\nvt  0.500 0.227 0.000\nvt  0.550 0.245 0.000\nvt  0.857 0.816 0.000\nvt  0.825 0.804 0.000\nvt  0.851 0.737 0.000\nvt  0.886 0.748 0.000\nvt  0.821 0.866 0.000\nvt  0.798 0.856 0.000\nvt  0.783 0.797 0.000\nvt  0.810 0.729 0.000\nvt  0.755 0.848 0.000\nvt  0.534 0.215 0.000\nvt  0.563 0.233 0.000\nvt  0.548 0.588 0.000\nvt  0.884 0.835 0.000\nvt  0.908 0.854 0.000\nvt  0.919 0.761 0.000\nvt  0.947 0.512 0.000\nvt  0.944 0.446 0.000\nvt  0.974 0.452 0.000\nvt  0.974 0.519 0.000\nvt  0.915 0.504 0.000\nvt  0.887 0.498 0.000\nvt  0.917 0.564 0.000\nvt  0.890 0.556 0.000\nvt  0.999 0.634 0.000\nvt  0.973 0.633 0.000\nvt  0.975 0.577 0.000\nvt  0.999 0.579 0.000\nvt  0.882 0.614 0.000\nvt  0.911 0.622 0.000\nvt  0.901 0.679 0.000\nvt  0.868 0.671 0.000\nvt  0.833 0.667 0.000\nvt  0.708 0.836 0.000\nvt  0.500 0.205 0.000\nvt  0.826 0.364 0.000\nvt  0.801 0.303 0.000\nvt  0.613 0.529 0.000\nvt  0.607 0.544 0.000\nvt  0.541 0.380 0.000\nvt  0.538 0.372 0.000\nvt  0.537 0.366 0.000\nvt  0.537 0.363 0.000\nvt  0.598 0.945 0.000\nvt  0.524 0.902 0.000\nvt  0.599 0.489 0.000\nvt  0.609 0.563 0.000\nvt  0.596 0.563 0.000\nvt  0.612 0.559 0.000\nvt  0.557 0.569 0.000\nvt  0.620 0.571 0.000\nvt  0.616 0.569 0.000\nvt  0.618 0.569 0.000\nvt  0.569 0.568 0.000\nvt  0.561 0.568 0.000\nvt  0.579 0.567 0.000\nvt  0.616 0.564 0.000\nvt  0.613 0.567 0.000\nvt  0.607 0.567 0.000\nvt  0.587 0.568 0.000\nvt  0.606 0.568 0.000\nvt  0.630 0.565 0.000\nvt  0.548 0.389 0.000\nvt  0.601 0.452 0.000\nvt  0.529 0.566 0.000\nvt  0.684 0.686 0.000\nvt  0.872 0.222 0.000\nvt  0.876 0.265 0.000\nvt  0.825 0.258 0.000\nvt  0.821 0.214 0.000\nvt  0.561 0.119 0.000\nvt  0.500 0.114 0.000\nvt  0.771 0.304 0.000\nvt  0.797 0.363 0.000\nvt  0.726 0.227 0.000\nvt  0.777 0.371 0.000\nvt  0.947 0.571 0.000\nvt  0.999 0.388 0.000\nvt  0.999 0.456 0.000\nvt  0.999 0.524 0.000\nvt  0.936 0.877 0.000\nvt  0.856 0.945 0.000\nvt  0.999 0.323 0.000\nvt  0.935 0.689 0.000\nvt  0.776 0.240 0.000\nvt  0.928 0.265 0.000\nvt  0.969 0.264 0.000\nvt  0.999 0.267 0.000\nvt  0.943 0.628 0.000\nvt  0.806 0.622 0.000\nvt  0.851 0.611 0.000\nvt  0.500 0.777 0.000\nvt  0.500 0.839 0.000\nvt  0.692 0.489 0.000\nvt  0.631 0.558 0.000\nvt  0.622 0.562 0.000\nvt  0.626 0.560 0.000\nvt  0.555 0.413 0.000\nvt  0.570 0.429 0.000\nvt  0.539 0.440 0.000\nvt  0.524 0.607 0.000\nvt  0.531 0.591 0.000\nvt  0.500 0.361 0.000\nvt  0.500 0.321 0.000\nvt  0.500 0.312 0.000\nvt  0.500 0.336 0.000\nvt  0.500 0.294 0.000\nvt  0.500 0.273 0.000\nvt  0.622 0.549 0.000\nvt  0.616 0.554 0.000\nvt  0.607 0.509 0.000\nvt  0.701 0.520 0.000\nvt  0.500 0.421 0.000\nvt  0.564 0.403 0.000\nvt  0.511 0.615 0.000\nvt  0.500 0.618 0.000\nvt  0.617 0.568 0.000\nvt  0.636 0.139 0.000\nvt  0.764 0.192 0.000\nvt  0.921 0.220 0.000\nvt  0.967 0.219 0.000\nvt  0.708 0.168 0.000\nvt  0.999 0.218 0.000\nvt  0.803 0.523 0.000\nvt  0.794 0.535 0.000\nvt  0.783 0.527 0.000\nvt  0.791 0.508 0.000\nvt  0.789 0.571 0.000\nvt  0.797 0.562 0.000\nvt  0.813 0.591 0.000\nvt  0.815 0.578 0.000\nvt  0.839 0.583 0.000\nvt  0.835 0.574 0.000\nvt  0.850 0.569 0.000\nvt  0.845 0.560 0.000\nvt  0.855 0.539 0.000\nvt  0.847 0.535 0.000\nvt  0.850 0.501 0.000\nvt  0.841 0.502 0.000\nvt  0.814 0.438 0.000\nvt  0.836 0.464 0.000\nvt  0.828 0.472 0.000\nvt  0.809 0.452 0.000\nvt  0.792 0.427 0.000\nvt  0.790 0.441 0.000\nvt  0.818 0.567 0.000\nvt  0.807 0.550 0.000\nvt  0.831 0.561 0.000\nvt  0.839 0.553 0.000\nvt  0.837 0.534 0.000\nvt  0.831 0.505 0.000\nvt  0.820 0.479 0.000\nvt  0.804 0.465 0.000\nvt  0.786 0.460 0.000\nvt  0.773 0.456 0.000\nvt  0.779 0.433 0.000\nvt  0.797 0.489 0.000\nvt  0.785 0.495 0.000\nvt  0.789 0.486 0.000\nvt  0.772 0.537 0.000\nvt  0.781 0.583 0.000\nvt  0.812 0.602 0.000\nvt  0.848 0.587 0.000\nvt  0.862 0.546 0.000\nvt  0.859 0.500 0.000\nvt  0.820 0.412 0.000\nvt  0.843 0.450 0.000\nvt  0.791 0.404 0.000\nvt  0.773 0.417 0.000\nvt  0.764 0.447 0.000\nvt  0.801 0.477 0.000\nvt  0.813 0.487 0.000\nvt  0.806 0.496 0.000\nvt  0.787 0.478 0.000\nvt  0.778 0.489 0.000\nvt  0.822 0.538 0.000\nvt  0.822 0.510 0.000\nvt  0.767 0.492 0.000\nvt  0.870 0.496 0.000\nvt  0.851 0.425 0.000\nvt  0.872 0.552 0.000\nvt  0.500 0.183 0.000\nvt  0.516 0.930 0.000\nvt  0.500 0.928 0.000\nvt  0.528 0.934 0.000\nvt  0.537 0.938 0.000\nvt  0.516 0.970 0.000\nvt  0.520 0.955 0.000\nvt  0.530 0.952 0.000\nvt  0.522 0.944 0.000\nvt  0.512 0.942 0.000\nvt  0.615 0.572 0.000\nvt  0.612 0.569 0.000\nvt  0.576 0.968 0.000\nvt  0.573 0.973 0.000\nvt  0.562 0.969 0.000\nvt  0.563 0.961 0.000\nvt  0.571 0.956 0.000\nvt  0.582 0.961 0.000\nvt  0.611 0.961 0.000\nvt  0.606 0.967 0.000\nvt  0.595 0.960 0.000\nvt  0.601 0.955 0.000\nvt  0.570 0.569 0.000\nvt  0.595 0.566 0.000\nvt  0.616 0.967 0.000\nvt  0.617 0.975 0.000\nvt  0.607 0.978 0.000\nvt  0.614 0.982 0.000\nvt  0.605 0.991 0.000\nvt  0.599 0.986 0.000\nvt  0.593 0.996 0.000\nvt  0.589 0.989 0.000\nvt  0.562 0.570 0.000\nvt  0.573 0.994 0.000\nvt  0.579 0.987 0.000\nvt  0.584 0.996 0.000\nvt  0.581 0.953 0.000\nvt  0.592 0.953 0.000\nvt  0.561 0.988 0.000\nvt  0.572 0.981 0.000\nvt  0.563 0.978 0.000\nvt  0.500 0.970 0.000\nvt  0.500 0.943 0.000\nvt  0.511 0.956 0.000\nvt  0.500 0.956 0.000\nvt  0.868 0.132 0.000\nvt  0.867 0.090 0.000\nvt  0.916 0.092 0.000\nvt  0.918 0.133 0.000\nvt  0.554 0.066 0.000\nvt  0.612 0.070 0.000\nvt  0.619 0.103 0.000\nvt  0.558 0.095 0.000\nvt  0.815 0.169 0.000\nvt  0.758 0.148 0.000\nvt  0.747 0.102 0.000\nvt  0.814 0.126 0.000\nvt  0.770 0.072 0.000\nvt  0.817 0.087 0.000\nvt  0.552 0.038 0.000\nvt  0.551 0.020 0.000\nvt  0.602 0.021 0.000\nvt  0.605 0.039 0.000\nvt  0.821 0.050 0.000\nvt  0.867 0.055 0.000\nvt  0.712 0.053 0.000\nvt  0.700 0.022 0.000\nvt  0.739 0.023 0.000\nvt  0.740 0.052 0.000\nvt  0.652 0.022 0.000\nvt  0.659 0.043 0.000\nvt  0.913 0.055 0.000\nvt  0.959 0.055 0.000\nvt  0.960 0.091 0.000\nvt  0.999 0.089 0.000\nvt  0.999 0.131 0.000\nvt  0.962 0.133 0.000\nvt  0.999 0.053 0.000\nvt  0.778 0.038 0.000\nvt  0.917 0.177 0.000\nvt  0.965 0.178 0.000\nvt  0.674 0.083 0.000\nvt  0.685 0.124 0.000\nvt  0.999 0.175 0.000\nvt  0.500 0.037 0.000\nvt  0.500 0.066 0.000\nvt  0.871 0.175 0.000\nvt  0.500 0.019 0.000\nvt  0.500 0.092 0.000\nvt  0.999 0.002 0.000\nvt  0.958 0.002 0.000\nvt  0.867 0.002 0.000\nvt  0.823 0.002 0.000\nvt  0.908 0.002 0.000\nvt  0.601 0.002 0.000\nvt  0.550 0.002 0.000\nvt  0.697 0.002 0.000\nvt  0.650 0.002 0.000\nvt  0.782 0.002 0.000\nvt  0.740 0.002 0.000\nvt  0.500 0.002 0.000\nvt  0.468 0.923 0.000\nvt  0.459 0.929 0.000\nvt  0.458 0.923 0.000\nvt  0.465 0.917 0.000\nvt  0.479 0.984 0.000\nvt  0.495 0.998 0.000\nvt  0.479 0.996 0.000\nvt  0.496 0.917 0.000\nvt  0.485 0.918 0.000\nvt  0.484 0.910 0.000\nvt  0.493 0.910 0.000\nvt  0.477 0.921 0.000\nvt  0.475 0.913 0.000\nvt  0.451 0.958 0.000\nvt  0.450 0.946 0.000\nvt  0.456 0.942 0.000\nvt  0.462 0.954 0.000\nvt  0.455 0.935 0.000\nvt  0.450 0.932 0.000\nvt  0.467 0.967 0.000\nvt  0.453 0.974 0.000\nvt  0.467 0.994 0.000\nvt  0.458 0.987 0.000\nvt  0.384 0.254 0.000\nvt  0.381 0.292 0.000\nvt  0.342 0.307 0.000\nvt  0.347 0.261 0.000\nvt  0.364 0.438 0.000\nvt  0.353 0.414 0.000\nvt  0.373 0.396 0.000\nvt  0.380 0.419 0.000\nvt  0.114 0.312 0.000\nvt  0.156 0.308 0.000\nvt  0.140 0.369 0.000\nvt  0.103 0.370 0.000\nvt  0.260 0.593 0.000\nvt  0.232 0.598 0.000\nvt  0.241 0.541 0.000\nvt  0.259 0.542 0.000\nvt  0.356 0.213 0.000\nvt  0.356 0.174 0.000\nvt  0.434 0.146 0.000\nvt  0.439 0.175 0.000\nvt  0.420 0.254 0.000\nvt  0.435 0.256 0.000\nvt  0.435 0.268 0.000\nvt  0.415 0.277 0.000\nvt  0.456 0.195 0.000\nvt  0.410 0.217 0.000\nvt  0.229 0.721 0.000\nvt  0.206 0.663 0.000\nvt  0.242 0.653 0.000\nvt  0.264 0.712 0.000\nvt  0.331 0.622 0.000\nvt  0.348 0.651 0.000\nvt  0.335 0.669 0.000\nvt  0.315 0.632 0.000\nvt  0.377 0.588 0.000\nvt  0.373 0.599 0.000\nvt  0.361 0.590 0.000\nvt  0.368 0.582 0.000\nvt  0.359 0.632 0.000\nvt  0.343 0.612 0.000\nvt  0.381 0.580 0.000\nvt  0.373 0.576 0.000\nvt  0.377 0.573 0.000\nvt  0.383 0.575 0.000\nvt  0.292 0.702 0.000\nvt  0.271 0.646 0.000\nvt  0.353 0.601 0.000\nvt  0.367 0.614 0.000\nvt  0.396 0.718 0.000\nvt  0.404 0.682 0.000\nvt  0.433 0.686 0.000\nvt  0.426 0.725 0.000\nvt  0.410 0.649 0.000\nvt  0.438 0.648 0.000\nvt  0.416 0.769 0.000\nvt  0.382 0.756 0.000\nvt  0.414 0.587 0.000\nvt  0.414 0.580 0.000\nvt  0.432 0.579 0.000\nvt  0.434 0.586 0.000\nvt  0.431 0.574 0.000\nvt  0.414 0.573 0.000\nvt  0.413 0.627 0.000\nvt  0.438 0.627 0.000\nvt  0.413 0.610 0.000\nvt  0.413 0.596 0.000\nvt  0.435 0.595 0.000\nvt  0.437 0.608 0.000\nvt  0.479 0.441 0.000\nvt  0.483 0.445 0.000\nvt  0.480 0.450 0.000\nvt  0.474 0.450 0.000\nvt  0.280 0.504 0.000\nvt  0.262 0.494 0.000\nvt  0.273 0.446 0.000\nvt  0.291 0.467 0.000\nvt  0.344 0.383 0.000\nvt  0.327 0.403 0.000\nvt  0.316 0.368 0.000\nvt  0.340 0.348 0.000\nvt  0.428 0.371 0.000\nvt  0.419 0.374 0.000\nvt  0.419 0.364 0.000\nvt  0.427 0.365 0.000\nvt  0.307 0.431 0.000\nvt  0.292 0.400 0.000\nvt  0.391 0.383 0.000\nvt  0.396 0.401 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.366 0.000\nvt  0.441 0.365 0.000\nvt  0.448 0.367 0.000\nvt  0.448 0.364 0.000\nvt  0.432 0.377 0.000\nvt  0.434 0.370 0.000\nvt  0.439 0.374 0.000\nvt  0.406 0.377 0.000\nvt  0.406 0.363 0.000\nvt  0.347 0.551 0.000\nvt  0.334 0.545 0.000\nvt  0.342 0.523 0.000\nvt  0.356 0.534 0.000\nvt  0.363 0.480 0.000\nvt  0.351 0.459 0.000\nvt  0.375 0.458 0.000\nvt  0.338 0.434 0.000\nvt  0.443 0.345 0.000\nvt  0.454 0.337 0.000\nvt  0.457 0.349 0.000\nvt  0.447 0.353 0.000\nvt  0.414 0.403 0.000\nvt  0.409 0.389 0.000\nvt  0.421 0.382 0.000\nvt  0.427 0.392 0.000\nvt  0.428 0.343 0.000\nvt  0.422 0.353 0.000\nvt  0.410 0.347 0.000\nvt  0.416 0.331 0.000\nvt  0.457 0.355 0.000\nvt  0.447 0.358 0.000\nvt  0.447 0.499 0.000\nvt  0.447 0.477 0.000\nvt  0.458 0.484 0.000\nvt  0.459 0.507 0.000\nvt  0.461 0.532 0.000\nvt  0.469 0.513 0.000\nvt  0.471 0.541 0.000\nvt  0.449 0.538 0.000\nvt  0.448 0.521 0.000\nvt  0.462 0.552 0.000\nvt  0.124 0.429 0.000\nvt  0.092 0.437 0.000\nvt  0.392 0.340 0.000\nvt  0.371 0.336 0.000\nvt  0.401 0.314 0.000\nvt  0.309 0.326 0.000\nvt  0.252 0.426 0.000\nvt  0.277 0.365 0.000\nvt  0.245 0.489 0.000\nvt  0.436 0.825 0.000\nvt  0.467 0.834 0.000\nvt  0.442 0.886 0.000\nvt  0.410 0.868 0.000\nvt  0.363 0.789 0.000\nvt  0.335 0.817 0.000\nvt  0.298 0.774 0.000\nvt  0.327 0.755 0.000\nvt  0.260 0.787 0.000\nvt  0.460 0.686 0.000\nvt  0.455 0.727 0.000\nvt  0.462 0.572 0.000\nvt  0.449 0.550 0.000\nvt  0.480 0.546 0.000\nvt  0.478 0.517 0.000\nvt  0.479 0.728 0.000\nvt  0.476 0.777 0.000\nvt  0.448 0.775 0.000\nvt  0.482 0.687 0.000\nvt  0.485 0.650 0.000\nvt  0.375 0.671 0.000\nvt  0.382 0.644 0.000\nvt  0.409 0.533 0.000\nvt  0.411 0.518 0.000\nvt  0.431 0.527 0.000\nvt  0.429 0.539 0.000\nvt  0.455 0.436 0.000\nvt  0.451 0.425 0.000\nvt  0.472 0.413 0.000\nvt  0.475 0.427 0.000\nvt  0.444 0.449 0.000\nvt  0.437 0.439 0.000\nvt  0.486 0.395 0.000\nvt  0.487 0.409 0.000\nvt  0.468 0.396 0.000\nvt  0.434 0.511 0.000\nvt  0.416 0.500 0.000\nvt  0.423 0.478 0.000\nvt  0.436 0.490 0.000\nvt  0.429 0.457 0.000\nvt  0.439 0.468 0.000\nvt  0.446 0.561 0.000\nvt  0.452 0.569 0.000\nvt  0.448 0.569 0.000\nvt  0.443 0.563 0.000\nvt  0.373 0.847 0.000\nvt  0.355 0.898 0.000\nvt  0.326 0.871 0.000\nvt  0.224 0.920 0.000\nvt  0.217 0.887 0.000\nvt  0.271 0.888 0.000\nvt  0.291 0.921 0.000\nvt  0.379 0.920 0.000\nvt  0.307 0.947 0.000\nvt  0.465 0.642 0.000\nvt  0.455 0.599 0.000\nvt  0.458 0.618 0.000\nvt  0.448 0.377 0.000\nvt  0.441 0.383 0.000\nvt  0.469 0.470 0.000\nvt  0.472 0.457 0.000\nvt  0.483 0.456 0.000\nvt  0.480 0.472 0.000\nvt  0.470 0.438 0.000\nvt  0.483 0.436 0.000\nvt  0.472 0.383 0.000\nvt  0.474 0.374 0.000\nvt  0.488 0.374 0.000\nvt  0.487 0.384 0.000\nvt  0.474 0.366 0.000\nvt  0.488 0.367 0.000\nvt  0.474 0.362 0.000\nvt  0.488 0.362 0.000\nvt  0.489 0.422 0.000\nvt  0.492 0.457 0.000\nvt  0.489 0.472 0.000\nvt  0.479 0.491 0.000\nvt  0.488 0.491 0.000\nvt  0.488 0.519 0.000\nvt  0.489 0.550 0.000\nvt  0.490 0.583 0.000\nvt  0.480 0.576 0.000\nvt  0.346 0.584 0.000\nvt  0.334 0.589 0.000\nvt  0.331 0.567 0.000\nvt  0.344 0.568 0.000\nvt  0.295 0.639 0.000\nvt  0.282 0.591 0.000\nvt  0.320 0.592 0.000\nvt  0.316 0.563 0.000\nvt  0.363 0.575 0.000\nvt  0.355 0.579 0.000\nvt  0.355 0.567 0.000\nvt  0.364 0.566 0.000\nvt  0.277 0.546 0.000\nvt  0.298 0.554 0.000\nvt  0.303 0.592 0.000\nvt  0.421 0.298 0.000\nvt  0.440 0.287 0.000\nvt  0.446 0.307 0.000\nvt  0.430 0.317 0.000\nvt  0.466 0.318 0.000\nvt  0.462 0.300 0.000\nvt  0.481 0.296 0.000\nvt  0.483 0.314 0.000\nvt  0.438 0.362 0.000\nvt  0.441 0.360 0.000\nvt  0.443 0.362 0.000\nvt  0.441 0.363 0.000\nvt  0.439 0.368 0.000\nvt  0.437 0.365 0.000\nvt  0.469 0.351 0.000\nvt  0.469 0.358 0.000\nvt  0.457 0.360 0.000\nvt  0.389 0.437 0.000\nvt  0.387 0.475 0.000\nvt  0.376 0.497 0.000\nvt  0.420 0.445 0.000\nvt  0.410 0.466 0.000\nvt  0.402 0.418 0.000\nvt  0.352 0.501 0.000\nvt  0.367 0.516 0.000\nvt  0.359 0.554 0.000\nvt  0.370 0.541 0.000\nvt  0.267 0.331 0.000\nvt  0.249 0.313 0.000\nvt  0.294 0.252 0.000\nvt  0.304 0.288 0.000\nvt  0.317 0.535 0.000\nvt  0.326 0.508 0.000\nvt  0.001 0.696 0.000\nvt  0.033 0.695 0.000\nvt  0.050 0.772 0.000\nvt  0.014 0.778 0.000\nvt  0.400 0.811 0.000\nvt  0.448 0.361 0.000\nvt  0.454 0.364 0.000\nvt  0.453 0.367 0.000\nvt  0.475 0.254 0.000\nvt  0.478 0.274 0.000\nvt  0.458 0.280 0.000\nvt  0.454 0.261 0.000\nvt  0.369 0.369 0.000\nvt  0.322 0.460 0.000\nvt  0.338 0.482 0.000\nvt  0.324 0.977 0.000\nvt  0.238 0.981 0.000\nvt  0.230 0.948 0.000\nvt  0.155 0.915 0.000\nvt  0.165 0.891 0.000\nvt  0.431 0.560 0.000\nvt  0.431 0.564 0.000\nvt  0.420 0.563 0.000\nvt  0.418 0.558 0.000\nvt  0.410 0.544 0.000\nvt  0.429 0.548 0.000\nvt  0.349 0.731 0.000\nvt  0.365 0.701 0.000\nvt  0.391 0.606 0.000\nvt  0.393 0.593 0.000\nvt  0.457 0.570 0.000\nvt  0.447 0.556 0.000\nvt  0.444 0.574 0.000\nvt  0.448 0.580 0.000\nvt  0.415 0.551 0.000\nvt  0.431 0.554 0.000\nvt  0.441 0.566 0.000\nvt  0.450 0.458 0.000\nvt  0.451 0.325 0.000\nvt  0.468 0.330 0.000\nvt  0.390 0.364 0.000\nvt  0.411 0.432 0.000\nvt  0.422 0.417 0.000\nvt  0.430 0.357 0.000\nvt  0.435 0.351 0.000\nvt  0.438 0.356 0.000\nvt  0.435 0.360 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.371 0.000\nvt  0.452 0.371 0.000\nvt  0.238 0.385 0.000\nvt  0.487 0.445 0.000\nvt  0.492 0.444 0.000\nvt  0.061 0.378 0.000\nvt  0.026 0.384 0.000\nvt  0.028 0.321 0.000\nvt  0.068 0.316 0.000\nvt  0.395 0.572 0.000\nvt  0.395 0.578 0.000\nvt  0.395 0.584 0.000\nvt  0.441 0.571 0.000\nvt  0.438 0.333 0.000\nvt  0.469 0.343 0.000\nvt  0.486 0.338 0.000\nvt  0.484 0.324 0.000\nvt  0.468 0.488 0.000\nvt  0.466 0.448 0.000\nvt  0.462 0.455 0.000\nvt  0.455 0.448 0.000\nvt  0.460 0.446 0.000\nvt  0.459 0.466 0.000\nvt  0.388 0.623 0.000\nvt  0.433 0.366 0.000\nvt  0.487 0.356 0.000\nvt  0.486 0.348 0.000\nvt  0.457 0.363 0.000\nvt  0.448 0.364 0.000\nvt  0.469 0.362 0.000\nvt  0.488 0.361 0.000\nvt  0.491 0.433 0.000\nvt  0.401 0.557 0.000\nvt  0.397 0.551 0.000\nvt  0.373 0.570 0.000\nvt  0.369 0.571 0.000\nvt  0.375 0.566 0.000\nvt  0.379 0.567 0.000\nvt  0.378 0.569 0.000\nvt  0.471 0.234 0.000\nvt  0.450 0.245 0.000\nvt  0.143 0.816 0.000\nvt  0.114 0.748 0.000\nvt  0.149 0.737 0.000\nvt  0.175 0.804 0.000\nvt  0.202 0.856 0.000\nvt  0.179 0.866 0.000\nvt  0.190 0.729 0.000\nvt  0.217 0.797 0.000\nvt  0.245 0.848 0.000\nvt  0.466 0.215 0.000\nvt  0.437 0.233 0.000\nvt  0.452 0.588 0.000\nvt  0.092 0.854 0.000\nvt  0.116 0.835 0.000\nvt  0.081 0.761 0.000\nvt  0.053 0.512 0.000\nvt  0.026 0.519 0.000\nvt  0.026 0.452 0.000\nvt  0.056 0.446 0.000\nvt  0.113 0.498 0.000\nvt  0.085 0.504 0.000\nvt  0.110 0.556 0.000\nvt  0.083 0.564 0.000\nvt  0.001 0.634 0.000\nvt  0.001 0.579 0.000\nvt  0.025 0.577 0.000\nvt  0.027 0.633 0.000\nvt  0.118 0.614 0.000\nvt  0.132 0.671 0.000\nvt  0.099 0.679 0.000\nvt  0.089 0.622 0.000\nvt  0.167 0.667 0.000\nvt  0.292 0.836 0.000\nvt  0.199 0.303 0.000\nvt  0.174 0.364 0.000\nvt  0.393 0.544 0.000\nvt  0.387 0.529 0.000\nvt  0.459 0.380 0.000\nvt  0.462 0.372 0.000\nvt  0.463 0.366 0.000\nvt  0.463 0.363 0.000\nvt  0.402 0.945 0.000\nvt  0.476 0.902 0.000\nvt  0.401 0.489 0.000\nvt  0.391 0.563 0.000\nvt  0.388 0.559 0.000\nvt  0.404 0.563 0.000\nvt  0.443 0.569 0.000\nvt  0.380 0.571 0.000\nvt  0.382 0.569 0.000\nvt  0.384 0.569 0.000\nvt  0.439 0.568 0.000\nvt  0.431 0.568 0.000\nvt  0.421 0.567 0.000\nvt  0.393 0.567 0.000\nvt  0.387 0.567 0.000\nvt  0.384 0.564 0.000\nvt  0.394 0.568 0.000\nvt  0.413 0.568 0.000\nvt  0.370 0.565 0.000\nvt  0.452 0.389 0.000\nvt  0.399 0.452 0.000\nvt  0.471 0.566 0.000\nvt  0.316 0.686 0.000\nvt  0.128 0.222 0.000\nvt  0.179 0.214 0.000\nvt  0.175 0.258 0.000\nvt  0.124 0.265 0.000\nvt  0.439 0.119 0.000\nvt  0.229 0.304 0.000\nvt  0.203 0.363 0.000\nvt  0.274 0.227 0.000\nvt  0.223 0.371 0.000\nvt  0.053 0.571 0.000\nvt  0.001 0.388 0.000\nvt  0.001 0.456 0.000\nvt  0.001 0.524 0.000\nvt  0.064 0.877 0.000\nvt  0.144 0.945 0.000\nvt  0.001 0.323 0.000\nvt  0.065 0.689 0.000\nvt  0.224 0.240 0.000\nvt  0.072 0.265 0.000\nvt  0.001 0.267 0.000\nvt  0.031 0.264 0.000\nvt  0.057 0.628 0.000\nvt  0.194 0.622 0.000\nvt  0.149 0.611 0.000\nvt  0.308 0.489 0.000\nvt  0.369 0.558 0.000\nvt  0.374 0.560 0.000\nvt  0.378 0.562 0.000\nvt  0.445 0.413 0.000\nvt  0.430 0.429 0.000\nvt  0.461 0.440 0.000\nvt  0.476 0.607 0.000\nvt  0.469 0.591 0.000\nvt  0.378 0.549 0.000\nvt  0.384 0.554 0.000\nvt  0.393 0.509 0.000\nvt  0.299 0.520 0.000\nvt  0.436 0.403 0.000\nvt  0.489 0.615 0.000\nvt  0.383 0.568 0.000\nvt  0.364 0.139 0.000\nvt  0.236 0.192 0.000\nvt  0.033 0.219 0.000\nvt  0.079 0.220 0.000\nvt  0.292 0.168 0.000\nvt  0.001 0.218 0.000\nvt  0.197 0.523 0.000\nvt  0.209 0.508 0.000\nvt  0.217 0.527 0.000\nvt  0.206 0.535 0.000\nvt  0.211 0.571 0.000\nvt  0.203 0.562 0.000\nvt  0.187 0.591 0.000\nvt  0.185 0.578 0.000\nvt  0.161 0.583 0.000\nvt  0.165 0.574 0.000\nvt  0.150 0.569 0.000\nvt  0.155 0.560 0.000\nvt  0.145 0.539 0.000\nvt  0.153 0.535 0.000\nvt  0.150 0.501 0.000\nvt  0.159 0.502 0.000\nvt  0.186 0.438 0.000\nvt  0.191 0.452 0.000\nvt  0.172 0.472 0.000\nvt  0.164 0.464 0.000\nvt  0.208 0.427 0.000\nvt  0.210 0.441 0.000\nvt  0.182 0.567 0.000\nvt  0.193 0.550 0.000\nvt  0.169 0.561 0.000\nvt  0.161 0.553 0.000\nvt  0.163 0.534 0.000\nvt  0.169 0.505 0.000\nvt  0.196 0.465 0.000\nvt  0.180 0.479 0.000\nvt  0.214 0.460 0.000\nvt  0.227 0.456 0.000\nvt  0.221 0.433 0.000\nvt  0.203 0.489 0.000\nvt  0.211 0.486 0.000\nvt  0.215 0.495 0.000\nvt  0.228 0.537 0.000\nvt  0.219 0.583 0.000\nvt  0.188 0.602 0.000\nvt  0.152 0.587 0.000\nvt  0.138 0.546 0.000\nvt  0.141 0.500 0.000\nvt  0.157 0.450 0.000\nvt  0.180 0.412 0.000\nvt  0.209 0.404 0.000\nvt  0.227 0.417 0.000\nvt  0.236 0.447 0.000\nvt  0.194 0.496 0.000\nvt  0.187 0.487 0.000\nvt  0.199 0.477 0.000\nvt  0.213 0.478 0.000\nvt  0.222 0.489 0.000\nvt  0.178 0.538 0.000\nvt  0.178 0.510 0.000\nvt  0.233 0.492 0.000\nvt  0.130 0.496 0.000\nvt  0.149 0.425 0.000\nvt  0.128 0.552 0.000\nvt  0.484 0.930 0.000\nvt  0.472 0.934 0.000\nvt  0.463 0.938 0.000\nvt  0.470 0.952 0.000\nvt  0.480 0.955 0.000\nvt  0.484 0.970 0.000\nvt  0.488 0.942 0.000\nvt  0.478 0.944 0.000\nvt  0.388 0.569 0.000\nvt  0.385 0.572 0.000\nvt  0.424 0.968 0.000\nvt  0.437 0.961 0.000\nvt  0.438 0.969 0.000\nvt  0.427 0.973 0.000\nvt  0.418 0.961 0.000\nvt  0.429 0.956 0.000\nvt  0.389 0.961 0.000\nvt  0.399 0.955 0.000\nvt  0.405 0.960 0.000\nvt  0.394 0.967 0.000\nvt  0.429 0.569 0.000\nvt  0.405 0.566 0.000\nvt  0.393 0.978 0.000\nvt  0.383 0.975 0.000\nvt  0.384 0.967 0.000\nvt  0.401 0.986 0.000\nvt  0.395 0.991 0.000\nvt  0.386 0.982 0.000\nvt  0.411 0.989 0.000\nvt  0.407 0.996 0.000\nvt  0.438 0.570 0.000\nvt  0.427 0.994 0.000\nvt  0.416 0.996 0.000\nvt  0.421 0.987 0.000\nvt  0.419 0.953 0.000\nvt  0.408 0.953 0.000\nvt  0.439 0.988 0.000\nvt  0.428 0.981 0.000\nvt  0.437 0.978 0.000\nvt  0.489 0.956 0.000\nvt  0.132 0.132 0.000\nvt  0.082 0.133 0.000\nvt  0.084 0.092 0.000\nvt  0.133 0.090 0.000\nvt  0.446 0.066 0.000\nvt  0.442 0.095 0.000\nvt  0.381 0.103 0.000\nvt  0.388 0.070 0.000\nvt  0.185 0.169 0.000\nvt  0.186 0.126 0.000\nvt  0.253 0.102 0.000\nvt  0.242 0.148 0.000\nvt  0.230 0.072 0.000\nvt  0.183 0.087 0.000\nvt  0.448 0.038 0.000\nvt  0.395 0.039 0.000\nvt  0.398 0.021 0.000\nvt  0.449 0.020 0.000\nvt  0.133 0.055 0.000\nvt  0.179 0.050 0.000\nvt  0.288 0.053 0.000\nvt  0.260 0.052 0.000\nvt  0.261 0.023 0.000\nvt  0.300 0.022 0.000\nvt  0.341 0.043 0.000\nvt  0.348 0.022 0.000\nvt  0.087 0.055 0.000\nvt  0.040 0.091 0.000\nvt  0.041 0.055 0.000\nvt  0.038 0.133 0.000\nvt  0.001 0.131 0.000\nvt  0.001 0.089 0.000\nvt  0.001 0.053 0.000\nvt  0.222 0.038 0.000\nvt  0.083 0.177 0.000\nvt  0.035 0.178 0.000\nvt  0.326 0.083 0.000\nvt  0.315 0.124 0.000\nvt  0.001 0.175 0.000\nvt  0.129 0.175 0.000\nvt  0.001 0.002 0.000\nvt  0.042 0.002 0.000\nvt  0.133 0.002 0.000\nvt  0.177 0.002 0.000\nvt  0.092 0.002 0.000\nvt  0.399 0.002 0.000\nvt  0.450 0.002 0.000\nvt  0.303 0.002 0.000\nvt  0.350 0.002 0.000\nvt  0.218 0.002 0.000\nvt  0.260 0.002 0.000\nvt  0.558 0.967 0.000\nvt  0.557 0.976 0.000\nvt  0.500 0.997 0.000\nvt  0.588 0.975 0.000\nvt  0.442 0.967 0.000\nvt  0.443 0.976 0.000\nvt  0.412 0.975 0.000\n# 1339 texture vertices\n\nvn  0.001 0.482 -0.876\nvn  -0.001 0.661 0.751\nvn  0.136 0.595 0.792\nvn  -0.203 0.679 0.706\nvn  -0.092 0.474 0.876\nvn  -0.184 0.792 0.581\nvn  -0.098 0.863 0.495\nvn  -0.449 0.820 0.356\nvn  -0.220 0.748 0.626\nvn  -0.560 0.798 -0.222\nvn  -0.233 0.531 -0.815\nvn  0.001 0.534 -0.845\nvn  -0.135 0.596 0.791\nvn  0.203 0.676 0.708\nvn  0.091 0.476 0.875\nvn  0.189 0.792 0.581\nvn  0.099 0.862 0.496\nvn  0.444 0.821 0.360\nvn  0.221 0.747 0.627\nvn  0.556 0.801 -0.221\nvn  0.228 0.532 -0.815\nvn  -0.002 0.536 -0.844\nvn  -0.574 0.744 -0.343\nvn  -0.485 0.523 -0.701\nvn  -0.121 0.869 -0.480\nvn  -0.215 0.930 -0.298\nvn  -0.000 -0.806 -0.591\nvn  -0.277 -0.779 -0.562\nvn  -0.258 -0.731 -0.632\nvn  -0.046 -0.809 -0.586\nvn  -0.210 0.565 -0.798\nvn  -0.094 0.624 -0.775\nvn  0.015 0.952 -0.307\nvn  0.045 0.919 -0.392\nvn  -0.099 0.857 -0.505\nvn  -0.379 0.493 -0.783\nvn  -0.947 0.285 -0.149\nvn  -0.809 -0.421 -0.411\nvn  -0.895 -0.443 -0.043\nvn  -0.999 -0.020 0.035\nvn  -0.359 0.933 -0.019\nvn  -0.809 0.586 0.047\nvn  -0.667 -0.516 -0.538\nvn  -0.726 -0.626 -0.285\nvn  -0.001 0.671 -0.741\nvn  -0.001 0.945 -0.327\nvn  -0.531 -0.632 -0.565\nvn  -0.618 -0.566 -0.546\nvn  0.800 -0.473 0.369\nvn  0.618 -0.771 0.151\nvn  0.693 -0.711 0.116\nvn  0.818 -0.467 0.335\nvn  0.849 -0.259 0.460\nvn  0.775 -0.130 0.619\nvn  0.667 -0.132 0.733\nvn  0.775 -0.270 0.571\nvn  0.958 -0.057 -0.280\nvn  0.763 0.033 -0.646\nvn  0.763 -0.153 -0.628\nvn  0.911 -0.129 -0.391\nvn  0.990 0.067 0.126\nvn  0.979 0.090 0.185\nvn  0.981 0.057 0.184\nvn  0.996 0.020 0.090\nvn  0.770 -0.392 0.504\nvn  0.657 -0.721 0.219\nvn  0.478 -0.656 0.584\nvn  0.599 -0.389 0.700\nvn  0.498 -0.846 0.192\nvn  0.537 -0.840 0.082\nvn  0.740 -0.557 0.378\nvn  0.668 -0.570 0.479\nvn  0.280 -0.914 0.294\nvn  0.421 -0.898 0.126\nvn  0.991 0.084 0.103\nvn  0.964 0.223 0.143\nvn  0.960 0.189 0.207\nvn  0.979 0.103 0.175\nvn  0.868 0.172 0.465\nvn  0.907 0.085 0.413\nvn  0.938 0.144 0.316\nvn  0.897 0.178 0.405\nvn  0.662 -0.174 0.729\nvn  0.583 -0.417 0.697\nvn  0.627 -0.449 0.637\nvn  0.685 -0.405 0.605\nvn  0.827 0.091 0.555\nvn  0.890 0.018 0.455\nvn  0.663 -0.395 0.636\nvn  0.606 -0.428 0.671\nvn  0.313 -0.735 0.602\nvn  -0.136 -0.864 0.485\nvn  0.951 0.158 0.267\nvn  0.964 0.113 0.241\nvn  0.731 -0.036 0.681\nvn  0.819 -0.134 0.558\nvn  0.546 0.270 0.793\nvn  0.602 0.237 0.763\nvn  0.444 0.233 0.865\nvn  0.353 0.173 0.920\nvn  0.240 -0.093 0.966\nvn  0.498 0.051 0.866\nvn  0.675 0.338 0.656\nvn  0.480 0.400 0.780\nvn  0.064 -0.572 0.818\nvn  0.126 -0.313 0.941\nvn  0.207 -0.613 0.763\nvn  0.221 -0.810 0.544\nvn  0.598 -0.694 -0.401\nvn  0.124 -0.977 -0.175\nvn  0.218 -0.333 0.917\nvn  0.377 -0.161 0.912\nvn  0.142 -0.210 0.967\nvn  0.256 -0.155 0.954\nvn  0.111 -0.351 0.930\nvn  0.107 -0.480 0.871\nvn  0.675 -0.732 -0.096\nvn  0.496 -0.844 0.206\nvn  -0.016 -0.986 0.167\nvn  0.304 -0.948 0.097\nvn  0.982 -0.082 0.171\nvn  0.963 -0.002 0.269\nvn  0.967 -0.134 0.216\nvn  0.969 -0.177 0.175\nvn  0.916 -0.244 0.319\nvn  0.853 -0.341 0.394\nvn  0.837 -0.365 0.407\nvn  0.886 -0.281 0.368\nvn  0.422 -0.292 0.858\nvn  0.039 -0.571 0.820\nvn  -0.011 -0.399 0.917\nvn  0.333 -0.349 0.876\nvn  0.935 -0.237 0.263\nvn  0.949 -0.159 0.273\nvn  0.697 -0.213 0.685\nvn  0.568 -0.123 0.814\nvn  -0.938 0.322 0.130\nvn  -0.609 -0.738 -0.291\nvn  -0.447 -0.857 -0.258\nvn  0.259 -0.528 0.809\nvn  0.137 -0.704 0.697\nvn  -0.107 -0.741 0.663\nvn  0.647 -0.296 0.703\nvn  0.603 -0.168 0.780\nvn  0.836 0.072 0.545\nvn  0.744 0.114 0.659\nvn  0.701 0.149 0.698\nvn  0.802 0.157 0.577\nvn  0.823 -0.080 0.562\nvn  0.690 0.142 0.710\nvn  0.628 0.036 0.778\nvn  0.894 -0.247 0.373\nvn  0.624 -0.153 0.766\nvn  0.661 0.110 0.742\nvn  0.712 0.424 0.559\nvn  0.701 0.284 0.654\nvn  0.504 -0.050 0.862\nvn  0.413 0.027 0.910\nvn  0.569 0.046 0.821\nvn  0.488 -0.134 0.862\nvn  0.411 -0.180 0.894\nvn  0.610 -0.024 0.792\nvn  0.747 -0.250 0.616\nvn  0.672 -0.313 0.671\nvn  0.536 0.762 0.363\nvn  0.559 0.768 0.312\nvn  0.802 0.272 0.531\nvn  0.618 0.206 0.759\nvn  0.717 0.383 0.583\nvn  0.780 0.464 0.420\nvn  0.617 0.401 0.678\nvn  0.658 0.397 0.640\nvn  0.672 0.440 0.596\nvn  0.501 0.314 0.807\nvn  0.612 0.527 0.589\nvn  0.679 0.320 0.661\nvn  0.732 -0.406 -0.547\nvn  0.885 -0.261 -0.386\nvn  0.842 -0.347 0.414\nvn  0.782 -0.349 0.517\nvn  0.784 -0.368 0.500\nvn  0.858 -0.453 0.244\nvn  0.953 -0.279 0.118\nvn  0.977 -0.189 0.104\nvn  0.989 -0.110 0.102\nvn  0.142 0.669 0.730\nvn  0.300 0.652 0.696\nvn  0.291 0.792 0.536\nvn  0.143 0.821 0.553\nvn  0.737 0.561 0.378\nvn  0.716 0.470 0.515\nvn  0.884 0.306 0.353\nvn  0.898 0.354 0.263\nvn  0.890 0.423 0.171\nvn  0.174 0.078 0.982\nvn  0.219 0.254 0.942\nvn  0.665 -0.104 0.739\nvn  0.671 0.390 0.631\nvn  0.596 0.435 0.675\nvn  0.636 0.467 0.614\nvn  0.076 0.244 0.967\nvn  0.261 0.437 0.861\nvn  0.107 0.440 0.892\nvn  0.011 0.082 0.997\nvn  0.005 0.082 0.997\nvn  0.028 -0.027 0.999\nvn  0.073 -0.057 0.996\nvn  0.006 0.228 0.974\nvn  0.683 0.140 0.717\nvn  0.724 0.233 0.650\nvn  0.400 0.338 0.852\nvn  0.270 0.126 0.955\nvn  0.357 0.433 0.828\nvn  0.503 0.485 0.716\nvn  0.536 0.133 0.834\nvn  0.416 -0.306 0.856\nvn  0.337 0.097 0.937\nvn  0.262 0.372 0.891\nvn  0.425 0.075 0.902\nvn  0.701 -0.147 0.698\nvn  -0.056 0.558 0.828\nvn  0.005 0.605 0.796\nvn  0.483 0.327 0.812\nvn  0.497 0.276 0.823\nvn  0.505 0.283 0.815\nvn  0.340 -0.030 0.940\nvn  0.332 0.066 0.941\nvn  0.026 0.644 0.765\nvn  0.021 0.538 0.843\nvn  0.170 -0.012 0.985\nvn  0.365 -0.067 0.929\nvn  0.826 -0.173 0.537\nvn  0.320 0.415 0.852\nvn  0.384 0.739 0.554\nvn  0.987 -0.013 0.160\nvn  0.495 0.720 0.487\nvn  0.490 0.830 0.268\nvn  0.279 0.906 0.317\nvn  0.431 0.899 -0.074\nvn  0.267 0.957 -0.112\nvn  0.283 0.953 0.107\nvn  0.471 0.877 0.092\nvn  0.132 0.985 0.113\nvn  0.135 0.931 0.339\nvn  0.190 -0.184 0.964\nvn  0.292 -0.372 0.881\nvn  0.307 -0.447 0.840\nvn  0.393 -0.580 0.713\nvn  0.524 -0.286 0.802\nvn  0.380 -0.582 0.719\nvn  0.697 0.212 0.685\nvn  0.603 0.070 0.795\nvn  0.558 -0.571 0.602\nvn  -0.089 -0.701 0.707\nvn  0.794 -0.345 0.500\nvn  0.345 -0.517 0.783\nvn  0.481 0.101 0.871\nvn  0.134 0.283 0.950\nvn  0.113 -0.558 0.822\nvn  -0.073 -0.993 0.089\nvn  -0.041 -0.994 0.103\nvn  0.084 -0.038 0.996\nvn  -0.012 -0.622 0.783\nvn  -0.002 0.254 0.967\nvn  0.004 -0.997 0.079\nvn  0.001 -0.832 -0.555\nvn  0.477 -0.363 0.801\nvn  0.414 0.160 0.896\nvn  0.395 0.485 0.780\nvn  0.611 0.484 0.627\nvn  0.406 0.510 0.758\nvn  0.375 0.498 0.782\nvn  0.555 0.314 0.770\nvn  0.349 0.411 0.842\nvn  0.012 0.247 0.969\nvn  0.002 -0.369 0.930\nvn  -0.003 0.509 0.861\nvn  0.876 -0.041 0.481\nvn  0.757 -0.214 0.618\nvn  0.737 -0.048 0.674\nvn  0.840 -0.012 0.542\nvn  0.960 0.137 0.243\nvn  0.969 0.103 0.226\nvn  0.909 0.015 0.417\nvn  0.906 0.015 0.423\nvn  0.676 -0.276 0.683\nvn  0.688 -0.223 0.691\nvn  0.691 0.035 0.722\nvn  0.719 -0.082 0.691\nvn  0.964 0.062 0.260\nvn  0.956 0.070 0.286\nvn  0.953 0.037 0.300\nvn  -0.003 -0.415 0.910\nvn  -0.001 -0.380 0.925\nvn  0.658 -0.419 0.625\nvn  0.735 -0.421 0.532\nvn  0.663 -0.303 0.685\nvn  0.550 -0.321 0.771\nvn  0.423 -0.236 0.875\nvn  0.326 -0.294 0.899\nvn  0.124 -0.396 0.910\nvn  0.218 -0.177 0.960\nvn  0.530 0.781 0.331\nvn  0.167 0.827 0.537\nvn  0.094 0.948 0.303\nvn  0.313 0.934 0.171\nvn  -0.406 -0.892 0.201\nvn  -0.743 0.107 0.661\nvn  0.455 0.704 0.546\nvn  0.288 0.957 0.025\nvn  0.245 0.958 0.150\nvn  0.532 -0.027 0.846\nvn  0.566 0.213 0.796\nvn  0.508 0.208 0.836\nvn  0.173 0.028 0.984\nvn  0.371 0.122 0.921\nvn  0.429 -0.045 0.902\nvn  0.614 0.165 0.772\nvn  0.737 0.157 0.657\nvn  0.726 0.057 0.685\nvn  0.662 0.061 0.747\nvn  0.845 -0.523 -0.112\nvn  0.845 -0.501 -0.185\nvn  0.744 -0.668 0.009\nvn  0.773 -0.630 0.079\nvn  0.889 0.108 0.445\nvn  0.899 0.077 0.430\nvn  0.184 0.204 -0.961\nvn  0.005 0.202 -0.979\nvn  -0.000 0.485 -0.875\nvn  0.159 0.484 -0.861\nvn  0.499 0.592 0.633\nvn  0.305 0.950 0.065\nvn  -0.274 -0.953 -0.127\nvn  0.245 -0.456 0.856\nvn  0.083 -0.881 0.465\nvn  0.435 -0.739 0.515\nvn  0.504 -0.429 0.750\nvn  0.818 -0.367 0.443\nvn  0.933 -0.162 0.322\nvn  0.872 0.029 0.489\nvn  0.002 0.994 0.113\nvn  0.133 0.983 -0.126\nvn  -0.001 0.992 -0.127\nvn  0.280 0.892 -0.356\nvn  0.126 0.916 -0.381\nvn  0.210 0.974 -0.083\nvn  -0.082 0.663 0.745\nvn  -0.059 0.391 0.919\nvn  0.111 0.992 -0.055\nvn  0.081 -0.190 0.978\nvn  0.035 0.076 0.996\nvn  0.852 0.236 0.467\nvn  0.775 0.219 0.593\nvn  0.505 -0.109 0.856\nvn  0.446 -0.314 0.838\nvn  0.511 0.200 0.836\nvn  0.623 -0.242 0.744\nvn  0.436 -0.554 0.709\nvn  0.599 -0.742 0.300\nvn  -0.036 0.177 0.984\nvn  -0.039 -0.159 0.987\nvn  0.308 0.942 -0.135\nvn  0.989 0.093 -0.111\nvn  0.477 -0.259 0.840\nvn  0.473 -0.423 0.773\nvn  0.774 -0.329 0.541\nvn  0.285 0.019 0.958\nvn  0.350 0.101 0.931\nvn  0.579 0.261 0.773\nvn  0.298 0.015 0.954\nvn  0.165 0.336 0.927\nvn  0.577 0.511 0.636\nvn  0.254 -0.834 0.490\nvn  -0.114 -0.925 0.363\nvn  0.941 -0.280 -0.188\nvn  0.460 -0.738 0.493\nvn  0.740 -0.635 0.221\nvn  0.003 0.529 0.849\nvn  0.206 -0.427 -0.881\nvn  0.497 -0.316 -0.808\nvn  0.457 -0.144 -0.878\nvn  0.179 -0.244 -0.953\nvn  -0.182 -0.980 -0.078\nvn  0.342 -0.427 0.837\nvn  0.424 -0.296 0.856\nvn  0.896 -0.357 -0.264\nvn  0.594 -0.104 0.798\nvn  0.012 0.528 0.849\nvn  0.042 0.469 0.882\nvn  0.624 0.102 0.775\nvn  0.324 -0.123 0.938\nvn  0.202 -0.638 0.743\nvn  0.714 0.512 0.477\nvn  0.433 -0.511 0.742\nvn  -0.350 -0.708 0.613\nvn  0.095 -0.410 0.907\nvn  0.622 -0.593 0.512\nvn  0.846 0.304 0.437\nvn  0.582 -0.043 0.812\nvn  -0.226 -0.380 0.897\nvn  0.215 0.644 0.734\nvn  0.123 0.952 0.280\nvn  -0.004 0.956 0.293\nvn  -0.005 0.635 0.772\nvn  0.325 -0.730 0.601\nvn  -0.017 -0.840 0.543\nvn  0.017 -0.788 0.616\nvn  0.294 -0.138 0.946\nvn  0.214 0.401 0.891\nvn  -0.150 0.490 0.859\nvn  0.573 -0.125 0.810\nvn  -0.134 0.957 0.258\nvn  0.252 0.828 0.501\nvn  -0.673 0.643 0.364\nvn  0.004 -0.960 0.279\nvn  0.032 -0.991 0.133\nvn  0.006 -0.908 0.419\nvn  0.180 -0.980 0.086\nvn  0.740 0.403 -0.538\nvn  0.627 0.652 -0.426\nvn  0.814 0.561 -0.149\nvn  0.925 0.321 -0.206\nvn  0.492 0.825 -0.280\nvn  0.649 0.757 -0.076\nvn  0.966 0.258 0.022\nvn  0.864 0.501 0.053\nvn  0.680 0.729 0.077\nvn  0.272 -0.962 -0.032\nvn  0.225 -0.968 0.111\nvn  0.288 -0.510 0.810\nvn  0.126 0.748 -0.651\nvn  0.340 0.725 -0.598\nvn  0.421 0.466 -0.778\nvn  0.205 -0.458 -0.865\nvn  0.489 -0.479 -0.729\nvn  0.500 -0.523 -0.690\nvn  0.210 -0.566 -0.798\nvn  0.895 -0.322 -0.309\nvn  0.759 -0.434 -0.485\nvn  0.797 -0.287 -0.532\nvn  0.937 -0.248 -0.245\nvn  -0.001 -0.238 -0.971\nvn  -0.000 -0.025 -1.000\nvn  0.194 -0.025 -0.981\nvn  0.201 -0.248 -0.948\nvn  0.969 0.094 -0.229\nvn  0.968 -0.101 -0.228\nvn  0.814 -0.088 -0.575\nvn  0.800 0.142 -0.583\nvn  0.998 0.061 -0.010\nvn  0.726 0.657 0.205\nvn  0.000 -0.985 0.174\nvn  0.985 -0.166 0.038\nvn  0.955 -0.220 -0.200\nvn  0.472 0.076 0.879\nvn  0.343 -0.235 0.909\nvn  0.464 -0.641 0.612\nvn  0.578 -0.186 0.795\nvn  -0.189 -0.982 0.010\nvn  0.004 0.938 0.345\nvn  0.002 0.829 0.559\nvn  0.445 0.232 0.865\nvn  0.463 0.340 0.818\nvn  -0.116 0.983 0.143\nvn  0.004 0.995 0.102\nvn  0.978 0.204 0.044\nvn  -0.967 -0.216 -0.137\nvn  -0.911 -0.347 0.224\nvn  -0.728 0.350 0.590\nvn  0.426 0.738 -0.523\nvn  0.618 0.786 0.011\nvn  0.151 0.857 -0.493\nvn  -0.333 0.912 -0.241\nvn  -0.277 0.956 0.095\nvn  -0.569 0.822 -0.032\nvn  -0.341 -0.671 -0.658\nvn  0.161 -0.736 -0.657\nvn  0.528 0.432 0.731\nvn  0.586 0.105 0.803\nvn  0.436 0.074 0.897\nvn  0.621 0.267 0.737\nvn  0.936 0.153 0.316\nvn  0.999 -0.010 0.042\nvn  0.826 0.281 -0.489\nvn  0.775 0.178 -0.606\nvn  0.995 -0.039 -0.095\nvn  0.005 -0.414 0.910\nvn  0.580 -0.243 0.778\nvn  0.938 -0.339 -0.068\nvn  0.925 -0.371 0.080\nvn  0.888 -0.269 0.373\nvn  0.923 -0.371 -0.106\nvn  0.494 -0.274 -0.825\nvn  -0.001 -0.456 -0.890\nvn  -0.002 -0.569 -0.822\nvn  -0.001 -0.452 -0.892\nvn  -0.003 0.749 -0.663\nvn  -0.000 0.920 -0.391\nvn  -0.001 -0.280 -0.960\nvn  0.470 0.194 -0.861\nvn  0.965 -0.123 0.234\nvn  0.400 -0.039 -0.916\nvn  0.142 -0.166 -0.976\nvn  -0.000 -0.194 -0.981\nvn  0.497 -0.049 -0.867\nvn  0.998 0.042 0.045\nvn  0.996 -0.037 -0.082\nvn  0.009 0.433 0.901\nvn  0.004 0.669 0.743\nvn  0.955 0.004 0.296\nvn  0.737 -0.001 0.675\nvn  0.707 0.177 0.684\nvn  0.484 0.627 0.610\nvn  0.515 0.250 0.820\nvn  0.360 0.121 0.925\nvn  -0.544 -0.573 0.613\nvn  0.382 -0.114 0.917\nvn  0.489 -0.108 0.866\nvn  -0.002 -0.670 0.742\nvn  0.002 -0.394 0.919\nvn  -0.004 -0.168 0.986\nvn  0.007 -0.109 0.994\nvn  0.009 -0.519 0.855\nvn  0.660 -0.118 0.742\nvn  0.621 -0.127 0.774\nvn  0.416 0.220 0.882\nvn  0.946 0.046 0.322\nvn  0.014 0.006 1.000\nvn  0.569 0.184 0.802\nvn  0.218 0.013 0.976\nvn  0.044 0.087 0.995\nvn  -0.419 0.862 0.284\nvn  0.647 -0.120 0.753\nvn  0.954 -0.017 0.301\nvn  0.352 0.140 -0.926\nvn  0.095 -0.050 -0.994\nvn  0.770 0.025 0.638\nvn  0.000 -0.078 -0.997\nvn  0.985 -0.172 0.009\nvn  0.920 -0.340 0.195\nvn  0.929 -0.331 -0.163\nvn  0.969 -0.237 0.074\nvn  0.969 -0.183 0.165\nvn  0.801 0.160 0.577\nvn  0.954 -0.021 0.301\nvn  0.293 0.803 0.520\nvn  0.977 0.170 0.129\nvn  0.134 0.985 -0.104\nvn  0.994 0.106 -0.036\nvn  0.099 0.675 -0.731\nvn  0.997 -0.079 -0.000\nvn  0.197 0.126 -0.972\nvn  0.978 -0.175 -0.110\nvn  0.110 -0.321 -0.941\nvn  0.939 -0.332 -0.089\nvn  0.400 -0.789 -0.467\nvn  0.171 -0.673 -0.720\nvn  0.931 -0.336 -0.144\nvn  0.854 -0.500 0.146\nvn  0.161 -0.985 -0.069\nvn  0.931 -0.304 -0.200\nvn  0.813 -0.565 -0.143\nvn  0.823 -0.546 0.154\nvn  0.795 -0.387 0.467\nvn  0.809 -0.168 0.563\nvn  0.826 0.053 0.562\nvn  0.925 0.261 0.275\nvn  0.990 0.071 0.119\nvn  0.951 0.129 0.281\nvn  0.810 -0.147 0.568\nvn  0.383 -0.603 0.699\nvn  0.769 0.635 0.079\nvn  0.786 0.352 0.508\nvn  0.919 0.082 -0.386\nvn  0.937 0.163 0.310\nvn  0.974 -0.026 0.224\nvn  0.787 0.550 0.279\nvn  0.517 0.758 -0.397\nvn  0.337 0.112 -0.935\nvn  0.221 -0.300 -0.928\nvn  0.395 -0.578 -0.714\nvn  0.521 -0.711 -0.472\nvn  0.432 -0.901 -0.043\nvn  0.826 -0.520 0.218\nvn  0.885 -0.217 0.412\nvn  0.786 -0.107 0.609\nvn  0.864 0.400 0.304\nvn  0.954 0.061 0.293\nvn  0.949 0.313 0.046\nvn  0.991 0.028 -0.131\nvn  0.945 -0.116 0.305\nvn  0.970 -0.241 0.032\nvn  0.946 -0.038 0.322\nvn  0.886 -0.270 -0.376\nvn  0.855 -0.272 -0.441\nvn  0.952 -0.122 -0.281\nvn  0.002 -0.883 0.469\nvn  -0.001 0.792 -0.611\nvn  -0.180 0.823 -0.539\nvn  -0.642 0.677 -0.360\nvn  -0.957 0.288 -0.031\nvn  -0.912 -0.300 0.281\nvn  -0.454 -0.866 0.207\nvn  -0.855 -0.043 0.517\nvn  -0.834 0.460 0.305\nvn  -0.242 0.911 0.334\nvn  -0.720 -0.667 -0.192\nvn  -0.762 -0.580 -0.288\nvn  0.452 0.774 0.444\nvn  0.857 0.048 0.513\nvn  0.966 0.131 0.225\nvn  0.211 0.953 0.219\nvn  -0.108 0.726 0.679\nvn  0.021 0.946 0.324\nvn  0.566 -0.691 -0.450\nvn  -0.068 0.939 -0.338\nvn  -0.261 -0.298 0.918\nvn  -0.200 -0.891 0.407\nvn  0.124 -0.991 0.059\nvn  0.913 -0.350 -0.211\nvn  0.488 -0.838 0.244\nvn  0.738 -0.593 0.322\nvn  0.994 -0.060 -0.087\nvn  -0.000 -0.981 0.193\nvn  0.000 0.974 0.227\nvn  -0.350 -0.016 0.936\nvn  0.000 -0.017 1.000\nvn  0.252 0.455 -0.854\nvn  0.774 0.620 -0.127\nvn  0.634 0.759 -0.148\nvn  0.192 0.569 -0.800\nvn  0.405 -0.094 0.909\nvn  0.031 0.149 0.988\nvn  0.360 0.283 0.889\nvn  0.469 0.080 0.880\nvn  0.769 0.452 0.452\nvn  0.946 0.185 0.266\nvn  0.893 0.181 0.413\nvn  0.654 0.429 0.623\nvn  0.506 0.610 0.610\nvn  0.436 0.659 0.613\nvn  0.160 0.558 0.814\nvn  -0.285 0.396 0.873\nvn  -0.223 0.539 0.812\nvn  0.037 0.570 0.821\nvn  0.623 0.727 -0.289\nvn  0.456 0.738 0.497\nvn  0.382 0.656 0.651\nvn  0.278 0.687 0.671\nvn  0.213 0.798 0.563\nvn  0.171 0.844 0.508\nvn  0.300 0.690 0.659\nvn  0.144 0.793 0.591\nvn  0.204 0.541 -0.816\nvn  -0.001 0.494 -0.870\nvn  0.029 0.458 -0.888\nvn  0.060 0.366 -0.929\nvn  0.000 0.421 -0.907\nvn  0.000 0.386 -0.922\nvn  0.001 0.455 -0.891\nvn  0.264 0.718 0.644\nvn  0.307 0.317 -0.897\nvn  0.056 0.164 -0.985\nvn  0.717 0.079 0.693\nvn  0.638 0.188 0.746\nvn  0.000 0.202 -0.979\nvn  0.006 -0.044 0.999\nvn  0.001 0.405 0.914\nvn  0.805 0.560 -0.194\nvn  0.002 0.627 0.779\nvn  0.010 -0.298 0.954\nvn  0.124 0.870 -0.477\nvn  0.488 0.530 -0.693\nvn  0.566 0.756 -0.329\nvn  0.213 0.932 -0.294\nvn  0.245 -0.741 -0.626\nvn  0.275 -0.782 -0.559\nvn  0.044 -0.811 -0.584\nvn  -0.012 0.949 -0.315\nvn  0.097 0.621 -0.778\nvn  0.215 0.561 -0.799\nvn  -0.030 0.913 -0.407\nvn  0.378 0.505 -0.776\nvn  0.084 0.865 -0.495\nvn  0.892 -0.451 -0.026\nvn  0.803 -0.447 -0.394\nvn  0.954 0.274 -0.123\nvn  0.998 -0.024 0.066\nvn  0.806 0.588 0.057\nvn  0.351 0.936 -0.012\nvn  0.662 -0.536 -0.524\nvn  0.725 -0.630 -0.278\nvn  0.524 -0.662 -0.536\nvn  0.620 -0.585 -0.522\nvn  -0.694 -0.711 0.115\nvn  -0.621 -0.770 0.148\nvn  -0.805 -0.470 0.362\nvn  -0.819 -0.465 0.335\nvn  -0.680 -0.145 0.719\nvn  -0.763 -0.140 0.631\nvn  -0.840 -0.272 0.470\nvn  -0.773 -0.256 0.580\nvn  -0.763 -0.155 -0.627\nvn  -0.763 0.034 -0.645\nvn  -0.958 -0.057 -0.281\nvn  -0.910 -0.129 -0.393\nvn  -0.983 0.060 0.175\nvn  -0.980 0.096 0.177\nvn  -0.990 0.069 0.123\nvn  -0.996 0.023 0.083\nvn  -0.484 -0.649 0.587\nvn  -0.662 -0.717 0.220\nvn  -0.775 -0.388 0.499\nvn  -0.606 -0.384 0.697\nvn  -0.748 -0.556 0.363\nvn  -0.539 -0.840 0.071\nvn  -0.496 -0.849 0.183\nvn  -0.668 -0.580 0.467\nvn  -0.280 -0.913 0.296\nvn  -0.424 -0.897 0.125\nvn  -0.960 0.187 0.209\nvn  -0.965 0.222 0.143\nvn  -0.991 0.084 0.104\nvn  -0.979 0.104 0.175\nvn  -0.940 0.170 0.295\nvn  -0.909 0.107 0.404\nvn  -0.862 0.204 0.464\nvn  -0.896 0.204 0.395\nvn  -0.570 -0.493 0.658\nvn  -0.531 -0.465 0.709\nvn  -0.651 -0.181 0.737\nvn  -0.688 -0.376 0.620\nvn  -0.892 0.030 0.452\nvn  -0.827 0.122 0.549\nvn  -0.345 -0.706 0.619\nvn  -0.566 -0.461 0.684\nvn  -0.543 -0.393 0.742\nvn  -0.097 -0.841 0.533\nvn  -0.964 0.119 0.237\nvn  -0.950 0.158 0.268\nvn  -0.733 -0.024 0.679\nvn  -0.825 -0.117 0.552\nvn  -0.442 0.232 0.866\nvn  -0.605 0.237 0.760\nvn  -0.556 0.267 0.787\nvn  -0.350 0.172 0.921\nvn  -0.239 -0.096 0.966\nvn  -0.501 0.068 0.863\nvn  -0.679 0.342 0.650\nvn  -0.486 0.403 0.776\nvn  -0.211 -0.600 0.772\nvn  -0.123 -0.334 0.934\nvn  -0.052 -0.530 0.847\nvn  -0.176 -0.798 0.577\nvn  -0.131 -0.968 -0.212\nvn  -0.598 -0.684 -0.418\nvn  -0.205 -0.329 0.922\nvn  -0.374 -0.151 0.915\nvn  -0.117 -0.376 0.919\nvn  -0.246 -0.160 0.956\nvn  -0.126 -0.268 0.955\nvn  -0.137 -0.531 0.837\nvn  0.062 -0.980 0.190\nvn  -0.478 -0.855 0.203\nvn  -0.669 -0.734 -0.114\nvn  -0.286 -0.955 0.083\nvn  -0.967 -0.136 0.215\nvn  -0.965 -0.005 0.263\nvn  -0.983 -0.085 0.164\nvn  -0.969 -0.182 0.170\nvn  -0.840 -0.358 0.408\nvn  -0.857 -0.341 0.386\nvn  -0.910 -0.256 0.326\nvn  -0.884 -0.284 0.371\nvn  0.022 -0.449 0.893\nvn  -0.046 -0.611 0.791\nvn  -0.478 -0.294 0.827\nvn  -0.375 -0.338 0.863\nvn  -0.935 -0.243 0.259\nvn  -0.949 -0.164 0.269\nvn  -0.736 -0.207 0.645\nvn  -0.587 -0.108 0.802\nvn  0.945 0.284 0.163\nvn  0.592 -0.756 -0.279\nvn  0.442 -0.866 -0.236\nvn  -0.053 -0.740 0.670\nvn  -0.228 -0.529 0.817\nvn  0.170 -0.772 0.613\nvn  -0.609 -0.162 0.777\nvn  -0.663 -0.292 0.690\nvn  -0.713 0.145 0.686\nvn  -0.759 0.059 0.648\nvn  -0.825 0.047 0.564\nvn  -0.809 0.158 0.566\nvn  -0.637 0.025 0.770\nvn  -0.687 0.129 0.715\nvn  -0.821 -0.086 0.564\nvn  -0.891 -0.252 0.378\nvn  -0.721 0.489 0.490\nvn  -0.698 0.164 0.697\nvn  -0.646 -0.143 0.750\nvn  -0.712 0.352 0.608\nvn  -0.567 0.074 0.821\nvn  -0.464 0.032 0.885\nvn  -0.518 -0.023 0.855\nvn  -0.550 -0.128 0.825\nvn  -0.756 -0.260 0.601\nvn  -0.645 -0.025 0.764\nvn  -0.437 -0.158 0.885\nvn  -0.687 -0.310 0.657\nvn  -0.541 0.781 0.313\nvn  -0.565 0.780 0.270\nvn  -0.712 0.385 0.587\nvn  -0.611 0.201 0.765\nvn  -0.859 0.335 0.388\nvn  -0.775 0.474 0.417\nvn  -0.673 0.387 0.630\nvn  -0.628 0.400 0.668\nvn  -0.676 0.438 0.592\nvn  -0.698 0.309 0.646\nvn  -0.622 0.535 0.573\nvn  -0.511 0.327 0.795\nvn  -0.733 -0.405 -0.547\nvn  -0.884 -0.261 -0.388\nvn  -0.791 -0.366 0.490\nvn  -0.793 -0.344 0.502\nvn  -0.844 -0.347 0.408\nvn  -0.858 -0.453 0.243\nvn  -0.953 -0.280 0.116\nvn  -0.976 -0.193 0.100\nvn  -0.989 -0.113 0.096\nvn  -0.289 0.792 0.537\nvn  -0.301 0.654 0.693\nvn  -0.134 0.672 0.728\nvn  -0.137 0.821 0.554\nvn  -0.884 0.305 0.354\nvn  -0.716 0.471 0.515\nvn  -0.736 0.562 0.377\nvn  -0.897 0.355 0.265\nvn  -0.890 0.422 0.171\nvn  -0.179 0.082 0.981\nvn  -0.216 0.250 0.944\nvn  -0.661 -0.125 0.740\nvn  -0.679 0.371 0.633\nvn  -0.636 0.460 0.620\nvn  -0.594 0.426 0.682\nvn  -0.258 0.436 0.862\nvn  -0.070 0.240 0.968\nvn  -0.095 0.440 0.893\nvn  -0.011 0.089 0.996\nvn  -0.069 -0.049 0.996\nvn  -0.719 0.247 0.649\nvn  -0.673 0.172 0.719\nvn  -0.353 0.447 0.822\nvn  -0.270 0.134 0.954\nvn  -0.440 0.328 0.836\nvn  -0.511 0.490 0.706\nvn  -0.342 0.114 0.933\nvn  -0.435 -0.298 0.849\nvn  -0.552 0.158 0.818\nvn  -0.273 0.369 0.888\nvn  -0.705 -0.192 0.683\nvn  -0.357 0.088 0.930\nvn  -0.499 0.346 0.795\nvn  0.009 0.585 0.811\nvn  0.086 0.584 0.807\nvn  -0.348 -0.035 0.937\nvn  -0.516 0.299 0.803\nvn  -0.512 0.295 0.806\nvn  -0.339 0.070 0.938\nvn  -0.348 -0.070 0.935\nvn  -0.148 -0.003 0.989\nvn  -0.349 0.750 0.561\nvn  -0.322 0.418 0.849\nvn  -0.890 -0.163 0.425\nvn  -0.990 -0.001 0.144\nvn  -0.500 0.824 0.267\nvn  -0.501 0.717 0.484\nvn  -0.285 0.905 0.315\nvn  -0.282 0.954 0.103\nvn  -0.268 0.957 -0.114\nvn  -0.433 0.898 -0.078\nvn  -0.473 0.876 0.093\nvn  -0.131 0.985 0.111\nvn  -0.127 0.932 0.339\nvn  -0.211 -0.186 0.960\nvn  -0.293 -0.359 0.886\nvn  -0.344 -0.465 0.816\nvn  -0.382 -0.591 0.710\nvn  -0.525 -0.255 0.812\nvn  -0.598 0.089 0.796\nvn  -0.688 0.244 0.683\nvn  -0.344 -0.576 0.742\nvn  -0.544 -0.583 0.603\nvn  0.098 -0.695 0.712\nvn  -0.805 -0.326 0.496\nvn  -0.132 0.306 0.943\nvn  -0.485 0.160 0.860\nvn  -0.351 -0.498 0.793\nvn  -0.141 -0.499 0.855\nvn  0.065 -0.990 0.123\nvn  0.037 -0.989 0.143\nvn  -0.065 -0.055 0.996\nvn  -0.473 -0.369 0.800\nvn  -0.396 0.179 0.900\nvn  -0.600 0.505 0.620\nvn  -0.387 0.499 0.776\nvn  -0.398 0.505 0.766\nvn  -0.358 0.488 0.796\nvn  -0.570 0.304 0.763\nvn  -0.317 0.412 0.854\nvn  -0.742 -0.129 0.658\nvn  -0.771 -0.207 0.602\nvn  -0.881 -0.036 0.472\nvn  -0.841 -0.052 0.538\nvn  -0.972 0.111 0.208\nvn  -0.961 0.151 0.230\nvn  -0.916 -0.004 0.402\nvn  -0.913 0.013 0.408\nvn  -0.689 0.026 0.724\nvn  -0.641 -0.316 0.699\nvn  -0.647 -0.304 0.699\nvn  -0.697 -0.094 0.711\nvn  -0.966 0.063 0.249\nvn  -0.963 0.075 0.259\nvn  -0.958 0.031 0.287\nvn  -0.681 -0.315 0.661\nvn  -0.745 -0.412 0.525\nvn  -0.666 -0.413 0.621\nvn  -0.548 -0.335 0.767\nvn  -0.107 -0.395 0.913\nvn  -0.299 -0.320 0.899\nvn  -0.418 -0.236 0.877\nvn  -0.210 -0.169 0.963\nvn  -0.090 0.952 0.291\nvn  -0.166 0.838 0.520\nvn  -0.523 0.797 0.302\nvn  -0.302 0.941 0.154\nvn  0.408 -0.888 0.211\nvn  0.735 0.117 0.668\nvn  -0.279 0.960 0.001\nvn  -0.468 0.706 0.531\nvn  -0.232 0.964 0.131\nvn  -0.555 -0.033 0.831\nvn  -0.517 0.199 0.833\nvn  -0.549 0.222 0.806\nvn  -0.376 0.125 0.918\nvn  -0.210 0.031 0.977\nvn  -0.435 -0.045 0.899\nvn  -0.739 0.154 0.656\nvn  -0.610 0.153 0.777\nvn  -0.663 0.041 0.748\nvn  -0.733 0.013 0.681\nvn  -0.744 -0.668 0.007\nvn  -0.845 -0.501 -0.187\nvn  -0.845 -0.522 -0.114\nvn  -0.774 -0.629 0.079\nvn  -0.897 0.040 0.440\nvn  -0.896 0.094 0.434\nvn  -0.179 0.204 -0.962\nvn  -0.157 0.488 -0.858\nvn  -0.506 0.590 0.630\nvn  -0.305 0.951 0.047\nvn  0.267 -0.958 -0.102\nvn  -0.432 -0.745 0.509\nvn  -0.075 -0.883 0.463\nvn  -0.236 -0.454 0.859\nvn  -0.504 -0.423 0.753\nvn  -0.821 -0.351 0.449\nvn  -0.876 0.033 0.481\nvn  -0.934 -0.155 0.322\nvn  -0.134 0.983 -0.126\nvn  -0.128 0.916 -0.381\nvn  -0.284 0.891 -0.353\nvn  0.055 0.396 0.917\nvn  0.092 0.644 0.760\nvn  -0.199 0.976 -0.093\nvn  -0.109 0.991 -0.072\nvn  -0.039 0.079 0.996\nvn  -0.081 -0.191 0.978\nvn  -0.854 0.239 0.462\nvn  -0.774 0.223 0.593\nvn  -0.502 -0.119 0.856\nvn  -0.403 -0.420 0.813\nvn  -0.680 -0.255 0.687\nvn  -0.525 0.172 0.834\nvn  -0.376 -0.531 0.759\nvn  -0.576 -0.754 0.316\nvn  0.040 0.159 0.986\nvn  0.036 -0.180 0.983\nvn  -0.308 0.943 -0.129\nvn  -0.983 0.074 -0.170\nvn  -0.456 -0.445 0.771\nvn  -0.476 -0.297 0.828\nvn  -0.788 -0.316 0.528\nvn  -0.393 0.095 0.915\nvn  -0.308 0.018 0.951\nvn  -0.125 0.331 0.935\nvn  -0.283 0.033 0.959\nvn  -0.598 0.322 0.734\nvn  -0.575 0.559 0.598\nvn  -0.216 -0.852 0.476\nvn  0.156 -0.927 0.342\nvn  -0.941 -0.282 -0.189\nvn  -0.739 -0.637 0.221\nvn  -0.469 -0.731 0.495\nvn  -0.458 -0.139 -0.878\nvn  -0.498 -0.315 -0.808\nvn  -0.210 -0.426 -0.880\nvn  -0.182 -0.243 -0.953\nvn  -0.334 -0.402 0.853\nvn  0.221 -0.960 -0.173\nvn  -0.414 -0.366 0.834\nvn  -0.902 -0.373 -0.218\nvn  -0.632 -0.114 0.767\nvn  -0.642 0.122 0.757\nvn  -0.194 -0.651 0.734\nvn  -0.351 -0.095 0.931\nvn  -0.707 0.530 0.467\nvn  -0.087 -0.550 0.831\nvn  0.352 -0.710 0.610\nvn  -0.500 -0.482 0.720\nvn  -0.653 -0.626 0.427\nvn  -0.856 0.328 0.399\nvn  -0.578 -0.029 0.816\nvn  0.275 -0.432 0.859\nvn  -0.123 0.953 0.277\nvn  -0.228 0.657 0.719\nvn  -0.298 -0.735 0.609\nvn  -0.300 -0.179 0.937\nvn  -0.219 0.400 0.890\nvn  -0.587 -0.175 0.791\nvn  0.175 0.460 0.870\nvn  -0.179 0.856 0.485\nvn  0.114 0.959 0.259\nvn  0.664 0.620 0.418\nvn  -0.026 -0.991 0.129\nvn  -0.184 -0.979 0.082\nvn  -0.810 0.566 -0.151\nvn  -0.628 0.654 -0.422\nvn  -0.741 0.405 -0.536\nvn  -0.924 0.322 -0.207\nvn  -0.493 0.823 -0.280\nvn  -0.648 0.758 -0.080\nvn  -0.966 0.258 0.022\nvn  -0.864 0.501 0.051\nvn  -0.679 0.730 0.075\nvn  -0.221 -0.970 0.105\nvn  -0.271 -0.962 -0.038\nvn  -0.376 -0.516 0.769\nvn  -0.124 0.748 -0.652\nvn  -0.339 0.727 -0.598\nvn  -0.420 0.469 -0.777\nvn  -0.500 -0.524 -0.690\nvn  -0.489 -0.481 -0.728\nvn  -0.206 -0.458 -0.865\nvn  -0.212 -0.565 -0.797\nvn  -0.893 -0.325 -0.312\nvn  -0.759 -0.435 -0.485\nvn  -0.796 -0.289 -0.532\nvn  -0.937 -0.249 -0.246\nvn  -0.193 -0.029 -0.981\nvn  -0.202 -0.249 -0.947\nvn  -0.814 -0.090 -0.574\nvn  -0.969 -0.102 -0.227\nvn  -0.969 0.093 -0.229\nvn  -0.801 0.142 -0.581\nvn  -0.998 0.061 -0.010\nvn  -0.718 0.664 0.209\nvn  -0.985 -0.168 0.036\nvn  -0.954 -0.222 -0.201\nvn  -0.451 0.039 0.891\nvn  -0.341 -0.253 0.905\nvn  -0.604 -0.144 0.784\nvn  -0.472 -0.641 0.606\nvn  0.107 -0.991 0.080\nvn  -0.463 0.274 0.843\nvn  -0.002 0.997 0.081\nvn  0.083 0.977 0.195\nvn  -0.466 0.366 0.805\nvn  -0.977 0.200 0.072\nvn  0.916 -0.331 0.226\nvn  0.929 -0.364 -0.067\nvn  0.728 0.359 0.584\nvn  -0.419 0.737 -0.531\nvn  -0.638 0.769 0.043\nvn  -0.146 0.857 -0.494\nvn  0.280 0.954 0.105\nvn  0.343 0.909 -0.237\nvn  0.546 0.838 -0.008\nvn  0.342 -0.678 -0.651\nvn  -0.159 -0.734 -0.660\nvn  -0.545 0.363 0.756\nvn  -0.599 0.165 0.783\nvn  -0.447 0.066 0.892\nvn  -0.645 0.255 0.721\nvn  -0.936 0.164 0.311\nvn  -0.776 0.182 -0.604\nvn  -0.827 0.285 -0.485\nvn  -0.999 -0.012 0.041\nvn  -0.995 -0.037 -0.093\nvn  -0.586 -0.252 0.770\nvn  -0.926 -0.370 0.079\nvn  -0.938 -0.339 -0.067\nvn  -0.889 -0.266 0.372\nvn  -0.922 -0.372 -0.106\nvn  -0.493 -0.275 -0.825\nvn  -0.473 0.194 -0.860\nvn  -0.965 -0.122 0.231\nvn  -0.401 -0.036 -0.915\nvn  -0.143 -0.164 -0.976\nvn  -0.496 -0.052 -0.867\nvn  -0.996 -0.037 -0.083\nvn  -0.998 0.042 0.045\nvn  -0.950 0.012 0.313\nvn  -0.733 -0.008 0.681\nvn  -0.670 0.247 0.700\nvn  -0.408 0.697 0.589\nvn  -0.330 0.155 0.931\nvn  -0.517 0.244 0.821\nvn  0.568 -0.625 0.535\nvn  -0.512 -0.108 0.852\nvn  -0.414 -0.112 0.903\nvn  -0.654 -0.140 0.743\nvn  -0.608 -0.086 0.789\nvn  -0.422 0.215 0.881\nvn  -0.943 0.031 0.332\nvn  -0.549 0.190 0.814\nvn  -0.193 0.018 0.981\nvn  0.358 0.872 0.335\nvn  -0.651 -0.118 0.750\nvn  -0.954 -0.010 0.300\nvn  -0.352 0.145 -0.925\nvn  -0.095 -0.049 -0.994\nvn  -0.769 0.031 0.639\nvn  -0.929 -0.329 -0.171\nvn  -0.923 -0.336 0.190\nvn  -0.985 -0.174 0.005\nvn  -0.970 -0.234 0.068\nvn  -0.801 0.162 0.576\nvn  -0.969 -0.184 0.166\nvn  -0.293 0.803 0.519\nvn  -0.954 -0.019 0.300\nvn  -0.133 0.986 -0.105\nvn  -0.976 0.175 0.130\nvn  -0.098 0.675 -0.732\nvn  -0.993 0.112 -0.041\nvn  -0.197 0.127 -0.972\nvn  -0.997 -0.077 -0.003\nvn  -0.112 -0.322 -0.940\nvn  -0.978 -0.176 -0.109\nvn  -0.171 -0.674 -0.719\nvn  -0.397 -0.789 -0.468\nvn  -0.937 -0.337 -0.091\nvn  -0.929 -0.341 -0.146\nvn  -0.158 -0.985 -0.070\nvn  -0.854 -0.500 0.145\nvn  -0.814 -0.564 -0.141\nvn  -0.931 -0.306 -0.199\nvn  -0.824 -0.545 0.156\nvn  -0.797 -0.383 0.466\nvn  -0.811 -0.165 0.562\nvn  -0.824 0.053 0.564\nvn  -0.926 0.257 0.275\nvn  -0.991 0.062 0.118\nvn  -0.952 0.122 0.281\nvn  -0.383 -0.604 0.699\nvn  -0.810 -0.150 0.567\nvn  -0.784 0.355 0.509\nvn  -0.761 0.645 0.076\nvn  -0.920 0.079 -0.385\nvn  -0.975 -0.023 0.222\nvn  -0.937 0.166 0.308\nvn  -0.787 0.551 0.279\nvn  -0.517 0.758 -0.396\nvn  -0.337 0.112 -0.935\nvn  -0.221 -0.301 -0.928\nvn  -0.395 -0.579 -0.714\nvn  -0.520 -0.711 -0.473\nvn  -0.426 -0.904 -0.044\nvn  -0.824 -0.523 0.219\nvn  -0.886 -0.220 0.409\nvn  -0.863 0.404 0.303\nvn  -0.782 -0.104 0.615\nvn  -0.953 0.066 0.297\nvn  -0.949 0.312 0.046\nvn  -0.991 0.025 -0.134\nvn  -0.944 -0.116 0.308\nvn  -0.971 -0.237 0.041\nvn  -0.947 -0.041 0.318\nvn  -0.854 -0.274 -0.443\nvn  -0.885 -0.271 -0.378\nvn  -0.952 -0.121 -0.282\nvn  0.180 0.824 -0.537\nvn  0.642 0.679 -0.355\nvn  0.956 0.291 -0.021\nvn  0.453 -0.867 0.208\nvn  0.910 -0.301 0.285\nvn  0.854 -0.043 0.518\nvn  0.833 0.459 0.308\nvn  0.241 0.911 0.334\nvn  0.731 -0.650 -0.206\nvn  0.760 -0.585 -0.282\nvn  -0.814 0.019 0.580\nvn  -0.563 0.638 0.526\nvn  -0.925 -0.012 0.381\nvn  -0.214 0.952 0.217\nvn  0.096 0.721 0.686\nvn  -0.027 0.945 0.325\nvn  -0.555 -0.678 -0.481\nvn  0.062 0.937 -0.343\nvn  0.240 -0.291 0.926\nvn  0.184 -0.889 0.419\nvn  -0.126 -0.990 0.061\nvn  -0.889 -0.369 -0.271\nvn  -0.506 -0.832 0.229\nvn  -0.808 -0.443 0.388\nvn  -0.993 -0.084 0.087\nvn  0.350 -0.016 0.937\nvn  -0.636 0.759 -0.140\nvn  -0.771 0.626 -0.115\nvn  -0.250 0.462 -0.851\nvn  -0.192 0.568 -0.801\nvn  -0.359 0.279 0.891\nvn  -0.026 0.144 0.989\nvn  -0.398 -0.100 0.912\nvn  -0.465 0.084 0.881\nvn  -0.895 0.186 0.405\nvn  -0.947 0.184 0.264\nvn  -0.761 0.459 0.458\nvn  -0.657 0.429 0.620\nvn  -0.426 0.660 0.618\nvn  -0.505 0.610 0.611\nvn  0.223 0.536 0.814\nvn  0.285 0.393 0.874\nvn  -0.163 0.555 0.815\nvn  -0.038 0.570 0.821\nvn  -0.628 0.723 -0.288\nvn  -0.458 0.737 0.497\nvn  -0.212 0.799 0.563\nvn  -0.278 0.687 0.672\nvn  -0.380 0.657 0.651\nvn  -0.170 0.846 0.506\nvn  -0.305 0.687 0.660\nvn  -0.144 0.795 0.589\nvn  0.001 0.494 -0.870\nvn  -0.208 0.539 -0.816\nvn  -0.027 0.458 -0.888\nvn  -0.057 0.367 -0.929\nvn  -0.262 0.718 0.645\nvn  -0.054 0.163 -0.985\nvn  -0.306 0.325 -0.895\nvn  -0.643 0.181 0.744\nvn  -0.717 0.083 0.692\nvn  -0.800 0.573 -0.178\nvn  0.296 -0.070 0.953\nvn  -0.319 -0.065 0.946\n# 1258 vertex normals\n\ng head\ns 1\nf 24/1/24 25/2/25 26/3/26\nf 24/1/24 26/3/26 23/4/23\nf 28/5/28 29/6/29 30/7/30\nf 28/5/28 30/7/30 27/8/27\nf 32/9/32 33/10/33 34/11/34\nf 32/9/32 34/11/34 31/12/31\nf 36/13/36 31/12/31 34/11/34\nf 36/13/36 34/11/34 35/14/35\nf 36/13/36 35/14/35 25/2/25\nf 36/13/36 25/2/25 24/1/24\nf 38/15/38 39/16/39 40/17/40\nf 38/15/38 40/17/40 37/18/37\nf 42/19/42 23/4/23 26/3/26\nf 42/19/42 26/3/26 41/20/41\nf 40/17/40 42/19/42 41/20/41\nf 40/17/40 41/20/41 37/18/37\nf 38/15/38 43/21/43 44/22/44\nf 38/15/38 44/22/44 39/16/39\nf 32/9/32 45/23/45 46/24/46\nf 32/9/32 46/24/46 33/10/33\nf 28/5/28 44/22/44 48/25/48\nf 28/5/28 48/25/48 47/26/47\nf 50/27/50 51/28/51 52/29/52\nf 50/27/50 52/29/52 49/30/49\nf 54/31/54 55/32/55 56/33/56\nf 54/31/54 56/33/56 53/34/53\nf 58/35/58 59/36/59 60/37/60\nf 58/35/58 60/37/60 57/38/57\nf 62/39/62 63/40/63 64/41/64\nf 62/39/62 64/41/64 61/42/61\nf 66/43/66 67/44/67 68/45/68\nf 66/43/66 68/45/68 65/46/65\nf 70/47/70 71/48/71 72/49/72\nf 70/47/70 72/49/72 69/50/69\nf 67/44/67 66/43/66 74/51/74\nf 67/44/67 74/51/74 73/52/73\nf 66/43/66 51/28/51 50/27/50\nf 66/43/66 50/27/50 74/51/74\nf 76/53/76 77/54/77 78/55/78\nf 76/53/76 78/55/78 75/56/75\nf 80/57/80 81/58/81 82/59/82\nf 80/57/80 82/59/82 79/60/79\nf 84/61/84 85/62/85 86/63/86\nf 84/61/84 86/63/86 83/64/83\nf 87/65/87 88/66/88 80/57/80\nf 87/65/87 80/57/80 79/60/79\nf 90/67/90 91/68/91 92/69/92\nf 90/67/90 92/69/92 89/70/89\nf 93/71/93 94/72/94 78/55/78\nf 93/71/93 78/55/78 77/54/77\nf 87/65/87 95/73/95 96/74/96\nf 87/65/87 96/74/96 88/66/88\nf 98/75/98 99/76/99 100/77/100\nf 98/75/98 100/77/100 97/78/97\nf 100/77/100 101/79/101 102/80/102\nf 100/77/100 102/80/102 97/78/97\nf 98/75/98 103/81/103 104/82/104\nf 98/75/98 104/82/104 99/76/99\nf 106/83/106 107/84/107 108/85/108\nf 106/83/106 108/85/108 105/86/105\nf 109/87/109 110/88/110 105/86/105\nf 109/87/109 105/86/105 108/85/108\nf 101/79/101 111/89/111 112/90/112\nf 101/79/101 112/90/112 102/80/102\nf 114/91/114 115/92/115 116/93/116\nf 114/91/114 116/93/116 113/94/113\nf 118/95/118 119/96/119 120/97/120\nf 118/95/118 120/97/120 117/98/117\nf 122/99/122 123/100/123 124/101/124\nf 122/99/122 124/101/124 121/102/121\nf 126/103/126 127/104/127 128/105/128\nf 126/103/126 128/105/128 125/106/125\nf 130/107/130 131/108/131 132/109/132\nf 130/107/130 132/109/132 129/110/129\nf 125/106/125 128/105/128 134/111/134\nf 125/106/125 134/111/134 133/112/133\nf 56/33/56 55/32/55 136/113/136\nf 56/33/56 136/113/136 135/114/135\nf 37/115/37 137/116/137 138/117/138\nf 37/115/37 138/117/138 38/118/38\nf 139/119/139 43/120/43 38/118/38\nf 139/119/139 38/118/38 138/117/138\nf 140/121/140 141/122/141 142/123/142\nf 140/121/140 142/123/142 130/107/130\nf 144/124/144 129/110/129 132/109/132\nf 144/124/144 132/109/132 143/125/143\nf 146/126/146 147/127/147 148/128/148\nf 146/126/146 148/128/148 145/129/145\nf 150/130/150 151/131/151 54/31/54\nf 150/130/150 54/31/54 149/132/149\nf 54/31/54 53/34/53 152/133/152\nf 54/31/54 152/133/152 149/132/149\nf 154/134/154 155/135/155 156/136/156\nf 154/134/154 156/136/156 153/137/153\nf 158/138/158 159/139/159 160/140/160\nf 158/138/158 160/140/160 157/141/157\nf 162/142/162 163/143/163 164/144/164\nf 162/142/162 164/144/164 161/145/161\nf 129/110/129 144/124/144 157/141/157\nf 129/110/129 157/141/157 160/140/160\nf 156/136/156 155/135/155 166/146/166\nf 156/136/156 166/146/166 165/147/165\nf 168/148/168 169/149/169 170/150/170\nf 168/148/168 170/150/170 167/151/167\nf 171/152/171 172/153/172 173/154/173\nf 171/152/171 173/154/173 169/149/169\nf 175/155/175 176/156/176 171/152/171\nf 175/155/175 171/152/171 174/157/174\nf 59/36/59 177/158/177 178/159/178\nf 59/36/59 178/159/178 60/37/60\nf 180/160/180 181/161/181 49/30/49\nf 180/160/180 49/30/49 179/162/179\nf 127/104/127 52/29/52 182/163/182\nf 127/104/127 182/163/182 128/105/128\nf 134/111/134 183/164/183 184/165/184\nf 134/111/134 184/165/184 124/101/124\nf 185/166/185 121/102/121 124/101/124\nf 185/166/185 124/101/124 184/165/184\nf 187/167/187 188/168/188 189/169/189\nf 187/167/187 189/169/189 186/170/186\nf 191/171/191 192/172/192 193/173/193\nf 191/171/191 193/173/193 190/174/190\nf 76/53/76 194/175/194 193/173/193\nf 76/53/76 193/173/193 77/54/77\nf 100/77/100 99/76/99 196/176/196\nf 100/77/100 196/176/196 195/177/195\nf 176/156/176 175/155/175 198/178/198\nf 176/156/176 198/178/198 197/179/197\nf 199/180/199 200/181/200 173/154/173\nf 199/180/199 173/154/173 172/153/172\nf 196/176/196 202/182/202 203/183/203\nf 196/176/196 203/183/203 201/184/201\nf 205/185/205 206/186/206 207/187/207\nf 205/185/205 207/187/207 204/188/204\nf 208/189/208 205/185/205 204/188/204\nf 208/189/208 204/188/204 201/184/201\nf 210/190/210 97/78/97 102/80/102\nf 210/190/210 102/80/102 209/191/209\nf 79/60/79 210/190/210 209/191/209\nf 79/60/79 209/191/209 87/65/87\nf 212/192/212 213/193/213 214/194/214\nf 212/192/212 214/194/214 211/195/211\nf 216/196/216 217/197/217 218/198/218\nf 216/196/216 218/198/218 215/199/215\nf 220/200/220 216/196/216 215/199/215\nf 220/200/220 215/199/215 219/201/219\nf 222/202/222 223/203/223 218/198/218\nf 222/202/222 218/198/218 221/204/221\nf 225/205/225 226/206/226 227/207/227\nf 225/205/225 227/207/227 224/208/224\nf 222/202/222 221/204/221 229/209/229\nf 222/202/222 229/209/229 228/210/228\nf 230/211/230 231/212/231 220/200/220\nf 230/211/230 220/200/220 219/201/219\nf 227/207/227 226/206/226 231/212/231\nf 227/207/227 231/212/231 230/211/230\nf 233/213/233 234/214/234 235/215/235\nf 233/213/233 235/215/235 232/216/232\nf 186/170/186 203/183/203 202/182/202\nf 186/170/186 202/182/202 187/167/187\nf 236/217/236 237/218/237 238/219/238\nf 236/217/236 238/219/238 188/168/188\nf 240/220/240 241/221/241 242/222/242\nf 240/220/240 242/222/242 239/223/239\nf 241/221/241 243/224/243 244/225/244\nf 241/221/241 244/225/244 238/219/238\nf 245/226/245 101/79/101 100/77/100\nf 245/226/245 100/77/100 195/177/195\nf 195/177/195 204/188/204 207/187/207\nf 195/177/195 207/187/207 245/226/245\nf 111/89/111 246/227/246 247/228/247\nf 111/89/111 247/228/247 115/92/115\nf 141/122/141 140/121/140 249/229/249\nf 141/122/141 249/229/249 248/230/248\nf 251/231/251 252/232/252 253/233/253\nf 251/231/251 253/233/253 250/234/250\nf 254/235/254 118/95/118 255/236/255\nf 254/235/254 255/236/255 217/197/217\nf 257/237/257 258/238/258 259/239/259\nf 257/237/257 259/239/259 256/240/256\nf 256/240/256 259/239/259 261/241/261\nf 256/240/256 261/241/261 260/242/260\nf 260/242/260 261/241/261 30/243/30\nf 260/242/260 30/243/30 29/244/29\nf 218/198/218 217/197/217 262/245/262\nf 218/198/218 262/245/262 221/204/221\nf 259/239/259 258/238/258 264/246/264\nf 259/239/259 264/246/264 263/247/263\nf 266/248/266 30/243/30 261/241/261\nf 266/248/266 261/241/261 265/249/265\nf 253/233/253 252/232/252 268/250/268\nf 253/233/253 268/250/268 267/251/267\nf 270/252/270 200/181/200 271/253/271\nf 270/252/270 271/253/271 269/254/269\nf 199/180/199 272/255/272 271/253/271\nf 199/180/199 271/253/271 200/181/200\nf 199/180/199 273/256/273 274/257/274\nf 199/180/199 274/257/274 272/255/272\nf 276/258/276 267/251/267 268/250/268\nf 276/258/276 268/250/268 275/259/275\nf 275/259/275 268/250/268 269/254/269\nf 275/259/275 269/254/269 277/260/277\nf 93/71/93 77/54/77 193/173/193\nf 93/71/93 193/173/193 192/172/192\nf 279/261/279 280/262/280 281/263/281\nf 279/261/279 281/263/281 278/264/278\nf 278/264/278 88/66/88 96/74/96\nf 278/264/278 96/74/96 279/261/279\nf 282/265/282 283/266/283 62/39/62\nf 282/265/282 62/39/62 94/72/94\nf 281/263/281 284/267/284 285/268/285\nf 281/263/281 285/268/285 278/264/278\nf 287/269/287 288/270/288 289/271/289\nf 287/269/287 289/271/289 286/272/286\nf 63/40/63 62/39/62 283/266/283\nf 63/40/63 283/266/283 290/273/290\nf 283/266/283 291/274/291 292/275/292\nf 283/266/283 292/275/292 290/273/290\nf 293/276/293 294/277/294 68/45/68\nf 293/276/293 68/45/68 67/44/67\nf 296/278/296 297/279/297 298/280/298\nf 296/278/296 298/280/298 295/281/295\nf 300/282/300 301/283/301 302/284/302\nf 300/282/300 302/284/302 299/285/299\nf 304/286/304 305/287/305 306/288/306\nf 304/286/304 306/288/306 303/289/303\nf 138/117/138 137/116/137 308/290/308\nf 138/117/138 308/290/308 307/291/307\nf 165/147/165 310/292/310 311/293/311\nf 165/147/165 311/293/311 309/294/309\nf 312/295/312 55/32/55 54/31/54\nf 312/295/312 54/31/54 151/131/151\nf 314/296/314 151/131/151 150/130/150\nf 314/296/314 150/130/150 313/297/313\nf 315/298/315 316/299/316 227/207/227\nf 315/298/315 227/207/227 230/211/230\nf 136/113/136 317/300/317 158/138/158\nf 136/113/136 158/138/158 157/141/157\nf 319/301/319 148/128/148 147/127/147\nf 319/301/319 147/127/147 318/302/318\nf 320/303/320 321/304/321 147/127/147\nf 320/303/320 147/127/147 146/126/146\nf 323/305/323 324/306/324 325/307/325\nf 323/305/323 325/307/325 322/308/322\nf 80/57/80 88/66/88 278/264/278\nf 80/57/80 278/264/278 285/268/285\nf 327/309/327 145/129/145 148/128/148\nf 327/309/327 148/128/148 326/310/326\nf 279/261/279 286/272/286 289/271/289\nf 279/261/279 289/271/289 280/262/280\nf 329/311/329 330/312/330 331/313/331\nf 329/311/329 331/313/331 328/314/328\nf 187/167/187 202/182/202 104/82/104\nf 187/167/187 104/82/104 332/315/332\nf 236/217/236 332/315/332 191/171/191\nf 236/217/236 191/171/191 190/174/190\nf 165/147/165 166/146/166 333/316/333\nf 165/147/165 333/316/333 310/292/310\nf 139/119/139 334/317/334 48/318/48\nf 139/119/139 48/318/48 43/120/43\nf 336/319/336 337/320/337 338/321/338\nf 336/319/336 338/321/338 335/322/335\nf 51/28/51 324/306/324 182/163/182\nf 51/28/51 182/163/182 52/29/52\nf 339/323/339 126/103/126 53/34/53\nf 339/323/339 53/34/53 56/33/56\nf 340/324/340 341/325/341 149/132/149\nf 340/324/340 149/132/149 152/133/152\nf 243/224/243 343/326/343 344/327/344\nf 243/224/243 344/327/344 342/328/342\nf 346/329/346 343/326/343 240/220/240\nf 346/329/346 240/220/240 345/330/345\nf 348/331/348 349/332/349 350/333/350\nf 348/331/348 350/333/350 347/334/347\nf 351/335/351 352/336/352 213/193/213\nf 351/335/351 213/193/213 212/192/212\nf 128/105/128 182/163/182 183/164/183\nf 128/105/128 183/164/183 134/111/134\nf 103/81/103 98/75/98 354/337/354\nf 103/81/103 354/337/354 353/338/353\nf 114/91/114 113/94/113 356/339/356\nf 114/91/114 356/339/356 355/340/355\nf 358/341/358 197/179/197 198/178/198\nf 358/341/358 198/178/198 357/342/357\nf 107/84/107 359/343/359 360/344/360\nf 107/84/107 360/344/360 108/85/108\nf 348/331/348 361/345/361 362/346/362\nf 348/331/348 362/346/362 349/332/349\nf 347/334/347 363/347/363 234/214/234\nf 347/334/347 234/214/234 348/331/348\nf 220/200/220 231/212/231 167/151/167\nf 220/200/220 167/151/167 364/348/364\nf 153/137/153 366/349/366 300/282/300\nf 153/137/153 300/282/300 365/350/365\nf 295/281/295 72/49/72 71/48/71\nf 295/281/295 71/48/71 296/278/296\nf 179/162/179 339/323/339 367/351/367\nf 179/162/179 367/351/367 180/160/180\nf 368/352/368 369/353/369 158/138/158\nf 368/352/368 158/138/158 317/300/317\nf 317/300/317 136/113/136 55/32/55\nf 317/300/317 55/32/55 312/295/312\nf 371/354/371 372/355/372 373/356/373\nf 371/354/371 373/356/373 370/357/370\nf 41/358/41 26/359/26 306/288/306\nf 41/358/41 306/288/306 305/287/305\nf 305/287/305 137/116/137 37/115/37\nf 305/287/305 37/115/37 41/358/41\nf 248/230/248 374/360/374 375/361/375\nf 248/230/248 375/361/375 141/122/141\nf 66/43/66 325/307/325 324/306/324\nf 66/43/66 324/306/324 51/28/51\nf 183/164/183 323/305/323 376/362/376\nf 183/164/183 376/362/376 184/165/184\nf 378/363/378 253/233/253 267/251/267\nf 378/363/378 267/251/267 377/364/377\nf 269/254/269 271/253/271 379/365/379\nf 269/254/269 379/365/379 277/260/277\nf 381/366/381 382/367/382 383/368/383\nf 381/366/381 383/368/383 380/369/380\nf 384/370/384 385/371/385 105/86/105\nf 384/370/384 105/86/105 110/88/110\nf 105/86/105 385/371/385 386/372/386\nf 105/86/105 386/372/386 106/83/106\nf 360/344/360 387/373/387 109/87/109\nf 360/344/360 109/87/109 108/85/108\nf 181/161/181 180/160/180 164/144/164\nf 181/161/181 164/144/164 163/143/163\nf 365/350/365 388/374/388 154/134/154\nf 365/350/365 154/134/154 153/137/153\nf 168/148/168 167/151/167 231/212/231\nf 168/148/168 231/212/231 226/206/226\nf 81/58/81 291/274/291 283/266/283\nf 81/58/81 283/266/283 282/265/282\nf 272/255/272 389/375/389 379/365/379\nf 272/255/272 379/365/379 271/253/271\nf 274/257/274 390/376/390 389/375/389\nf 274/257/274 389/375/389 272/255/272\nf 139/119/139 375/361/375 374/360/374\nf 139/119/139 374/360/374 334/317/334\nf 391/377/391 366/349/366 153/137/153\nf 391/377/391 153/137/153 156/136/156\nf 392/378/392 393/379/393 366/349/366\nf 392/378/392 366/349/366 391/377/391\nf 173/154/173 200/181/200 270/252/270\nf 173/154/173 270/252/270 394/380/394\nf 301/283/301 300/282/300 366/349/366\nf 301/283/301 366/349/366 393/379/393\nf 396/381/396 397/382/397 398/383/398\nf 396/381/396 398/383/398 395/384/395\nf 399/385/399 364/348/364 167/151/167\nf 399/385/399 167/151/167 170/150/170\nf 394/380/394 251/231/251 399/385/399\nf 394/380/394 399/385/399 170/150/170\nf 270/252/270 252/232/252 251/231/251\nf 270/252/270 251/231/251 394/380/394\nf 102/80/102 112/90/112 400/386/400\nf 102/80/102 400/386/400 209/191/209\nf 131/108/131 401/387/401 372/355/372\nf 131/108/131 372/355/372 371/354/371\nf 391/377/391 156/136/156 165/147/165\nf 391/377/391 165/147/165 309/294/309\nf 403/388/403 404/389/404 405/390/405\nf 403/388/403 405/390/405 402/391/402\nf 402/391/402 392/378/392 391/377/391\nf 402/391/402 391/377/391 309/294/309\nf 35/392/35 310/292/310 333/316/333\nf 35/392/35 333/316/333 25/393/25\nf 35/392/35 34/394/34 311/293/311\nf 35/392/35 311/293/311 310/292/310\nf 34/394/34 33/395/33 403/388/403\nf 34/394/34 403/388/403 311/293/311\nf 406/396/406 262/245/262 217/197/217\nf 406/396/406 217/197/217 255/236/255\nf 377/364/377 407/397/407 408/398/408\nf 377/364/377 408/398/408 406/396/406\nf 117/98/117 378/363/378 255/236/255\nf 117/98/117 255/236/255 118/95/118\nf 270/252/270 269/254/269 268/250/268\nf 270/252/270 268/250/268 252/232/252\nf 304/286/304 303/289/303 373/356/373\nf 304/286/304 373/356/373 372/355/372\nf 362/346/362 409/399/409 410/400/410\nf 362/346/362 410/400/410 349/332/349\nf 411/401/411 412/402/412 89/70/89\nf 411/401/411 89/70/89 92/69/92\nf 414/403/414 411/401/411 415/404/415\nf 414/403/414 415/404/415 413/405/413\nf 417/406/417 336/319/336 418/407/418\nf 417/406/417 418/407/418 416/408/416\nf 337/320/337 419/409/419 69/50/69\nf 337/320/337 69/50/69 72/49/72\nf 421/410/421 422/411/422 423/412/423\nf 421/410/421 423/412/423 420/413/420\nf 421/410/421 424/414/424 425/415/425\nf 421/410/421 425/415/425 422/411/422\nf 423/412/423 422/411/422 427/416/427\nf 423/412/423 427/416/427 426/417/426\nf 239/223/239 242/222/242 428/418/428\nf 239/223/239 428/418/428 425/415/425\nf 430/419/430 73/52/73 74/51/74\nf 430/419/430 74/51/74 429/420/429\nf 70/47/70 69/50/69 419/409/419\nf 70/47/70 419/409/419 429/420/429\nf 247/228/247 431/421/431 116/93/116\nf 247/228/247 116/93/116 115/92/115\nf 346/329/346 345/330/345 433/422/433\nf 346/329/346 433/422/433 432/423/432\nf 433/422/433 421/410/421 420/413/420\nf 433/422/433 420/413/420 434/424/434\nf 436/425/436 437/426/437 438/427/438\nf 436/425/436 438/427/438 435/428/435\nf 437/426/437 381/366/381 380/369/380\nf 437/426/437 380/369/380 438/427/438\nf 178/159/178 177/158/177 440/429/440\nf 178/159/178 440/429/440 439/430/439\nf 440/429/440 441/431/441 442/432/442\nf 440/429/440 442/432/442 439/430/439\nf 444/433/444 445/434/445 446/435/446\nf 444/433/444 446/435/446 443/436/443\nf 324/306/324 323/305/323 183/164/183\nf 324/306/324 183/164/183 182/163/182\nf 213/193/213 352/336/352 357/342/357\nf 213/193/213 357/342/357 198/178/198\nf 214/194/214 175/155/175 174/157/174\nf 214/194/214 174/157/174 225/205/225\nf 448/437/448 449/438/449 450/439/450\nf 448/437/448 450/439/450 447/440/447\nf 423/412/423 426/417/426 451/441/451\nf 423/412/423 451/441/451 447/440/447\nf 75/56/75 451/441/451 426/417/426\nf 75/56/75 426/417/426 76/53/76\nf 78/55/78 94/72/94 62/39/62\nf 78/55/78 62/39/62 61/42/61\nf 286/272/286 86/63/86 85/62/85\nf 286/272/286 85/62/85 287/269/287\nf 95/73/95 87/65/87 209/191/209\nf 95/73/95 209/191/209 400/386/400\nf 237/218/237 452/442/452 428/418/428\nf 237/218/237 428/418/428 242/222/242\nf 190/174/190 193/173/193 194/175/194\nf 190/174/190 194/175/194 452/442/452\nf 237/218/237 236/217/236 190/174/190\nf 237/218/237 190/174/190 452/442/452\nf 79/60/79 82/59/82 354/337/354\nf 79/60/79 354/337/354 210/190/210\nf 286/272/286 279/261/279 96/74/96\nf 286/272/286 96/74/96 86/63/86\nf 430/419/430 417/406/417 416/408/416\nf 430/419/430 416/408/416 453/443/453\nf 338/321/338 295/281/295 298/280/298\nf 338/321/338 298/280/298 299/285/299\nf 57/38/57 60/37/60 455/444/455\nf 57/38/57 455/444/455 454/445/454\nf 212/192/212 456/446/456 457/447/457\nf 212/192/212 457/447/457 351/335/351\nf 83/64/83 355/340/355 356/339/356\nf 83/64/83 356/339/356 84/61/84\nf 142/123/142 141/122/141 375/361/375\nf 142/123/142 375/361/375 307/291/307\nf 401/387/401 142/123/142 307/291/307\nf 401/387/401 307/291/307 308/290/308\nf 459/448/459 257/237/257 256/240/256\nf 459/448/459 256/240/256 458/449/458\nf 228/210/228 264/246/264 258/238/258\nf 228/210/228 258/238/258 222/202/222\nf 256/240/256 260/242/260 460/450/460\nf 256/240/256 460/450/460 458/449/458\nf 460/450/460 260/242/260 29/244/29\nf 460/450/460 29/244/29 47/451/47\nf 263/247/263 265/249/265 261/241/261\nf 263/247/263 261/241/261 259/239/259\nf 461/452/461 462/453/462 189/169/189\nf 461/452/461 189/169/189 244/225/244\nf 227/207/227 316/299/316 463/454/463\nf 227/207/227 463/454/463 224/208/224\nf 465/455/465 466/456/466 410/400/410\nf 465/455/465 410/400/410 464/457/464\nf 90/67/90 386/372/386 385/371/385\nf 90/67/90 385/371/385 91/68/91\nf 233/213/233 361/345/361 348/331/348\nf 233/213/233 348/331/348 234/214/234\nf 235/215/235 234/214/234 363/347/363\nf 235/215/235 363/347/363 467/458/467\nf 338/321/338 337/320/337 72/49/72\nf 338/321/338 72/49/72 295/281/295\nf 338/321/338 299/285/299 302/284/302\nf 338/321/338 302/284/302 335/322/335\nf 468/459/468 469/460/469 470/461/470\nf 468/459/468 470/461/470 415/404/415\nf 347/334/347 471/462/471 472/463/472\nf 347/334/347 472/463/472 363/347/363\nf 471/462/471 347/334/347 350/333/350\nf 471/462/471 350/333/350 473/464/473\nf 465/455/465 475/465/475 476/466/476\nf 465/455/465 476/466/476 474/467/474\nf 384/370/384 110/88/110 478/468/478\nf 384/370/384 478/468/478 477/469/477\nf 414/403/414 479/470/479 412/402/412\nf 414/403/414 412/402/412 411/401/411\nf 288/270/288 287/269/287 412/402/412\nf 288/270/288 412/402/412 479/470/479\nf 85/62/85 84/61/84 90/67/90\nf 85/62/85 90/67/90 89/70/89\nf 386/372/386 356/339/356 113/94/113\nf 386/372/386 113/94/113 106/83/106\nf 232/216/232 358/341/358 357/342/357\nf 232/216/232 357/342/357 233/213/233\nf 297/279/297 296/278/296 181/161/181\nf 297/279/297 181/161/181 163/143/163\nf 419/409/419 337/320/337 336/319/336\nf 419/409/419 336/319/336 417/406/417\nf 49/30/49 52/29/52 127/104/127\nf 49/30/49 127/104/127 179/162/179\nf 26/359/26 25/393/25 333/316/333\nf 26/359/26 333/316/333 306/288/306\nf 371/354/371 370/357/370 162/142/162\nf 371/354/371 162/142/162 161/145/161\nf 258/238/258 257/237/257 223/203/223\nf 258/238/258 223/203/223 222/202/222\nf 257/237/257 459/448/459 480/471/480\nf 257/237/257 480/471/480 223/203/223\nf 211/195/211 214/194/214 225/205/225\nf 211/195/211 225/205/225 224/208/224\nf 316/299/316 481/472/481 314/296/314\nf 316/299/316 314/296/314 463/454/463\nf 171/152/171 169/149/169 168/148/168\nf 171/152/171 168/148/168 174/157/174\nf 273/256/273 199/180/199 172/153/172\nf 273/256/273 172/153/172 482/473/482\nf 168/148/168 226/206/226 225/205/225\nf 168/148/168 225/205/225 174/157/174\nf 245/226/245 246/227/246 111/89/111\nf 245/226/245 111/89/111 101/79/101\nf 114/91/114 112/90/112 111/89/111\nf 114/91/114 111/89/111 115/92/115\nf 210/190/210 354/337/354 98/75/98\nf 210/190/210 98/75/98 97/78/97\nf 431/421/431 358/341/358 232/216/232\nf 431/421/431 232/216/232 359/343/359\nf 235/215/235 360/344/360 359/343/359\nf 235/215/235 359/343/359 232/216/232\nf 360/344/360 235/215/235 467/458/467\nf 360/344/360 467/458/467 387/373/387\nf 81/58/81 282/265/282 483/474/483\nf 81/58/81 483/474/483 82/59/82\nf 485/475/485 486/476/486 487/477/487\nf 485/475/485 487/477/487 484/478/484\nf 489/479/489 68/45/68 294/277/294\nf 489/479/489 294/277/294 488/480/488\nf 491/481/491 454/445/454 455/444/455\nf 491/481/491 455/444/455 490/482/490\nf 154/134/154 370/357/370 373/356/373\nf 154/134/154 373/356/373 155/135/155\nf 491/481/491 322/308/322 325/307/325\nf 491/481/491 325/307/325 492/483/492\nf 491/481/491 490/482/490 493/484/493\nf 491/481/491 493/484/493 322/308/322\nf 436/425/436 435/428/435 446/435/446\nf 436/425/436 446/435/446 494/485/494\nf 495/486/495 496/487/496 438/427/438\nf 495/486/495 438/427/438 380/369/380\nf 496/487/496 497/488/497 435/428/435\nf 496/487/496 435/428/435 438/427/438\nf 331/313/331 330/312/330 498/489/498\nf 331/313/331 498/489/498 432/423/432\nf 499/490/499 346/329/346 432/423/432\nf 499/490/499 432/423/432 498/489/498\nf 380/369/380 383/368/383 500/491/500\nf 380/369/380 500/491/500 495/486/495\nf 501/492/501 328/314/328 331/313/331\nf 501/492/501 331/313/331 434/424/434\nf 499/490/499 344/327/344 343/326/343\nf 499/490/499 343/326/343 346/329/346\nf 492/483/492 502/493/502 454/445/454\nf 492/483/492 454/445/454 491/481/491\nf 454/445/454 502/493/502 487/477/487\nf 454/445/454 487/477/487 57/38/57\nf 486/476/486 58/35/58 57/38/57\nf 486/476/486 57/38/57 487/477/487\nf 58/35/58 486/476/486 503/494/503\nf 58/35/58 503/494/503 382/367/382\nf 383/368/383 504/495/504 505/496/505\nf 383/368/383 505/496/505 500/491/500\nf 447/440/447 450/439/450 420/413/420\nf 447/440/447 420/413/420 423/412/423\nf 329/311/329 328/314/328 445/434/445\nf 329/311/329 445/434/445 444/433/444\nf 450/439/450 449/438/449 506/497/506\nf 450/439/450 506/497/506 501/492/501\nf 507/498/507 508/499/508 451/441/451\nf 507/498/507 451/441/451 75/56/75\nf 99/76/99 104/82/104 202/182/202\nf 99/76/99 202/182/202 196/176/196\nf 509/500/509 208/189/208 201/184/201\nf 509/500/509 201/184/201 203/183/203\nf 201/184/201 204/188/204 195/177/195\nf 201/184/201 195/177/195 196/176/196\nf 462/453/462 510/501/510 186/170/186\nf 462/453/462 186/170/186 189/169/189\nf 203/183/203 186/170/186 510/501/510\nf 203/183/203 510/501/510 509/500/509\nf 148/128/148 319/301/319 341/325/341\nf 148/128/148 341/325/341 326/310/326\nf 326/310/326 341/325/341 340/324/340\nf 326/310/326 340/324/340 511/502/511\nf 123/100/123 511/502/511 340/324/340\nf 123/100/123 340/324/340 133/112/133\nf 71/48/71 49/30/49 181/161/181\nf 71/48/71 181/161/181 296/278/296\nf 154/134/154 388/374/388 162/142/162\nf 154/134/154 162/142/162 370/357/370\nf 155/135/155 373/356/373 303/289/303\nf 155/135/155 303/289/303 166/146/166\nf 166/146/166 303/289/303 306/288/306\nf 166/146/166 306/288/306 333/316/333\nf 512/503/512 320/303/320 289/271/289\nf 512/503/512 289/271/289 288/270/288\nf 479/470/479 414/403/414 514/504/514\nf 479/470/479 514/504/514 513/505/513\nf 414/403/414 413/405/413 475/465/475\nf 414/403/414 475/465/475 514/504/514\nf 513/505/513 512/503/512 288/270/288\nf 513/505/513 288/270/288 479/470/479\nf 191/171/191 103/81/103 353/338/353\nf 191/171/191 353/338/353 192/172/192\nf 332/315/332 104/82/104 103/81/103\nf 332/315/332 103/81/103 191/171/191\nf 82/59/82 483/474/483 353/338/353\nf 82/59/82 353/338/353 354/337/354\nf 83/64/83 86/63/86 96/74/96\nf 83/64/83 96/74/96 95/73/95\nf 83/64/83 95/73/95 400/386/400\nf 83/64/83 400/386/400 355/340/355\nf 355/340/355 400/386/400 112/90/112\nf 355/340/355 112/90/112 114/91/114\nf 144/124/144 135/114/135 136/113/136\nf 144/124/144 136/113/136 157/141/157\nf 298/280/298 365/350/365 300/282/300\nf 298/280/298 300/282/300 299/285/299\nf 298/280/298 297/279/297 388/374/388\nf 298/280/298 388/374/388 365/350/365\nf 367/351/367 143/125/143 164/144/164\nf 367/351/367 164/144/164 180/160/180\nf 515/506/515 516/507/516 219/201/219\nf 515/506/515 219/201/219 215/199/215\nf 254/235/254 217/197/217 216/196/216\nf 254/235/254 216/196/216 517/508/517\nf 398/383/398 364/348/364 399/385/399\nf 398/383/398 399/385/399 395/384/395\nf 398/383/398 397/382/397 517/508/517\nf 398/383/398 517/508/517 216/196/216\nf 518/509/518 519/510/519 246/227/246\nf 518/509/518 246/227/246 245/226/245\nf 319/301/319 150/130/150 149/132/149\nf 319/301/319 149/132/149 341/325/341\nf 429/420/429 419/409/419 417/406/417\nf 429/420/429 417/406/417 430/419/430\nf 33/395/33 46/511/46 404/389/404\nf 33/395/33 404/389/404 403/388/403\nf 403/388/403 402/391/402 309/294/309\nf 403/388/403 309/294/309 311/293/311\nf 393/379/393 520/512/520 521/513/521\nf 393/379/393 521/513/521 301/283/301\nf 522/514/522 520/512/520 393/379/393\nf 522/514/522 393/379/393 392/378/392\nf 302/284/302 301/283/301 521/513/521\nf 302/284/302 521/513/521 523/515/523\nf 302/284/302 523/515/523 524/516/524\nf 302/284/302 524/516/524 335/322/335\nf 321/304/321 456/446/456 318/302/318\nf 321/304/321 318/302/318 147/127/147\nf 456/446/456 321/304/321 525/517/525\nf 456/446/456 525/517/525 457/447/457\nf 410/400/410 409/399/409 526/518/526\nf 410/400/410 526/518/526 464/457/464\nf 410/400/410 466/456/466 350/333/350\nf 410/400/410 350/333/350 349/332/349\nf 456/446/456 212/192/212 211/195/211\nf 456/446/456 211/195/211 527/519/527\nf 211/195/211 224/208/224 463/454/463\nf 211/195/211 463/454/463 527/519/527\nf 407/397/407 377/364/377 267/251/267\nf 407/397/407 267/251/267 276/258/276\nf 378/363/378 377/364/377 406/396/406\nf 378/363/378 406/396/406 255/236/255\nf 175/155/175 214/194/214 213/193/213\nf 175/155/175 213/193/213 198/178/198\nf 386/372/386 90/67/90 84/61/84\nf 386/372/386 84/61/84 356/339/356\nf 409/399/409 362/346/362 351/335/351\nf 409/399/409 351/335/351 457/447/457\nf 85/62/85 89/70/89 412/402/412\nf 85/62/85 412/402/412 287/269/287\nf 361/345/361 233/213/233 357/342/357\nf 361/345/361 357/342/357 352/336/352\nf 116/93/116 431/421/431 359/343/359\nf 116/93/116 359/343/359 107/84/107\nf 116/93/116 107/84/107 106/83/106\nf 116/93/116 106/83/106 113/94/113\nf 352/336/352 351/335/351 362/346/362\nf 352/336/352 362/346/362 361/345/361\nf 513/505/513 514/504/514 464/457/464\nf 513/505/513 464/457/464 526/518/526\nf 526/518/526 409/399/409 457/447/457\nf 526/518/526 457/447/457 525/517/525\nf 514/504/514 475/465/475 465/455/465\nf 514/504/514 465/455/465 464/457/464\nf 358/341/358 431/421/431 247/228/247\nf 358/341/358 247/228/247 197/179/197\nf 176/156/176 482/473/482 172/153/172\nf 176/156/176 172/153/172 171/152/171\nf 396/381/396 395/384/395 250/234/250\nf 396/381/396 250/234/250 119/96/119\nf 395/384/395 399/385/399 251/231/251\nf 395/384/395 251/231/251 250/234/250\nf 291/274/291 81/58/81 80/57/80\nf 291/274/291 80/57/80 285/268/285\nf 284/267/284 292/275/292 291/274/291\nf 284/267/284 291/274/291 285/268/285\nf 528/520/528 327/309/327 326/310/326\nf 528/520/528 326/310/326 511/502/511\nf 126/103/126 125/106/125 152/133/152\nf 126/103/126 152/133/152 53/34/53\nf 152/133/152 125/106/125 133/112/133\nf 152/133/152 133/112/133 340/324/340\nf 127/104/127 126/103/126 339/323/339\nf 127/104/127 339/323/339 179/162/179\nf 56/33/56 135/114/135 367/351/367\nf 56/33/56 367/351/367 339/323/339\nf 124/101/124 123/100/123 133/112/133\nf 124/101/124 133/112/133 134/111/134\nf 143/125/143 367/351/367 135/114/135\nf 143/125/143 135/114/135 144/124/144\nf 164/144/164 143/125/143 132/109/132\nf 164/144/164 132/109/132 161/145/161\nf 401/387/401 131/108/131 130/107/130\nf 401/387/401 130/107/130 142/123/142\nf 292/275/292 528/520/528 122/99/122\nf 292/275/292 122/99/122 290/273/290\nf 61/42/61 507/498/507 75/56/75\nf 61/42/61 75/56/75 78/55/78\nf 320/303/320 512/503/512 525/517/525\nf 320/303/320 525/517/525 321/304/321\nf 512/503/512 513/505/513 526/518/526\nf 512/503/512 526/518/526 525/517/525\nf 123/100/123 122/99/122 528/520/528\nf 123/100/123 528/520/528 511/502/511\nf 262/245/262 529/521/529 229/209/229\nf 262/245/262 229/209/229 221/204/221\nf 316/299/316 315/298/315 368/352/368\nf 316/299/316 368/352/368 481/472/481\nf 516/507/516 315/298/315 230/211/230\nf 516/507/516 230/211/230 219/201/219\nf 515/506/515 530/522/530 369/353/369\nf 515/506/515 369/353/369 516/507/516\nf 530/522/530 515/506/515 223/203/223\nf 530/522/530 223/203/223 480/471/480\nf 215/199/215 218/198/218 223/203/223\nf 215/199/215 223/203/223 515/506/515\nf 459/448/459 458/449/458 374/360/374\nf 459/448/459 374/360/374 248/230/248\nf 458/449/458 460/450/460 334/317/334\nf 458/449/458 334/317/334 374/360/374\nf 334/317/334 460/450/460 47/451/47\nf 334/317/334 47/451/47 48/318/48\nf 459/448/459 248/230/248 249/229/249\nf 459/448/459 249/229/249 480/471/480\nf 253/233/253 120/97/120 119/96/119\nf 253/233/253 119/96/119 250/234/250\nf 394/380/394 170/150/170 169/149/169\nf 394/380/394 169/149/169 173/154/173\nf 519/510/519 482/473/482 176/156/176\nf 519/510/519 176/156/176 197/179/197\nf 518/509/518 273/256/273 482/473/482\nf 518/509/518 482/473/482 519/510/519\nf 531/523/531 274/257/274 273/256/273\nf 531/523/531 273/256/273 518/509/518\nf 532/524/532 390/376/390 274/257/274\nf 532/524/532 274/257/274 531/523/531\nf 343/326/343 243/224/243 241/221/241\nf 343/326/343 241/221/241 240/220/240\nf 188/168/188 238/219/238 244/225/244\nf 188/168/188 244/225/244 189/169/189\nf 187/167/187 332/315/332 236/217/236\nf 187/167/187 236/217/236 188/168/188\nf 447/440/447 451/441/451 508/499/508\nf 447/440/447 508/499/508 448/437/448\nf 162/142/162 388/374/388 297/279/297\nf 162/142/162 297/279/297 163/143/163\nf 392/378/392 402/391/402 405/390/405\nf 392/378/392 405/390/405 522/514/522\nf 533/525/533 413/405/413 415/404/415\nf 533/525/533 415/404/415 470/461/470\nf 534/526/534 65/46/65 68/45/68\nf 534/526/534 68/45/68 489/479/489\nf 502/493/502 535/527/535 484/478/484\nf 502/493/502 484/478/484 487/477/487\nf 503/494/503 536/528/536 537/529/537\nf 503/494/503 537/529/537 504/495/504\nf 492/483/492 538/530/538 535/527/535\nf 492/483/492 535/527/535 502/493/502\nf 492/483/492 325/307/325 66/43/66\nf 492/483/492 66/43/66 65/46/65\nf 504/495/504 537/529/537 539/531/539\nf 504/495/504 539/531/539 505/496/505\nf 239/223/239 424/414/424 345/330/345\nf 239/223/239 345/330/345 240/220/240\nf 59/36/59 58/35/58 382/367/382\nf 59/36/59 382/367/382 381/366/381\nf 432/423/432 433/422/433 434/424/434\nf 432/423/432 434/424/434 331/313/331\nf 437/426/437 436/425/436 440/429/440\nf 437/426/437 440/429/440 177/158/177\nf 381/366/381 437/426/437 177/158/177\nf 381/366/381 177/158/177 59/36/59\nf 449/438/449 441/431/441 494/485/494\nf 449/438/449 494/485/494 506/497/506\nf 450/439/450 501/492/501 434/424/434\nf 450/439/450 434/424/434 420/413/420\nf 382/367/382 503/494/503 504/495/504\nf 382/367/382 504/495/504 383/368/383\nf 501/492/501 506/497/506 445/434/445\nf 501/492/501 445/434/445 328/314/328\nf 536/528/536 503/494/503 486/476/486\nf 536/528/536 486/476/486 485/475/485\nf 313/297/313 150/130/150 319/301/319\nf 313/297/313 319/301/319 318/302/318\nf 327/309/327 284/267/284 281/263/281\nf 327/309/327 281/263/281 145/129/145\nf 483/474/483 93/71/93 192/172/192\nf 483/474/483 192/172/192 353/338/353\nf 483/474/483 282/265/282 94/72/94\nf 483/474/483 94/72/94 93/71/93\nf 422/411/422 425/415/425 428/418/428\nf 422/411/422 428/418/428 427/416/427\nf 421/410/421 433/422/433 345/330/345\nf 421/410/421 345/330/345 424/414/424\nf 463/454/463 314/296/314 313/297/313\nf 463/454/463 313/297/313 527/519/527\nf 315/298/315 516/507/516 369/353/369\nf 315/298/315 369/353/369 368/352/368\nf 314/296/314 481/472/481 312/295/312\nf 314/296/314 312/295/312 151/131/151\nf 368/352/368 317/300/317 312/295/312\nf 368/352/368 312/295/312 481/472/481\nf 369/353/369 530/522/530 159/139/159\nf 369/353/369 159/139/159 158/138/158\nf 480/471/480 249/229/249 159/139/159\nf 480/471/480 159/139/159 530/522/530\nf 262/245/262 406/396/406 408/398/408\nf 262/245/262 408/398/408 529/521/529\nf 398/383/398 216/196/216 220/200/220\nf 398/383/398 220/200/220 364/348/364\nf 541/532/541 542/533/542 543/534/543\nf 541/532/541 543/534/543 540/535/540\nf 545/536/545 543/534/543 542/533/542\nf 545/536/545 542/533/542 544/537/544\nf 547/538/547 545/536/545 544/537/544\nf 547/538/547 544/537/544 546/539/546\nf 549/540/549 547/538/547 546/539/546\nf 549/540/549 546/539/546 548/541/548\nf 551/542/551 549/540/549 548/541/548\nf 551/542/551 548/541/548 550/543/550\nf 553/544/553 551/542/551 550/543/550\nf 553/544/553 550/543/550 552/545/552\nf 555/546/555 553/544/553 552/545/552\nf 555/546/555 552/545/552 554/547/554\nf 557/548/557 558/549/558 559/550/559\nf 557/548/557 559/550/559 556/551/556\nf 561/552/561 557/548/557 556/551/556\nf 561/552/561 556/551/556 560/553/560\nf 563/554/563 546/539/546 544/537/544\nf 563/554/563 544/537/544 562/555/562\nf 564/556/564 548/541/548 546/539/546\nf 564/556/564 546/539/546 563/554/563\nf 565/557/565 550/543/550 548/541/548\nf 565/557/565 548/541/548 564/556/564\nf 566/558/566 552/545/552 550/543/550\nf 566/558/566 550/543/550 565/557/565\nf 552/545/552 566/558/566 567/559/567\nf 552/545/552 567/559/567 554/547/554\nf 559/550/559 568/560/568 569/561/569\nf 559/550/559 569/561/569 556/551/556\nf 570/562/570 560/553/560 556/551/556\nf 570/562/570 556/551/556 569/561/569\nf 571/563/571 572/564/572 560/553/560\nf 571/563/571 560/553/560 570/562/570\nf 574/565/574 540/535/540 575/566/575\nf 574/565/574 575/566/575 573/567/573\nf 577/568/577 543/534/543 545/536/545\nf 577/568/577 545/536/545 576/569/576\nf 545/536/545 547/538/547 578/570/578\nf 545/536/545 578/570/578 576/569/576\nf 579/571/579 578/570/578 547/538/547\nf 579/571/579 547/538/547 549/540/549\nf 580/572/580 579/571/579 551/542/551\nf 580/572/580 551/542/551 553/544/553\nf 580/572/580 553/544/553 555/546/555\nf 580/572/580 555/546/555 581/573/581\nf 558/549/558 557/548/557 583/574/583\nf 558/549/558 583/574/583 582/575/582\nf 561/552/561 584/576/584 583/574/583\nf 561/552/561 583/574/583 557/548/557\nf 561/552/561 572/564/572 585/577/585\nf 561/552/561 585/577/585 584/576/584\nf 571/563/571 586/578/586 585/577/585\nf 571/563/571 585/577/585 572/564/572\nf 544/537/544 542/533/542 541/532/541\nf 544/537/544 541/532/541 562/555/562\nf 574/565/574 588/579/588 589/580/589\nf 574/565/574 589/580/589 587/581/587\nf 574/565/574 573/567/573 590/582/590\nf 574/565/574 590/582/590 588/579/588\nf 590/582/590 573/567/573 575/566/575\nf 590/582/590 575/566/575 591/583/591\nf 575/566/575 540/535/540 543/534/543\nf 575/566/575 543/534/543 591/583/591\nf 564/556/564 592/584/592 566/558/566\nf 564/556/564 566/558/566 565/557/565\nf 592/584/592 593/585/593 567/559/567\nf 592/584/592 567/559/567 566/558/566\nf 568/560/568 559/550/559 554/547/554\nf 568/560/568 554/547/554 567/559/567\nf 554/547/554 559/550/559 558/549/558\nf 554/547/554 558/549/558 555/546/555\nf 582/575/582 581/573/581 555/546/555\nf 582/575/582 555/546/555 558/549/558\nf 592/584/592 564/556/564 563/554/563\nf 592/584/592 563/554/563 562/555/562\nf 589/580/589 568/560/568 567/559/567\nf 589/580/589 567/559/567 593/585/593\nf 540/535/540 574/565/574 587/581/587\nf 540/535/540 587/581/587 541/532/541\nf 571/563/571 570/562/570 590/582/590\nf 571/563/571 590/582/590 591/583/591\nf 589/580/589 588/579/588 569/561/569\nf 589/580/589 569/561/569 568/560/568\nf 543/534/543 577/568/577 594/586/594\nf 543/534/543 594/586/594 591/583/591\nf 594/586/594 586/578/586 571/563/571\nf 594/586/594 571/563/571 591/583/591\nf 596/587/596 581/573/581 582/575/582\nf 596/587/596 582/575/582 595/588/595\nf 596/587/596 597/589/597 580/572/580\nf 596/587/596 580/572/580 581/573/581\nf 583/574/583 490/482/490 455/444/455\nf 583/574/583 455/444/455 595/588/595\nf 583/574/583 584/576/584 493/484/493\nf 583/574/583 493/484/493 490/482/490\nf 597/589/597 508/499/508 579/571/579\nf 597/589/597 579/571/579 580/572/580\nf 442/432/442 448/437/448 508/499/508\nf 442/432/442 508/499/508 597/589/597\nf 60/37/60 178/159/178 595/588/595\nf 60/37/60 595/588/595 455/444/455\nf 178/159/178 439/430/439 596/587/596\nf 178/159/178 596/587/596 595/588/595\nf 577/568/577 64/41/64 185/166/185\nf 577/568/577 185/166/185 594/586/594\nf 586/578/586 184/165/184 376/362/376\nf 586/578/586 376/362/376 585/577/585\nf 590/582/590 570/562/570 569/561/569\nf 590/582/590 569/561/569 588/579/588\nf 61/42/61 576/569/576 578/570/578\nf 61/42/61 578/570/578 507/498/507\nf 585/577/585 376/362/376 493/484/493\nf 585/577/585 493/484/493 584/576/584\nf 453/443/453 598/590/598 73/52/73\nf 453/443/453 73/52/73 430/419/430\nf 519/510/519 197/179/197 247/228/247\nf 519/510/519 247/228/247 246/227/246\nf 281/263/281 280/262/280 146/126/146\nf 281/263/281 146/126/146 145/129/145\nf 64/41/64 63/40/63 121/102/121\nf 64/41/64 121/102/121 185/166/185\nf 284/267/284 327/309/327 528/520/528\nf 284/267/284 528/520/528 292/275/292\nf 290/273/290 122/99/122 121/102/121\nf 290/273/290 121/102/121 63/40/63\nf 280/262/280 289/271/289 320/303/320\nf 280/262/280 320/303/320 146/126/146\nf 184/165/184 586/578/586 594/586/594\nf 184/165/184 594/586/594 185/166/185\nf 253/233/253 378/363/378 117/98/117\nf 253/233/253 117/98/117 120/97/120\nf 249/229/249 140/121/140 160/140/160\nf 249/229/249 160/140/160 159/139/159\nf 129/110/129 160/140/160 140/121/140\nf 129/110/129 140/121/140 130/107/130\nf 161/145/161 132/109/132 131/108/131\nf 161/145/161 131/108/131 371/354/371\nf 313/297/313 318/302/318 456/446/456\nf 313/297/313 456/446/456 527/519/527\nf 492/483/492 65/46/65 534/526/534\nf 492/483/492 534/526/534 538/530/538\nf 441/431/441 449/438/449 448/437/448\nf 441/431/441 448/437/448 442/432/442\nf 443/436/443 446/435/446 435/428/435\nf 443/436/443 435/428/435 497/488/497\nf 446/435/446 445/434/445 506/497/506\nf 446/435/446 506/497/506 494/485/494\nf 441/431/441 440/429/440 436/425/436\nf 441/431/441 436/425/436 494/485/494\nf 596/587/596 439/430/439 442/432/442\nf 596/587/596 442/432/442 597/589/597\nf 577/568/577 576/569/576 61/42/61\nf 577/568/577 61/42/61 64/41/64\nf 238/219/238 237/218/237 242/222/242\nf 238/219/238 242/222/242 241/221/241\nf 194/175/194 76/53/76 426/417/426\nf 194/175/194 426/417/426 427/416/427\nf 452/442/452 194/175/194 427/416/427\nf 452/442/452 427/416/427 428/418/428\nf 461/452/461 244/225/244 243/224/243\nf 461/452/461 243/224/243 342/328/342\nf 508/499/508 507/498/507 578/570/578\nf 508/499/508 578/570/578 579/571/579\nf 245/226/245 207/187/207 531/523/531\nf 245/226/245 531/523/531 518/509/518\nf 206/186/206 532/524/532 531/523/531\nf 206/186/206 531/523/531 207/187/207\nf 32/9/32 31/12/31 600/591/600\nf 32/9/32 600/591/600 599/592/599\nf 601/593/601 600/591/600 36/13/36\nf 601/593/601 36/13/36 24/1/24\nf 602/594/602 601/593/601 24/1/24\nf 602/594/602 24/1/24 23/4/23\nf 40/17/40 602/594/602 23/4/23\nf 40/17/40 23/4/23 42/19/42\nf 44/22/44 604/595/604 605/596/605\nf 44/22/44 605/596/605 603/597/603\nf 39/16/39 603/597/603 602/594/602\nf 39/16/39 602/594/602 40/17/40\nf 601/593/601 606/598/606 607/599/607\nf 601/593/601 607/599/607 600/591/600\nf 468/459/468 608/600/608 609/601/609\nf 468/459/468 609/601/609 469/460/469\nf 477/469/477 609/601/609 608/600/608\nf 477/469/477 608/600/608 384/370/384\nf 610/602/610 611/603/611 612/604/612\nf 610/602/610 612/604/612 472/605/472\nf 610/602/610 472/605/472 471/606/471\nf 610/602/610 471/606/471 613/607/613\nf 476/608/476 614/609/614 615/610/615\nf 476/608/476 615/610/615 474/611/474\nf 478/468/478 110/88/110 109/87/109\nf 478/468/478 109/87/109 616/612/616\nf 466/456/466 465/455/465 474/467/474\nf 466/456/466 474/467/474 617/613/617\nf 466/456/466 617/613/617 473/464/473\nf 466/456/466 473/464/473 350/333/350\nf 614/609/614 533/614/533 470/615/470\nf 614/609/614 470/615/470 618/616/618\nf 475/465/475 413/405/413 533/525/533\nf 475/465/475 533/525/533 476/466/476\nf 618/616/618 469/617/469 609/618/609\nf 618/616/618 609/618/609 619/619/619\nf 619/619/619 609/618/609 477/620/477\nf 619/619/619 477/620/477 620/621/620\nf 387/373/387 621/622/621 616/612/616\nf 387/373/387 616/612/616 109/87/109\nf 616/623/616 622/624/622 620/621/620\nf 616/623/616 620/621/620 478/625/478\nf 473/626/473 617/627/617 615/610/615\nf 473/626/473 615/610/615 613/607/613\nf 621/628/621 623/629/623 622/624/622\nf 621/628/621 622/624/622 616/623/616\nf 624/630/624 612/604/612 611/603/611\nf 624/630/624 611/603/611 623/629/623\nf 49/30/49 71/48/71 70/47/70\nf 49/30/49 70/47/70 50/27/50\nf 336/319/336 335/322/335 524/516/524\nf 336/319/336 524/516/524 418/407/418\nf 598/590/598 293/276/293 67/44/67\nf 598/590/598 67/44/67 73/52/73\nf 50/27/50 70/47/70 429/420/429\nf 50/27/50 429/420/429 74/51/74\nf 322/308/322 493/484/493 376/362/376\nf 322/308/322 376/362/376 323/305/323\nf 589/580/589 593/585/593 592/584/592\nf 589/580/589 592/584/592 587/581/587\nf 396/381/396 119/96/119 118/95/118\nf 396/381/396 118/95/118 254/235/254\nf 517/508/517 397/382/397 396/381/396\nf 517/508/517 396/381/396 254/235/254\nf 28/5/28 27/8/27 625/631/625\nf 28/5/28 625/631/625 604/595/604\nf 600/591/600 607/599/607 626/632/626\nf 600/591/600 626/632/626 599/592/599\nf 607/599/607 627/633/627 628/634/628\nf 607/599/607 628/634/628 626/632/626\nf 604/595/604 625/631/625 628/634/628\nf 604/595/604 628/634/628 627/633/627\nf 630/635/630 631/636/631 632/637/632\nf 630/635/630 632/637/632 629/638/629\nf 634/639/634 635/640/635 636/641/636\nf 634/639/634 636/641/636 633/642/633\nf 638/643/638 639/644/639 640/645/640\nf 638/643/638 640/645/640 637/646/637\nf 641/647/641 642/648/642 637/646/637\nf 641/647/641 637/646/637 640/645/640\nf 644/649/644 645/650/645 646/651/646\nf 644/649/644 646/651/646 643/652/643\nf 631/636/631 642/648/642 648/653/648\nf 631/636/631 648/653/648 647/654/647\nf 650/655/650 651/656/651 652/657/652\nf 650/655/650 652/657/652 649/658/649\nf 643/652/643 646/651/646 654/659/654\nf 643/652/643 654/659/654 653/660/653\nf 654/659/654 651/656/651 650/655/650\nf 654/659/654 650/655/650 653/660/653\nf 655/661/655 656/662/656 657/663/657\nf 655/661/655 657/663/657 632/637/632\nf 657/663/657 659/664/659 660/665/660\nf 657/663/657 660/665/660 658/666/658\nf 661/667/661 659/664/659 657/663/657\nf 661/667/661 657/663/657 656/662/656\nf 631/636/631 647/654/647 655/661/655\nf 631/636/631 655/661/655 632/637/632\nf 637/646/637 642/648/642 631/636/631\nf 637/646/637 631/636/631 630/635/630\nf 640/645/640 650/655/650 649/658/649\nf 640/645/640 649/658/649 641/647/641\nf 652/657/652 662/668/662 641/647/641\nf 652/657/652 641/647/641 649/658/649\nf 648/653/648 642/648/642 641/647/641\nf 648/653/648 641/647/641 662/668/662\nf 663/669/663 664/670/664 537/529/537\nf 663/669/663 537/529/537 536/528/536\nf 666/671/666 640/645/640 639/644/639\nf 666/671/666 639/644/639 665/672/665\nf 666/671/666 665/672/665 636/641/636\nf 666/671/666 636/641/636 635/640/635\nf 667/673/667 539/531/539 537/529/537\nf 667/673/667 537/529/537 664/670/664\nf 634/639/634 644/649/644 643/652/643\nf 634/639/634 643/652/643 635/640/635\nf 653/660/653 650/655/650 640/645/640\nf 653/660/653 640/645/640 666/671/666\nf 666/671/666 635/640/635 643/652/643\nf 666/671/666 643/652/643 653/660/653\nf 669/674/669 644/649/644 634/639/634\nf 669/674/669 634/639/634 668/675/668\nf 638/643/638 637/646/637 630/635/630\nf 638/643/638 630/635/630 670/676/670\nf 645/650/645 644/649/644 669/674/669\nf 645/650/645 669/674/669 671/677/671\nf 638/643/638 670/676/670 485/475/485\nf 638/643/638 485/475/485 484/478/484\nf 672/678/672 633/642/633 489/479/489\nf 672/678/672 489/479/489 488/480/488\nf 632/637/632 657/663/657 658/666/658\nf 632/637/632 658/666/658 629/638/629\nf 670/676/670 663/669/663 536/528/536\nf 670/676/670 536/528/536 485/475/485\nf 633/642/633 636/641/636 534/526/534\nf 633/642/633 534/526/534 489/479/489\nf 484/478/484 535/527/535 639/644/639\nf 484/478/484 639/644/639 638/643/638\nf 629/638/629 658/666/658 664/670/664\nf 629/638/629 664/670/664 663/669/663\nf 665/672/665 639/644/639 535/527/535\nf 665/672/665 535/527/535 538/530/538\nf 636/641/636 665/672/665 538/530/538\nf 636/641/636 538/530/538 534/526/534\nf 660/665/660 667/673/667 664/670/664\nf 660/665/660 664/670/664 658/666/658\nf 668/675/668 634/639/634 633/642/633\nf 668/675/668 633/642/633 672/678/672\nf 630/635/630 629/638/629 663/669/663\nf 630/635/630 663/669/663 670/676/670\nf 1/679/1 661/667/661 656/662/656\nf 1/679/1 656/662/656 22/680/22\nf 20/681/20 647/654/647 648/653/648\nf 20/681/20 648/653/648 18/682/18\nf 647/654/647 20/681/20 21/683/21\nf 647/654/647 21/683/21 655/661/655\nf 15/684/15 646/651/646 645/650/645\nf 15/684/15 645/650/645 13/685/13\nf 19/686/19 651/656/651 654/659/654\nf 19/686/19 654/659/654 14/687/14\nf 648/653/648 662/668/662 16/688/16\nf 648/653/648 16/688/16 18/682/18\nf 17/689/17 652/657/652 651/656/651\nf 17/689/17 651/656/651 19/686/19\nf 21/683/21 22/680/22 656/662/656\nf 21/683/21 656/662/656 655/661/655\nf 13/685/13 645/650/645 671/677/671\nf 13/685/13 671/677/671 2/690/2\nf 646/651/646 15/684/15 14/687/14\nf 646/651/646 14/687/14 654/659/654\nf 17/689/17 16/688/16 662/668/662\nf 17/689/17 662/668/662 652/657/652\nf 608/600/608 91/68/91 385/371/385\nf 608/600/608 385/371/385 384/370/384\nf 304/286/304 372/355/372 401/387/401\nf 304/286/304 401/387/401 308/290/308\nf 468/459/468 415/404/415 411/401/411\nf 468/459/468 411/401/411 92/69/92\nf 602/594/602 603/597/603 606/598/606\nf 602/594/602 606/598/606 601/593/601\nf 608/600/608 468/459/468 92/69/92\nf 608/600/608 92/69/92 91/68/91\nf 305/287/305 304/286/304 308/290/308\nf 305/287/305 308/290/308 137/116/137\nf 139/119/139 138/117/138 307/291/307\nf 139/119/139 307/291/307 375/361/375\nf 674/691/674 675/692/675 676/693/676\nf 674/691/674 676/693/676 673/694/673\nf 678/695/678 27/8/27 679/696/679\nf 678/695/678 679/696/679 677/697/677\nf 681/698/681 682/699/682 683/700/683\nf 681/698/681 683/700/683 680/701/680\nf 684/702/684 685/703/685 683/700/683\nf 684/702/684 683/700/683 682/699/682\nf 684/702/684 674/691/674 673/694/673\nf 684/702/684 673/694/673 685/703/685\nf 687/704/687 688/705/688 689/706/689\nf 687/704/687 689/706/689 686/707/686\nf 690/708/690 691/709/691 676/693/676\nf 690/708/690 676/693/676 675/692/675\nf 689/706/689 688/705/688 691/709/691\nf 689/706/689 691/709/691 690/708/690\nf 687/704/687 686/707/686 693/710/693\nf 687/704/687 693/710/693 692/711/692\nf 681/698/681 680/701/680 46/24/46\nf 681/698/681 46/24/46 45/23/45\nf 678/695/678 694/712/694 695/713/695\nf 678/695/678 695/713/695 693/710/693\nf 697/714/697 698/715/698 699/716/699\nf 697/714/697 699/716/699 696/717/696\nf 701/718/701 702/719/702 703/720/703\nf 701/718/701 703/720/703 700/721/700\nf 705/722/705 706/723/706 707/724/707\nf 705/722/705 707/724/707 704/725/704\nf 709/726/709 710/727/710 711/728/711\nf 709/726/709 711/728/711 708/729/708\nf 713/730/713 714/731/714 715/732/715\nf 713/730/713 715/732/715 712/733/712\nf 717/734/717 718/735/718 719/736/719\nf 717/734/717 719/736/719 716/737/716\nf 712/733/712 720/738/720 721/739/721\nf 712/733/712 721/739/721 713/730/713\nf 713/730/713 721/739/721 697/714/697\nf 713/730/713 697/714/697 696/717/696\nf 723/740/723 724/741/724 725/742/725\nf 723/740/723 725/742/725 722/743/722\nf 727/744/727 728/745/728 729/746/729\nf 727/744/727 729/746/729 726/747/726\nf 731/748/731 732/749/732 733/750/733\nf 731/748/731 733/750/733 730/751/730\nf 735/752/735 728/745/728 727/744/727\nf 735/752/735 727/744/727 734/753/734\nf 737/754/737 738/755/738 739/756/739\nf 737/754/737 739/756/739 736/757/736\nf 741/758/741 722/743/722 725/742/725\nf 741/758/741 725/742/725 740/759/740\nf 735/752/735 734/753/734 743/760/743\nf 735/752/735 743/760/743 742/761/742\nf 745/762/745 746/763/746 747/764/747\nf 745/762/745 747/764/747 744/765/744\nf 747/764/747 746/763/746 749/766/749\nf 747/764/747 749/766/749 748/767/748\nf 745/762/745 744/765/744 751/768/751\nf 745/762/745 751/768/751 750/769/750\nf 753/770/753 754/771/754 755/772/755\nf 753/770/753 755/772/755 752/773/752\nf 757/774/757 755/772/755 754/771/754\nf 757/774/757 754/771/754 756/775/756\nf 748/767/748 749/766/749 759/776/759\nf 748/767/748 759/776/759 758/777/758\nf 761/778/761 762/779/762 763/780/763\nf 761/778/761 763/780/763 760/781/760\nf 765/782/765 766/783/766 767/784/767\nf 765/782/765 767/784/767 764/785/764\nf 769/786/769 770/787/770 771/788/771\nf 769/786/769 771/788/771 768/789/768\nf 773/790/773 774/791/774 775/792/775\nf 773/790/773 775/792/775 772/793/772\nf 777/794/777 778/795/778 779/796/779\nf 777/794/777 779/796/779 776/797/776\nf 774/791/774 780/798/780 781/799/781\nf 774/791/774 781/799/781 775/792/775\nf 703/720/703 782/800/782 783/801/783\nf 703/720/703 783/801/783 700/721/700\nf 688/802/688 687/803/687 785/804/785\nf 688/802/688 785/804/785 784/805/784\nf 786/806/786 785/804/785 687/803/687\nf 786/806/786 687/803/687 692/807/692\nf 788/808/788 777/794/777 789/809/789\nf 788/808/788 789/809/789 787/810/787\nf 790/811/790 791/812/791 779/796/779\nf 790/811/790 779/796/779 778/795/778\nf 793/813/793 794/814/794 795/815/795\nf 793/813/793 795/815/795 792/816/792\nf 797/817/797 798/818/798 701/718/701\nf 797/817/797 701/718/701 796/819/796\nf 701/718/701 798/818/798 799/820/799\nf 701/718/701 799/820/799 702/719/702\nf 801/821/801 802/822/802 803/823/803\nf 801/821/801 803/823/803 800/824/800\nf 805/825/805 806/826/806 807/827/807\nf 805/825/805 807/827/807 804/828/804\nf 809/829/809 810/830/810 811/831/811\nf 809/829/809 811/831/811 808/832/808\nf 778/795/778 807/827/807 806/826/806\nf 778/795/778 806/826/806 790/811/790\nf 803/823/803 812/833/812 813/834/813\nf 803/823/803 813/834/813 800/824/800\nf 815/835/815 816/836/816 817/837/817\nf 815/835/815 817/837/817 814/838/814\nf 819/839/819 814/838/814 820/840/820\nf 819/839/819 820/840/820 818/841/818\nf 822/842/822 823/843/823 819/839/819\nf 822/842/822 819/839/819 821/844/821\nf 704/725/704 707/724/707 825/845/825\nf 704/725/704 825/845/825 824/846/824\nf 827/847/827 828/848/828 698/715/698\nf 827/847/827 698/715/698 826/849/826\nf 772/793/772 775/792/775 829/850/829\nf 772/793/772 829/850/829 699/716/699\nf 781/799/781 771/788/771 831/851/831\nf 781/799/781 831/851/831 830/852/830\nf 832/853/832 831/851/831 771/788/771\nf 832/853/832 771/788/771 770/787/770\nf 834/854/834 835/855/835 836/856/836\nf 834/854/834 836/856/836 833/857/833\nf 838/858/838 839/859/839 840/860/840\nf 838/858/838 840/860/840 837/861/837\nf 723/740/723 722/743/722 840/860/840\nf 723/740/723 840/860/840 841/862/841\nf 747/764/747 842/863/842 843/864/843\nf 747/764/747 843/864/843 744/765/744\nf 821/844/821 844/865/844 845/866/845\nf 821/844/821 845/866/845 822/842/822\nf 847/867/847 818/841/818 820/840/820\nf 847/867/847 820/840/820 846/868/846\nf 843/864/843 849/869/849 850/870/850\nf 843/864/843 850/870/850 848/871/848\nf 205/185/205 851/872/851 852/873/852\nf 205/185/205 852/873/852 206/186/206\nf 208/189/208 849/869/849 851/872/851\nf 208/189/208 851/872/851 205/185/205\nf 853/874/853 854/875/854 749/766/749\nf 853/874/853 749/766/749 746/763/746\nf 728/745/728 735/752/735 854/875/854\nf 728/745/728 854/875/854 853/874/853\nf 856/876/856 857/877/857 858/878/858\nf 856/876/856 858/878/858 855/879/855\nf 860/880/860 861/881/861 862/882/862\nf 860/880/860 862/882/862 859/883/859\nf 863/884/863 864/885/864 861/881/861\nf 863/884/863 861/881/861 860/880/860\nf 866/886/866 867/887/867 862/882/862\nf 866/886/866 862/882/862 865/888/865\nf 869/889/869 870/890/870 871/891/871\nf 869/889/869 871/891/871 868/892/868\nf 866/886/866 228/210/228 229/209/229\nf 866/886/866 229/209/229 867/887/867\nf 873/893/873 864/885/864 863/884/863\nf 873/893/873 863/884/863 872/894/872\nf 871/891/871 873/893/873 872/894/872\nf 871/891/871 872/894/872 868/892/868\nf 875/895/875 876/896/876 877/897/877\nf 875/895/875 877/897/877 874/898/874\nf 835/855/835 834/854/834 848/871/848\nf 835/855/835 848/871/848 850/870/850\nf 879/899/879 833/857/833 880/900/880\nf 879/899/879 880/900/880 878/901/878\nf 882/902/882 883/903/883 884/904/884\nf 882/902/882 884/904/884 881/905/881\nf 881/905/881 880/900/880 886/906/886\nf 881/905/881 886/906/886 885/907/885\nf 887/908/887 842/863/842 747/764/747\nf 887/908/887 747/764/747 748/767/748\nf 842/863/842 887/908/887 852/873/852\nf 842/863/842 852/873/852 851/872/851\nf 758/777/758 760/781/760 889/909/889\nf 758/777/758 889/909/889 888/910/888\nf 787/810/787 890/911/890 891/912/891\nf 787/810/787 891/912/891 788/808/788\nf 893/913/893 894/914/894 895/915/895\nf 893/913/893 895/915/895 892/916/892\nf 896/917/896 859/883/859 897/918/897\nf 896/917/896 897/918/897 765/782/765\nf 899/919/899 900/920/900 901/921/901\nf 899/919/899 901/921/901 898/922/898\nf 900/920/900 902/923/902 903/924/903\nf 900/920/900 903/924/903 901/921/901\nf 902/923/902 677/925/677 679/926/679\nf 902/923/902 679/926/679 903/924/903\nf 862/882/862 867/887/867 904/927/904\nf 862/882/862 904/927/904 859/883/859\nf 901/921/901 263/247/263 264/246/264\nf 901/921/901 264/246/264 898/922/898\nf 266/248/266 265/249/265 903/924/903\nf 266/248/266 903/924/903 679/926/679\nf 895/915/895 905/928/905 906/929/906\nf 895/915/895 906/929/906 892/916/892\nf 907/930/907 908/931/908 909/932/909\nf 907/930/907 909/932/909 846/868/846\nf 847/867/847 846/868/846 909/932/909\nf 847/867/847 909/932/909 910/933/910\nf 847/867/847 910/933/910 912/934/912\nf 847/867/847 912/934/912 911/935/911\nf 276/258/276 275/259/275 906/929/906\nf 276/258/276 906/929/906 905/928/905\nf 275/259/275 277/260/277 908/931/908\nf 275/259/275 908/931/908 906/929/906\nf 741/758/741 837/861/837 840/860/840\nf 741/758/741 840/860/840 722/743/722\nf 914/936/914 915/937/915 916/938/916\nf 914/936/914 916/938/916 913/939/913\nf 915/937/915 914/936/914 743/760/743\nf 915/937/915 743/760/743 734/753/734\nf 918/940/918 740/759/740 709/726/709\nf 918/940/918 709/726/709 917/941/917\nf 916/938/916 915/937/915 920/942/920\nf 916/938/916 920/942/920 919/943/919\nf 922/944/922 923/945/923 924/946/924\nf 922/944/922 924/946/924 921/947/921\nf 708/729/708 925/948/925 917/941/917\nf 708/729/708 917/941/917 709/726/709\nf 917/941/917 925/948/925 927/949/927\nf 917/941/917 927/949/927 926/950/926\nf 293/276/293 712/733/712 715/732/715\nf 293/276/293 715/732/715 294/277/294\nf 929/951/929 930/952/930 931/953/931\nf 929/951/929 931/953/931 928/954/928\nf 933/955/933 934/956/934 935/957/935\nf 933/955/933 935/957/935 932/958/932\nf 937/959/937 938/960/938 939/961/939\nf 937/959/937 939/961/939 936/962/936\nf 785/804/785 940/963/940 941/964/941\nf 785/804/785 941/964/941 784/805/784\nf 812/833/812 943/965/943 944/966/944\nf 812/833/812 944/966/944 942/967/942\nf 945/968/945 796/819/796 701/718/701\nf 945/968/945 701/718/701 700/721/700\nf 946/969/946 947/970/947 797/817/797\nf 946/969/946 797/817/797 796/819/796\nf 949/971/949 873/893/873 871/891/871\nf 949/971/949 871/891/871 948/972/948\nf 783/801/783 806/826/806 805/825/805\nf 783/801/783 805/825/805 950/973/950\nf 951/974/951 952/975/952 792/816/792\nf 951/974/951 792/816/792 795/815/795\nf 954/976/954 793/813/793 792/816/792\nf 954/976/954 792/816/792 953/977/953\nf 956/978/956 957/979/957 958/980/958\nf 956/978/956 958/980/958 955/981/955\nf 727/744/727 920/942/920 915/937/915\nf 727/744/727 915/937/915 734/753/734\nf 959/982/959 960/983/960 795/815/795\nf 959/982/959 795/815/795 794/814/794\nf 914/936/914 913/939/913 924/946/924\nf 914/936/914 924/946/924 923/945/923\nf 329/984/329 961/985/961 962/986/962\nf 329/984/329 962/986/962 330/987/330\nf 834/854/834 963/988/963 751/768/751\nf 834/854/834 751/768/751 848/871/848\nf 879/899/879 839/859/839 838/858/838\nf 879/899/879 838/858/838 963/988/963\nf 812/833/812 942/967/942 964/989/964\nf 812/833/812 964/989/964 813/834/813\nf 786/806/786 692/807/692 695/990/695\nf 786/806/786 695/990/695 965/991/965\nf 967/992/967 968/993/968 969/994/969\nf 967/992/967 969/994/969 966/995/966\nf 696/717/696 699/716/699 829/850/829\nf 696/717/696 829/850/829 955/981/955\nf 970/996/970 703/720/703 702/719/702\nf 970/996/970 702/719/702 773/790/773\nf 972/997/972 799/820/799 798/818/798\nf 972/997/972 798/818/798 971/998/971\nf 885/907/885 342/999/342 344/1000/344\nf 885/907/885 344/1000/344 973/1001/973\nf 974/1002/974 975/1003/975 882/902/882\nf 974/1002/974 882/902/882 973/1001/973\nf 977/1004/977 978/1005/978 979/1006/979\nf 977/1004/977 979/1006/979 976/1007/976\nf 981/1008/981 856/876/856 855/879/855\nf 981/1008/981 855/879/855 980/1009/980\nf 775/792/775 781/799/781 830/852/830\nf 775/792/775 830/852/830 829/850/829\nf 750/769/750 982/1010/982 983/1011/983\nf 750/769/750 983/1011/983 745/762/745\nf 761/778/761 984/1012/984 985/1013/985\nf 761/778/761 985/1013/985 762/779/762\nf 986/1014/986 987/1015/987 845/866/845\nf 986/1014/986 845/866/845 844/865/844\nf 752/773/752 755/772/755 989/1016/989\nf 752/773/752 989/1016/989 988/1017/988\nf 977/1004/977 976/1007/976 991/1018/991\nf 977/1004/977 991/1018/991 990/1019/990\nf 978/1005/978 977/1004/977 874/898/874\nf 978/1005/978 874/898/874 992/1020/992\nf 863/884/863 993/1021/993 816/836/816\nf 863/884/863 816/836/816 872/894/872\nf 802/822/802 995/1022/995 933/955/933\nf 802/822/802 933/955/933 994/1023/994\nf 930/952/930 929/951/929 716/737/716\nf 930/952/930 716/737/716 719/736/719\nf 828/848/828 827/847/827 996/1024/996\nf 828/848/828 996/1024/996 970/996/970\nf 998/1025/998 950/973/950 805/825/805\nf 998/1025/998 805/825/805 997/1026/997\nf 950/973/950 945/968/945 700/721/700\nf 950/973/950 700/721/700 783/801/783\nf 1000/1027/1000 1001/1028/1001 1002/1029/1002\nf 1000/1027/1000 1002/1029/1002 999/1030/999\nf 691/1031/691 936/962/936 939/961/939\nf 691/1031/691 939/961/939 676/1032/676\nf 936/962/936 691/1031/691 688/802/688\nf 936/962/936 688/802/688 784/805/784\nf 890/911/890 787/810/787 1004/1033/1004\nf 890/911/890 1004/1033/1004 1003/1034/1003\nf 713/730/713 696/717/696 955/981/955\nf 713/730/713 955/981/955 958/980/958\nf 830/852/830 831/851/831 1005/1035/1005\nf 830/852/830 1005/1035/1005 956/978/956\nf 1006/1036/1006 1007/1037/1007 905/928/905\nf 1006/1036/1006 905/928/905 895/915/895\nf 908/931/908 277/260/277 379/365/379\nf 908/931/908 379/365/379 909/932/909\nf 1009/1038/1009 1010/1039/1010 1011/1040/1011\nf 1009/1038/1009 1011/1040/1011 1008/1041/1008\nf 1013/1042/1013 756/775/756 754/771/754\nf 1013/1042/1013 754/771/754 1012/1043/1012\nf 754/771/754 753/770/753 1014/1044/1014\nf 754/771/754 1014/1044/1014 1012/1043/1012\nf 989/1016/989 755/772/755 757/774/757\nf 989/1016/989 757/774/757 1015/1045/1015\nf 826/849/826 808/832/808 811/831/811\nf 826/849/826 811/831/811 827/847/827\nf 995/1022/995 802/822/802 801/821/801\nf 995/1022/995 801/821/801 1016/1046/1016\nf 815/835/815 868/892/868 872/894/872\nf 815/835/815 872/894/872 816/836/816\nf 726/747/726 918/940/918 917/941/917\nf 726/747/726 917/941/917 926/950/926\nf 910/933/910 909/932/909 379/365/379\nf 910/933/910 379/365/379 389/375/389\nf 912/934/912 910/933/910 389/375/389\nf 912/934/912 389/375/389 390/376/390\nf 786/806/786 965/991/965 1003/1034/1003\nf 786/806/786 1003/1034/1003 1004/1033/1004\nf 1017/1047/1017 803/823/803 802/822/802\nf 1017/1047/1017 802/822/802 994/1023/994\nf 1019/1048/1019 1017/1047/1017 994/1023/994\nf 1019/1048/1019 994/1023/994 1018/1049/1018\nf 820/840/820 1020/1050/1020 907/930/907\nf 820/840/820 907/930/907 846/868/846\nf 932/958/932 1018/1049/1018 994/1023/994\nf 932/958/932 994/1023/994 933/955/933\nf 1022/1051/1022 1023/1052/1023 1024/1053/1024\nf 1022/1051/1022 1024/1053/1024 1021/1054/1021\nf 1025/1055/1025 817/837/817 816/836/816\nf 1025/1055/1025 816/836/816 993/1021/993\nf 1020/1050/1020 817/837/817 1025/1055/1025\nf 1020/1050/1020 1025/1055/1025 893/913/893\nf 907/930/907 1020/1050/1020 893/913/893\nf 907/930/907 893/913/893 892/916/892\nf 749/766/749 854/875/854 1026/1056/1026\nf 749/766/749 1026/1056/1026 759/776/759\nf 776/797/776 1000/1027/1000 999/1030/999\nf 776/797/776 999/1030/999 1027/1057/1027\nf 1017/1047/1017 943/965/943 812/833/812\nf 1017/1047/1017 812/833/812 803/823/803\nf 1028/1058/1028 1029/1059/1029 405/390/405\nf 1028/1058/1028 405/390/405 404/389/404\nf 1029/1059/1029 943/965/943 1017/1047/1017\nf 1029/1059/1029 1017/1047/1017 1019/1048/1019\nf 685/1060/685 673/1061/673 964/989/964\nf 685/1060/685 964/989/964 942/967/942\nf 685/1060/685 942/967/942 944/966/944\nf 685/1060/685 944/966/944 683/1062/683\nf 683/1062/683 944/966/944 1028/1058/1028\nf 683/1062/683 1028/1058/1028 680/1063/680\nf 1030/1064/1030 897/918/897 859/883/859\nf 1030/1064/1030 859/883/859 904/927/904\nf 1007/1037/1007 1030/1064/1030 408/398/408\nf 1007/1037/1007 408/398/408 407/397/407\nf 766/783/766 765/782/765 897/918/897\nf 766/783/766 897/918/897 1006/1036/1006\nf 907/930/907 892/916/892 906/929/906\nf 907/930/907 906/929/906 908/931/908\nf 937/959/937 999/1030/999 1002/1029/1002\nf 937/959/937 1002/1029/1002 938/960/938\nf 991/1018/991 976/1007/976 1032/1065/1032\nf 991/1018/991 1032/1065/1032 1031/1066/1031\nf 1034/1067/1034 739/756/739 738/755/738\nf 1034/1067/1034 738/755/738 1033/1068/1033\nf 1035/1069/1035 1036/1070/1036 1037/1071/1037\nf 1035/1069/1035 1037/1071/1037 1034/1067/1034\nf 1038/1072/1038 416/408/416 418/407/418\nf 1038/1072/1038 418/407/418 967/992/967\nf 966/995/966 719/736/719 718/735/718\nf 966/995/966 718/735/718 1039/1073/1039\nf 1041/1074/1041 1042/1075/1042 1043/1076/1043\nf 1041/1074/1041 1043/1076/1043 1040/1077/1040\nf 1041/1074/1041 1040/1077/1040 1045/1078/1045\nf 1041/1074/1041 1045/1078/1045 1044/1079/1044\nf 1043/1076/1043 1046/1080/1046 1047/1081/1047\nf 1043/1076/1043 1047/1081/1047 1040/1077/1040\nf 883/903/883 1045/1078/1045 1048/1082/1048\nf 883/903/883 1048/1082/1048 884/904/884\nf 1049/1083/1049 1050/1084/1050 721/739/721\nf 1049/1083/1049 721/739/721 720/738/720\nf 717/734/717 1050/1084/1050 1039/1073/1039\nf 717/734/717 1039/1073/1039 718/735/718\nf 889/909/889 760/781/760 763/780/763\nf 889/909/889 763/780/763 1051/1085/1051\nf 974/1002/974 1052/1086/1052 1053/1087/1053\nf 974/1002/974 1053/1087/1053 975/1003/975\nf 1053/1087/1053 1054/1088/1054 1042/1075/1042\nf 1053/1087/1053 1042/1075/1042 1041/1074/1041\nf 1056/1089/1056 1057/1090/1057 1058/1091/1058\nf 1056/1089/1056 1058/1091/1058 1055/1092/1055\nf 1055/1092/1055 1058/1091/1058 1010/1039/1010\nf 1055/1092/1055 1010/1039/1010 1009/1038/1009\nf 825/845/825 1059/1093/1059 1060/1094/1060\nf 825/845/825 1060/1094/1060 824/846/824\nf 1060/1094/1060 1059/1093/1059 1062/1095/1062\nf 1060/1094/1060 1062/1095/1062 1061/1096/1061\nf 444/1097/444 443/1098/443 1064/1099/1064\nf 444/1097/444 1064/1099/1064 1063/1100/1063\nf 955/981/955 829/850/829 830/852/830\nf 955/981/955 830/852/830 956/978/956\nf 855/879/855 845/866/845 987/1015/987\nf 855/879/855 987/1015/987 980/1009/980\nf 858/878/858 869/889/869 823/843/823\nf 858/878/858 823/843/823 822/842/822\nf 1066/1101/1066 1067/1102/1067 1068/1103/1068\nf 1066/1101/1066 1068/1103/1068 1065/1104/1065\nf 1043/1076/1043 1067/1102/1067 1069/1105/1069\nf 1043/1076/1043 1069/1105/1069 1046/1080/1046\nf 724/741/724 723/740/723 1046/1080/1046\nf 724/741/724 1046/1080/1046 1069/1105/1069\nf 725/742/725 710/727/710 709/726/709\nf 725/742/725 709/726/709 740/759/740\nf 923/945/923 922/944/922 730/751/730\nf 923/945/923 730/751/730 733/750/733\nf 742/761/742 1026/1056/1026 854/875/854\nf 742/761/742 854/875/854 735/752/735\nf 878/901/878 884/904/884 1048/1082/1048\nf 878/901/878 1048/1082/1048 1070/1106/1070\nf 839/859/839 1070/1106/1070 841/862/841\nf 839/859/839 841/862/841 840/860/840\nf 878/901/878 1070/1106/1070 839/859/839\nf 878/901/878 839/859/839 879/899/879\nf 728/745/728 853/874/853 983/1011/983\nf 728/745/728 983/1011/983 729/746/729\nf 923/945/923 733/750/733 743/760/743\nf 923/945/923 743/760/743 914/936/914\nf 1049/1083/1049 453/443/453 416/408/416\nf 1049/1083/1049 416/408/416 1038/1072/1038\nf 969/994/969 934/956/934 931/953/931\nf 969/994/969 931/953/931 930/952/930\nf 706/723/706 1071/1107/1071 1072/1108/1072\nf 706/723/706 1072/1108/1072 707/724/707\nf 856/876/856 981/1008/981 1074/1109/1074\nf 856/876/856 1074/1109/1074 1073/1110/1073\nf 732/749/732 731/748/731 985/1013/985\nf 732/749/732 985/1013/985 984/1012/984\nf 789/809/789 940/963/940 1004/1033/1004\nf 789/809/789 1004/1033/1004 787/810/787\nf 1027/1057/1027 941/964/941 940/963/940\nf 1027/1057/1027 940/963/940 789/809/789\nf 1075/1111/1075 1076/1112/1076 900/920/900\nf 1075/1111/1075 900/920/900 899/919/899\nf 228/210/228 866/886/866 898/922/898\nf 228/210/228 898/922/898 264/246/264\nf 900/920/900 1076/1112/1076 1077/1113/1077\nf 900/920/900 1077/1113/1077 902/923/902\nf 1077/1113/1077 694/1114/694 677/925/677\nf 1077/1113/1077 677/925/677 902/923/902\nf 263/247/263 901/921/901 903/924/903\nf 263/247/263 903/924/903 265/249/265\nf 461/1115/461 886/906/886 836/856/836\nf 461/1115/461 836/856/836 462/1116/462\nf 871/891/871 870/890/870 1078/1117/1078\nf 871/891/871 1078/1117/1078 948/972/948\nf 1080/1118/1080 1081/1119/1081 1032/1065/1032\nf 1080/1118/1080 1032/1065/1032 1079/1120/1079\nf 737/754/737 736/757/736 1012/1043/1012\nf 737/754/737 1012/1043/1012 1014/1044/1014\nf 875/895/875 874/898/874 977/1004/977\nf 875/895/875 977/1004/977 990/1019/990\nf 877/897/877 1082/1121/1082 992/1020/992\nf 877/897/877 992/1020/992 874/898/874\nf 969/994/969 930/952/930 719/736/719\nf 969/994/969 719/736/719 966/995/966\nf 969/994/969 968/993/968 935/957/935\nf 969/994/969 935/957/935 934/956/934\nf 1084/1122/1084 1037/1071/1037 1085/1123/1085\nf 1084/1122/1084 1085/1123/1085 1083/1124/1083\nf 978/1005/978 992/1020/992 1087/1125/1087\nf 978/1005/978 1087/1125/1087 1086/1126/1086\nf 1086/1126/1086 1088/1127/1088 979/1006/979\nf 1086/1126/1086 979/1006/979 978/1005/978\nf 1080/1118/1080 1090/1128/1090 1091/1129/1091\nf 1080/1118/1080 1091/1129/1091 1089/1130/1089\nf 1013/1042/1013 1092/1131/1092 1093/1132/1093\nf 1013/1042/1013 1093/1132/1093 756/775/756\nf 1035/1069/1035 1034/1067/1034 1033/1068/1033\nf 1035/1069/1035 1033/1068/1033 1094/1133/1094\nf 921/947/921 1094/1133/1094 1033/1068/1033\nf 921/947/921 1033/1068/1033 922/944/922\nf 730/751/730 738/755/738 737/754/737\nf 730/751/730 737/754/737 731/748/731\nf 1014/1044/1014 753/770/753 762/779/762\nf 1014/1044/1014 762/779/762 985/1013/985\nf 876/896/876 875/895/875 987/1015/987\nf 876/896/876 987/1015/987 986/1014/986\nf 928/954/928 808/832/808 826/849/826\nf 928/954/928 826/849/826 929/951/929\nf 1039/1073/1039 1038/1072/1038 967/992/967\nf 1039/1073/1039 967/992/967 966/995/966\nf 698/715/698 828/848/828 772/793/772\nf 698/715/698 772/793/772 699/716/699\nf 676/1032/676 939/961/939 964/989/964\nf 676/1032/676 964/989/964 673/1061/673\nf 1000/1027/1000 810/830/810 809/829/809\nf 1000/1027/1000 809/829/809 1001/1028/1001\nf 898/922/898 866/886/866 865/888/865\nf 898/922/898 865/888/865 899/919/899\nf 899/919/899 865/888/865 1095/1134/1095\nf 899/919/899 1095/1134/1095 1075/1111/1075\nf 857/877/857 870/890/870 869/889/869\nf 857/877/857 869/889/869 858/878/858\nf 948/972/948 1078/1117/1078 946/969/946\nf 948/972/948 946/969/946 1096/1135/1096\nf 819/839/819 823/843/823 815/835/815\nf 819/839/819 815/835/815 814/838/814\nf 911/935/911 1097/1136/1097 818/841/818\nf 911/935/911 818/841/818 847/867/847\nf 815/835/815 823/843/823 869/889/869\nf 815/835/815 869/889/869 868/892/868\nf 887/908/887 748/767/748 758/777/758\nf 887/908/887 758/777/758 888/910/888\nf 761/778/761 760/781/760 758/777/758\nf 761/778/761 758/777/758 759/776/759\nf 853/874/853 746/763/746 745/762/745\nf 853/874/853 745/762/745 983/1011/983\nf 1051/1085/1051 988/1017/988 876/896/876\nf 1051/1085/1051 876/896/876 986/1014/986\nf 877/897/877 876/896/876 988/1017/988\nf 877/897/877 988/1017/988 989/1016/989\nf 989/1016/989 1015/1045/1015 1082/1121/1082\nf 989/1016/989 1082/1121/1082 877/897/877\nf 726/747/726 729/746/729 1098/1137/1098\nf 726/747/726 1098/1137/1098 918/940/918\nf 1100/1138/1100 1101/1139/1101 1102/1140/1102\nf 1100/1138/1100 1102/1140/1102 1099/1141/1099\nf 1103/1142/1103 488/480/488 294/277/294\nf 1103/1142/1103 294/277/294 715/732/715\nf 1104/1143/1104 1105/1144/1105 1072/1108/1072\nf 1104/1143/1104 1072/1108/1072 1071/1107/1071\nf 801/821/801 800/824/800 1002/1029/1002\nf 801/821/801 1002/1029/1002 1001/1028/1001\nf 1104/1143/1104 1106/1145/1106 958/980/958\nf 1104/1143/1104 958/980/958 957/979/957\nf 1104/1143/1104 957/979/957 1107/1146/1107\nf 1104/1143/1104 1107/1146/1107 1105/1144/1105\nf 1056/1089/1056 1108/1147/1108 1064/1099/1064\nf 1056/1089/1056 1064/1099/1064 1057/1090/1057\nf 495/1148/495 1010/1039/1010 1058/1091/1058\nf 495/1148/495 1058/1091/1058 496/1149/496\nf 496/1149/496 1058/1091/1058 1057/1090/1057\nf 496/1149/496 1057/1090/1057 497/1150/497\nf 962/986/962 1052/1086/1052 498/1151/498\nf 962/986/962 498/1151/498 330/987/330\nf 499/1152/499 498/1151/498 1052/1086/1052\nf 499/1152/499 1052/1086/1052 974/1002/974\nf 1010/1039/1010 495/1148/495 500/1153/500\nf 1010/1039/1010 500/1153/500 1011/1040/1011\nf 1109/1154/1109 1054/1088/1054 962/986/962\nf 1109/1154/1109 962/986/962 961/985/961\nf 499/1152/499 974/1002/974 973/1001/973\nf 499/1152/499 973/1001/973 344/1000/344\nf 1106/1145/1106 1104/1143/1104 1071/1107/1071\nf 1106/1145/1106 1071/1107/1071 1110/1155/1110\nf 1071/1107/1071 706/723/706 1102/1140/1102\nf 1071/1107/1071 1102/1140/1102 1110/1155/1110\nf 1099/1141/1099 1102/1140/1102 706/723/706\nf 1099/1141/1099 706/723/706 705/722/705\nf 705/722/705 1008/1041/1008 1111/1156/1111\nf 705/722/705 1111/1156/1111 1099/1141/1099\nf 1011/1040/1011 500/1153/500 505/1157/505\nf 1011/1040/1011 505/1157/505 1112/1158/1112\nf 1067/1102/1067 1043/1076/1043 1042/1075/1042\nf 1067/1102/1067 1042/1075/1042 1068/1103/1068\nf 329/984/329 444/1097/444 1063/1100/1063\nf 329/984/329 1063/1100/1063 961/985/961\nf 1068/1103/1068 1109/1154/1109 1113/1159/1113\nf 1068/1103/1068 1113/1159/1113 1065/1104/1065\nf 1115/1160/1115 724/741/724 1069/1105/1069\nf 1115/1160/1115 1069/1105/1069 1114/1161/1114\nf 744/765/744 843/864/843 848/871/848\nf 744/765/744 848/871/848 751/768/751\nf 509/500/509 850/870/850 849/869/849\nf 509/500/509 849/869/849 208/189/208\nf 849/869/849 843/864/843 842/863/842\nf 849/869/849 842/863/842 851/872/851\nf 462/1116/462 836/856/836 835/855/835\nf 462/1116/462 835/855/835 510/501/510\nf 850/870/850 509/500/509 510/501/510\nf 850/870/850 510/501/510 835/855/835\nf 795/815/795 960/983/960 971/998/971\nf 795/815/795 971/998/971 951/974/951\nf 960/983/960 1116/1162/1116 972/997/972\nf 960/983/960 972/997/972 971/998/971\nf 768/789/768 780/798/780 972/997/972\nf 768/789/768 972/997/972 1116/1162/1116\nf 716/737/716 929/951/929 826/849/826\nf 716/737/716 826/849/826 698/715/698\nf 801/821/801 1001/1028/1001 809/829/809\nf 801/821/801 809/829/809 1016/1046/1016\nf 800/824/800 813/834/813 938/960/938\nf 800/824/800 938/960/938 1002/1029/1002\nf 813/834/813 964/989/964 939/961/939\nf 813/834/813 939/961/939 938/960/938\nf 1117/1163/1117 921/947/921 924/946/924\nf 1117/1163/1117 924/946/924 954/976/954\nf 1094/1133/1094 1118/1164/1118 1119/1165/1119\nf 1094/1133/1094 1119/1165/1119 1035/1069/1035\nf 1035/1069/1035 1119/1165/1119 1089/1130/1089\nf 1035/1069/1035 1089/1130/1089 1036/1070/1036\nf 1118/1164/1118 1094/1133/1094 921/947/921\nf 1118/1164/1118 921/947/921 1117/1163/1117\nf 838/858/838 837/861/837 982/1010/982\nf 838/858/838 982/1010/982 750/769/750\nf 963/988/963 838/858/838 750/769/750\nf 963/988/963 750/769/750 751/768/751\nf 729/746/729 983/1011/983 982/1010/982\nf 729/746/729 982/1010/982 1098/1137/1098\nf 732/749/732 742/761/742 743/760/743\nf 732/749/732 743/760/743 733/750/733\nf 732/749/732 984/1012/984 1026/1056/1026\nf 732/749/732 1026/1056/1026 742/761/742\nf 984/1012/984 761/778/761 759/776/759\nf 984/1012/984 759/776/759 1026/1056/1026\nf 790/811/790 806/826/806 783/801/783\nf 790/811/790 783/801/783 782/800/782\nf 931/953/931 934/956/934 933/955/933\nf 931/953/931 933/955/933 995/1022/995\nf 931/953/931 995/1022/995 1016/1046/1016\nf 931/953/931 1016/1046/1016 928/954/928\nf 996/1024/996 827/847/827 811/831/811\nf 996/1024/996 811/831/811 791/812/791\nf 1121/1166/1121 861/881/861 864/885/864\nf 1121/1166/1121 864/885/864 1120/1167/1120\nf 896/917/896 1122/1168/1122 860/880/860\nf 896/917/896 860/880/860 859/883/859\nf 1024/1053/1024 1023/1052/1023 1025/1055/1025\nf 1024/1053/1024 1025/1055/1025 993/1021/993\nf 1024/1053/1024 860/880/860 1122/1168/1122\nf 1024/1053/1024 1122/1168/1122 1021/1054/1021\nf 1124/1169/1124 887/908/887 888/910/888\nf 1124/1169/1124 888/910/888 1123/1170/1123\nf 951/974/951 971/998/971 798/818/798\nf 951/974/951 798/818/798 797/817/797\nf 1050/1084/1050 1049/1083/1049 1038/1072/1038\nf 1050/1084/1050 1038/1072/1038 1039/1073/1039\nf 680/1063/680 1028/1058/1028 404/389/404\nf 680/1063/680 404/389/404 46/511/46\nf 1028/1058/1028 944/966/944 943/965/943\nf 1028/1058/1028 943/965/943 1029/1059/1029\nf 1018/1049/1018 932/958/932 521/513/521\nf 1018/1049/1018 521/513/521 520/512/520\nf 522/514/522 1019/1048/1019 1018/1049/1018\nf 522/514/522 1018/1049/1018 520/512/520\nf 935/957/935 523/515/523 521/513/521\nf 935/957/935 521/513/521 932/958/932\nf 935/957/935 968/993/968 524/516/524\nf 935/957/935 524/516/524 523/515/523\nf 953/977/953 792/816/792 952/975/952\nf 953/977/953 952/975/952 1073/1110/1073\nf 1073/1110/1073 1074/1109/1074 1125/1171/1125\nf 1073/1110/1073 1125/1171/1125 953/977/953\nf 1032/1065/1032 1081/1119/1081 1126/1172/1126\nf 1032/1065/1032 1126/1172/1126 1031/1066/1031\nf 1032/1065/1032 976/1007/976 979/1006/979\nf 1032/1065/1032 979/1006/979 1079/1120/1079\nf 1073/1110/1073 1127/1173/1127 857/877/857\nf 1073/1110/1073 857/877/857 856/876/856\nf 857/877/857 1127/1173/1127 1078/1117/1078\nf 857/877/857 1078/1117/1078 870/890/870\nf 407/397/407 276/258/276 905/928/905\nf 407/397/407 905/928/905 1007/1037/1007\nf 1006/1036/1006 897/918/897 1030/1064/1030\nf 1006/1036/1006 1030/1064/1030 1007/1037/1007\nf 822/842/822 845/866/845 855/879/855\nf 822/842/822 855/879/855 858/878/858\nf 1014/1044/1014 985/1013/985 731/748/731\nf 1014/1044/1014 731/748/731 737/754/737\nf 1031/1066/1031 1074/1109/1074 981/1008/981\nf 1031/1066/1031 981/1008/981 991/1018/991\nf 730/751/730 922/944/922 1033/1068/1033\nf 730/751/730 1033/1068/1033 738/755/738\nf 990/1019/990 980/1009/980 987/1015/987\nf 990/1019/990 987/1015/987 875/895/875\nf 763/780/763 752/773/752 988/1017/988\nf 763/780/763 988/1017/988 1051/1085/1051\nf 763/780/763 762/779/762 753/770/753\nf 763/780/763 753/770/753 752/773/752\nf 980/1009/980 990/1019/990 991/1018/991\nf 980/1009/980 991/1018/991 981/1008/981\nf 1118/1164/1118 1126/1172/1126 1081/1119/1081\nf 1118/1164/1118 1081/1119/1081 1119/1165/1119\nf 1126/1172/1126 1125/1171/1125 1074/1109/1074\nf 1126/1172/1126 1074/1109/1074 1031/1066/1031\nf 1119/1165/1119 1081/1119/1081 1080/1118/1080\nf 1119/1165/1119 1080/1118/1080 1089/1130/1089\nf 986/1014/986 844/865/844 889/909/889\nf 986/1014/986 889/909/889 1051/1085/1051\nf 821/844/821 819/839/819 818/841/818\nf 821/844/821 818/841/818 1097/1136/1097\nf 1022/1051/1022 764/785/764 894/914/894\nf 1022/1051/1022 894/914/894 1023/1052/1023\nf 1023/1052/1023 894/914/894 893/913/893\nf 1023/1052/1023 893/913/893 1025/1055/1025\nf 926/950/926 920/942/920 727/744/727\nf 926/950/926 727/744/727 726/747/726\nf 919/943/919 920/942/920 926/950/926\nf 919/943/919 926/950/926 927/949/927\nf 1128/1174/1128 1116/1162/1116 960/983/960\nf 1128/1174/1128 960/983/960 959/982/959\nf 773/790/773 702/719/702 799/820/799\nf 773/790/773 799/820/799 774/791/774\nf 799/820/799 972/997/972 780/798/780\nf 799/820/799 780/798/780 774/791/774\nf 772/793/772 828/848/828 970/996/970\nf 772/793/772 970/996/970 773/790/773\nf 703/720/703 970/996/970 996/1024/996\nf 703/720/703 996/1024/996 782/800/782\nf 771/788/771 781/799/781 780/798/780\nf 771/788/771 780/798/780 768/789/768\nf 791/812/791 790/811/790 782/800/782\nf 791/812/791 782/800/782 996/1024/996\nf 811/831/811 810/830/810 779/796/779\nf 811/831/811 779/796/779 791/812/791\nf 1027/1057/1027 789/809/789 777/794/777\nf 1027/1057/1027 777/794/777 776/797/776\nf 927/949/927 925/948/925 769/786/769\nf 927/949/927 769/786/769 1128/1174/1128\nf 710/727/710 725/742/725 724/741/724\nf 710/727/710 724/741/724 1115/1160/1115\nf 954/976/954 953/977/953 1125/1171/1125\nf 954/976/954 1125/1171/1125 1117/1163/1117\nf 1117/1163/1117 1125/1171/1125 1126/1172/1126\nf 1117/1163/1117 1126/1172/1126 1118/1164/1118\nf 768/789/768 1116/1162/1116 1128/1174/1128\nf 768/789/768 1128/1174/1128 769/786/769\nf 904/927/904 867/887/867 229/209/229\nf 904/927/904 229/209/229 529/521/529\nf 948/972/948 1096/1135/1096 998/1025/998\nf 948/972/948 998/1025/998 949/971/949\nf 1120/1167/1120 864/885/864 873/893/873\nf 1120/1167/1120 873/893/873 949/971/949\nf 1121/1166/1121 1120/1167/1120 997/1026/997\nf 1121/1166/1121 997/1026/997 1129/1175/1129\nf 1129/1175/1129 1095/1134/1095 865/888/865\nf 1129/1175/1129 865/888/865 1121/1166/1121\nf 861/881/861 1121/1166/1121 865/888/865\nf 861/881/861 865/888/865 862/882/862\nf 1075/1111/1075 890/911/890 1003/1034/1003\nf 1075/1111/1075 1003/1034/1003 1076/1112/1076\nf 1076/1112/1076 1003/1034/1003 965/991/965\nf 1076/1112/1076 965/991/965 1077/1113/1077\nf 965/991/965 695/990/695 694/1114/694\nf 965/991/965 694/1114/694 1077/1113/1077\nf 1075/1111/1075 1095/1134/1095 891/912/891\nf 1075/1111/1075 891/912/891 890/911/890\nf 895/915/895 894/914/894 764/785/764\nf 895/915/895 764/785/764 767/784/767\nf 1020/1050/1020 820/840/820 814/838/814\nf 1020/1050/1020 814/838/814 817/837/817\nf 1123/1170/1123 844/865/844 821/844/821\nf 1123/1170/1123 821/844/821 1097/1136/1097\nf 1124/1169/1124 1123/1170/1123 1097/1136/1097\nf 1124/1169/1124 1097/1136/1097 911/935/911\nf 1130/1176/1130 1124/1169/1124 911/935/911\nf 1130/1176/1130 911/935/911 912/934/912\nf 532/524/532 1130/1176/1130 912/934/912\nf 532/524/532 912/934/912 390/376/390\nf 973/1001/973 882/902/882 881/905/881\nf 973/1001/973 881/905/881 885/907/885\nf 833/857/833 836/856/836 886/906/886\nf 833/857/833 886/906/886 880/900/880\nf 834/854/834 833/857/833 879/899/879\nf 834/854/834 879/899/879 963/988/963\nf 1067/1102/1067 1066/1101/1066 1114/1161/1114\nf 1067/1102/1067 1114/1161/1114 1069/1105/1069\nf 809/829/809 808/832/808 928/954/928\nf 809/829/809 928/954/928 1016/1046/1016\nf 1019/1048/1019 522/514/522 405/390/405\nf 1019/1048/1019 405/390/405 1029/1059/1029\nf 1131/1177/1131 1085/1123/1085 1037/1071/1037\nf 1131/1177/1131 1037/1071/1037 1036/1070/1036\nf 1132/1178/1132 1103/1142/1103 715/732/715\nf 1132/1178/1132 715/732/715 714/731/714\nf 1110/1155/1110 1102/1140/1102 1101/1139/1101\nf 1110/1155/1110 1101/1139/1101 1133/1179/1133\nf 1111/1156/1111 1112/1158/1112 1135/1180/1135\nf 1111/1156/1111 1135/1180/1135 1134/1181/1134\nf 1106/1145/1106 1110/1155/1110 1133/1179/1133\nf 1106/1145/1106 1133/1179/1133 1136/1182/1136\nf 1106/1145/1106 714/731/714 713/730/713\nf 1106/1145/1106 713/730/713 958/980/958\nf 1112/1158/1112 505/1157/505 539/1183/539\nf 1112/1158/1112 539/1183/539 1135/1180/1135\nf 883/903/883 882/902/882 975/1003/975\nf 883/903/883 975/1003/975 1044/1079/1044\nf 704/725/704 1009/1038/1009 1008/1041/1008\nf 704/725/704 1008/1041/1008 705/722/705\nf 1052/1086/1052 962/986/962 1054/1088/1054\nf 1052/1086/1052 1054/1088/1054 1053/1087/1053\nf 1055/1092/1055 824/846/824 1060/1094/1060\nf 1055/1092/1055 1060/1094/1060 1056/1089/1056\nf 1009/1038/1009 704/725/704 824/846/824\nf 1009/1038/1009 824/846/824 1055/1092/1055\nf 1065/1104/1065 1113/1159/1113 1108/1147/1108\nf 1065/1104/1065 1108/1147/1108 1061/1096/1061\nf 1068/1103/1068 1042/1075/1042 1054/1088/1054\nf 1068/1103/1068 1054/1088/1054 1109/1154/1109\nf 1008/1041/1008 1011/1040/1011 1112/1158/1112\nf 1008/1041/1008 1112/1158/1112 1111/1156/1111\nf 1109/1154/1109 961/985/961 1063/1100/1063\nf 1109/1154/1109 1063/1100/1063 1113/1159/1113\nf 1134/1181/1134 1100/1138/1100 1099/1141/1099\nf 1134/1181/1134 1099/1141/1099 1111/1156/1111\nf 947/970/947 952/975/952 951/974/951\nf 947/970/947 951/974/951 797/817/797\nf 959/982/959 794/814/794 916/938/916\nf 959/982/959 916/938/916 919/943/919\nf 1098/1137/1098 982/1010/982 837/861/837\nf 1098/1137/1098 837/861/837 741/758/741\nf 1098/1137/1098 741/758/741 740/759/740\nf 1098/1137/1098 740/759/740 918/940/918\nf 1040/1077/1040 1047/1081/1047 1048/1082/1048\nf 1040/1077/1040 1048/1082/1048 1045/1078/1045\nf 1041/1074/1041 1044/1079/1044 975/1003/975\nf 1041/1074/1041 975/1003/975 1053/1087/1053\nf 1078/1117/1078 1127/1173/1127 947/970/947\nf 1078/1117/1078 947/970/947 946/969/946\nf 949/971/949 998/1025/998 997/1026/997\nf 949/971/949 997/1026/997 1120/1167/1120\nf 946/969/946 796/819/796 945/968/945\nf 946/969/946 945/968/945 1096/1135/1096\nf 998/1025/998 1096/1135/1096 945/968/945\nf 998/1025/998 945/968/945 950/973/950\nf 997/1026/997 805/825/805 804/828/804\nf 997/1026/997 804/828/804 1129/1175/1129\nf 1095/1134/1095 1129/1175/1129 804/828/804\nf 1095/1134/1095 804/828/804 891/912/891\nf 904/927/904 529/521/529 408/398/408\nf 904/927/904 408/398/408 1030/1064/1030\nf 1024/1053/1024 993/1021/993 863/884/863\nf 1024/1053/1024 863/884/863 860/880/860\nf 1138/1184/1138 1139/1185/1139 1140/1186/1140\nf 1138/1184/1138 1140/1186/1140 1137/1187/1137\nf 1141/1188/1141 1142/1189/1142 1137/1187/1137\nf 1141/1188/1141 1137/1187/1137 1140/1186/1140\nf 1143/1190/1143 1144/1191/1144 1142/1189/1142\nf 1143/1190/1143 1142/1189/1142 1141/1188/1141\nf 1145/1192/1145 1146/1193/1146 1144/1191/1144\nf 1145/1192/1145 1144/1191/1144 1143/1190/1143\nf 1147/1194/1147 1148/1195/1148 1146/1193/1146\nf 1147/1194/1147 1146/1193/1146 1145/1192/1145\nf 1149/1196/1149 1150/1197/1150 1148/1195/1148\nf 1149/1196/1149 1148/1195/1148 1147/1194/1147\nf 1151/1198/1151 1152/1199/1152 1150/1197/1150\nf 1151/1198/1151 1150/1197/1150 1149/1196/1149\nf 1154/1200/1154 1155/1201/1155 1156/1202/1156\nf 1154/1200/1154 1156/1202/1156 1153/1203/1153\nf 1157/1204/1157 1158/1205/1158 1155/1201/1155\nf 1157/1204/1157 1155/1201/1155 1154/1200/1154\nf 1159/1206/1159 1160/1207/1160 1142/1189/1142\nf 1159/1206/1159 1142/1189/1142 1144/1191/1144\nf 1161/1208/1161 1159/1206/1159 1144/1191/1144\nf 1161/1208/1161 1144/1191/1144 1146/1193/1146\nf 1162/1209/1162 1161/1208/1161 1146/1193/1146\nf 1162/1209/1162 1146/1193/1146 1148/1195/1148\nf 1163/1210/1163 1162/1209/1162 1148/1195/1148\nf 1163/1210/1163 1148/1195/1148 1150/1197/1150\nf 1150/1197/1150 1152/1199/1152 1164/1211/1164\nf 1150/1197/1150 1164/1211/1164 1163/1210/1163\nf 1156/1202/1156 1155/1201/1155 1166/1212/1166\nf 1156/1202/1156 1166/1212/1166 1165/1213/1165\nf 1167/1214/1167 1166/1212/1166 1155/1201/1155\nf 1167/1214/1167 1155/1201/1155 1158/1205/1158\nf 1169/1215/1169 1167/1214/1167 1158/1205/1158\nf 1169/1215/1169 1158/1205/1158 1168/1216/1168\nf 1170/1217/1170 1171/1218/1171 1172/1219/1172\nf 1170/1217/1170 1172/1219/1172 1139/1185/1139\nf 1173/1220/1173 1174/1221/1174 1141/1188/1141\nf 1173/1220/1173 1141/1188/1141 1140/1186/1140\nf 1141/1188/1141 1174/1221/1174 1175/1222/1175\nf 1141/1188/1141 1175/1222/1175 1143/1190/1143\nf 1176/1223/1176 1145/1192/1145 1143/1190/1143\nf 1176/1223/1176 1143/1190/1143 1175/1222/1175\nf 1177/1224/1177 1149/1196/1149 1147/1194/1147\nf 1177/1224/1177 1147/1194/1147 1176/1223/1176\nf 1177/1224/1177 1178/1225/1178 1151/1198/1151\nf 1177/1224/1177 1151/1198/1151 1149/1196/1149\nf 1153/1203/1153 1179/1226/1179 1180/1227/1180\nf 1153/1203/1153 1180/1227/1180 1154/1200/1154\nf 1157/1204/1157 1154/1200/1154 1180/1227/1180\nf 1157/1204/1157 1180/1227/1180 1181/1228/1181\nf 1157/1204/1157 1181/1228/1181 1182/1229/1182\nf 1157/1204/1157 1182/1229/1182 1168/1216/1168\nf 1169/1215/1169 1168/1216/1168 1182/1229/1182\nf 1169/1215/1169 1182/1229/1182 1183/1230/1183\nf 1142/1189/1142 1160/1207/1160 1138/1184/1138\nf 1142/1189/1142 1138/1184/1138 1137/1187/1137\nf 1170/1217/1170 1185/1231/1185 1186/1232/1186\nf 1170/1217/1170 1186/1232/1186 1184/1233/1184\nf 1170/1217/1170 1184/1233/1184 1187/1234/1187\nf 1170/1217/1170 1187/1234/1187 1171/1218/1171\nf 1187/1234/1187 1188/1235/1188 1172/1219/1172\nf 1187/1234/1187 1172/1219/1172 1171/1218/1171\nf 1172/1219/1172 1188/1235/1188 1140/1186/1140\nf 1172/1219/1172 1140/1186/1140 1139/1185/1139\nf 1161/1208/1161 1162/1209/1162 1163/1210/1163\nf 1161/1208/1161 1163/1210/1163 1189/1236/1189\nf 1189/1236/1189 1163/1210/1163 1164/1211/1164\nf 1189/1236/1189 1164/1211/1164 1190/1237/1190\nf 1165/1213/1165 1164/1211/1164 1152/1199/1152\nf 1165/1213/1165 1152/1199/1152 1156/1202/1156\nf 1152/1199/1152 1151/1198/1151 1153/1203/1153\nf 1152/1199/1152 1153/1203/1153 1156/1202/1156\nf 1179/1226/1179 1153/1203/1153 1151/1198/1151\nf 1179/1226/1179 1151/1198/1151 1178/1225/1178\nf 1189/1236/1189 1160/1207/1160 1159/1206/1159\nf 1189/1236/1189 1159/1206/1159 1161/1208/1161\nf 1186/1232/1186 1190/1237/1190 1164/1211/1164\nf 1186/1232/1186 1164/1211/1164 1165/1213/1165\nf 1139/1185/1139 1138/1184/1138 1185/1231/1185\nf 1139/1185/1139 1185/1231/1185 1170/1217/1170\nf 1169/1215/1169 1188/1235/1188 1187/1234/1187\nf 1169/1215/1169 1187/1234/1187 1167/1214/1167\nf 1186/1232/1186 1165/1213/1165 1166/1212/1166\nf 1186/1232/1186 1166/1212/1166 1184/1233/1184\nf 1140/1186/1140 1188/1235/1188 1191/1238/1191\nf 1140/1186/1140 1191/1238/1191 1173/1220/1173\nf 1191/1238/1191 1188/1235/1188 1169/1215/1169\nf 1191/1238/1191 1169/1215/1169 1183/1230/1183\nf 1192/1239/1192 1193/1240/1193 1179/1226/1179\nf 1192/1239/1192 1179/1226/1179 1178/1225/1178\nf 1192/1239/1192 1178/1225/1178 1177/1224/1177\nf 1192/1239/1192 1177/1224/1177 1194/1241/1194\nf 1180/1227/1180 1193/1240/1193 1072/1108/1072\nf 1180/1227/1180 1072/1108/1072 1105/1144/1105\nf 1180/1227/1180 1105/1144/1105 1107/1146/1107\nf 1180/1227/1180 1107/1146/1107 1181/1228/1181\nf 1194/1241/1194 1177/1224/1177 1176/1223/1176\nf 1194/1241/1194 1176/1223/1176 1114/1161/1114\nf 1062/1095/1062 1194/1241/1194 1114/1161/1114\nf 1062/1095/1062 1114/1161/1114 1066/1101/1066\nf 707/724/707 1072/1108/1072 1193/1240/1193\nf 707/724/707 1193/1240/1193 825/845/825\nf 825/845/825 1193/1240/1193 1192/1239/1192\nf 825/845/825 1192/1239/1192 1059/1093/1059\nf 1173/1220/1173 1191/1238/1191 832/853/832\nf 1173/1220/1173 832/853/832 711/728/711\nf 1183/1230/1183 1182/1229/1182 1005/1035/1005\nf 1183/1230/1183 1005/1035/1005 831/851/831\nf 1187/1234/1187 1184/1233/1184 1166/1212/1166\nf 1187/1234/1187 1166/1212/1166 1167/1214/1167\nf 710/727/710 1115/1160/1115 1175/1222/1175\nf 710/727/710 1175/1222/1175 1174/1221/1174\nf 1182/1229/1182 1181/1228/1181 1107/1146/1107\nf 1182/1229/1182 1107/1146/1107 1005/1035/1005\nf 453/443/453 1049/1083/1049 720/738/720\nf 453/443/453 720/738/720 598/590/598\nf 1123/1170/1123 888/910/888 889/909/889\nf 1123/1170/1123 889/909/889 844/865/844\nf 916/938/916 794/814/794 793/813/793\nf 916/938/916 793/813/793 913/939/913\nf 711/728/711 832/853/832 770/787/770\nf 711/728/711 770/787/770 708/729/708\nf 919/943/919 927/949/927 1128/1174/1128\nf 919/943/919 1128/1174/1128 959/982/959\nf 925/948/925 708/729/708 770/787/770\nf 925/948/925 770/787/770 769/786/769\nf 913/939/913 793/813/793 954/976/954\nf 913/939/913 954/976/954 924/946/924\nf 831/851/831 832/853/832 1191/1238/1191\nf 831/851/831 1191/1238/1191 1183/1230/1183\nf 895/915/895 767/784/767 766/783/766\nf 895/915/895 766/783/766 1006/1036/1006\nf 891/912/891 804/828/804 807/827/807\nf 891/912/891 807/827/807 788/808/788\nf 778/795/778 777/794/777 788/808/788\nf 778/795/778 788/808/788 807/827/807\nf 810/830/810 1000/1027/1000 776/797/776\nf 810/830/810 776/797/776 779/796/779\nf 947/970/947 1127/1173/1127 1073/1110/1073\nf 947/970/947 1073/1110/1073 952/975/952\nf 1106/1145/1106 1136/1182/1136 1132/1178/1132\nf 1106/1145/1106 1132/1178/1132 714/731/714\nf 1061/1096/1061 1062/1095/1062 1066/1101/1066\nf 1061/1096/1061 1066/1101/1066 1065/1104/1065\nf 443/1098/443 497/1150/497 1057/1090/1057\nf 443/1098/443 1057/1090/1057 1064/1099/1064\nf 1064/1099/1064 1108/1147/1108 1113/1159/1113\nf 1064/1099/1064 1113/1159/1113 1063/1100/1063\nf 1061/1096/1061 1108/1147/1108 1056/1089/1056\nf 1061/1096/1061 1056/1089/1056 1060/1094/1060\nf 1192/1239/1192 1194/1241/1194 1062/1095/1062\nf 1192/1239/1192 1062/1095/1062 1059/1093/1059\nf 1173/1220/1173 711/728/711 710/727/710\nf 1173/1220/1173 710/727/710 1174/1221/1174\nf 880/900/880 881/905/881 884/904/884\nf 880/900/880 884/904/884 878/901/878\nf 841/862/841 1047/1081/1047 1046/1080/1046\nf 841/862/841 1046/1080/1046 723/740/723\nf 1070/1106/1070 1048/1082/1048 1047/1081/1047\nf 1070/1106/1070 1047/1081/1047 841/862/841\nf 461/1115/461 342/999/342 885/907/885\nf 461/1115/461 885/907/885 886/906/886\nf 1114/1161/1114 1176/1223/1176 1175/1222/1175\nf 1114/1161/1114 1175/1222/1175 1115/1160/1115\nf 887/908/887 1124/1169/1124 1130/1176/1130\nf 887/908/887 1130/1176/1130 852/873/852\nf 206/186/206 852/873/852 1130/1176/1130\nf 206/186/206 1130/1176/1130 532/524/532\nf 681/698/681 599/592/599 1195/1242/1195\nf 681/698/681 1195/1242/1195 682/699/682\nf 1196/1243/1196 674/691/674 684/702/684\nf 1196/1243/1196 684/702/684 1195/1242/1195\nf 1197/1244/1197 675/692/675 674/691/674\nf 1197/1244/1197 674/691/674 1196/1243/1196\nf 689/706/689 690/708/690 675/692/675\nf 689/706/689 675/692/675 1197/1244/1197\nf 693/710/693 1199/1245/1199 1200/1246/1200\nf 693/710/693 1200/1246/1200 1198/1247/1198\nf 686/707/686 689/706/689 1197/1244/1197\nf 686/707/686 1197/1244/1197 1199/1245/1199\nf 1196/1243/1196 1195/1242/1195 1202/1248/1202\nf 1196/1243/1196 1202/1248/1202 1201/1249/1201\nf 1084/1122/1084 1083/1124/1083 1204/1250/1204\nf 1084/1122/1084 1204/1250/1204 1203/1251/1203\nf 1092/1131/1092 1013/1042/1013 1203/1251/1203\nf 1092/1131/1092 1203/1251/1203 1204/1250/1204\nf 1206/1252/1206 1087/1253/1087 1207/1254/1207\nf 1206/1252/1206 1207/1254/1207 1205/1255/1205\nf 1206/1252/1206 1208/1256/1208 1086/1257/1086\nf 1206/1252/1206 1086/1257/1086 1087/1253/1087\nf 1091/1258/1091 1090/1259/1090 1210/1260/1210\nf 1091/1258/1091 1210/1260/1210 1209/1261/1209\nf 1093/1132/1093 1211/1262/1211 757/774/757\nf 1093/1132/1093 757/774/757 756/775/756\nf 1079/1120/1079 1212/1263/1212 1090/1128/1090\nf 1079/1120/1079 1090/1128/1090 1080/1118/1080\nf 1079/1120/1079 979/1006/979 1088/1127/1088\nf 1079/1120/1079 1088/1127/1088 1212/1263/1212\nf 1209/1261/1209 1213/1264/1213 1085/1265/1085\nf 1209/1261/1209 1085/1265/1085 1131/1266/1131\nf 1089/1130/1089 1091/1129/1091 1131/1177/1131\nf 1089/1130/1089 1131/1177/1131 1036/1070/1036\nf 1213/1264/1213 1214/1267/1214 1204/1268/1204\nf 1213/1264/1213 1204/1268/1204 1083/1269/1083\nf 1214/1267/1214 1215/1270/1215 1092/1271/1092\nf 1214/1267/1214 1092/1271/1092 1204/1268/1204\nf 1015/1045/1015 757/774/757 1211/1262/1211\nf 1015/1045/1015 1211/1262/1211 1216/1272/1216\nf 1211/1273/1211 1093/1274/1093 1215/1270/1215\nf 1211/1273/1211 1215/1270/1215 1217/1275/1217\nf 1088/1276/1088 1208/1256/1208 1210/1260/1210\nf 1088/1276/1088 1210/1260/1210 1212/1277/1212\nf 1216/1278/1216 1211/1273/1211 1217/1275/1217\nf 1216/1278/1216 1217/1275/1217 1218/1279/1218\nf 1219/1280/1219 1218/1279/1218 1205/1255/1205\nf 1219/1280/1219 1205/1255/1205 1207/1254/1207\nf 698/715/698 697/714/697 717/734/717\nf 698/715/698 717/734/717 716/737/716\nf 967/992/967 418/407/418 524/516/524\nf 967/992/967 524/516/524 968/993/968\nf 598/590/598 720/738/720 712/733/712\nf 598/590/598 712/733/712 293/276/293\nf 697/714/697 721/739/721 1050/1084/1050\nf 697/714/697 1050/1084/1050 717/734/717\nf 957/979/957 956/978/956 1005/1035/1005\nf 957/979/957 1005/1035/1005 1107/1146/1107\nf 1186/1232/1186 1185/1231/1185 1189/1236/1189\nf 1186/1232/1186 1189/1236/1189 1190/1237/1190\nf 1022/1051/1022 896/917/896 765/782/765\nf 1022/1051/1022 765/782/765 764/785/764\nf 1122/1168/1122 896/917/896 1022/1051/1022\nf 1122/1168/1122 1022/1051/1022 1021/1054/1021\nf 678/695/678 1198/1247/1198 625/631/625\nf 678/695/678 625/631/625 27/8/27\nf 1195/1242/1195 599/592/599 626/632/626\nf 1195/1242/1195 626/632/626 1202/1248/1202\nf 1202/1248/1202 626/632/626 628/634/628\nf 1202/1248/1202 628/634/628 1220/1281/1220\nf 1198/1247/1198 1220/1281/1220 628/634/628\nf 1198/1247/1198 628/634/628 625/631/625\nf 1222/1282/1222 1223/1283/1223 1224/1284/1224\nf 1222/1282/1222 1224/1284/1224 1221/1285/1221\nf 1226/1286/1226 1227/1287/1227 1228/1288/1228\nf 1226/1286/1226 1228/1288/1228 1225/1289/1225\nf 1230/1290/1230 1231/1291/1231 1232/1292/1232\nf 1230/1290/1230 1232/1292/1232 1229/1293/1229\nf 1234/1294/1234 1232/1292/1232 1231/1291/1231\nf 1234/1294/1234 1231/1291/1231 1233/1295/1233\nf 1236/1296/1236 1237/1297/1237 1238/1298/1238\nf 1236/1296/1236 1238/1298/1238 1235/1299/1235\nf 1221/1285/1221 1239/1300/1239 1240/1301/1240\nf 1221/1285/1221 1240/1301/1240 1233/1295/1233\nf 1242/1302/1242 1243/1303/1243 1244/1304/1244\nf 1242/1302/1242 1244/1304/1244 1241/1305/1241\nf 1237/1297/1237 1245/1306/1245 1246/1307/1246\nf 1237/1297/1237 1246/1307/1246 1238/1298/1238\nf 1246/1307/1246 1245/1306/1245 1242/1302/1242\nf 1246/1307/1246 1242/1302/1242 1241/1305/1241\nf 1248/1308/1248 1224/1284/1224 1249/1309/1249\nf 1248/1308/1248 1249/1309/1249 1247/1310/1247\nf 1249/1309/1249 1250/1311/1250 660/1312/660\nf 1249/1309/1249 660/1312/660 659/1313/659\nf 661/1314/661 1247/1310/1247 1249/1309/1249\nf 661/1314/661 1249/1309/1249 659/1313/659\nf 1221/1285/1221 1224/1284/1224 1248/1308/1248\nf 1221/1285/1221 1248/1308/1248 1239/1300/1239\nf 1231/1291/1231 1222/1282/1222 1221/1285/1221\nf 1231/1291/1231 1221/1285/1221 1233/1295/1233\nf 1232/1292/1232 1234/1294/1234 1243/1303/1243\nf 1232/1292/1232 1243/1303/1243 1242/1302/1242\nf 1244/1304/1244 1243/1303/1243 1234/1294/1234\nf 1244/1304/1244 1234/1294/1234 1251/1315/1251\nf 1240/1301/1240 1251/1315/1251 1234/1294/1234\nf 1240/1301/1240 1234/1294/1234 1233/1295/1233\nf 1253/1316/1253 1134/1181/1134 1135/1180/1135\nf 1253/1316/1253 1135/1180/1135 1252/1317/1252\nf 1254/1318/1254 1255/1319/1255 1229/1293/1229\nf 1254/1318/1254 1229/1293/1229 1232/1292/1232\nf 1254/1318/1254 1225/1289/1225 1228/1288/1228\nf 1254/1318/1254 1228/1288/1228 1255/1319/1255\nf 667/1320/667 1252/1317/1252 1135/1180/1135\nf 667/1320/667 1135/1180/1135 539/1183/539\nf 1226/1286/1226 1225/1289/1225 1237/1297/1237\nf 1226/1286/1226 1237/1297/1237 1236/1296/1236\nf 1245/1306/1245 1254/1318/1254 1232/1292/1232\nf 1245/1306/1245 1232/1292/1232 1242/1302/1242\nf 1254/1318/1254 1245/1306/1245 1237/1297/1237\nf 1254/1318/1254 1237/1297/1237 1225/1289/1225\nf 669/674/669 668/675/668 1226/1286/1226\nf 669/674/669 1226/1286/1226 1236/1296/1236\nf 1230/1290/1230 1256/1321/1256 1222/1282/1222\nf 1230/1290/1230 1222/1282/1222 1231/1291/1231\nf 1235/1299/1235 671/677/671 669/674/669\nf 1235/1299/1235 669/674/669 1236/1296/1236\nf 1230/1290/1230 1101/1139/1101 1100/1138/1100\nf 1230/1290/1230 1100/1138/1100 1256/1321/1256\nf 672/678/672 488/480/488 1103/1142/1103\nf 672/678/672 1103/1142/1103 1227/1287/1227\nf 1224/1284/1224 1223/1283/1223 1250/1311/1250\nf 1224/1284/1224 1250/1311/1250 1249/1309/1249\nf 1256/1321/1256 1100/1138/1100 1134/1181/1134\nf 1256/1321/1256 1134/1181/1134 1253/1316/1253\nf 1227/1287/1227 1103/1142/1103 1132/1178/1132\nf 1227/1287/1227 1132/1178/1132 1228/1288/1228\nf 1101/1139/1101 1230/1290/1230 1229/1293/1229\nf 1101/1139/1101 1229/1293/1229 1133/1179/1133\nf 1223/1283/1223 1253/1316/1253 1252/1317/1252\nf 1223/1283/1223 1252/1317/1252 1250/1311/1250\nf 1255/1319/1255 1136/1182/1136 1133/1179/1133\nf 1255/1319/1255 1133/1179/1133 1229/1293/1229\nf 1228/1288/1228 1132/1178/1132 1136/1182/1136\nf 1228/1288/1228 1136/1182/1136 1255/1319/1255\nf 660/1312/660 1250/1311/1250 1252/1317/1252\nf 660/1312/660 1252/1317/1252 667/1320/667\nf 668/675/668 672/678/672 1227/1287/1227\nf 668/675/668 1227/1287/1227 1226/1286/1226\nf 1222/1282/1222 1256/1321/1256 1253/1316/1253\nf 1222/1282/1222 1253/1316/1253 1223/1283/1223\nf 1/1322/1 12/1323/12 1247/1310/1247\nf 1/1322/1 1247/1310/1247 661/1314/661\nf 10/1324/10 8/1325/8 1240/1301/1240\nf 10/1324/10 1240/1301/1240 1239/1300/1239\nf 1239/1300/1239 1248/1308/1248 11/1326/11\nf 1239/1300/1239 11/1326/11 10/1324/10\nf 5/1327/5 3/1328/3 1235/1299/1235\nf 5/1327/5 1235/1299/1235 1238/1298/1238\nf 9/1329/9 4/1330/4 1246/1307/1246\nf 9/1329/9 1246/1307/1246 1241/1305/1241\nf 1240/1301/1240 8/1325/8 6/1331/6\nf 1240/1301/1240 6/1331/6 1251/1315/1251\nf 7/1332/7 9/1329/9 1241/1305/1241\nf 7/1332/7 1241/1305/1241 1244/1304/1244\nf 11/1326/11 1248/1308/1248 1247/1310/1247\nf 11/1326/11 1247/1310/1247 12/1323/12\nf 3/1328/3 2/690/2 671/677/671\nf 3/1328/3 671/677/671 1235/1299/1235\nf 1238/1298/1238 1246/1307/1246 4/1330/4\nf 1238/1298/1238 4/1330/4 5/1327/5\nf 7/1332/7 1244/1304/1244 1251/1315/1251\nf 7/1332/7 1251/1315/1251 6/1331/6\nf 1203/1251/1203 1013/1042/1013 1012/1043/1012\nf 1203/1251/1203 1012/1043/1012 736/757/736\nf 937/959/937 941/964/941 1027/1057/1027\nf 937/959/937 1027/1057/1027 999/1030/999\nf 1084/1122/1084 739/756/739 1034/1067/1034\nf 1084/1122/1084 1034/1067/1034 1037/1071/1037\nf 1197/1244/1197 1196/1243/1196 1201/1249/1201\nf 1197/1244/1197 1201/1249/1201 1199/1245/1199\nf 1203/1251/1203 736/757/736 739/756/739\nf 1203/1251/1203 739/756/739 1084/1122/1084\nf 936/962/936 784/805/784 941/964/941\nf 936/962/936 941/964/941 937/959/937\nf 786/806/786 1004/1033/1004 940/963/940\nf 786/806/786 940/963/940 785/804/785\nf 467/1333/467 612/604/612 387/1334/387\nf 612/604/612 624/630/624 387/1334/387\nf 621/628/621 387/1334/387 624/630/624\nf 604/595/604 44/22/44 28/5/28\nf 472/605/472 612/604/612 467/1333/467\nf 29/6/29 28/5/28 47/26/47\nf 43/21/43 48/25/48 44/22/44\nf 30/7/30 266/1335/266 27/8/27\nf 424/414/424 239/223/239 425/415/425\nf 467/458/467 363/347/363 472/463/472\nf 561/552/561 560/553/560 572/564/572\nf 549/540/549 551/542/551 579/571/579\nf 583/574/583 595/588/595 582/575/582\nf 31/12/31 36/13/36 600/591/600\nf 39/16/39 44/22/44 603/597/603\nf 32/9/32 599/592/599 45/23/45\nf 473/626/473 613/607/613 471/606/471\nf 477/620/477 478/625/478 620/621/620\nf 474/611/474 615/610/615 617/627/617\nf 1257/1336/1257 614/609/614 618/616/618\nf 1257/1336/1257 620/621/620 622/624/622\nf 1257/1336/1257 618/616/618 619/619/619\nf 1257/1336/1257 613/607/613 615/610/615\nf 614/609/614 1257/1336/1257 615/610/615\nf 622/624/622 623/629/623 1257/1336/1257\nf 1257/1336/1257 623/629/623 611/603/611\nf 624/630/624 623/629/623 621/628/621\nf 469/617/469 618/616/618 470/615/470\nf 614/609/614 476/608/476 533/614/533\nf 610/602/610 1257/1336/1257 611/603/611\nf 613/607/613 1257/1336/1257 610/602/610\nf 620/621/620 1257/1336/1257 619/619/619\nf 541/532/541 592/584/592 562/555/562\nf 541/532/541 587/581/587 592/584/592\nf 627/633/627 607/599/607 605/596/605\nf 627/633/627 605/596/605 604/595/604\nf 605/596/605 606/598/606 603/597/603\nf 607/599/607 606/598/606 605/596/605\nf 1207/1254/1207 1082/1337/1082 1015/1338/1015\nf 1219/1280/1219 1207/1254/1207 1015/1338/1015\nf 1015/1338/1015 1216/1278/1216 1219/1280/1219\nf 693/710/693 1198/1247/1198 678/695/678\nf 1207/1254/1207 1087/1253/1087 1082/1337/1082\nf 678/695/678 677/697/677 694/712/694\nf 695/713/695 692/711/692 693/710/693\nf 266/1335/266 679/696/679 27/8/27\nf 883/903/883 1044/1079/1044 1045/1078/1045\nf 992/1020/992 1082/1121/1082 1087/1125/1087\nf 1158/1205/1158 1157/1204/1157 1168/1216/1168\nf 1147/1194/1147 1145/1192/1145 1176/1223/1176\nf 1193/1240/1193 1180/1227/1180 1179/1226/1179\nf 684/702/684 682/699/682 1195/1242/1195\nf 693/710/693 686/707/686 1199/1245/1199\nf 599/592/599 681/698/681 45/23/45\nf 1208/1256/1208 1088/1276/1088 1086/1257/1086\nf 1093/1274/1093 1092/1271/1092 1215/1270/1215\nf 1210/1260/1210 1090/1259/1090 1212/1277/1212\nf 1209/1261/1209 1258/1339/1258 1213/1264/1213\nf 1215/1270/1215 1258/1339/1258 1217/1275/1217\nf 1213/1264/1213 1258/1339/1258 1214/1267/1214\nf 1208/1256/1208 1258/1339/1258 1210/1260/1210\nf 1258/1339/1258 1209/1261/1209 1210/1260/1210\nf 1218/1279/1218 1217/1275/1217 1258/1339/1258\nf 1218/1279/1218 1258/1339/1258 1205/1255/1205\nf 1218/1279/1218 1219/1280/1219 1216/1278/1216\nf 1213/1264/1213 1083/1269/1083 1085/1265/1085\nf 1091/1258/1091 1209/1261/1209 1131/1266/1131\nf 1258/1339/1258 1206/1252/1206 1205/1255/1205\nf 1258/1339/1258 1208/1256/1208 1206/1252/1206\nf 1258/1339/1258 1215/1270/1215 1214/1267/1214\nf 1189/1236/1189 1138/1184/1138 1160/1207/1160\nf 1185/1231/1185 1138/1184/1138 1189/1236/1189\nf 1202/1248/1202 1220/1281/1220 1200/1246/1200\nf 1200/1246/1200 1220/1281/1220 1198/1247/1198\nf 1201/1249/1201 1200/1246/1200 1199/1245/1199\nf 1201/1249/1201 1202/1248/1202 1200/1246/1200\n# 2492 faces\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1]),\n\t\t\ty = float.Parse (strItems [2]),\n\t\t\tz = float.Parse (strItems [3])\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 6: Shaders for the software renderer**\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\nRefactoring the source code. IShader.\n\n```csharp\ninterface IShader\n{\n    Vec4f Vertex (Face face, int nthvert);\n    bool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n};\n\nclass RenderResult\n{\n    public Image Image { get; set; }\n    public float [] ZBuffer { get; set; }\n}\n\nRenderResult Render (Model model, IShader shader)\n{\n    var image = new Image (width, height, Format.BGR);\n    var zbuffer = InitZBuffer (image);\n    var screen_coords = new Vec4f [3];\n\n    foreach (var face in model.Faces) {\n        for (int i = 0; i < 3; i++)\n            screen_coords [i] = shader.Vertex (face, i);\n        Triangle (image, screen_coords, shader, zbuffer);\n    }\n\n    return new RenderResult {\n        Image = image,\n        ZBuffer = zbuffer\n    };\n}\n\nvoid Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n{\n    pMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n    pMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n    for (int i = 0; i < 3; i++) {\n        pMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n        pMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n        pMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n        pMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n    }\n}\n\nvoid Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n{\n    Vec2i pMin, pMax;\n    Box (pts, out pMin, out pMax);\n\n    Color color;\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n            var bc = Barycentric (Project2D (pts [0] / pts [0].h),\n                                    Project2D (pts [1] / pts [1].h),\n                                    Project2D (pts [2] / pts [2].h),\n                                    pixelCenter);\n\n            var z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n            var w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n            var frag_depth = z / w;\n\n            var idx = x + y * image.Width;\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n                continue;\n\n\n            var fragment = new Vec3f { x = x, y = y, z = frag_depth };\n            var discard = shader.Fragment (fragment, bc, out color);\n            if (!discard) {\n                zbuffer [idx] = frag_depth;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n```\n\nLet us see how it works. The actual render code:\n\n* Parsing the .obj file\n\n* Iteration through all triangles of the model and rasterization of each triangle.\n\nThe last step is the most interesting. Outer loop iterates through all the triangles. Inner loop iterates through all the vertices of the current triangle and calls a vertex shader for each vertex.\n\n**The main goal of the vertex shader is to transform the coordinates of the vertices. The secondary goal is to prepare data for the fragment shader.**\n\nWhat happens after that? We call the rasterization routine. What happens inside the rasterizer we do not know (well, okay, we do know since we programmed it!) with one exception. We know that the rasterizer calls **our** routine for each pixel, namely, the fragment shader. Again, for each pixel inside the triangle the rasterizer calls our own callback, the fragment shader.\n\n**The main goal of the fragment shader - is to determine the color of the current pixel. Secondary goal - we can discard current pixel by returning true.**\n\nThe rendering pipeline for the OpenGL 2 can be represented as follows (in fact, it is more or less the same for newer versions too):\n\n![  ](./img/lesson6_opengl2_pipeline.png)\n\nBecause of the time limits I have for my course, I restrict myself to the OpenGL 2 pipeline and therefore to fragment and vertex shaders only. In newer versions of OpenGL there are other shaders, allowing, for example, to generate geometry on the fly.\n\nOkay, in the above image all the stages we can not touch are shown in blue, whereas our callbacks are shown in orange. In fact, our render code - is the \\*\\*primitive processing \\*\\*routine. It calls the vertex shader. We do not have primitive assembly here, since we are drawing dumb triangles only (in our code it is merged with the primitive processing). `Triangle` function - is the **rasterizer**, for each point inside the triangle it calls the **fragment shader**, then performs depth checks (z-buffer) and such.\n\nThat is all. You know what the shaders are and now you can create your own shaders.\n\n# **My implementation of shaders shown on Gouraud shading**\n\nAccording to its name, it is a Gouraud shader. Here is the code:\n\n```csharp\nusing static ShaderUtils;\n\nclass GouraudShader : IShader\n{\n    readonly Model model;\n    readonly Vec3f lightDir;\n\n    // written by vertex shader, read by fragment shader\n    protected Vec3f varyingIntensity = new Vec3f ();\n\n    readonly Matrix4 transformation;\n\n    public GouraudShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n    {\n        this.model = model;\n        transformation = viewPort * projection * modelView;\n        this.lightDir = lightDir.Normalize ();\n    }\n\n    public virtual Vec4f Vertex (Face face, int nthvert)\n    {\n        var n = model.Normal (face, nthvert).Normalize ();\n        // get diffuse lighting intensity\n        varyingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir));\n        var d = Dot(n, lightDir);\n\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public virtual bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // interpolate intensity for the current pixel\n        var intensity = Dot (varyingIntensity, bar);\n        color = Color.White * intensity; // well duh\n        return false;\n    }\n}\n\n// set of utils which will be used in our shaders\nstatic class ShaderUtils\n{\n    public static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n    {\n        var v = model.Vertex (face, nthvert); // read the vertex from model\n        var glVertex = Embed4D (v);\n        return Mult (t, glVertex); // transform it to screen coordinates\n    }\n\n    public static void UpdateVarayingUV (Model model, Face face, int nthvert,\n                                         ref Vec3f varyingU, ref Vec3f varyingV)\n    {\n        var vt = model.GetUV (face, nthvert);\n        varyingU [nthvert] = vt.x;\n        varyingV [nthvert] = vt.y;\n    }\n\n    public static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n    {\n        return new Vec2f {\n            x = Dot (varU, bar),\n            y = Dot (varV, bar)\n        };\n    }\n\n    public static Color GetColor (Image texture, Vec2f uvf)\n    {\n        var uvi = CalcXY(texture, uvf);\n        return texture [uvi.x, uvi.y];\n    }\n\n    public static Vec3f Transform (Matrix4 t, Vec3f v)\n    {\n        var v4d = Mult (t, Embed4D (v));\n        return Project3D (v4d);\n    }\n\n    public static Vec3f Normal (Image normalMap, Vec2f uvf)\n    {\n        // RGB values as xyz. But Color stores data as BGR (zyx)\n        var c = GetColor (normalMap, uvf);\n\n        return new Vec3f {\n            x = (c [2] / 255f) * 2 - 1,\n            y = (c [1] / 255f) * 2 - 1,\n            z = (c [0] / 255f) * 2 - 1\n        };\n    }\n\n    public static float Specular (Image specularMap, Vec2f uvf)\n    {\n        var uvi = CalcXY (specularMap, uvf);\n        var color = specularMap [uvi.x, uvi.y];\n        return color[0];\n    }\n\n    public static Vec2i CalcXY (Image texture, Vec2f uvf)\n    {\n        return new Vec2i {\n            x = (int)(uvf.x * texture.Width),\n            y = (int)(uvf.y * texture.Height)\n        };\n    }\n}\n\nvar light_dir = new Vec3f { x = 1, y = 1, z = 1 };\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\nvar modelView = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1f/(eye-center).Norm());\n\nvar shader = new GouraudShader (headModel, viewPort, projection, modelView, light_dir);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n**vayring** is a reserved keyword in GLSL language, I have used VaryingIntensity as a name in order to show the correspondence. In varying variables we store data to be interpolated inside the triangle, and the fragment shaders get the interpolated value (for the current pixel).\n\nFragment routine is called for each pixel inside the triangle we draw; as an input it receives [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) for interpolation of VaryingXXX data. Thus, interpolated intensity can be computed as:\n\nVaryingIntensity\\[0\\]\\*bar\\[0\\] \\+ VaryingIntensity\\[1\\]\\*bar\\[1\\] \\+ VaryingIntensity\\[2\\]\\*bar\\[2\\]\n\nor simply as a dot product between two vectors: `Dot(VaryingIntensity,bar)`. In true GLSL, of course, fragment shaders receive ready interpolated values.\n\nNotice that the shader returns a bool value. It is easy to understand what it does if we look inside the updated rasterizer:\n\n```csharp\n/*\n...\nvar discard = shader.Fragment (fragment, bc, out color);\nif (!discard) {\n    zbuffer [idx] = frag_depth;\n    image [x, y] = color;\n}\n*/\n```\n\nFragment shader can discard drawing of the current pixel, then the rasterizer simply skips it. It is handy if we want to create binary masks or whatever you want.\n\nOf course, the rasterizer can not imagine all the weird stuff you could program, therefore it can not be pre-compiled with your shader. Here we use IShader interface as an intermediate between the two.\n\n# **First modification of the shaders**\n\nSimple modification of the Gourad shading, where the intensities are allowed to have 6 values only:\n\n```csharp\nclass GouraudShader6 : GouraudShader\n{\n    public GouraudShader6 (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n        : base (model, viewPort, projection, modelView, lightDir)\n    {\n    }\n\n    public override bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var intensity = Dot (varyingIntensity, bar);\n        if (intensity > 0.85f) intensity = 1;\n        else if (intensity > 0.60f) intensity = 0.80f;\n        else if (intensity > 0.45f) intensity = 0.60f;\n        else if (intensity > 0.30f) intensity = 0.45f;\n        else if (intensity > 0.15f) intensity = 0.30f;\n        else intensity = 0;\n        color = new Color (255, 155, 0) * intensity;\n        return false;\n    }\n}\n\nvar shader = new GouraudShader6 (headModel, viewPort, projection, modelView, light_dir);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Textures**\n\nI'll skip the [Phong shading](https://en.wikipedia.org/wiki/Phong_shading), but take a look at the article. Remember the homework assignment I gave you for texturing? We had to interpolate uv-coordinates.\n\n```csharp\nusing static ShaderUtils;\n\nclass TextureShader : IShader\n{\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 transformation;\n    readonly Image texture;\n\n    // written by vertex shader, read by fragment shader\n    Vec3f varyingIntensity = new Vec3f ();\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    public TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n    {\n        this.model = model;\n        transformation = viewPort * projection * modelView;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var n = model.Normal (face, nthvert).Normalize ();\n        varyingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // interpolate intensity for the current pixel\n        var intensity = Dot (varyingIntensity, bar);\n\n        // interpolate uv for the current pixel\n        var uvf = CalcUV (varyingU, varyingV, bar);\n\n        color = GetColor (texture, uvf) * intensity;\n        return false;\n    }\n}\n\nvar shader = new TextureShader (headModel, viewPort, projection, modelView, light_dir, headTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Normalmapping**\n\nOkay, now we have texture coordinates. What can we store in texture images? In fact, almost anything. It can be color, directions, temperature and so on. Let us load this texture:\n\n![  ](./img/lesson6_african_head_nm.png)\n\nIf we interpret RGB values as xyz directions, this image gives us normal vectors **for each pixel** of our render and not only per vertex as before.\n\nBy the way, compare this image to another one, it gives exactly the same information, but in another frame:\n\n![  ](./img/lesson6_african_head_nm_tangent.png)\n\nOne of the images gives normal vectors in global (Cartesian) coordinate system, another one in [Darboux frame](https://en.wikipedia.org/wiki/Darboux_frame) (so-called tangent space). In Darboux frame the z-vector is normal to the object, x - principal curvature direction and y - their cross product.\n\n**Exercise 1:** Can you tell which image is represented in Darboux frame and which one is in the global coordinate frame?\n\n**Exercise 2:** Can you tell which representation is better and if yes, why is that?\n\n**Uniform** is a reserved keyword in GLSL, it allows to pass constants to the shaders. Here I pass the matrix Projection\\*ModelView and its inverse transpose to transform the normal vectors (refer to the end of the lesson5). So, computation of the lighting intensity is the same as before with one exception: instead of interpolating normal vectors we retrieve the information from the normal mapping texture (do not forget to transform light vector and normal vectors).\n\n```csharp\nclass NormalMapShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public NormalMapShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n\n        var intensity = Math.Max (0f, Dot (n, l));\n        color = GetColor (texture, uv) * intensity;\n        return false;\n    }\n}\n\nvar headNormalMap = Image.Load (\"obj/african_head_nm.tga\");\nheadNormalMap.VerticalFlip ();\n\nvar shader = new NormalMapShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Specular mapping**\n\nOkay, let us continue the fun. All the computer graphics science is the art to cheat. To (cheaply) trick the eye we use the [Phong's approximation](https://en.wikipedia.org/wiki/Phong_reflection_model) of the lighting model. Phong proposed to consider the final lighting as a (weighted) sum of three light intensities: ambient lighting (constant per scene), diffuse lighting (the one we computed up to this moment) and specular lighting.\n\nTake a look at the following image, it speaks for itself:\n\n![  ](./img/lesson6_phong.png)\n\nWe compute diffuse lighting as a cosine of the angle between the normal vector and the light direction vector. I mean, this supposes that the light is reflected in all directions uniformly. What happens to glossy surfaces? In the limit case (mirror) the pixel is illuminated if and only if we can see the light source reflected by this pixel:\n\n![  ](./img/lesson6_reflection.png)\n\nFor diffuse lighting we computed the (cosine of) angle between vectors **n** and **l**, and now we are interested in the (cosine of) angle between vectors **r** (reflected light direction) and **v**(view direction).\n\n**Exercise 3:** Given vectors **n** and **l**, find vector **r**.\n\n*Answer:* If **n** and **l** are normalized, then **r** = 2**n**<**n**,**l**> - **l**\n\nFor diffused lighting we computed the light intensity as the cosine. But a glossy surface reflects in one direction much more than in others! Okay then, what happens if we take tenth power of the cosine? Recall that all numbers inferior to 1 will decrease when we apply the power. It means that tenth power of the cosine will give smaller radius of the reflected beam. And hundredth power **much** smaller beam radius. This power is stored in a special texture (specular mapping texture) that tells for each point if it is glossy or not.\\\n\\\nI think that i do not need to comment anything in the below code at the exception of coefficients: `5 + color [i] * (diff + 1.3f * specular)`\n\nI took 5 for the ambient component, 1 for the diffuse component and 1.3 for the specular component. What coefficients to choose - is your choice. Different choices give different appearances for the object. Normally it is for the artist to decide.\n\n*Please note that normally the sum of the coefficents must be equal to 1, but you know. I like to create light.*\n\n```csharp\nclass SpecularShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n    readonly Image specularMap;\n\n    public SpecularShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap, Image specularMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n        this.specularMap = specularMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n\n        var r = (n * (2 * Dot (n, l)) - l).Normalize ();\n\n        var diff = Math.Max (0f, Dot (n, l));\n        var specular = Math.Pow (Math.Max (0f, r.z), Specular (specularMap, uv) + 15);\n\n        color = GetColor (texture, uv);\n\n        int v = 0;\n        for (int i = 0; i < 4; i++)\n            v = (v << 8) | (byte)Math.Min (255, (int)(5 + color [i] * (diff + 1.3f * specular)));\n        color = new Color (v, color.format);\n\n        return false;\n    }\n}\n\nvar headSpecularMap = Image.Load (\"obj/african_head_spec.tga\");\nvar shader = new SpecularShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap, headSpecularMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n```csharp\nvar diabloModel = Model.FromFile (\"obj/diablo3_pose.obj\");\nvar diabloTexture = Image.Load (\"obj/diablo3_pose_diffuse.tga\");\nvar diabloNormalMap = Image.Load (\"obj/diablo3_pose_nm.tga\");\nvar diabloTangentMap = Image.Load (\"obj/diablo3_pose_nm_tangent.tga\");\nvar diabloSpecularMap = Image.Load (\"obj/diablo3_pose_spec.tga\");\ndiabloTexture.VerticalFlip ();\ndiabloNormalMap.VerticalFlip ();\ndiabloTangentMap.VerticalFlip ();\ndiabloSpecularMap.VerticalFlip ();\n\nvar shader = new SpecularShader (diabloModel, viewPort, projection, modelView, light_dir, diabloTexture, diabloNormalMap, diabloSpecularMap);\n\nvar image = Render (diabloModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Conclusion**\n\nWe know how to render quite nice scenes, but our lighting is far from being real. In the next articles I will talk about shadows.\n\nEnjoy!\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson1.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson2.csx",
    "content": "using static Geometry;\n\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\n\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n\tLine(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n\tLine(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n\tLine(image, t[0], t[1], color);\n\tLine(image, t[1], t[2], color);\n\tLine(image, t[2], t[0], color);\n}\n\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson2.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\nusing static Geometry;\n```\n\n# Lesson 2: Triangle rasterization and back face culling\n\n# Old-school method: Line sweeping\n\nThus, the task is to draw two-dimensional triangles. For motivated students it normally takes a couple of hours, even if they are bad programmers. Last time we saw Bresenham’s line drawing algorithm. Today’s task is to draw a filled triangle. Funny enough, but this task is not trivial. I don’t know why, but I know that it’s true. Most of my students struggle with this simple task. So, the initial stub will look like this:\n\n```csharp\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n    Line(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n    Line(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    Line(image, t[0], t[1], color);\n    Line(image, t[1], t[2], color);\n    Line(image, t[2], t[0], color);\n}\n\nVec2i[] t0 = {\n    new Vec2i { x = 10, y = 70 },\n    new Vec2i { x = 50, y = 160 },\n    new Vec2i { x = 70, y = 80 }\n};\nVec2i[] t1 = {\n    new Vec2i { x = 180, y = 50 },\n    new Vec2i { x = 150, y = 1 },\n    new Vec2i { x = 70, y = 180 }\n};\nVec2i[] t2 = {\n    new Vec2i { x = 180, y = 150 },\n    new Vec2i { x = 120, y = 160 },\n    new Vec2i { x = 130, y = 180 }\n};\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThe code is simple: I provide three triangles for the initial debugging of your code. If we invoke `Line` inside the triangle function, we’ll get the contour of the triangle. How to draw a filled triangle?\n\nA good method of drawing a triangle must have the following features:\n\n* It should be (surprise!) simple and fast.\n\n\n* It should be symmetrical: the picture should not depend on the order of vertices passed to the drawing function.\n\n\n* If two triangles have two common vertices, there should be no holes between them because of rasterization rounding.\n\nWe could add more requirements, but let’s do with these ones. Traditionally a line sweeping is used:\n\n1. Sort vertices of the triangle by their y-coordinates\n\n2. Rasterize simultaneously the left and the right sides of the triangle\n\n3. Draw a horizontal line segment between the left and the right boundary points\n\nAt this point my students start to lose the firm ground: which segment is the left one, which one is right? Besides, there are three segments in a triangle... Usually, after this introduction I leave my students for about an hour: once again, reading my code is much less valuable than comparing your own code with mine.\n\n`[One hour passes]`\n\nHow do I draw a triangle? Once again, if you have a better method, I’d be glad to adopt it. Let us assume that we have three points of the triangle: `t0`, `t1`, `t2`, they are sorted in ascending order by the y-coordinate. Then, the boundary A is between `t0` and `t2`, boundary B is between `t0` and `t1`, and then between `t1` and `t2`.\n\n```csharp\nvoid OrderByY (Vec2i[] t)\n{\n    if(t[0].y > t[1].y) Swap(t, 0, 1);\n    if(t[1].y > t[2].y) Swap(t, 1, 2);\n    if(t[0].y > t[1].y) Swap(t, 0, 1);   \n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    Line(image, t[0], t[1], Color.Green);\n    Line(image, t[1], t[2], Color.Green);\n    Line(image, t[2], t[0], Color.Red);    \n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\n// Here boundary A is red, and boundary B is green.\nimage.VerticalFlip ();\nimage\n```\n\nUnfortunately, boundary B is made of two parts. Let us draw the bottom half of the triangle by cutting it horizontally:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        image[A.x, y] = Color.Red; \n        image[B.x, y] = Color.Green; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNote that the segments are not continuous. Last time when we drew straight lines we struggled to get continuous segments and here I did not bother with rotating the image (remember the xy swapping?). Why? We fill the triangles aftewards, that’s why. If we connect the corresponding pairs of points by horizontal lines, the gaps disappear:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        Line(image, A, B, Color.White);\n        image[B.x, y] = Color.Green; \n        image[A.x, y] = Color.Red; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNow, let us draw the second (upper) half of the triangle. We can do this by adding a second loop:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    \n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n    \n    float height_21 = t[2].y - t[1].y;\n    for(int y=t[1].y; y<=t[2].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[1].y) / height_21; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[1].x + (int)((t[2].x-t[1].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThis could be enough, but I dislike to see the same code twice. That is why we will make it a bit less readable, but more handy for modifications/maintaining:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    // I dont care about degenerate triangles\n    if(t[0].y == t[1].y && t[1].y == t[2].y)\n        return;\n\n    OrderByY(t);\n\n    float height_10 = t[1].y - t[0].y;\n    float total_height = t[2].y - t[0].y;\n    for(int i=0; i<total_height; i++) {\n        bool second_half = i > t[1].y - t[0].y || t[1].y == t[0].y;\n        float segment_height = second_half ? t[2].y-t[1].y : t[1].y-t[0].y;\n        var alpha = i / total_height;\n        // be careful with divisions by zero\n        var beta = (i - (second_half ? t[1].y-t[0].y : 0)) / segment_height;\n        Vec2i A = new Vec2i {\n            x = t[0].x + (int)((t[2].x-t[0].x)*alpha),\n            y = t[0].y + i\n        };\n        Vec2i B = new Vec2i {\n            x = second_half ? t[1].x + (int)((t[2].x-t[1].x)*beta) : t[0].x + (int)((t[1].x-t[0].x)*beta),\n            y = t[0].y + i\n        };\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, t[0].y + i] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\n# The method I adopt for my code\n\nWhile not being really complicated, the source code for the line sweeping is a bit messy. Moreover, it is really an old-school approach designed for mono-thread CPU programming. Let us take a look at the following pseudo-code:\n\n```csharp\n// triangle(Vec2i[] points) { \n//     Vec2i bbox[2] = find_bounding_box(points); \n//     for (each pixel in the bounding box) { \n//         if (inside(points, pixel)) { \n//             put_pixel(pixel); \n//         } \n//     } \n// }\n```\n\nDo you like it? I do. It is really easy to find a bounding box. It is certainly no problem to check whether a point belongs a 2D triangle (or any convex polygon).\n\n*Off Topic: if I have to implement some code to check whether a point belongs to a polygon, and this program will run on a plane, I will never get on this plane. Turns out, it is a surprisingly difficult task to solve this problem reliably. But here we just painting pixels. I am okay with that.*\n\nThere is another thing I like about this pseudocode: a neophyte in programming accepts it with enthusiasm, more experienced programmers often chuckle: “*What an idiot wrote it?*”. And an expert in computer graphics programming will shrug his shoulders and say: “*Well, that’s how it works in real life*”. Massively parallel computations in thousands of threads (i’m talking about regular consumer computers here) change the way of thinking.\n\nOkay, let us start: first of all we need to know what the [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) are. Given a 2D triangle ABC and a point P, all in old good Cartesian coordinates `(xy)`. Our goal is to find barycentric coordinates of the point P with respect to the triangle ABC. It means that we look for three numbers `(1 − u − v,u,v)` such that we can find the point P as follows:\n\n![ ](./img/lesson2_f1.png)\n\nWhile being a bit frightening at the first glance, it is really simple: imagine that we put three weights `(1−u−v,u,v)` at the vertices A, B and C, respectively. Then the barycenter of the system is exactly in the point P. We can say the same thing with other words: the point P has coordinates `(u,v)` in the (oblique) basis (A,![](./img/lesson2_ab.png),![](./img/lesson2_ac.png)):\n\n![ ](./img/lesson2_f2.png)\n\nSo, we have vectors ![](./img/lesson2_ab.png)￼, ![](./img/lesson2_ac.png)￼ and ![￼](./img/lesson2_ap.png), we need to find two real numbers u and v respecting the following constraint:\n\n![ ](./img/lesson2_f3.png)\n\nIt is a simple vector equation, or a linear system of two equations with two variables:\n\n![ ](./img/lesson2_f4.png)\n\nI am lazy and do not want to solve linear systems in a scholar way. Let us write it in matrix form:\n\n![ ](./img/lesson2_f5.png)\n\nIt means that we are looking for a vector `(u,v,1)` that is orthogonal to `(￼ABx,AC￼x,￼PAx)` and `(￼ABy,AC￼y,PA￼y)` *at the same time*! I hope you see [where I am heading](https://en.wikipedia.org/wiki/Cross_product). That is a small hint: to find an intersection of two straight lines in a plane (that is exactly what we did here), it is sufficient to compute one cross product. By the way, test yourself: how do we find an equation of a line passing through two given points?\n\nSo, let us program our new rasterization routine: we iterate through all pixels of a bounding box for a given triangle. For each pixel we compute its barycentric coordinates. If it has at least one negative component, then the pixel is outside of the triangle. Probably it is more clear to see the program directly:\n\n```csharp\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}\n```\n\n# Flat shading render\n\nWe already know how to draw a model with empty triangles. Let us fill them with a random color. This will help us to see how well we have encoded filling of triangles. Here is the code:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\n// Map world coordinates [-1..-1] to screen coordinates [0..width]\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*image.Width/2),\n    y = (int)((v.y+1)*image.Height/2)\n};\n\nvar rnd = new Random();\nFunc<byte> rndByte = () => (byte)rnd.Next(255);\nFunc<Color> rndColor = () => new Color(rndByte(), rndByte(), rndByte()); \n\nvar coordinates = new Vec3f[3];\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        var v = headModel.Vertices[vIndex];\n        coordinates[i] = map(v);\n    }    \n    Triangle(image, coordinates, rndColor());\n}\n\nimage.VerticalFlip ();\nimage\n```\n\nLet us get rid of these clown-colors and put some lighting. Captain Obvious: ”*At the same light intensity, the polygon is illuminated most brightly when it is orthogonal to the light direction.*”\n\nLet us compare:\n\n![ ](./img/lesson2_light1.jpeg)\n\n![](./img/lesson2_light2.jpeg)\n\nWe get zero illumination if the polygon is parallel to the vector of light. To paraphrase: the intensity of illumination is equal to the scalar product of the light vector and the normal to the given triangle. The normal to the triangle can be calculated simply as the [cross product](https://en.wikipedia.org/wiki/Cross_product) of its two sides.\n\nAs a side note, at this course we will perform linear computations on the colors. However `(128,128,128)` color is not half as bright as `(255, 255, 255)`. We are going to ignore gamma correction and tolerate the incorrectness of the brightness of our colors.\n\n```csharp\nvar image = new Image (width, height, Format.BGR);\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\nforeach (var face in headModel.Faces) {\n    for (int i = 0; i < 3; i++) {\n        var vIndex = face.Vertices [i];\n        world [i] = headModel.Vertices [vIndex];\n        screen [i] = map (world [i]);\n    }\n\n    var n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n    var intensivity = Dot (n, light_dir);\n    if (intensivity > 0)\n        Triangle (image, screen, Color.White * intensivity);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson3.csx",
    "content": "using static Geometry;\n\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nfloat [] InitZBuffer (Image image)\n{\n\tvar zbuffer = new float [image.Width * image.Height];\n\tfor (int idx = 0; idx < zbuffer.Length; idx++)\n\t\tzbuffer [idx] = float.NegativeInfinity;\n\treturn zbuffer;\n}\n\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n\tvar ab = b - a;\n\tvar ac = c - a;\n\tvar pa = a - p;\n\n\tvar r = Cross (new Vec3f {\n\t\tx = ab.x,\n\t\ty = ac.x,\n\t\tz = pa.x\n\t}, new Vec3f {\n\t\tx = ab.y,\n\t\ty = ac.y,\n\t\tz = pa.y\n\t});\n\n\t// triangle is degenerate, in this case return smth with negative coordinates\n\t// dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n\tif ((int)r.z == 0)\n\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\treturn new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n\tVec3f t0 = coordinates [0];\n\tVec3f t1 = coordinates [1];\n\tVec3f t2 = coordinates [2];\n\n\tvar pMax = new Vec2i {\n\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t};\n\tvar pMin = new Vec2i {\n\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t};\n\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\tx = x + 0.5f,\n\t\t\t\ty = y + 0.5f\n\t\t\t};\n\t\t\tvar bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\tcontinue;\n\n\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\tvar u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n\t\t\tvar v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\tzbuffer [idx] = z;\n\n\t\t\t\tvar color = texture [u, v];\n\t\t\t\timage [x, y] = color * intensivity;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson3.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\nusing static Geometry;\n```\n\n# **Lesson 3: Hidden faces removal (z buffer)**\n\n# Introduction\n\nHello, let me introduce you my friend z-buffer of a black guy. He will help us get rid of the visual artifacts of the hidden faces removal we had during the last lesson.\n\n![](./img/lesson3_face1.png)\n\nBy the way, i'd like to mention that this model i use heavily in the course is created by [Vidar Rapp](https://se.linkedin.com/in/vidarrapp). He kindely granted me a permission to use it for teaching rendering basics and i vandalized it, but i promise you to give back the eyes to the guy.\n\nWell, back to the topic, in theory we could just draw all the triangles without discarding any. If we do it properly starting rear-to-front, the front facets will erase the back ones. It is called the [painter's algorithm](http://en.wikipedia.org/wiki/Painter%27s_algorithm). Unfortunately, it comes along with a high computational cost: for each camera movement we need to re-sort all the scene. And then there are dynamic scenes... And this is not even the main problem. The main problem is it is not always possible to determine the correct order.\n\n# **Let us try to render a simple scene**\n\nImagine a simple scene made of three triangles: the camera looks up-to-down, we project the colored triangles onto the white screen:\n\n![ ](./img/lesson3_scene1.png)\n\nThe render should look like this:\n\n![ ](./img/lesson3_scene2.png)\n\nBlue facet - is it behind or in front of the red one? The painter's algorithm does not work here. It is possible to split blue facet in two (one in front of the red facet and one behind). And then the one in front of the red one is to be split in two - one in front of the green triangle and one behind... I think you get the problem: in scenes with millions of triangles it is really expensive to compute. It is possible to use [BSP trees](https://en.wikipedia.org/wiki/Binary_space_partitioning) to get it done. By the way, this data structure is constant for moving camera, but it is really messy. And the life is too short to get it messy.\n\n# **Even simpler: let us lose a dimension. Y-buffer!**\n\nLet us lose a dimension for a while and to cut the above scene along the yellow plane:\n\n![ ](./img/lesson3_scene3.png)\n\nI mean, now our scene is made of three line segments (intersection of the yellow plane and each of the triangles), and the final render has a normal width but 1 pixel height:\n\n![ ](./img/lesson3_scene4.png)\n\nOur scene is two-dimensional, so it is easy to draw it using the line() function we programmed in the very first lesson.\n\n```csharp\nvar scene = new Image (800, 500, Format.BGR);\n\n// scene \"2d mesh\"\nLine(scene, new Vec2i {x=20, y=34}, new Vec2i {x=744, y=400}, Color.Red);\nLine(scene, new Vec2i {x=120, y=434}, new Vec2i {x=444, y=400}, Color.Green);\nLine(scene, new Vec2i {x=330, y=463}, new Vec2i {x=594, y=200}, Color.Blue);\n\n// screen line\nLine(scene, new Vec2i {x=10, y=10}, new Vec2i{x=790, y=10}, Color.White);\n\nscene.VerticalFlip(); // I want to have the origin at the left bottom corner of the image\nscene // This is how our 2D scene looks like if we look at it sideways:\n```\n\nLet us render it. Recall that the render is 1 pixel height. In my source code I create images 16 pixels height for the ease of reading on high resolution screens. `Rasterize()` function writes only in the first line of the image `render`\n\n```csharp\nvoid Rasterize(Image image, Vec2i p0, Vec2i p1, int[] ybuffer, Color color)\n{\n    if (p0.x>p1.x)\n        Swap(ref p0, ref p1);\n    \n    for (int x=p0.x; x<=p1.x; x++) {\n        float t = (x-p0.x)/(float)(p1.x-p0.x);\n        var y = (int)(p0.y*(1-t) + p1.y*t);\n        if (ybuffer[x] < y) {\n            ybuffer[x] = y;\n            image[x, 0] = color;\n        }\n    }\n}\n\nvar ybuffer = new int [width];\nfor (int i = 0; i < width; i++)\n    ybuffer[i] = int.MinValue;\n\nvar render = new Image (width, 16, Format.BGR);\nRasterize(render, new Vec2i{x=20,y=34}, new Vec2i{x=744, y=400}, ybuffer, Color.Red);\nRasterize(render, new Vec2i{x=120, y=434}, new Vec2i{x=444,y=400}, ybuffer, Color.Green);\nRasterize(render, new Vec2i{x=330, y=463}, new Vec2i{x=594,y=200}, ybuffer, Color.Blue);\n\nrender\n```\n\nIt is really-really simple: I iterate through all x-coordinates between `p0.x` and `p1.x` and compute the corresponding y-coordinate of the segment. Then I check what we got in our array `ybuffer` with current `x` index. If the current `y`-value is closer to the camera than the value in the `ybuffer`, then I draw it on the screen and update the `ybuffer`.\n\nLet us see it step-by-step. After calling `Rasterize()` on the first (red) segment this is our memory:\n\nscreen:![](./img/lesson3_rasterize1.png)\n\nybuffer: ![ ](./img/lesson3_rasterize2.png)\n\nHere the magenta color indicates the minus infinity, those are places corresponding to the screen we did not touch. All the rest is shown in the shades of gray: clear colors are close to the camera, dark colors far from the camera.\n\nThen we draw the green segment.\n\nscreen:![ ](./img/lesson3_rasterize3.png)\n\nybuffer:![ ](./img/lesson3_rasterize4.png)\n\nAnd finally the blue one.\n\nscreen:![ ](./img/lesson3_rasterize5.png)\n\nybuffer:![ ](./img/lesson3_rasterize6.png)\n\nCongratulations, we just drew a 2D scene on a 1D screen! Let us admire once again the render: ![ ](./img/lesson3_rasterize7.png)\n\n# Back to 3D\n\nSo, for drawing on a 2D screen the z-buffer must be two-dimensional:\n\n`var zbuffer = new int[width * height];`\n\nPersonally I pack a two-dimensional buffer into a one-dimensional, the conversion is trivial:\n\n`var idx = x + y* width;`\n\nand the back one:\n\n`var x = idx % width;`\\\n`var y = idx % width;`\n\nThen in the code I simply iterate through all the triangles and call the rasterizer function with current triangle and a reference to the z-buffer.\n\nThe only difficulty is how to compute the z-value of a pixel we want to draw. Let us recall how we computed the y-value in the y-buffer example:\n\n`int y = p0.y*(1-t) + p1.y*t;`\n\nWhat is the nature of the `t` variable? It turns out that `(1-t, t)` are barycentric coordinates of the point `(x,y)` with respect to the segment `p0, p1: (x,y) = p0*(1-t) + p1*t`. So the idea is to take the barycentric coordinates version of triangle rasterization, and for every pixel we want to draw simply to multiply its barycentric coordinates by the z-values of the vertices of the triangle we rasterize:\n\n```csharp\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - p;\n\n    var r = Cross (new Vec3f {\n        x = ab.x,\n        y = ac.x,\n        z = pa.x\n    }, new Vec3f {\n        x = ab.y,\n        y = ac.y,\n        z = pa.y\n    });\n\n    // triangle is degenerate, in this case return smth with negative coordinates\n    // dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n    if ((int)r.z == 0)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n    return new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D (t0), Project2D (t1), Project2D (t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n\nfloat [] InitZBuffer (Image image)\n{\n    var zbuffer = new float [image.Width * image.Height];\n    for (int idx = 0; idx < zbuffer.Length; idx++)\n        zbuffer [idx] = float.NegativeInfinity;\n    return zbuffer;\n}\n\nvar image = new Image(width, height, Format.BGR);\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*(image.Width-1)/2 + 0.5f),\n    y = (int)((v.y+1)*(image.Height-1)/2 + 0.5f),\n    z = v.z\n};\n\nvar zbuffer = InitZBuffer(image);\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = headModel.Vertices[vIndex];\n        screen[i] = map(world[i]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, Color.White * intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Okay, we just interpolated the z-values. What else can we do?\n\nTexture!\n\nIn the `.obj` file we have lines starting with `vt u v`, they give an array of texture coordinates. The number in the middle (between the slashes) in the facet lines\\\n`f x/x/x x/x/x x/x/x` are the texture coordinates of this vertex of this triangle. Interpolate it inside the triangle, multiply by the width-height of the texture image and you will get the color to put in your render.\n\n```csharp\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n            var v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n\n                var color = texture [u, v];\n                image [x, y] = color * intensivity;\n            }\n        }\n    }\n}\n\nvar image = new Image(width, height, Format.BGR);\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nFunc<Vec3f, Vec2f> uvMap = v => new Vec2f {\n    x = v.x * (headTexture.Width - 1),\n    y = v.y * (headTexture.Height - 1)\n}; \n\nvar zbuffer = InitZBuffer(image);\nvar uv = new Vec2f[3];\nvar model = headModel;\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson4.csx",
    "content": "Vec2f[] uv = new Vec2f [3];\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n\tx = v.x * (texture.Width - 1),\n\ty = v.y * (texture.Height - 1)\n};\n\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n\tvar depth = 255f;\n\n\tvar m = Matrix4.Identity ();\n\tm [0, 3] = x + w / 2f;\n\tm [1, 3] = y + h / 2f;\n\tm [2, 3] = depth / 2f;\n\n\tm [0, 0] = w / 2f;\n\tm [1, 1] = h / 2f;\n\tm [2, 2] = depth / 2f;\n\treturn m;\n}\n\nMatrix4 Projection (float coeff)\n{\n\tvar projection = Matrix4.Identity ();\n\tprojection [3, 2] = coeff;\n\treturn projection;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson4.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 4: Perspective projection**\n\n# The goal\n\nIn previous lessons we rendered our model in orthographic projection by simply forgetting the z-coordinate. The goal for today is to learn how to draw in perspective:\n\n![  ](./img/lesson4_the_goal.png)\n\n# 2D geometry: Linear transformations\n\nA linear transformation on a plane can be represented by a corresponding matrix. If we take a point `(x,y)` then its transformation can be written as follows:\n\n![  ](./img/lesson4_formula1.svg)\n\nThe simplest (not degenerate) transformation is the identity, it does not move any point:\n\n![  ](./img/lesson4_formula_2d_identity.svg)\n\nDiagonal coefficients of the matrix give scaling along coordinate axes. Let us illustrate it, if we take the following transformation:\n\n![  ](./img/lesson4_formula_2d_scale.svg)\n\nThen the white object (the white square with one corner chopped) will be transformed into the yellow one. Red and green line segments give unit length vectors aligned with `x` and `y`, respectively. All the images for this article were generated using this code:\n\n```csharp\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n\nMatrix4 Projection (float coeff)\n{\n    var projection = Matrix4.Identity ();\n    projection [3, 2] = coeff;\n    return projection;\n}\n\nVec4f Embed4D (Vec3f v, float fill = 1)\n{\n    return new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n}\n\nVec3f Project3D (Vec4f v)\n{\n    return new Vec3f { x = v.x, y = v.y, z = v.z };\n}\n\nFunc<Vec4f, Vec3f> map = v => Project3D(v/v.h);\nvoid RenderAxes (Image image)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n\n    // draw the axes\n    var x = new Vec3f { x = 1 };\n    var y = new Vec3f { y = 1 };\n    var o = new Vec3f ();\n    o = map(Mult(vp, Embed4D(o)));\n    x = map(Mult(vp, Embed4D(x)));\n    y = map(Mult(vp, Embed4D(y)));\n    Line(image, o, x, Color.Red);\n    Line(image, o, y, Color.Green);\n}\n\nvar cube = Model.FromFile(\"obj/cube.obj\");\nvoid RenderCube(Image image, Matrix4 deformation, Color color)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n    var face = cube.Faces[0];\n    var faceLen = face.Vertices.Length;\n\n    for(int j=0; j<faceLen; j++) {\n        var wp0 = cube.Vertices[face.Vertices [j]];\n        var wp1 = cube.Vertices[face.Vertices [(j+1) % faceLen]];\n\n        var sp0 = map(Mult(vp*deformation, Embed4D(wp0)));\n        var sp1 = map(Mult(vp*deformation, Embed4D(wp1)));\n        Line(image, sp0, sp1, color);\n    }\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Zoom(1f), color: Color.White);\n// draw the deformed model\nRenderCube(image, deformation: Matrix4.Zoom(1.5f), color: Color.Yellow); \n\nimage.VerticalFlip ();\nimage\n```\n\nWhy do we bother with matrices? Because it is handy. First of all, in matrix form we can express a transformation of the entire object like this:\n\n![  ](img/lesson4_formula_2d_scale32.svg)\n\nIn this expression the transformation matrix is the same as in the previous one, but the 2x5 matrix is nothing else but the vertices of our squarish object. We simply took all the vertices in an array, multiplied it by the transformation matrix and obtained the transformed object. Cool, is not it?\n\nWell, the true reason hides here: very, very often we wish to transform our object with many transformations in a row. Imagine that in your source code you write transformation functions like:\n\n```csharp\n// vec2 foo(vec2 p) return vec2(ax+by, cx+dy);\n// vec2 bar(vec2 p) return vec2(ex+fy, gx+hy);\n// [..]\n// for (each p in object) {\n//     p = foo(bar(p));\n// }\n```\n\nThis code performs two linear transformations for each vertex of our object, and often we count those vertices in millions. And tens of transformations in a row is not a rare case, resulting in tens millions of operations, really expensive. In matrix form we can pre-multiply all the transformation matrices and to transform our object one time. For an expression with multiplications only we can put parentheses where we want, can we?\n\nOkay, let us continue. We know that diagonal coefficients of the matrix scale our world along the coordinate axes. What other coefficients are responsible for? Let us consider the following transformation:\n\n![  ](./img/lesson4_formula_2d_tr_example1.svg)\n\nHere is its action on our object:\n\n```csharp\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Identity(), color: Color.White);\n\nvar deformation = Matrix4.Identity ();\ndeformation[0, 1] = 1/3f;\nRenderCube(image, deformation, Color.Yellow); // draw the deformed model\n\nimage.VerticalFlip();\nimage\n```\n\nIt is a simple shearing along the x-axis. Another anti-diagonal element shears our space along the y-axis. Thus, there are two base linear transformations on a plane: scaling and shearing. Many readers react: wait, what about rotations?!\n\nIt turns out that any rotation (around the origin) can be represented as a composite action of three shears, here the white object is transformed to the red one, then to the green one and finally to the blue:\n\n![](./img/lesson4_formula_rotation.png)\n\nBut those are intricate details, to keep the things simple, a rotation matrix can be written directly (do you remember the pre-multiplication trick?):\n\n![  ](img/lesson4_formula_rotation.svg)\n\nWe can multiply the matrices in any order, but let us remember that the multiplication for matrices is not commutative:\n\n![  ](img/lesson4_formula_noncomutative.svg)\n\nIt makes sense: to shear an object and then to rotate it is not the same as to rotate it and then to shear it!\n\n```csharp\nfloat DegToRad (float degAngle)\n{\n    return degAngle * (float)Math.PI / 180;\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nvar angle = DegToRad(30);\n\nvar rotation = Matrix4.RotationZ(angle);\nvar shear = Matrix4.Identity ();\nshear[0, 1] = 1/3f;\n\nRenderCube(image, deformation: rotation * shear, color: Color.Green);\nRenderCube(image, deformation: shear * rotation, color: Color.Red);\n\nimage.VerticalFlip();\nimage\n```\n\n# 2D affine transformations\n\nSo, any linear transformation on a plane is a composition of scale and shear transformations. And it means that we can do any linear transformation we want, the origin wont ever move! Those possibilities are great, but if we can not perform simple translations, our life will be miserable. Can we? Okay, translations are not linear, no problem, let us try to append translations after performing the linear part:\n\n![  ](./img/lesson4_formula_translation.svg)\n\nThis expression is really cool, we can rotate, we can scale, shear and translate. However. Let us recall that we are interested in composing multiple transformation, here is what a composition of two transformations look like (remember, we need to compose dozes of those?):\n\n![  ](./img/lesson4_formula_composition.svg)\n\nIt is starting to look ugly even for a single composition, add more and things get even worse.\n\n# Homogeneous coordinates\n\nOkay, now it is the time for the black magic. Imagine that i add one column and one row to our transformation matrix (thus making it 3x3) and append one coordinate always equal to 1 to our vector to be transformed:\n\n![  ](./img/lesson4_formula_3d.svg)\n\nIf we multiply this matrix and the vector augmented by 1 we get another vector with 1 in the last component, but the other two components have exactly the shape we would like! Magic.\n\nIn fact, the idea is really simple. Parallel translations are not linear in the 2D space. So we embed our 2D into 3D space (by simply adding 1 for the 3rd component). It means that our 2D space is the plane z=1 in the 3D space. Then we perform a linear 3D transformation and project the result onto our 2D physical plane. Parallel translations have not become linear, but the pipeline is simple.\n\nHow do we project 3D back onto the 2D plane? Simply by dividing by the 3d component:\n\n![  ](./img/lesson4_formula_project.svg)\n\n## Wait a second, it is forbidden to divide by zero!\n\nWho said this? \\[Shoots\\] Let us recall the pipeline:\n\n* We embed 2D into 3D by putting it inside the plane z=3\n\n* We do whatever we want in 3d\n\n* For every point we want to project from 3D into 2D we draw a straight line between the origin and the point to project and then we find its intersection with the plane z=1.\n\nIn this image our 2D plane is in magenta, the point `(x,y,z)` is projected onto `(x/z, y/z)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nLet us imagine a vertical rail through the point `(x,y,1)`. Where will be projected the point `(x,y,1)`? Doh, onto `(x,y)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nNow let us descend on the rail, for example, the point `(x,y,1/2)` is projected onto `(2x, 2y)`:\n\n![](./img/lesson4_sketch3.png)\n\nLet us continue, point `(x,y,1/4)` becomes `(4x, 4y)`:\n\n![](./img/lesson4_sketch4.png)\n\nIf we continue the process, approaching to `z=0`, then the projection goes farther from the origin in the direction `(x,y)`. In other words, point `(x,y,0)` is projected onto an infinitely far point in the direction `(x,y)`. What is it? Right, it is simply a vector!\n\nHomogeneous coordinates allow to distinguish between a vector and a point. If a programmer writes `vec2(x,y)`, is it a vector or a point? Hard to say. In homogeneous coordinates all things with `z=0` are vectors, all the rest are points. Look: `vector + vector = vector`. `vector - vector = vector`. `point + vector = point`. Great, is not it?\n\n## A composite transformation\n\nAs i said before, we should be able to accumulate dozens of transformations. Why? Let us imagine we need to rotate an object (2D) around a point `(x0,y0)`. How to do it? Well, we could look up for formulas somewhere, or we can do it by hand, we have all the tools we need!\n\nWe know to rotate around the origin, we know how to translate. It is all we need: translate `(x0,y0)` into the origin, rotate, un-translate, done:\n\n![  ](img/lesson4_formula_rotate_xy.svg)\n\nIn 3D sequences of actions will be a bit longer, but the idea is the same: we need to know few basic transformations and with their aid we can represent any composed action.\n\n# Wait a minute, may I touch this magical bottom row of the 3x3 matrix?\n\nSure thing! Let us apply the following transformation to our standard squarish object:\n\n![  ](./img/lesson4_matrix_third_line.svg)\n\nRecall that the original object is in white, unit axis vectors are in red and green:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nimage.VerticalFlip ();\nimage\n```\n\nHere is the transformed object:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\n\nvar deformation = Matrix4.Identity ();\ndeformation[3, 0] = -1/5f;\nRenderCube(image, deformation, color: Color.Red);\n\nimage.VerticalFlip ();\nimage\n```\n\nAnd here another kind of magic (white!) happens. Do you remember our y-buffer exercise? Here we will do the same: we project our 2D object onto the vertical line `x=0`. Let us harden the rules a bit: we have to use a central projection, our camera is in the point `(5,0)` and is pointed onto the origin. To find the projection we need to trace straight lines between the camera and the points to be projected (yellow) and to find the intersection with the screen line (white vertical).\n\n![  ](./img/lesson4_sketch5.png)\n\nNow i replace the original object with the transformed one, but i do not touch the yellow lines we drew before:\n\n![  ](./img/lesson4_sketch6.png)\n\nIf we project the red object onto the screen using **standard orthogonal projection**, then we find exactly the same points! Let us look closely how the transformation works: all vertical segments are transformed into vertical segments, but those close to the camera are stretched and those far from the camera are shrunk. If we choose the coefficient correctly (in our transformation matrix it is the -1/5 coefficient), we obtain an image in perspective (central) projection!\n\n# Time to work in full 3D\n\nLet us explain the magic. As for 2D affine transformations, for 3D affine transformations we will use homogeneous coordinates: a point `(x,y,z)` is augmented with 1`(x,y,z,1)`, then we transform it in 4D and project back to 3D. For example, if we take the following transformation:\n\n![  ](./img/lesson4_formula_4d_1.svg)\n\nThe retro-projection gives us the following 3D coordinages:\n\n![  ](./img/lesson4_formula_central_project.svg)\n\nLet us remember this result, but put it aside for a while. Let us return to the standard definition of the central projection, without any fancy stuff as 4D transformations. Given a point `P=(x,y,z)` we want to project it onto the plane z=0, the camera is on the z-axis in the point `(0,0,c)`:\n\n![](./img/lesson4_sketch7.png)\n\nTriangles ABC and ODC are similar. It means that we can write the following: |AB|/|AC|=|OD|/|OC| => x/(c-z) = x'/c. In other words:\n\n![ ](./img/lesson4_formula_x.svg)\n\nBy doing the same reasoning for triangles CPB and CP'D, it is easy to find the following expression:\n\n![](./img/lesson4_formula_y.svg)\n\nIt is really similar to the result we put aside few moments ago, but there we got the result by a single matrix multiplication. We got the law for the coefficient: `r = -1/c`\n\n# Let us sum up: the main formula for today\n\n*If you simply copy-paste this formula without understanding the above material, I hate you.*\n\nSo, if we want to compute a central projection with a camera **(important!) camera located on the z-axis with distance c from the origin**, then we embed the point into 4D by augmenting it with 1, then we multiply it with the following matrix, and retro-project it into 3D.\n\n![  ](./img/lesson4_formula_last.svg)\n\nWe deformed our object in a way, that simply forgetting its z-coordinate we will get a drawing in a perspective. If we want to use the z-buffer, then, naturally, do not forget the z:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\nvar camera = new Vec3f { z = 3 };\nvar projection = Projection(-1/camera.z);\nvar viewPort   = Viewport(width/8, height/8, width*3/4, height*3/4);\n\nFunc<Vec3f, Vec3f> map = v => {\n    var r4 = Mult (viewPort * projection, Embed4D (v));\n    var r = Project3D (r4 / r4.h);\n    r.x = (int)(r.x + 0.5f);\n    r.y = (int)(r.y + 0.5f);\n    return r;\n};\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n    x = v.x * (texture.Width - 1),\n    y = v.y * (texture.Height - 1)\n};\n\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nVec2f[] uv = new Vec2f [3];\n\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson5.csx",
    "content": "using static Geometry;\n\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n\tvar z = (eye - center).Normalize ();\n\tvar x = Cross (up, z).Normalize ();\n\tvar y = Cross (z, x).Normalize ();\n\n\tvar Minv = Matrix4.Identity ();\n\tMinv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n\tMinv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n\tMinv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n\tvar Tr = Matrix4.Identity ();\n\tTr [0, 3] = -center.x;\n\tTr [1, 3] = -center.y;\n\tTr [2, 3] = -center.y;\n\n\treturn Minv * Tr;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson5.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# Lesson 5: Moving the camera\n\n# Change of basis in 3D space\n\nIn Euclidean space coordinates can be given by a point (the origin) and a basis. What does it mean that point P has coordinates `(x,y,z)` in the frame `(O, i,j,k)`? It means that the vector OP can be expressed as follows:\n\n![  ](./img/lesson5_basis.svg)\n\nNow image that we have another frame `(O', i',j',k')`. How do we transform coordinates given in one frame to another? First of all let us note that since `(i,j,k)` and `(i',j',k')` are bases of 3D, there exists a (non degenerate) matrix M such that:\n\n![  ](./img/lesson5_new_basis.svg)\n\nLet us draw an illustration:\n\n![](./img/lesson5_sketch1.png)\n\nThen let us re-express the vector OP:\n\n![  ](./img/lesson5_change_basis1.svg)\n\nNow let us substitute `(i',j',k')` in the right part with the change of basis matrix:\n\n![  ](./img/lesson5_change_basis2.svg)\n\nAnd it gives us the formula to transform coordinates from one frame to another:\n\n![  ](./img/lesson5_change_basis3.svg)\n\n# Let us create our own gluLookAt\n\nOpenGL and, as a consequence, our tiny renderer are able to draw scenes **only with the camera located on the z-axis.** If we want to move the camera, no problem, we can move all the scene, leaving the camera immobile.\n\nLet us put the problem this way: we want to draw a scene with a camera situated in point **e**(eye), the camera should be pointed to the point **c** (center) in such way that a given vector **u**(up) is to be vertical in the final render.\n\nHere is an illustration:\n\n![  ](./img/lesson5_change_basis4.png)\n\n```csharp\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n    var z = (eye - center).Normalize ();\n    var x = Cross (up, z).Normalize ();\n    var y = Cross (z, x).Normalize ();\n\n    var Minv = Matrix4.Identity ();\n    Minv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n    Minv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n    Minv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n    var Tr = Matrix4.Identity ();\n    Tr [0, 3] = -center.x;\n    Tr [1, 3] = -center.y;\n    Tr [2, 3] = -center.y;\n\n    return Minv * Tr;\n}\n```\n\nNote that `z'` is given by the vector **`ce`** (do not forget to normalize it, it helps later). How do we compute `x'`? Simply by a cross product between **`u`** and **`z'`**. Then we compute `y'`, such that it is orthogonal to already calculated `x'` and `z'` (let me remind you that in our problem settings \\*\\*`ce` \\*\\*and **`u`** are not necessarily orthogonal). The very last step is a translation of the origin to the center **c** and our transformation matrix is ready. Now it suffices to get any point with coordinates `(x,y,z,1)` in the model frame, multiply it by the matrix ModelView and we get the coordinates in the camera frame! By the way, the name ModelView comes from OpenGL terminology.\n\n# Viewport\n\nIf you followed this course from the beginning, you should remember strange lines like this one:\n\n```csharp\n// x = (v.x+1)*(width-1)/2\n// y = (v.y+1)*(height-1)/2\n```\n\nWhat does it mean? It means that i have a point Vec2f v, it belongs to the square \\[-1,1\\]\\*\\[-1,1\\]. I want to draw it in the image of (width, height) dimensions. Value (v.x\\+1) is varying between 0 and 2, (v.x\\+1)/2 between 0 and 1, and (v.x\\+1)\\*width/2 sweeps all the image. Thus we effectively mapped the bi-unit square onto the image.\n\nBut now we are getting rid of these ugly constructs, and i want to rewrite all the computiations in the matrix form. Let us consider the following C# code:\n\n```csharp\n/*\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n*/\n```\n\nThis code creates this matrix:\n\n![  ](./img/lesson5_viewport.svg)\n\nIt means that the bi-unit cube \\[-1,1\\]*\\[-1,1\\]*\\[-1,1\\] is mapped onto the screen cube \\[0,w\\]*\\[0,h\\]*\\[0,d\\]. Right, cube, and not a rectangle, this is because of the depth computations with the z-buffer. Here d is the resolution of the z-buffer. I like to have it equal to 255 because of simplicity of dumping black-and-white images of the z-buffer for debugging.\n\nIn the OpenGL terminology this matrix is called viewport matrix.\n\n# Chain of coordinate transformations\n\nSo, let us sum up. Our models (characters, for example) are created in their own local frame (**object coordinates**). They are inserted into a scene expressed in **world coordinates**. The transformation from one to another is made with matrix **Model**. Then, we want to express it in the camera frame (**eye coordinates**), the transformation is called **View**. Then, we deform the scene to create a perspective deformation with **Projection** matrix (lesson 4), this matrix transforms the scene to so-called **clip coordinates**. Finally, we draw the scene, and the matrix transforming clip coordinates to the **screen coordinates** is called **Viewport**.\n\nAgain, if we read a point **v** from the .obj file, then to draw it on the screen it undergoes the following chain of transformations:\n\nViewport \\* Projection \\* View \\* Model \\* v\n\nAs i draw a single object only, the matrix Model is equal to identity, and i merged it with the matrix View:\n\n```csharp\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n// draw the model\nvar modelView  = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1/(eye-center).Norm());\n\nFunc<Vec3f, Vec3f> map = v => {\n\tvar r4 = Mult (viewPort * projection * modelView, Embed4D (v));\n\tvar r = Project3D (r4 / r4.h);\n\tr.x = (int)(r.x + 0.5f);\n\tr.y = (int)(r.y + 0.5f);\n\treturn r;\n};\n\nvar image = new Image(width, height, Format.BGR);\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Transformation of normal vectors\n\nThere is a widely-known fact:\n\n* If we have a model and its normal vectors are given by the artist AND this model is transformed with an affine mapping, then normal vectors are to be transformed with a mapping, equal to the transposition of the inverse matrix of the original mapping matrix\n\nWhat-what-what?! I met quite a few programmers who know this fact, but it remains a black magic for them. In fact, it is not so complicated. Take a pencil and draw a 2D triangle `(0,0)`, `(0,1)`, `(1,0)` and a vector **n**, normal to the hypothenuse. Naturally, **n** is equal to `(1,1)`. Then let us stretch all the y-coordinates by a factor of 2, leaving x-coordinates intact. Thus, our triangle becomes `(0,0)`, `(0,2)`, `(1,0)`. If we transform the vector **n** in the same way, it becomes `(1, 2)` and it is no longer orthogonal to the transformed edge of the triangle.\n\nThus, to remove all the black magic fog, we need to understand one simple thing: **we do not need to simply transform normal vectors (as they can become not normal anymore), we need to compute (new) normal vectors to the transformed model.**\n\nBack to 3D, we have a vector **n** = (A,B,C). We know that the plane passing through the origin and having **n** for its normal, has an equation `Ax+By+Cz=0`. Let us write it in the matrix form (i do it in homogeneous coordinates from the beginning):\n\n![  ](./img/lesson5_transform_normal1.png)\n\nRecall that `(A,B,C)` - is a vector, so we augment it with 0 when embedding into the 4D, and `(x,y,z)` is augmented with 1 since it is a point.\n\nLet us insert an identity matrix in between (inverse to M multiplied by M is equal to identity):\n\n![  ](./img/lesson5_transform_normal2.png)\n\nThe expression in right parentheses - are for the transformed points of the object. In the left - are for normal vectors to the transformed object! In standard convention we usually write coordinates as columns (please let us not raise all the stuff about contra- and co-variant vectors), so we can rewrite the previous expression as follows:\n\n![  ](./img/lesson5_transform_normal2.png)\n\nAnd the left parentheses tell us that a normal to the transformed object can be computed from the old normal by applying the inverse transpose matrix of the affine mapping.\n\nPlease note that if our transformation matrix M is a composition of uniform scalings, rotations and translations, then M is equal to its inverse transpose, since inverse and transpose are cancelling each other in this case. But since our matrices include perspective deformations, usually this trick does not help.\n\nIn the current code we do not use the transformation of normal vectors, but in the next lesson it will be very, very handy.\n\nHappy coding!\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/lesson6.csx",
    "content": "using static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n\nvar diabloModel = Model.FromFile (\"obj/diablo3_pose.obj\");\nvar diabloTexture = Image.Load (\"obj/diablo3_pose_diffuse.tga\");\nvar diabloNormalMap = Image.Load (\"obj/diablo3_pose_nm.tga\");\nvar diabloTangentMap = Image.Load (\"obj/diablo3_pose_nm_tangent.tga\");\nvar diabloSpecularMap = Image.Load (\"obj/diablo3_pose_spec.tga\");\ndiabloTexture.VerticalFlip ();\ndiabloNormalMap.VerticalFlip ();\ndiabloTangentMap.VerticalFlip ();\ndiabloSpecularMap.VerticalFlip ();\n\nlight_dir = new Vec3f { x = 1, y = 1, z = 1 };\neye = new Vec3f { x = 1, y = 1, z = 3 };\ncenter = new Vec3f { x = 0, y = 0, z = 0 };\nup = new Vec3f { x = 0, y = 1, z = 0 };\n\nvar modelView = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1f/(eye-center).Norm());\n\ninterface IShader\n{\n\tVec4f Vertex (Face face, int nthvert);\n\tbool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n};\n\nclass RenderResult\n{\n\tpublic Image Image { get; set; }\n\tpublic float [] ZBuffer { get; set; }\n}\n\nRenderResult Render (Model model, IShader shader)\n{\n\tvar image = new Image (width, height, Format.BGR);\n\tvar zbuffer = InitZBuffer (image);\n\tvar screen_coords = new Vec4f [3];\n\n\tforeach (var face in model.Faces) {\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tscreen_coords [i] = shader.Vertex (face, i);\n\t\tTriangle (image, screen_coords, shader, zbuffer);\n\t}\n\n\treturn new RenderResult {\n\t\tImage = image,\n\t\tZBuffer = zbuffer\n\t};\n}\n\nvoid Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n{\n\tpMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n\tpMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n\tfor (int i = 0; i < 3; i++) {\n\t\tpMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n\t\tpMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n\t\tpMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n\t\tpMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n\t}\n}\n\nvoid Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n{\n\tVec2i pMin, pMax;\n\tBox (pts, out pMin, out pMax);\n\n\tColor color;\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n\t\t\tvar bc = Barycentric (Project2D (pts [0] / pts [0].h),\n\t\t\t\t\t\t\t\t  Project2D (pts [1] / pts [1].h),\n\t\t\t\t\t\t\t\t  Project2D (pts [2] / pts [2].h),\n\t\t\t\t\t\t\t\t  pixelCenter);\n\n\t\t\tvar z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n\t\t\tvar w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n\t\t\tvar frag_depth = z / w;\n\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n\t\t\t\tcontinue;\n\n\n\t\t\tvar fragment = new Vec3f { x = x, y = y, z = frag_depth };\n\t\t\tvar discard = shader.Fragment (fragment, bc, out color);\n\t\t\tif (!discard) {\n\t\t\t\tzbuffer [idx] = frag_depth;\n\t\t\t\timage [x, y] = color;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic class ShaderUtils\n{\n    public static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n    {\n        var v = model.Vertex (face, nthvert); // read the vertex from model\n        var glVertex = Embed4D (v);\n        return Mult (t, glVertex); // transform it to screen coordinates\n    }\n\n    public static void UpdateVarayingUV (Model model, Face face, int nthvert,\n                                         ref Vec3f varyingU, ref Vec3f varyingV)\n    {\n        var vt = model.GetUV (face, nthvert);\n        varyingU [nthvert] = vt.x;\n        varyingV [nthvert] = vt.y;\n    }\n\n    public static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n    {\n        return new Vec2f {\n            x = Dot (varU, bar),\n            y = Dot (varV, bar)\n        };\n    }\n\n    public static Color GetColor (Image texture, Vec2f uvf)\n    {\n        var uvi = CalcXY(texture, uvf);\n        return texture [uvi.x, uvi.y];\n    }\n\n    public static Vec3f Transform (Matrix4 t, Vec3f v)\n    {\n        var v4d = Mult (t, Embed4D (v));\n        return Project3D (v4d);\n    }\n\n    public static Vec3f Normal (Image normalMap, Vec2f uvf)\n    {\n        // RGB values as xyz. But Color stores data as BGR (zyx)\n        var c = GetColor (normalMap, uvf);\n\n        return new Vec3f {\n            x = (c [2] / 255f) * 2 - 1,\n            y = (c [1] / 255f) * 2 - 1,\n            z = (c [0] / 255f) * 2 - 1\n        };\n    }\n\n    public static float Specular (Image specularMap, Vec2f uvf)\n    {\n        var uvi = CalcXY (specularMap, uvf);\n        var color = specularMap [uvi.x, uvi.y];\n        return color[0];\n    }\n\n    public static Vec2i CalcXY (Image texture, Vec2f uvf)\n    {\n        return new Vec2i {\n            x = (int)(uvf.x * texture.Width),\n            y = (int)(uvf.y * texture.Height)\n        };\n    }\n}\n\nclass TextureShader : IShader\n{\n\treadonly Model model;\n\treadonly Vec3f lightDir;\n\treadonly Matrix4 transformation;\n\treadonly Image texture;\n\n\t// written by vertex shader, read by fragment shader\n\tVec3f varyingIntensity = new Vec3f ();\n\tVec3f varyingU = new Vec3f ();\n\tVec3f varyingV = new Vec3f ();\n\n\tpublic TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n\t{\n\t\tthis.model = model;\n\t\ttransformation = viewPort * projection * modelView;\n\t\tthis.lightDir = lightDir.Normalize ();\n\t\tthis.texture = texture;\n\t}\n\n\tpublic Vec4f Vertex (Face face, int nthvert)\n\t{\n\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n\t\tvar n = model.Normal (face, nthvert).Normalize ();\n\t\tvaryingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n\t\treturn TransformFace (model, face, nthvert, transformation);\n\t}\n\n\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t{\n\t\t// interpolate intensity for the current pixel\n\t\tvar intensity = Dot (varyingIntensity, bar);\n\n\t\t// interpolate uv for the current pixel\n\t\tvar uvf = CalcUV (varyingU, varyingV, bar);\n\n\t\tcolor = GetColor (texture, uvf) * intensity;\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/obj/african_head.obj",
    "content": "v -0.000581696 -0.734665 -0.623267\nv 0.000283538 -1 0.286843\nv -0.117277 -0.973564 0.306907\nv -0.382144 -0.890788 0.221243\nv -0.247144 -0.942602 0.276051\nv -0.656078 -0.718512 -0.109025\nv -0.609847 -0.786562 0.0198068\nv -0.66248 -0.632053 -0.244271\nv -0.511812 -0.845392 0.127809\nv -0.609326 -0.569868 -0.41571\nv -0.426949 -0.649767 -0.567143\nv -0.201076 -0.720822 -0.633205\nv 0.117382 -0.973645 0.306766\nv 0.382454 -0.890869 0.221097\nv 0.247512 -0.942667 0.275986\nv 0.656371 -0.718624 -0.109224\nv 0.610273 -0.786562 0.0197893\nv 0.66248 -0.631463 -0.244119\nv 0.511631 -0.845357 0.127832\nv 0.608654 -0.568839 -0.416318\nv 0.424663 -0.649937 -0.567418\nv 0.198972 -0.720968 -0.633141\nv 0.153371 -0.140519 0.477416\nv 0.134781 -0.14723 0.48805\nv 0.131261 -0.132153 0.49872\nv 0.14749 -0.135105 0.489565\nv 0.000686924 -0.0534984 0.505694\nv 0.075062 -0.0473306 0.49955\nv 0.0695841 -0.0997942 0.550277\nv 0.0302569 -0.0971868 0.55389\nv 0.0745124 -0.135953 0.523215\nv 0.0354892 -0.12785 0.535159\nv 0.0389268 -0.109557 0.550558\nv 0.0734835 -0.11538 0.538029\nv 0.106386 -0.125623 0.51513\nv 0.107415 -0.144295 0.5047\nv 0.15968 -0.130861 0.484794\nv 0.156224 -0.123705 0.486735\nv 0.15792 -0.107798 0.4677\nv 0.163784 -0.126996 0.470144\nv 0.154687 -0.134655 0.486373\nv 0.160668 -0.135649 0.476189\nv 0.143433 -0.119034 0.499854\nv 0.131606 -0.0726738 0.476148\nv -0.000260156 -0.124553 0.539058\nv -0.000646004 -0.110651 0.55444\nv 0.100423 -0.10574 0.537643\nv 0.126128 -0.115784 0.515598\nv 0.250944 -0.275583 0.380381\nv 0.221602 -0.335752 0.330174\nv 0.275434 -0.301318 0.24751\nv 0.307699 -0.239869 0.292356\nv 0.332124 -0.0415605 0.412962\nv 0.319444 0.00732526 0.451091\nv 0.28667 -0.025805 0.481549\nv 0.297006 -0.0758717 0.454242\nv 0.357953 -0.159928 -0.223225\nv 0.303981 -0.144611 -0.343644\nv 0.296386 -0.0547553 -0.357792\nv 0.357339 -0.0633433 -0.24278\nv 0.45086 0.331215 0.047962\nv 0.438899 0.336167 0.131147\nv 0.447405 0.226107 0.139349\nv 0.455613 0.205353 0.0827643\nv 0.197493 -0.411308 0.138256\nv 0.204911 -0.353378 0.2082\nv 0.102001 -0.419375 0.24969\nv 0.0995867 -0.475697 0.20834\nv 0.150133 -0.372261 0.431226\nv 0.176423 -0.362054 0.392056\nv 0.196019 -0.326474 0.426929\nv 0.154611 -0.348549 0.463444\nv 0.0892273 -0.391968 0.303592\nv 0.159013 -0.363737 0.305077\nv 0.455712 0.508986 -0.0641442\nv 0.432146 0.648411 -0.0417475\nv 0.417051 0.611568 0.0817295\nv 0.44205 0.483438 0.0478626\nv 0.3446 0.43288 0.398633\nv 0.372358 0.383369 0.353998\nv 0.388341 0.404485 0.306953\nv 0.355059 0.467372 0.356967\nv 0.305162 0.338815 0.458112\nv 0.298579 0.319803 0.456627\nv 0.313422 0.304568 0.427776\nv 0.323711 0.315968 0.429291\nv 0.33161 0.397557 0.430226\nv 0.354427 0.359727 0.390478\nv 0.304162 0.291952 0.432377\nv 0.292662 0.309771 0.452991\nv 0.282934 0.292496 0.4562\nv 0.292025 0.281663 0.435178\nv 0.397344 0.565249 0.192585\nv 0.42257 0.455996 0.145494\nv 0.317848 0.364866 0.448834\nv 0.340595 0.337517 0.417978\nv 0.243227 0.479439 0.494236\nv 0.250155 0.546138 0.465934\nv 0.179019 0.560251 0.511681\nv 0.170173 0.4781 0.536229\nv 0.162386 0.410407 0.547009\nv 0.235031 0.427051 0.517018\nv 0.271745 0.634415 0.42162\nv 0.196896 0.657291 0.472505\nv 0.186589 0.312952 0.511073\nv 0.189518 0.32493 0.514165\nv 0.146286 0.31277 0.509009\nv 0.144959 0.300178 0.501713\nv 0.143965 0.300412 0.49409\nv 0.187203 0.310596 0.506407\nv 0.157744 0.364614 0.528804\nv 0.216697 0.382527 0.516083\nv 0.194441 0.332425 0.515989\nv 0.204286 0.349818 0.516732\nv 0.156254 0.334062 0.519579\nv 0.151565 0.320341 0.513961\nv 0.0431068 0.071791 0.618005\nv 0.0477954 0.0867105 0.593486\nv 0.0780844 0.0816652 0.602518\nv 0.0574124 0.0746147 0.621185\nv 0.448253 0.130656 0.149533\nv 0.431801 0.159355 0.215905\nv 0.422792 0.0771637 0.237185\nv 0.428691 0.0348783 0.166914\nv 0.365073 -0.0526507 0.316126\nv 0.326974 -0.104793 0.373068\nv 0.312773 -0.172965 0.33446\nv 0.368107 -0.126698 0.269222\nv 0.203695 -0.131796 0.523934\nv 0.180463 -0.136479 0.525396\nv 0.182848 -0.14892 0.516989\nv 0.204163 -0.152533 0.514914\nv 0.39379 0.00616771 0.269368\nv 0.40177 -0.0591341 0.209048\nv 0.26083 -0.0996422 0.484274\nv 0.250406 -0.0552171 0.50321\nv 0.15851 -0.136292 0.498474\nv 0.155032 -0.134684 0.502964\nv 0.145006 -0.133819 0.514504\nv 0.171033 -0.12032 0.538263\nv 0.158849 -0.127938 0.534943\nv 0.167969 -0.138075 0.523788\nv 0.232061 -0.151474 0.497024\nv 0.23074 -0.117128 0.507191\nv 0.365798 0.221617 0.362743\nv 0.342501 0.235507 0.392185\nv 0.325951 0.202558 0.415114\nv 0.359268 0.178677 0.383229\nv 0.352369 0.0489033 0.417452\nv 0.322262 0.0907619 0.44953\nv 0.295322 0.04895 0.483251\nv 0.367108 0.00328555 0.369771\nv 0.138972 -0.18796 0.555521\nv 0.161562 -0.177794 0.535913\nv 0.154015 -0.155093 0.536392\nv 0.136131 -0.156414 0.558491\nv 0.220263 -0.08194 0.518603\nv 0.202088 -0.0486753 0.52791\nv 0.17564 -0.0814314 0.545822\nv 0.193131 -0.106435 0.533575\nv 0.199492 -0.169714 0.509722\nv 0.190033 -0.188183 0.514668\nv 0.207302 -0.213011 0.492721\nv 0.222415 -0.183044 0.489617\nv 0.125088 -0.132884 0.551294\nv 0.144497 -0.139192 0.530254\nv 0.135014 0.119128 0.544717\nv 0.119534 0.149685 0.554253\nv 0.096915 0.171211 0.569382\nv 0.112553 0.137432 0.569616\nv 0.0878476 0.217858 0.555667\nv 0.0649773 0.232128 0.568628\nv 0.073466 0.185119 0.584571\nv 0.116359 0.191199 0.548932\nv 0.111419 0.228591 0.524951\nv 0.0858774 0.255408 0.530312\nv 0.301408 0.0368718 -0.387812\nv 0.366839 0.037626 -0.269538\nv 0.272125 -0.199781 0.399533\nv 0.246349 -0.195514 0.453266\nv 0.223339 -0.243049 0.450553\nv 0.364021 -0.197455 0.21335\nv 0.411416 -0.124798 0.140589\nv 0.431568 -0.0028997 0.0907502\nv 0.449346 0.11075 0.0889086\nv 0.0649948 0.777167 0.432594\nv 0.133465 0.770619 0.418569\nv 0.14341 0.869244 0.301253\nv 0.0689586 0.877043 0.315395\nv 0.305372 0.809321 0.22043\nv 0.289307 0.723856 0.335524\nv 0.355187 0.660735 0.264773\nv 0.372264 0.728258 0.148528\nv 0.382308 0.7766 0.0116631\nv 0.0971488 0.470588 0.557912\nv 0.110788 0.565185 0.534317\nv 0.100113 0.277828 0.510938\nv 0.10966 0.248679 0.503771\nv 0.0443988 0.240822 0.58581\nv 0.0522151 0.193614 0.604337\nv 0.052601 0.564735 0.541859\nv 0.123726 0.667896 0.498907\nv 0.0597976 0.671147 0.508711\nv 0.0466729 0.466215 0.561034\nv 0.000423846 0.462807 0.558988\nv -0.00017831 0.388326 0.563478\nv 0.0352086 0.389069 0.560584\nv 0.000833078 0.56384 0.544139\nv 0.295773 0.426823 0.470722\nv 0.301706 0.464689 0.451056\nv 0.189957 0.181465 0.501181\nv 0.186163 0.208931 0.491956\nv 0.141574 0.222722 0.500509\nv 0.146526 0.195338 0.518293\nv 0.111986 0.0116865 0.562811\nv 0.111343 0.0404672 0.565769\nv 0.0577164 0.0420398 0.577988\nv 0.0656438 -0.00796249 0.596918\nv 0.147695 0.0440509 0.537258\nv 0.144778 0.0631738 0.538491\nv 0.0268719 -0.0140834 0.602378\nv 0.0270356 -0.0372401 0.622027\nv 0.0876429 -0.0456996 0.601127\nv 0.183093 0.146552 0.519439\nv 0.148589 0.164593 0.536819\nv 0.147344 0.131095 0.542934\nv 0.176733 0.112264 0.532435\nv -0.000394618 -0.0441035 0.617625\nv -0.000260156 -0.0187662 0.600677\nv 0.165058 0.0770935 0.530856\nv 0.148554 0.0982976 0.535562\nv 0.116476 0.272829 0.494797\nv 0.119084 0.26261 0.493569\nv 0.120873 0.268971 0.480883\nv 0.11761 0.27287 0.484221\nv 0.224695 0.848444 0.271198\nv 0.231324 0.918189 0.121063\nv 0.14614 0.9439 0.150241\nv 0.241894 0.945736 -0.185803\nv 0.156043 0.976475 -0.183418\nv 0.146906 0.980702 -0.0177607\nv 0.23195 0.948285 -0.0402158\nv 0.0684324 0.995189 -0.00981573\nv 0.0682103 0.955014 0.162933\nv 0.0891571 0.383649 0.555118\nv 0.110613 0.336412 0.528863\nv 0.122749 0.310759 0.512914\nv 0.147081 -0.111919 0.55631\nv 0.158656 -0.0994551 0.55786\nv 0.0939743 0.0869969 0.616333\nv 0.101206 0.119326 0.615532\nv 0.0670469 0.122121 0.645885\nv 0.0560853 0.0831385 0.640601\nv 0.0795284 0.0820978 0.567845\nv 0.0337354 0.0564741 0.595059\nv 0.0854448 -0.103577 0.606979\nv 0.0826211 -0.0671141 0.612931\nv 0.0280704 -0.0555854 0.637736\nv 0.0319698 -0.0970874 0.628212\nv 0.0789964 -0.121811 0.579602\nv 0.0327415 -0.116959 0.594106\nv 0.0216981 0.0173339 0.585915\nv -0.00123062 -0.095585 0.625704\nv -0.000511542 -0.0598999 0.637227\nv -0.00157555 -0.115643 0.593966\nv -0.000219233 -0.0988881 0.554498\nv 0.0291929 0.0853015 0.665324\nv 0.0352671 0.124524 0.666125\nv 0.0371846 0.159004 0.648446\nv 0.0654158 0.154462 0.629171\nv 0.0280178 0.19967 0.620548\nv 0.0221015 0.245843 0.59797\nv 0.0432997 0.281499 0.556866\nv 0.0222008 0.28717 0.567459\nv -0.000400465 0.125745 0.673871\nv -0.00057585 0.0822265 0.675105\nv -0.000347849 0.160916 0.656029\nv 0.367195 0.315074 0.363767\nv 0.346658 0.302744 0.393991\nv 0.344389 0.266656 0.384439\nv 0.371726 0.266504 0.352507\nv 0.40246 0.429197 0.234116\nv 0.422126 0.335763 0.207276\nv 0.393316 0.264083 0.313887\nv 0.387102 0.325737 0.325369\nv 0.3274 0.295928 0.408636\nv 0.316392 0.29076 0.418709\nv 0.3085 0.274624 0.423199\nv 0.323636 0.272379 0.406602\nv 0.429381 0.244458 0.204002\nv 0.407084 0.332408 0.277313\nv 0.410597 0.257869 0.266264\nv -0.0012657 -0.456867 0.290093\nv -0.00137093 -0.520579 0.266159\nv 0.154137 -0.304206 0.500479\nv 0.193482 -0.282873 0.473493\nv 0.186367 -0.242201 0.509588\nv 0.148993 -0.26399 0.525367\nv 0.110332 -0.274916 0.545857\nv 0.099347 -0.233134 0.560204\nv 0.0558865 -0.227615 0.569605\nv 0.0659185 -0.270006 0.563817\nv 0.154687 -0.142577 0.51838\nv 0.159498 -0.143009 0.513072\nv 0.154646 -0.138239 0.502496\nv 0.149045 -0.137596 0.50639\nv 0.15958 -0.138174 0.517463\nv 0.161574 -0.141559 0.511657\nv 0.0940387 -0.129288 0.582226\nv 0.109215 -0.12609 0.531844\nv 0.0782715 -0.117578 0.557129\nv 0.264817 0.0151299 0.501573\nv 0.280122 0.127096 0.47057\nv 0.262508 0.0886748 0.494464\nv 0.187613 0.050926 0.529248\nv 0.207829 0.0868157 0.523449\nv 0.231821 -0.0170182 0.518246\nv 0.304138 0.164985 0.443485\nv 0.343004 0.132813 0.418235\nv 0.313621 0.250742 0.418382\nv 0.290815 0.22492 0.444303\nv 0.355269 -0.194146 0.0276407\nv 0.388534 -0.179618 0.0746089\nv 0.336544 -0.25083 0.156379\nv 0.29365 -0.279868 0.104617\nv 0.389288 0.153006 0.345258\nv 0.39155 0.205715 0.320166\nv 0.127262 0.566927 -0.64996\nv 0.000868155 0.562946 -0.661419\nv 0.000850617 0.724441 -0.605705\nv 0.118774 0.725955 -0.596105\nv 0.21095 0.754513 0.387525\nv 0.133734 -0.133188 0.514651\nv 0.131302 -0.13393 0.53047\nv 0.0671053 -0.326445 0.551902\nv 0.0661056 -0.374553 0.504765\nv 0.117289 -0.365439 0.489939\nv 0.116552 -0.318792 0.528974\nv 0.288249 -0.135286 0.424736\nv 0.39393 0.0544045 0.33225\nv 0.374655 0.0965379 0.38044\nv 0.000792155 1 -0.0074948\nv 0.0731795 0.993937 -0.182792\nv 0.000868155 0.999152 -0.181886\nv 0.179405 0.936399 -0.330549\nv 0.0842755 0.953459 -0.338026\nv 0.141767 0.271455 0.486238\nv 0.139978 0.267433 0.490862\nv 0.175908 0.259465 0.501362\nv 0.175312 0.263359 0.495861\nv 0.181597 0.230187 0.495539\nv 0.140253 0.240576 0.495341\nv 0.336982 0.587763 0.356927\nv 0.312043 0.518258 0.416183\nv 0.259971 0.350203 0.495411\nv 0.250763 0.331028 0.496036\nv 0.114179 0.255893 0.495902\nv 0.111069 0.276518 0.499456\nv 0.125433 0.293116 0.500415\nv 0.124965 0.282353 0.489968\nv 0.13906 0.254928 0.497457\nv 0.17737 0.2462 0.50062\nv 0.121796 0.272327 0.47658\nv 0.149548 0.0847578 0.549377\nv 0.142825 -0.226381 0.544992\nv 0.106181 -0.197232 0.576871\nv 0.258193 -0.146669 0.465227\nv 0.2105 0.0188071 0.525711\nv 0.181041 -0.0155508 0.531721\nv 0.173453 -0.168949 0.5218\nv 0.180322 -0.15877 0.514949\nv 0.168554 -0.150118 0.516667\nv 0.163082 -0.153579 0.523344\nv 0.139124 -0.128733 0.545343\nv 0.152348 -0.134468 0.527471\nv 0.416192 -0.0714636 0.0335278\nv 0.0220956 0.0520719 0.640232\nv 0.0361615 0.0619695 0.628476\nv -0.000283541 0.202056 0.62768\nv 0.0869063 -0.0493125 -0.489641\nv 0.192289 -0.0534399 -0.447186\nv 0.192003 -0.134672 -0.429197\nv 0.0851642 -0.130335 -0.46373\nv 0.236434 0.310245 0.495686\nv 0.237714 0.31211 0.497539\nv 0.244636 0.32534 0.496212\nv 0.121253 0.281932 0.477293\nv 0.173149 -0.207241 0.528208\nv -0.000242618 0.247989 0.603612\nv -0.00037708 0.28838 0.571697\nv 0.108496 -0.160507 0.588207\nv 0.0613995 -0.166388 0.620127\nv 0.0634222 -0.199565 0.59462\nv 0.0893734 0.151176 0.600127\nv 0.122124 0.0729427 0.596088\nv 0.0993528 0.072475 0.584781\nv 0.108315 0.0599584 0.583916\nv 0.133524 0.0551528 0.575778\nv 0.13315 0.107517 0.580426\nv 0.274937 0.384257 0.485735\nv 0.170606 -0.145383 0.517205\nv 0.0464391 -0.130399 0.611931\nv 0.0392892 -0.113439 0.575094\nv -0.00161647 -0.112428 0.579865\nv -0.00351648 -0.131685 0.617859\nv 0.0194356 0.03489 0.601858\nv -0.000564158 0.0478802 0.644208\nv -2.04632e-05 0.0350303 0.598835\nv 0.222163 0.246884 0.4972\nv 0.217802 0.257547 0.498129\nv 0.293159 0.278716 0.430419\nv 0.302852 0.281932 0.427367\nv 0.285209 0.277366 0.434932\nv 0.289307 0.275834 0.436551\nv 0.290061 0.280494 0.427963\nv -0.000225079 -0.384287 0.444245\nv 0.0651001 -0.383883 0.440585\nv -0.000891543 -0.364076 0.502426\nv 0.116576 -0.381784 0.436341\nv 0.363734 0.712842 -0.467571\nv 0.32166 0.832542 -0.392653\nv 0.376508 0.821429 -0.265451\nv 0.427095 0.698004 -0.319575\nv 0.27178 0.90956 -0.29643\nv 0.310423 0.901357 -0.210644\nv 0.441869 0.677005 -0.175175\nv 0.389019 0.807076 -0.128411\nv 0.313311 0.894506 -0.0788532\nv 0.12783 -0.376125 0.378248\nv 0.0722266 -0.391483 0.37664\nv 0.125579 0.302411 0.505741\nv 0.101656 0.861358 -0.486525\nv 0.214084 0.849981 -0.463327\nv 0.2467 0.723207 -0.559263\nv 0.104913 0.117397 -0.600268\nv 0.221579 0.117865 -0.555159\nv 0.200848 0.0268164 -0.488992\nv 0.0944011 0.0271204 -0.539134\nv 0.391141 0.144178 -0.303545\nv 0.331241 0.130393 -0.444613\nv 0.360829 0.250357 -0.491155\nv 0.424003 0.258021 -0.333419\nv 0.000868155 0.23912 -0.655479\nv 0.00089154 0.393909 -0.675105\nv 0.125626 0.397949 -0.664716\nv 0.115418 0.240453 -0.645617\nv 0.452175 0.547687 -0.348309\nv 0.450217 0.395605 -0.350776\nv 0.383015 0.40193 -0.511868\nv 0.3854 0.562496 -0.506472\nv 0.464078 0.52881 -0.195929\nv 0.311698 0.866351 0.071908\nv -9.64635e-05 -0.406882 0.376985\nv 0.373883 -0.18312 -0.115123\nv 0.389189 -0.0789467 -0.141776\nv 0.247109 0.197607 0.47589\nv 0.22891 0.231497 0.489717\nv 0.121077 -0.116725 0.574393\nv 0.125626 -0.0895459 0.583057\nv 0.110548 -0.128452 0.555428\nv 0.000710309 0.959638 0.167019\nv 0.000710309 0.881206 0.320973\nv 0.224163 0.124079 0.505215\nv 0.255305 0.260798 0.480649\nv 0.25188 0.263516 0.478322\nv 0.214891 0.26119 0.49413\nv 0.116476 0.273741 0.475423\nv 0.290704 0.283902 0.433377\nv 0.29641 0.299523 0.422813\nv 0.29406 0.288222 0.418078\nv 0.142655 0.263364 0.482467\nv 0.121638 0.267831 0.470296\nv 0.171711 0.256898 0.489693\nv 0.246864 0.257401 0.473821\nv 0.274311 0.271648 0.453301\nv 0.274539 0.26862 0.446654\nv 0.233686 0.331104 0.49074\nv 0.187548 0.326632 0.49682\nv 0.296971 0.273928 0.433476\nv 0.134067 -0.0744861 0.577333\nv 0.237434 0.052867 0.514604\nv 0.0637905 0.27076 0.54346\nv 0.375421 0.514218 0.287328\nv 0.353808 -0.333437 -0.190615\nv 0.349365 -0.276331 -0.333858\nv 0.323337 -0.214946 -0.338453\nv 0.356725 -0.247925 -0.205557\nv -0.000330311 -0.581268 0.237302\nv 0.092922 -0.548418 0.185458\nv 0.394783 -0.0876049 -0.0664009\nv 0.358315 -0.197624 -0.02995\nv 0.292785 -0.321493 0.0377429\nv 0.395175 -0.0904345 -0.0143524\nv 0.243385 0.243183 -0.602957\nv 0.000587539 -0.0451091 -0.498205\nv 0.000751232 0.030862 -0.55154\nv 0.000809694 0.11928 -0.61144\nv 0.000850617 0.862837 -0.491295\nv 0.000868155 0.958527 -0.339277\nv 0.000423846 -0.128189 -0.469085\nv 0.264186 0.56961 -0.608026\nv 0.35127 -0.283317 -0.0863656\nv 0.196201 -0.209591 -0.418785\nv 0.0873097 -0.206341 -0.44839\nv 0.000488154 -0.206259 -0.449945\nv 0.263397 0.402579 -0.621226\nv 0.456683 0.384813 -0.0591516\nv 0.457776 0.372302 -0.191281\nv 0.000850617 0.671351 0.512487\nv 0.000809694 0.77919 0.437668\nv 0.408656 0.116286 0.298547\nv 0.295913 0.259781 0.439334\nv 0.285355 0.265481 0.449775\nv 0.278766 0.270035 0.454663\nv 0.128946 -0.0227065 0.564741\nv 0.16203 0.016989 0.534633\nv 0.0985987 0.0583799 0.58087\nv 0.0538462 0.323165 0.543729\nv 0.0794758 0.301522 0.528465\nv -0.00330601 -0.197759 0.600525\nv -0.000511542 -0.225551 0.572931\nv -0.00456879 -0.164231 0.628277\nv -0.000336157 -0.26392 0.574381\nv -0.000768774 -0.325515 0.55686\nv 0.269921 0.242499 0.464742\nv 0.260573 0.253022 0.476072\nv 0.235066 0.15963 0.493271\nv 0.411369 0.186119 0.273583\nv 0.000178307 0.0131539 0.584682\nv 0.153436 -0.0554568 0.55786\nv 0.0264569 0.331747 0.554112\nv -0.000342003 0.332998 0.557743\nv 0.285589 0.277974 0.428156\nv 0.184795 -0.499655 0.1217\nv 0.332808 -0.386298 -0.0699261\nv 0.20739 -0.274419 -0.415909\nv 0.0927467 -0.274308 -0.43723\nv 0.278029 -0.438791 0.0475586\nv 0.000505693 -0.27722 -0.43768\nv 0.438191 0.12488 -0.0367783\nv 0.460214 0.163208 -0.055258\nv 0.485388 0.177437 -0.0277343\nv 0.472304 0.161641 -0.00367724\nv 0.496244 0.232684 -0.0170708\nv 0.477425 0.247036 0.00446648\nv 0.517015 0.298681 -0.0523876\nv 0.492233 0.31788 -0.0441737\nv 0.53425 0.316407 -0.124009\nv 0.511491 0.332595 -0.129276\nv 0.535904 0.290111 -0.170685\nv 0.511128 0.30365 -0.186838\nv 0.538611 0.228878 -0.193017\nv 0.511286 0.231199 -0.218992\nv 0.520242 0.128838 -0.191421\nv 0.490433 0.122168 -0.208603\nv 0.487562 0.00951757 -0.0819458\nv 0.472286 -0.00658864 -0.0930419\nv 0.47079 0.0399937 -0.154257\nv 0.496437 0.0472722 -0.136917\nv 0.485142 -0.0247586 -0.0238758\nv 0.46129 -0.0429694 -0.0334343\nv 0.474888 0.238927 -0.0419989\nv 0.495232 0.289088 -0.0628581\nv 0.508398 0.299996 -0.11766\nv 0.51311 0.283323 -0.158478\nv 0.514642 0.235303 -0.176531\nv 0.501751 0.136134 -0.181559\nv 0.486025 0.0533522 -0.11859\nv 0.486451 0.0268164 -0.067155\nv 0.482529 0.0136625 -0.0120607\nv 0.464265 0.0280383 0.0249515\nv 0.457519 -0.0185791 0.0196256\nv 0.442769 0.0582571 -0.0293244\nv 0.45632 0.0847169 -0.0600578\nv 0.442465 0.0842785 -0.0209644\nv 0.459612 0.268106 0.0209995\nv 0.458559 0.182857 0.0414318\nv 0.463026 0.318488 -0.0446005\nv 0.470222 0.311835 -0.142898\nv 0.455063 0.232836 -0.195221\nv 0.43839 0.13186 -0.191088\nv 0.424564 0.0473131 -0.148417\nv 0.423447 -0.00471202 -0.0897563\nv 0.425377 -0.0292075 -0.0262143\nv 0.430714 -0.0102191 0.0297161\nv 0.446335 0.0345567 0.0460036\nv 0.475607 0.129364 -0.0864649\nv 0.482611 0.0600636 -0.0525396\nv 0.481517 0.0827175 -0.101349\nv 0.470503 0.0444835 -0.0133527\nv 0.479278 0.0776957 0.00471786\nv 0.504692 0.223938 -0.101723\nv 0.50375 0.131866 -0.1473\nv 0.45452 0.100016 0.0450097\nv 0.403623 0.0251386 -0.16934\nv 0.414719 0.138607 -0.218957\nv 0.435461 0.249632 -0.229924\nv -0.000201695 -0.407876 0.310666\nv 0.000347846 -0.171521 0.505794\nv 0.0884205 -0.186598 0.484028\nv 0.141147 -0.173807 0.465513\nv 0.159878 -0.142255 0.458644\nv 0.152483 -0.116468 0.431278\nv 0.0708352 0.0121893 0.376371\nv 0.128069 -0.116368 0.360528\nv 0.143994 -0.166791 0.41184\nv 0.0748398 -0.218144 0.372349\nv 0.280941 0.292858 0.454897\nv 0.281356 0.319879 0.451494\nv 0.127268 0.269088 0.455435\nv 0.116921 0.284697 0.447653\nv 0.119996 0.274998 0.469126\nv 0.15699 0.254759 0.466326\nv 0.265916 0.273601 0.421176\nv 0.214885 0.253946 0.455259\nv 0.141223 0.313133 0.482117\nv 0.211436 0.255823 0.486852\nv 0.277135 0.302686 0.410799\nv 0.252505 0.333881 0.433599\nv 0.202023 0.342182 0.464578\nv 0.11989 0.295816 0.471196\nv 0.146526 0.322539 0.455943\nv 0.126292 0.301838 0.454973\nv 0.119744 0.284878 0.469419\nv 0.00103185 0.0191579 0.374711\nv 0.000909079 -0.205715 0.379849\nv 0.0536357 -0.100847 0.27211\nv 0.00103185 -0.098929 0.27128\nv 0.255463 -0.398733 -0.446098\nv 0.412907 -0.372688 -0.332858\nv 0.452596 -0.41557 -0.353559\nv 0.293329 -0.465367 -0.476007\nv 0.0815337 -0.637104 0.176286\nv 0.0726358 -0.738524 0.179519\nv 0.174763 -0.714911 0.155526\nv 0.172032 -0.601823 0.129884\nv 0.380782 -0.504069 -0.184377\nv 0.357368 -0.419095 -0.180384\nv 0.337538 -0.494803 -0.0548371\nv 0.372989 -0.619402 -0.0373571\nv 0.453578 -0.652661 -0.0939539\nv 0.452351 -0.545892 -0.196981\nv 0.173576 -0.814197 0.195654\nv 0.0739044 -0.845866 0.20734\nv 0.0964414 -0.904976 0.254455\nv 0.197703 -0.864562 0.243353\nv 0.519564 -0.487407 -0.384801\nv 0.555004 -0.584226 -0.219366\nv 0.451357 -0.731555 -0.0215899\nv 0.382594 -0.74824 0.0443666\nv 0.439805 -0.799196 0.0975376\nv 0.519108 -0.768071 -0.00769357\nv 0.274837 -0.806199 0.115503\nv 0.320508 -0.838061 0.183769\nv 0.354533 -0.544232 -0.525256\nv 0.162503 -0.604343 -0.559076\nv 0.131098 -0.496837 -0.498761\nv 0.115161 -0.410103 -0.457756\nv -0.00017831 -0.492774 -0.504192\nv 2.046e-05 -0.40666 -0.465186\nv -0.000482311 -0.600531 -0.555322\nv 0.546217 -0.696736 -0.117257\nv 0.22746 -0.332063 -0.424345\nv 0.101627 -0.33885 -0.437002\nv 0.280193 -0.554165 0.0658922\nv 0.274843 -0.684891 0.0781517\nv 0.000347846 -0.34199 -0.438165\nv 0.000733693 -0.746364 0.176765\nv 0.000312769 -0.874904 0.179121\nv 0.378648 -0.322586 -0.326994\nv -0.000114002 -0.940246 0.234262\nv 0.000979233 -0.650317 0.207112\nv -0.130513 -0.13217 0.498924\nv -0.133687 -0.14723 0.488109\nv -0.15222 -0.140519 0.477457\nv -0.14666 -0.13514 0.489746\nv -0.0697653 -0.0999404 0.550318\nv -0.0736414 -0.0473131 0.499649\nv -0.0305784 -0.0972511 0.55389\nv -0.0396517 -0.109762 0.550014\nv -0.0358517 -0.127727 0.53534\nv -0.0742493 -0.135994 0.523315\nv -0.0733373 -0.115561 0.537643\nv -0.106766 -0.144336 0.504823\nv -0.106281 -0.125786 0.515779\nv -0.156505 -0.107798 0.467782\nv -0.155611 -0.123682 0.486899\nv -0.159311 -0.130796 0.484958\nv -0.162872 -0.126996 0.470243\nv -0.159919 -0.135625 0.47627\nv -0.154055 -0.134696 0.486513\nv -0.142597 -0.118993 0.499994\nv -0.130051 -0.0726738 0.476189\nv -0.10054 -0.105798 0.538111\nv -0.125684 -0.115824 0.51596\nv -0.274604 -0.301394 0.247527\nv -0.220831 -0.335775 0.330215\nv -0.250102 -0.275554 0.380393\nv -0.3066 -0.239804 0.292309\nv -0.284302 -0.0258401 0.479772\nv -0.319479 0.00809111 0.449577\nv -0.331873 -0.0412272 0.412243\nv -0.293674 -0.0747667 0.452418\nv -0.294668 -0.0547787 -0.357622\nv -0.302063 -0.144319 -0.34334\nv -0.356012 -0.159916 -0.223184\nv -0.355474 -0.0633082 -0.24271\nv -0.447241 0.22613 0.139332\nv -0.437922 0.336149 0.131124\nv -0.449486 0.331215 0.047962\nv -0.454982 0.205353 0.0827818\nv -0.103311 -0.419241 0.249936\nv -0.203701 -0.353384 0.208147\nv -0.196966 -0.411506 0.138841\nv -0.101797 -0.475733 0.208638\nv -0.196499 -0.327216 0.427455\nv -0.176283 -0.362363 0.392138\nv -0.150331 -0.372548 0.431378\nv -0.155575 -0.349484 0.46435\nv -0.0890109 -0.391945 0.303855\nv -0.158306 -0.363848 0.305182\nv -0.415613 0.611627 0.0817705\nv -0.430808 0.648493 -0.0417066\nv -0.45411 0.508986 -0.0641209\nv -0.440308 0.483438 0.0478393\nv -0.389808 0.40462 0.306977\nv -0.375935 0.38348 0.354021\nv -0.34643 0.433026 0.398499\nv -0.354807 0.467378 0.356891\nv -0.317409 0.30382 0.429121\nv -0.30173 0.320499 0.456861\nv -0.309295 0.339493 0.457756\nv -0.328406 0.316144 0.429519\nv -0.358297 0.360101 0.389344\nv -0.335684 0.397733 0.427864\nv -0.285156 0.29304 0.457387\nv -0.294212 0.310695 0.451757\nv -0.307675 0.294425 0.430781\nv -0.29475 0.281949 0.435698\nv -0.421091 0.455996 0.145494\nv -0.395403 0.565208 0.19252\nv -0.321999 0.364421 0.449238\nv -0.345494 0.336792 0.417218\nv -0.178165 0.560672 0.512335\nv -0.249354 0.546354 0.466589\nv -0.243286 0.479638 0.494943\nv -0.170168 0.4781 0.536796\nv -0.164123 0.410647 0.547114\nv -0.236966 0.427297 0.516007\nv -0.270669 0.634748 0.422187\nv -0.195815 0.657882 0.47347\nv -0.14597 0.313039 0.508126\nv -0.18946 0.324971 0.513312\nv -0.186823 0.312829 0.511757\nv -0.144895 0.300213 0.501871\nv -0.186911 0.310514 0.506612\nv -0.143462 0.300341 0.494353\nv -0.160048 0.365076 0.528073\nv -0.219468 0.382854 0.516404\nv -0.15782 0.334506 0.520076\nv -0.205952 0.349935 0.517012\nv -0.195236 0.332495 0.516264\nv -0.151653 0.320785 0.513142\nv -0.0805691 0.0827468 0.603261\nv -0.0493739 0.08878 0.593591\nv -0.0448723 0.0732117 0.617958\nv -0.0594819 0.0761932 0.621314\nv -0.422927 0.0771812 0.237185\nv -0.432205 0.159355 0.215905\nv -0.448112 0.130656 0.149516\nv -0.4282 0.0348607 0.166897\nv -0.311779 -0.172912 0.334378\nv -0.324787 -0.103758 0.371735\nv -0.364851 -0.052639 0.316097\nv -0.367254 -0.126698 0.269146\nv -0.183918 -0.149136 0.51793\nv -0.182024 -0.137865 0.527822\nv -0.205163 -0.131463 0.524127\nv -0.205514 -0.152071 0.514943\nv -0.39379 0.00614433 0.269368\nv -0.400951 -0.0591282 0.208995\nv -0.261011 -0.0993382 0.483865\nv -0.25102 -0.0551177 0.50328\nv -0.158849 -0.136444 0.499199\nv -0.155155 -0.134784 0.503397\nv -0.145304 -0.133848 0.514902\nv -0.160802 -0.128394 0.536919\nv -0.173424 -0.121349 0.541327\nv -0.169156 -0.138478 0.524928\nv -0.232096 -0.116964 0.50767\nv -0.232727 -0.151188 0.49696\nv -0.326085 0.202611 0.415651\nv -0.34094 0.235683 0.392156\nv -0.367727 0.221336 0.359031\nv -0.358829 0.177595 0.3841\nv -0.295603 0.0501836 0.478632\nv -0.32232 0.0902006 0.449922\nv -0.351843 0.04895 0.416686\nv -0.367248 0.00336155 0.369624\nv -0.156137 -0.154941 0.536878\nv -0.165134 -0.177028 0.538193\nv -0.144573 -0.187364 0.558725\nv -0.140533 -0.155882 0.559046\nv -0.17761 -0.0804258 0.547933\nv -0.201667 -0.0484356 0.526945\nv -0.22024 -0.0817529 0.517585\nv -0.195826 -0.106131 0.536439\nv -0.207794 -0.213087 0.493049\nv -0.191711 -0.188305 0.515551\nv -0.201111 -0.170071 0.510745\nv -0.223385 -0.183243 0.490178\nv -0.128595 -0.132761 0.551212\nv -0.145777 -0.139513 0.530605\nv -0.0971664 0.171538 0.569909\nv -0.120048 0.150182 0.555387\nv -0.13557 0.119437 0.545004\nv -0.113103 0.137432 0.569453\nv -0.0653573 0.232432 0.569575\nv -0.08745 0.217992 0.556468\nv -0.0739395 0.185388 0.584933\nv -0.0855266 0.255554 0.53095\nv -0.110583 0.228714 0.525501\nv -0.115915 0.191404 0.5495\nv -0.300099 0.0366964 -0.387999\nv -0.364734 0.0377897 -0.269357\nv -0.223181 -0.243207 0.45081\nv -0.246139 -0.195666 0.45347\nv -0.271201 -0.199869 0.399446\nv -0.362846 -0.197443 0.213286\nv -0.410176 -0.124757 0.140565\nv -0.430404 -0.00290555 0.0907385\nv -0.448779 0.11075 0.0889086\nv -0.142135 0.869847 0.301633\nv -0.132167 0.771303 0.419317\nv -0.0633989 0.777407 0.43288\nv -0.0675789 0.877324 0.315577\nv -0.353469 0.660735 0.264732\nv -0.2875 0.723792 0.335465\nv -0.30353 0.809117 0.220313\nv -0.37099 0.728422 0.148627\nv -0.381016 0.776764 0.0117274\nv -0.0996744 0.472587 0.557146\nv -0.109525 0.565325 0.53475\nv -0.100294 0.277787 0.511248\nv -0.108689 0.248457 0.503268\nv -0.0528874 0.193947 0.604898\nv -0.0453926 0.241125 0.586705\nv -0.12255 0.668732 0.500514\nv -0.0511336 0.564922 0.542589\nv -0.0582191 0.671655 0.50974\nv -0.0440363 0.465776 0.561151\nv -0.0361966 0.388923 0.562367\nv -0.301894 0.466338 0.448542\nv -0.295831 0.424807 0.472166\nv -0.140867 0.22264 0.499754\nv -0.185742 0.209381 0.492394\nv -0.186338 0.179495 0.502724\nv -0.145859 0.19535 0.519018\nv -0.0600022 0.0437294 0.578309\nv -0.113337 0.0407946 0.564875\nv -0.114196 0.0121659 0.564255\nv -0.0686019 -0.00676987 0.598064\nv -0.143661 0.0637116 0.537807\nv -0.147607 0.0440217 0.535469\nv -0.0907706 -0.0459919 0.600525\nv -0.0300113 -0.0346152 0.623594\nv -0.028047 -0.0138554 0.603173\nv -0.148028 0.131527 0.5437\nv -0.148519 0.164868 0.537322\nv -0.183164 0.146873 0.520193\nv -0.176978 0.112363 0.532908\nv -0.147823 0.0979234 0.535574\nv -0.165064 0.0766492 0.532955\nv -0.120107 0.268649 0.480825\nv -0.118558 0.262394 0.493353\nv -0.115979 0.27287 0.494434\nv -0.116476 0.272952 0.483859\nv -0.229115 0.916634 0.120496\nv -0.223379 0.848952 0.271461\nv -0.145146 0.945128 0.150709\nv -0.145409 0.980883 -0.0176788\nv -0.154278 0.976311 -0.1834\nv -0.240088 0.945514 -0.185786\nv -0.230512 0.948548 -0.0401515\nv -0.0669533 0.995411 -0.00979819\nv -0.0669124 0.955581 0.163097\nv -0.0891746 0.383199 0.554861\nv -0.112226 0.336757 0.527307\nv -0.123381 0.311174 0.513382\nv -0.149484 -0.111966 0.558549\nv -0.160264 -0.0991219 0.559216\nv -0.0695139 0.122828 0.646821\nv -0.103574 0.1197 0.616608\nv -0.0967747 0.0873945 0.617683\nv -0.0583127 0.0845006 0.640951\nv -0.0810075 0.0824603 0.567973\nv -0.0347818 0.058339 0.594989\nv -0.031812 -0.0520134 0.636181\nv -0.0876079 -0.0656701 0.61341\nv -0.0905251 -0.101683 0.607529\nv -0.0378686 -0.0937434 0.629054\nv -0.0836617 -0.122507 0.579642\nv -0.0385351 -0.11728 0.594673\nv -0.0223295 0.0177081 0.586652\nv -0.0307538 0.0864766 0.665646\nv -0.0369098 0.125196 0.667078\nv -0.0659946 0.154643 0.629212\nv -0.0379446 0.159028 0.648136\nv -0.0287544 0.19984 0.620642\nv -0.0228205 0.245931 0.598298\nv -0.0444456 0.281523 0.558544\nv -0.0233467 0.287164 0.569581\nv -0.348774 0.267521 0.384632\nv -0.352083 0.30296 0.39367\nv -0.371253 0.315308 0.363077\nv -0.374871 0.266369 0.352501\nv -0.422202 0.335746 0.207253\nv -0.401928 0.429197 0.234116\nv -0.395345 0.264083 0.313998\nv -0.391071 0.32586 0.325679\nv -0.312703 0.275793 0.421661\nv -0.320315 0.291642 0.417107\nv -0.332077 0.295173 0.409057\nv -0.327599 0.271742 0.406824\nv -0.429802 0.244434 0.203979\nv -0.409282 0.332454 0.277442\nv -0.411848 0.257886 0.266369\nv -0.187414 -0.242265 0.510307\nv -0.193763 -0.283183 0.474066\nv -0.155254 -0.304954 0.501777\nv -0.149998 -0.264183 0.526518\nv -0.0567108 -0.227311 0.569523\nv -0.101124 -0.233508 0.561461\nv -0.11039 -0.27508 0.546021\nv -0.066205 -0.270351 0.564711\nv -0.154225 -0.138052 0.502391\nv -0.159867 -0.142787 0.513271\nv -0.15533 -0.142366 0.518626\nv -0.148566 -0.137426 0.506285\nv -0.160416 -0.138344 0.518258\nv -0.161965 -0.141513 0.511996\nv -0.110811 -0.126394 0.533276\nv -0.10089 -0.129879 0.583501\nv -0.0809374 -0.117865 0.558397\nv -0.263876 0.014785 0.500935\nv -0.26083 0.088932 0.49537\nv -0.279702 0.127055 0.470506\nv -0.207764 0.0867397 0.523776\nv -0.187729 0.0509786 0.529558\nv -0.232096 -0.0167025 0.518065\nv -0.344056 0.133304 0.417078\nv -0.302046 0.166376 0.445239\nv -0.292551 0.225429 0.44414\nv -0.316041 0.250468 0.418475\nv -0.335386 -0.250836 0.156385\nv -0.387207 -0.179618 0.074568\nv -0.353755 -0.194151 0.0276524\nv -0.292388 -0.279891 0.104617\nv -0.392211 0.205733 0.320201\nv -0.386651 0.150025 0.344942\nv -0.126064 0.567371 -0.651942\nv -0.117096 0.725914 -0.596082\nv -0.209068 0.754227 0.387245\nv -0.134091 -0.133281 0.515294\nv -0.132384 -0.133778 0.530774\nv -0.118289 -0.366228 0.490722\nv -0.0673742 -0.375085 0.505343\nv -0.0685259 -0.327012 0.553422\nv -0.117722 -0.319453 0.530388\nv -0.287793 -0.13528 0.424643\nv -0.375234 0.0965671 0.380457\nv -0.394351 0.054463 0.33218\nv -0.0714373 0.993797 -0.182751\nv -0.0825568 0.953558 -0.338084\nv -0.177458 0.935674 -0.330221\nv -0.176961 0.259482 0.501637\nv -0.139651 0.267463 0.490903\nv -0.141176 0.271537 0.486156\nv -0.175792 0.263446 0.495797\nv -0.139621 0.240295 0.49489\nv -0.181918 0.230053 0.49499\nv -0.335299 0.587722 0.356851\nv -0.311189 0.51838 0.416464\nv -0.263028 0.350391 0.495528\nv -0.252435 0.331198 0.496568\nv -0.111168 0.276448 0.500608\nv -0.113553 0.255671 0.49582\nv -0.124754 0.293525 0.500263\nv -0.124275 0.282616 0.489933\nv -0.138587 0.254671 0.496603\nv -0.17851 0.246346 0.500783\nv -0.120744 0.272286 0.476557\nv -0.150635 0.0843194 0.549231\nv -0.110981 -0.197039 0.578654\nv -0.145877 -0.226522 0.547184\nv -0.257825 -0.146365 0.464946\nv -0.181813 -0.015013 0.533586\nv -0.21057 0.0188715 0.525811\nv -0.169226 -0.14996 0.516989\nv -0.181743 -0.1588 0.515902\nv -0.175376 -0.168545 0.522911\nv -0.163813 -0.153415 0.52335\nv -0.140253 -0.128364 0.545887\nv -0.153091 -0.134363 0.527834\nv -0.414608 -0.0714286 0.0335337\nv -0.0376523 0.063203 0.628721\nv -0.0232707 0.0530365 0.640016\nv -0.190483 -0.134521 -0.42891\nv -0.190425 -0.0530365 -0.446291\nv -0.0856669 -0.0492716 -0.489617\nv -0.0841703 -0.13027 -0.463549\nv -0.238743 0.312729 0.498784\nv -0.236568 0.310718 0.495914\nv -0.245034 0.325784 0.495083\nv -0.120311 0.281967 0.47734\nv -0.176107 -0.207054 0.530523\nv -0.114635 -0.15994 0.588938\nv -0.0702155 -0.19877 0.595006\nv -0.0735478 -0.165324 0.619338\nv -0.0899814 0.151661 0.600396\nv -0.111016 0.0572925 0.58557\nv -0.101867 0.0715163 0.586237\nv -0.127064 0.0733753 0.597824\nv -0.136833 0.0543987 0.574241\nv -0.135833 0.107312 0.581379\nv -0.278287 0.38386 0.485911\nv -0.171226 -0.145371 0.517737\nv -0.0426215 -0.114106 0.575498\nv -0.0575293 -0.131258 0.610721\nv -0.0203535 0.0339429 0.602828\nv -0.224215 0.246978 0.496697\nv -0.219644 0.257664 0.498129\nv -0.308126 0.284604 0.426215\nv -0.296275 0.279026 0.430641\nv -0.291721 0.275554 0.437358\nv -0.286612 0.276705 0.435172\nv -0.291949 0.280143 0.428238\nv -0.065825 -0.384532 0.440825\nv -0.11702 -0.382428 0.436651\nv -0.374667 0.821265 -0.265393\nv -0.3198 0.831958 -0.392208\nv -0.362179 0.712818 -0.467507\nv -0.425879 0.698185 -0.319692\nv -0.269938 0.909215 -0.296313\nv -0.308015 0.900609 -0.210562\nv -0.440407 0.677046 -0.175192\nv -0.387417 0.807117 -0.128411\nv -0.312037 0.894728 -0.0788123\nv -0.0720161 -0.391612 0.376675\nv -0.127765 -0.376523 0.378341\nv -0.124801 0.303066 0.504835\nv -0.0997913 0.860855 -0.486022\nv -0.212687 0.850449 -0.463771\nv -0.245244 0.723306 -0.559461\nv -0.199083 0.0271847 -0.488407\nv -0.21986 0.118005 -0.554936\nv -0.10327 0.117479 -0.600127\nv -0.0928636 0.0273016 -0.53883\nv -0.389259 0.144254 -0.303446\nv -0.329178 0.130557 -0.444432\nv -0.359227 0.250316 -0.491237\nv -0.422325 0.258021 -0.333419\nv -0.123907 0.397932 -0.664658\nv -0.113699 0.240517 -0.645459\nv -0.381641 0.401913 -0.512072\nv -0.448592 0.395605 -0.3508\nv -0.450574 0.547705 -0.348333\nv -0.384366 0.562601 -0.506817\nv -0.462722 0.528827 -0.195952\nv -0.310604 0.866976 0.0721301\nv -0.372013 -0.183143 -0.115123\nv -0.387686 -0.0789994 -0.141781\nv -0.2476 0.197566 0.475487\nv -0.230342 0.231532 0.488372\nv -0.129238 -0.0890256 0.584927\nv -0.123544 -0.115971 0.574872\nv -0.114588 -0.128867 0.557082\nv -0.221702 0.122764 0.506442\nv -0.216107 0.26119 0.49413\nv -0.253242 0.263207 0.478422\nv -0.256568 0.260547 0.479737\nv -0.115342 0.273619 0.475323\nv -0.298743 0.299903 0.422953\nv -0.291698 0.283732 0.432722\nv -0.295854 0.288181 0.418253\nv -0.142059 0.263388 0.482491\nv -0.120428 0.267802 0.470325\nv -0.172108 0.256934 0.489641\nv -0.275083 0.271584 0.453242\nv -0.248582 0.25684 0.473757\nv -0.275001 0.268573 0.446274\nv -0.234253 0.331396 0.490634\nv -0.187624 0.326819 0.49717\nv -0.300292 0.274694 0.432944\nv -0.135658 -0.0739483 0.577444\nv -0.237428 0.052791 0.514919\nv -0.0645564 0.270789 0.544612\nv -0.373819 0.514195 0.287264\nv -0.321852 -0.214718 -0.338184\nv -0.348166 -0.27584 -0.333396\nv -0.352171 -0.333378 -0.190533\nv -0.354936 -0.247872 -0.205511\nv -0.0936937 -0.549137 0.186785\nv -0.35669 -0.197653 -0.0299733\nv -0.393228 -0.0876225 -0.0664009\nv -0.29161 -0.321499 0.0380294\nv -0.393638 -0.0904403 -0.014329\nv -0.241608 0.243201 -0.602916\nv -0.263209 0.569914 -0.609242\nv -0.349441 -0.283282 -0.0863831\nv -0.194821 -0.209504 -0.418674\nv -0.0862925 -0.206323 -0.448413\nv -0.261795 0.402579 -0.621448\nv -0.456233 0.372302 -0.191263\nv -0.455245 0.384813 -0.0591282\nv -0.408072 0.116608 0.297155\nv -0.298661 0.260278 0.439147\nv -0.287606 0.265861 0.450068\nv -0.279696 0.270216 0.454289\nv -0.162731 0.0172638 0.536515\nv -0.13087 -0.0222973 0.565699\nv -0.101475 0.0572691 0.580946\nv -0.0809198 0.301049 0.528407\nv -0.0556351 0.322972 0.54498\nv -0.272306 0.242932 0.464508\nv -0.262964 0.253017 0.476001\nv -0.233067 0.158607 0.487893\nv -0.412053 0.186142 0.273695\nv -0.154815 -0.0532762 0.55793\nv -0.0277489 0.331782 0.556427\nv -0.286179 0.277611 0.427928\nv -0.183941 -0.499632 0.122144\nv -0.331493 -0.386257 -0.0698735\nv -0.206238 -0.274279 -0.416026\nv -0.0915482 -0.274332 -0.437317\nv -0.277193 -0.438779 0.0481257\nv -0.484037 0.177414 -0.0276816\nv -0.458618 0.163319 -0.0553633\nv -0.437233 0.124752 -0.0367315\nv -0.471526 0.1616 -0.00366555\nv -0.476232 0.247018 0.00445479\nv -0.494987 0.232631 -0.0169773\nv -0.491035 0.317921 -0.0441971\nv -0.515688 0.298728 -0.0523583\nv -0.510175 0.332513 -0.1293\nv -0.532917 0.316524 -0.12405\nv -0.50993 0.303592 -0.186815\nv -0.534671 0.290233 -0.170849\nv -0.510152 0.231181 -0.21891\nv -0.537459 0.228895 -0.193058\nv -0.48934 0.122068 -0.20872\nv -0.519208 0.128879 -0.191363\nv -0.469632 0.0399528 -0.15424\nv -0.470766 -0.00661202 -0.0930419\nv -0.486142 0.00947665 -0.0819458\nv -0.495221 0.0472722 -0.1369\nv -0.459705 -0.0431682 -0.033446\nv -0.483546 -0.0248521 -0.0238816\nv -0.494011 0.289082 -0.0628932\nv -0.473502 0.238904 -0.0420457\nv -0.507246 0.300137 -0.117724\nv -0.512134 0.2833 -0.158502\nv -0.513712 0.235303 -0.176549\nv -0.50102 0.136093 -0.181582\nv -0.485095 0.0532704 -0.118549\nv -0.485253 0.0267755 -0.0671726\nv -0.481172 0.0136801 -0.012201\nv -0.456127 -0.0187428 0.0196958\nv -0.462909 0.027933 0.024969\nv -0.454923 0.0845591 -0.060163\nv -0.441284 0.0577602 -0.0294063\nv -0.440921 0.0840388 -0.0210813\nv -0.457712 0.18288 0.0414318\nv -0.458378 0.268123 0.0210228\nv -0.461588 0.318505 -0.044618\nv -0.468843 0.311858 -0.142898\nv -0.453707 0.232836 -0.195204\nv -0.436969 0.13182 -0.191047\nv -0.423167 0.0473306 -0.148288\nv -0.421945 -0.00467109 -0.089692\nv -0.423991 -0.0291198 -0.0260915\nv -0.429434 -0.0102776 0.0297746\nv -0.445242 0.0345158 0.0460211\nv -0.481617 0.0602039 -0.0524227\nv -0.474104 0.129276 -0.0866754\nv -0.480325 0.0824545 -0.101285\nv -0.469474 0.0446648 -0.013376\nv -0.478167 0.0776431 0.00467109\nv -0.503592 0.223961 -0.101887\nv -0.502575 0.131983 -0.147242\nv -0.453707 0.0999988 0.0450097\nv -0.413357 0.138549 -0.218945\nv -0.402232 0.0251035 -0.169299\nv -0.434023 0.249632 -0.229901\nv -0.0871226 -0.186639 0.484069\nv -0.139686 -0.173807 0.465537\nv -0.158481 -0.142278 0.458685\nv -0.0688299 0.0121893 0.376371\nv -0.150805 -0.116468 0.431278\nv -0.126228 -0.116368 0.360528\nv -0.142316 -0.166791 0.41184\nv -0.0730392 -0.218144 0.372349\nv -0.282087 0.293548 0.454716\nv -0.283513 0.320341 0.45129\nv -0.124398 0.285323 0.452968\nv -0.126795 0.269175 0.455978\nv -0.119353 0.275057 0.469524\nv -0.156265 0.2548 0.466332\nv -0.265074 0.27356 0.421036\nv -0.214762 0.253899 0.455218\nv -0.141855 0.312577 0.484315\nv -0.212745 0.255776 0.486875\nv -0.277117 0.302621 0.410811\nv -0.252014 0.333887 0.433371\nv -0.20141 0.342405 0.464461\nv -0.120767 0.295565 0.473184\nv -0.145333 0.322832 0.456154\nv -0.126041 0.301873 0.455785\nv -0.119879 0.284837 0.470541\nv -0.0516539 -0.100847 0.27211\nv -0.454245 -0.41571 -0.353027\nv -0.413392 -0.372097 -0.332203\nv -0.255785 -0.398019 -0.4467\nv -0.294685 -0.464338 -0.476902\nv -0.174388 -0.714777 0.156607\nv -0.0715543 -0.738454 0.180284\nv -0.0798266 -0.636725 0.177765\nv -0.171536 -0.601788 0.131147\nv -0.337345 -0.494639 -0.0546091\nv -0.355094 -0.419334 -0.180442\nv -0.379665 -0.504905 -0.184915\nv -0.373053 -0.619338 -0.0373044\nv -0.45328 -0.545816 -0.197379\nv -0.454128 -0.653065 -0.0942754\nv -0.0965876 -0.904778 0.254759\nv -0.0736004 -0.845567 0.20775\nv -0.172974 -0.81408 0.195975\nv -0.1973 -0.864375 0.243622\nv -0.520961 -0.488138 -0.3841\nv -0.556272 -0.584635 -0.21946\nv -0.439238 -0.799155 0.0975785\nv -0.381694 -0.748264 0.0442672\nv -0.45103 -0.731883 -0.0219173\nv -0.519067 -0.768135 -0.0077988\nv -0.273785 -0.806328 0.115322\nv -0.319391 -0.83802 0.183769\nv -0.163088 -0.604103 -0.559421\nv -0.356672 -0.543712 -0.525361\nv -0.131226 -0.496761 -0.498854\nv -0.114629 -0.410074 -0.45775\nv -0.546533 -0.697291 -0.117619\nv -0.100633 -0.33885 -0.437013\nv -0.22677 -0.331835 -0.424707\nv -0.274931 -0.684651 0.0790578\nv -0.28021 -0.553908 0.0669913\nv -0.378028 -0.321668 -0.326088\nv 0.172833 0.300014 0.41564\nv -0.171097 0.299996 0.415616\n# 1258 vertices\n\nvt  0.532 0.923 0.000\nvt  0.535 0.917 0.000\nvt  0.542 0.923 0.000\nvt  0.541 0.929 0.000\nvt  0.521 0.984 0.000\nvt  0.521 0.996 0.000\nvt  0.505 0.998 0.000\nvt  0.500 0.985 0.000\nvt  0.504 0.917 0.000\nvt  0.507 0.910 0.000\nvt  0.516 0.910 0.000\nvt  0.515 0.918 0.000\nvt  0.523 0.921 0.000\nvt  0.525 0.913 0.000\nvt  0.549 0.958 0.000\nvt  0.538 0.954 0.000\nvt  0.544 0.942 0.000\nvt  0.550 0.946 0.000\nvt  0.545 0.935 0.000\nvt  0.550 0.932 0.000\nvt  0.547 0.974 0.000\nvt  0.533 0.967 0.000\nvt  0.500 0.917 0.000\nvt  0.500 0.910 0.000\nvt  0.542 0.987 0.000\nvt  0.533 0.994 0.000\nvt  0.616 0.254 0.000\nvt  0.653 0.261 0.000\nvt  0.658 0.307 0.000\nvt  0.619 0.292 0.000\nvt  0.636 0.438 0.000\nvt  0.620 0.419 0.000\nvt  0.627 0.396 0.000\nvt  0.647 0.414 0.000\nvt  0.886 0.312 0.000\nvt  0.897 0.370 0.000\nvt  0.860 0.369 0.000\nvt  0.844 0.308 0.000\nvt  0.740 0.593 0.000\nvt  0.741 0.542 0.000\nvt  0.759 0.541 0.000\nvt  0.768 0.598 0.000\nvt  0.644 0.213 0.000\nvt  0.561 0.175 0.000\nvt  0.566 0.146 0.000\nvt  0.644 0.174 0.000\nvt  0.580 0.254 0.000\nvt  0.585 0.277 0.000\nvt  0.565 0.268 0.000\nvt  0.565 0.256 0.000\nvt  0.590 0.217 0.000\nvt  0.544 0.195 0.000\nvt  0.771 0.721 0.000\nvt  0.736 0.712 0.000\nvt  0.758 0.653 0.000\nvt  0.794 0.663 0.000\nvt  0.669 0.622 0.000\nvt  0.685 0.632 0.000\nvt  0.665 0.669 0.000\nvt  0.652 0.651 0.000\nvt  0.623 0.588 0.000\nvt  0.632 0.582 0.000\nvt  0.639 0.590 0.000\nvt  0.627 0.599 0.000\nvt  0.641 0.632 0.000\nvt  0.657 0.612 0.000\nvt  0.619 0.580 0.000\nvt  0.617 0.575 0.000\nvt  0.623 0.573 0.000\nvt  0.627 0.576 0.000\nvt  0.708 0.702 0.000\nvt  0.729 0.646 0.000\nvt  0.633 0.614 0.000\nvt  0.647 0.601 0.000\nvt  0.604 0.718 0.000\nvt  0.574 0.725 0.000\nvt  0.567 0.686 0.000\nvt  0.596 0.682 0.000\nvt  0.562 0.648 0.000\nvt  0.590 0.649 0.000\nvt  0.618 0.756 0.000\nvt  0.584 0.769 0.000\nvt  0.586 0.587 0.000\nvt  0.566 0.586 0.000\nvt  0.568 0.579 0.000\nvt  0.586 0.580 0.000\nvt  0.569 0.574 0.000\nvt  0.586 0.573 0.000\nvt  0.562 0.627 0.000\nvt  0.587 0.627 0.000\nvt  0.587 0.610 0.000\nvt  0.563 0.608 0.000\nvt  0.565 0.595 0.000\nvt  0.587 0.596 0.000\nvt  0.521 0.441 0.000\nvt  0.526 0.450 0.000\nvt  0.520 0.450 0.000\nvt  0.517 0.445 0.000\nvt  0.720 0.504 0.000\nvt  0.709 0.467 0.000\nvt  0.727 0.446 0.000\nvt  0.738 0.494 0.000\nvt  0.656 0.383 0.000\nvt  0.660 0.348 0.000\nvt  0.684 0.368 0.000\nvt  0.673 0.403 0.000\nvt  0.572 0.371 0.000\nvt  0.573 0.365 0.000\nvt  0.581 0.364 0.000\nvt  0.581 0.374 0.000\nvt  0.708 0.400 0.000\nvt  0.693 0.431 0.000\nvt  0.604 0.401 0.000\nvt  0.609 0.383 0.000\nvt  0.557 0.364 0.000\nvt  0.559 0.365 0.000\nvt  0.557 0.366 0.000\nvt  0.556 0.364 0.000\nvt  0.552 0.367 0.000\nvt  0.552 0.364 0.000\nvt  0.568 0.377 0.000\nvt  0.561 0.374 0.000\nvt  0.566 0.370 0.000\nvt  0.594 0.377 0.000\nvt  0.594 0.363 0.000\nvt  0.653 0.551 0.000\nvt  0.644 0.534 0.000\nvt  0.658 0.523 0.000\nvt  0.666 0.545 0.000\nvt  0.637 0.480 0.000\nvt  0.625 0.458 0.000\nvt  0.649 0.459 0.000\nvt  0.662 0.434 0.000\nvt  0.557 0.345 0.000\nvt  0.553 0.353 0.000\nvt  0.543 0.349 0.000\nvt  0.546 0.337 0.000\nvt  0.586 0.403 0.000\nvt  0.573 0.392 0.000\nvt  0.579 0.382 0.000\nvt  0.591 0.389 0.000\nvt  0.572 0.343 0.000\nvt  0.584 0.331 0.000\nvt  0.590 0.347 0.000\nvt  0.578 0.353 0.000\nvt  0.553 0.358 0.000\nvt  0.543 0.355 0.000\nvt  0.553 0.499 0.000\nvt  0.541 0.507 0.000\nvt  0.542 0.484 0.000\nvt  0.553 0.477 0.000\nvt  0.539 0.532 0.000\nvt  0.529 0.541 0.000\nvt  0.531 0.513 0.000\nvt  0.551 0.538 0.000\nvt  0.538 0.552 0.000\nvt  0.552 0.521 0.000\nvt  0.908 0.437 0.000\nvt  0.876 0.429 0.000\nvt  0.608 0.340 0.000\nvt  0.599 0.314 0.000\nvt  0.629 0.336 0.000\nvt  0.691 0.326 0.000\nvt  0.723 0.365 0.000\nvt  0.748 0.426 0.000\nvt  0.755 0.489 0.000\nvt  0.564 0.825 0.000\nvt  0.590 0.868 0.000\nvt  0.558 0.886 0.000\nvt  0.533 0.834 0.000\nvt  0.637 0.789 0.000\nvt  0.673 0.755 0.000\nvt  0.702 0.774 0.000\nvt  0.665 0.817 0.000\nvt  0.740 0.787 0.000\nvt  0.545 0.727 0.000\nvt  0.540 0.686 0.000\nvt  0.551 0.550 0.000\nvt  0.538 0.572 0.000\nvt  0.520 0.546 0.000\nvt  0.522 0.517 0.000\nvt  0.552 0.775 0.000\nvt  0.524 0.777 0.000\nvt  0.521 0.728 0.000\nvt  0.500 0.687 0.000\nvt  0.500 0.651 0.000\nvt  0.515 0.650 0.000\nvt  0.518 0.687 0.000\nvt  0.500 0.727 0.000\nvt  0.625 0.671 0.000\nvt  0.618 0.644 0.000\nvt  0.591 0.533 0.000\nvt  0.571 0.539 0.000\nvt  0.569 0.527 0.000\nvt  0.589 0.518 0.000\nvt  0.545 0.436 0.000\nvt  0.525 0.427 0.000\nvt  0.528 0.413 0.000\nvt  0.549 0.425 0.000\nvt  0.556 0.449 0.000\nvt  0.563 0.439 0.000\nvt  0.514 0.395 0.000\nvt  0.532 0.396 0.000\nvt  0.513 0.409 0.000\nvt  0.566 0.511 0.000\nvt  0.564 0.490 0.000\nvt  0.577 0.478 0.000\nvt  0.584 0.500 0.000\nvt  0.500 0.408 0.000\nvt  0.500 0.394 0.000\nvt  0.571 0.457 0.000\nvt  0.561 0.468 0.000\nvt  0.554 0.561 0.000\nvt  0.557 0.563 0.000\nvt  0.552 0.569 0.000\nvt  0.548 0.569 0.000\nvt  0.627 0.847 0.000\nvt  0.674 0.871 0.000\nvt  0.645 0.898 0.000\nvt  0.776 0.920 0.000\nvt  0.709 0.921 0.000\nvt  0.729 0.888 0.000\nvt  0.783 0.887 0.000\nvt  0.693 0.947 0.000\nvt  0.621 0.920 0.000\nvt  0.535 0.642 0.000\nvt  0.542 0.618 0.000\nvt  0.545 0.599 0.000\nvt  0.559 0.383 0.000\nvt  0.552 0.377 0.000\nvt  0.531 0.470 0.000\nvt  0.520 0.472 0.000\nvt  0.517 0.456 0.000\nvt  0.528 0.457 0.000\nvt  0.530 0.438 0.000\nvt  0.517 0.436 0.000\nvt  0.528 0.383 0.000\nvt  0.513 0.384 0.000\nvt  0.512 0.374 0.000\nvt  0.526 0.374 0.000\nvt  0.512 0.367 0.000\nvt  0.526 0.366 0.000\nvt  0.512 0.362 0.000\nvt  0.526 0.362 0.000\nvt  0.511 0.422 0.000\nvt  0.500 0.384 0.000\nvt  0.500 0.375 0.000\nvt  0.500 0.362 0.000\nvt  0.500 0.367 0.000\nvt  0.511 0.472 0.000\nvt  0.508 0.457 0.000\nvt  0.521 0.491 0.000\nvt  0.512 0.519 0.000\nvt  0.512 0.491 0.000\nvt  0.511 0.550 0.000\nvt  0.520 0.576 0.000\nvt  0.510 0.583 0.000\nvt  0.500 0.457 0.000\nvt  0.500 0.472 0.000\nvt  0.500 0.491 0.000\nvt  0.654 0.584 0.000\nvt  0.656 0.568 0.000\nvt  0.669 0.567 0.000\nvt  0.666 0.589 0.000\nvt  0.705 0.639 0.000\nvt  0.718 0.591 0.000\nvt  0.684 0.563 0.000\nvt  0.680 0.592 0.000\nvt  0.637 0.575 0.000\nvt  0.636 0.566 0.000\nvt  0.645 0.567 0.000\nvt  0.645 0.579 0.000\nvt  0.723 0.546 0.000\nvt  0.697 0.592 0.000\nvt  0.702 0.554 0.000\nvt  0.500 0.163 0.000\nvt  0.500 0.137 0.000\nvt  0.579 0.298 0.000\nvt  0.570 0.317 0.000\nvt  0.554 0.307 0.000\nvt  0.560 0.287 0.000\nvt  0.534 0.318 0.000\nvt  0.517 0.314 0.000\nvt  0.519 0.296 0.000\nvt  0.538 0.300 0.000\nvt  0.562 0.362 0.000\nvt  0.559 0.363 0.000\nvt  0.557 0.362 0.000\nvt  0.559 0.360 0.000\nvt  0.563 0.365 0.000\nvt  0.561 0.368 0.000\nvt  0.543 0.360 0.000\nvt  0.531 0.358 0.000\nvt  0.531 0.351 0.000\nvt  0.611 0.437 0.000\nvt  0.613 0.475 0.000\nvt  0.624 0.497 0.000\nvt  0.580 0.445 0.000\nvt  0.590 0.466 0.000\nvt  0.598 0.418 0.000\nvt  0.648 0.501 0.000\nvt  0.633 0.516 0.000\nvt  0.641 0.554 0.000\nvt  0.630 0.541 0.000\nvt  0.733 0.331 0.000\nvt  0.696 0.288 0.000\nvt  0.706 0.252 0.000\nvt  0.751 0.313 0.000\nvt  0.683 0.535 0.000\nvt  0.674 0.508 0.000\nvt  0.999 0.696 0.000\nvt  0.986 0.778 0.000\nvt  0.950 0.772 0.000\nvt  0.967 0.695 0.000\nvt  0.600 0.811 0.000\nvt  0.552 0.361 0.000\nvt  0.547 0.367 0.000\nvt  0.546 0.364 0.000\nvt  0.525 0.254 0.000\nvt  0.546 0.261 0.000\nvt  0.542 0.280 0.000\nvt  0.522 0.274 0.000\nvt  0.631 0.369 0.000\nvt  0.678 0.460 0.000\nvt  0.662 0.482 0.000\nvt  0.770 0.948 0.000\nvt  0.762 0.981 0.000\nvt  0.676 0.977 0.000\nvt  0.845 0.915 0.000\nvt  0.835 0.891 0.000\nvt  0.569 0.560 0.000\nvt  0.582 0.558 0.000\nvt  0.580 0.563 0.000\nvt  0.569 0.564 0.000\nvt  0.590 0.544 0.000\nvt  0.571 0.548 0.000\nvt  0.635 0.701 0.000\nvt  0.651 0.731 0.000\nvt  0.607 0.593 0.000\nvt  0.609 0.606 0.000\nvt  0.543 0.570 0.000\nvt  0.553 0.556 0.000\nvt  0.552 0.580 0.000\nvt  0.556 0.574 0.000\nvt  0.569 0.554 0.000\nvt  0.585 0.551 0.000\nvt  0.559 0.566 0.000\nvt  0.550 0.458 0.000\nvt  0.532 0.330 0.000\nvt  0.549 0.325 0.000\nvt  0.610 0.364 0.000\nvt  0.589 0.432 0.000\nvt  0.578 0.417 0.000\nvt  0.570 0.357 0.000\nvt  0.565 0.360 0.000\nvt  0.562 0.356 0.000\nvt  0.565 0.351 0.000\nvt  0.557 0.364 0.000\nvt  0.556 0.364 0.000\nvt  0.548 0.371 0.000\nvt  0.557 0.371 0.000\nvt  0.762 0.385 0.000\nvt  0.513 0.445 0.000\nvt  0.508 0.444 0.000\nvt  0.500 0.520 0.000\nvt  0.939 0.378 0.000\nvt  0.932 0.316 0.000\nvt  0.972 0.321 0.000\nvt  0.974 0.384 0.000\nvt  0.605 0.572 0.000\nvt  0.605 0.578 0.000\nvt  0.605 0.584 0.000\nvt  0.559 0.571 0.000\nvt  0.562 0.333 0.000\nvt  0.500 0.552 0.000\nvt  0.500 0.585 0.000\nvt  0.531 0.343 0.000\nvt  0.514 0.338 0.000\nvt  0.516 0.324 0.000\nvt  0.532 0.488 0.000\nvt  0.534 0.448 0.000\nvt  0.540 0.446 0.000\nvt  0.545 0.448 0.000\nvt  0.538 0.455 0.000\nvt  0.541 0.466 0.000\nvt  0.612 0.623 0.000\nvt  0.567 0.366 0.000\nvt  0.513 0.356 0.000\nvt  0.500 0.355 0.000\nvt  0.500 0.346 0.000\nvt  0.514 0.348 0.000\nvt  0.543 0.363 0.000\nvt  0.552 0.364 0.000\nvt  0.531 0.362 0.000\nvt  0.512 0.361 0.000\nvt  0.509 0.433 0.000\nvt  0.500 0.444 0.000\nvt  0.500 0.432 0.000\nvt  0.603 0.551 0.000\nvt  0.599 0.557 0.000\nvt  0.627 0.570 0.000\nvt  0.631 0.571 0.000\nvt  0.625 0.566 0.000\nvt  0.622 0.569 0.000\nvt  0.621 0.567 0.000\nvt  0.529 0.234 0.000\nvt  0.500 0.249 0.000\nvt  0.500 0.227 0.000\nvt  0.550 0.245 0.000\nvt  0.857 0.816 0.000\nvt  0.825 0.804 0.000\nvt  0.851 0.737 0.000\nvt  0.886 0.748 0.000\nvt  0.821 0.866 0.000\nvt  0.798 0.856 0.000\nvt  0.783 0.797 0.000\nvt  0.810 0.729 0.000\nvt  0.755 0.848 0.000\nvt  0.534 0.215 0.000\nvt  0.563 0.233 0.000\nvt  0.548 0.588 0.000\nvt  0.884 0.835 0.000\nvt  0.908 0.854 0.000\nvt  0.919 0.761 0.000\nvt  0.947 0.512 0.000\nvt  0.944 0.446 0.000\nvt  0.974 0.452 0.000\nvt  0.974 0.519 0.000\nvt  0.915 0.504 0.000\nvt  0.887 0.498 0.000\nvt  0.917 0.564 0.000\nvt  0.890 0.556 0.000\nvt  0.999 0.634 0.000\nvt  0.973 0.633 0.000\nvt  0.975 0.577 0.000\nvt  0.999 0.579 0.000\nvt  0.882 0.614 0.000\nvt  0.911 0.622 0.000\nvt  0.901 0.679 0.000\nvt  0.868 0.671 0.000\nvt  0.833 0.667 0.000\nvt  0.708 0.836 0.000\nvt  0.500 0.205 0.000\nvt  0.826 0.364 0.000\nvt  0.801 0.303 0.000\nvt  0.613 0.529 0.000\nvt  0.607 0.544 0.000\nvt  0.541 0.380 0.000\nvt  0.538 0.372 0.000\nvt  0.537 0.366 0.000\nvt  0.537 0.363 0.000\nvt  0.598 0.945 0.000\nvt  0.524 0.902 0.000\nvt  0.599 0.489 0.000\nvt  0.609 0.563 0.000\nvt  0.596 0.563 0.000\nvt  0.612 0.559 0.000\nvt  0.557 0.569 0.000\nvt  0.620 0.571 0.000\nvt  0.616 0.569 0.000\nvt  0.618 0.569 0.000\nvt  0.569 0.568 0.000\nvt  0.561 0.568 0.000\nvt  0.579 0.567 0.000\nvt  0.616 0.564 0.000\nvt  0.613 0.567 0.000\nvt  0.607 0.567 0.000\nvt  0.587 0.568 0.000\nvt  0.606 0.568 0.000\nvt  0.630 0.565 0.000\nvt  0.548 0.389 0.000\nvt  0.601 0.452 0.000\nvt  0.529 0.566 0.000\nvt  0.684 0.686 0.000\nvt  0.872 0.222 0.000\nvt  0.876 0.265 0.000\nvt  0.825 0.258 0.000\nvt  0.821 0.214 0.000\nvt  0.561 0.119 0.000\nvt  0.500 0.114 0.000\nvt  0.771 0.304 0.000\nvt  0.797 0.363 0.000\nvt  0.726 0.227 0.000\nvt  0.777 0.371 0.000\nvt  0.947 0.571 0.000\nvt  0.999 0.388 0.000\nvt  0.999 0.456 0.000\nvt  0.999 0.524 0.000\nvt  0.936 0.877 0.000\nvt  0.856 0.945 0.000\nvt  0.999 0.323 0.000\nvt  0.935 0.689 0.000\nvt  0.776 0.240 0.000\nvt  0.928 0.265 0.000\nvt  0.969 0.264 0.000\nvt  0.999 0.267 0.000\nvt  0.943 0.628 0.000\nvt  0.806 0.622 0.000\nvt  0.851 0.611 0.000\nvt  0.500 0.777 0.000\nvt  0.500 0.839 0.000\nvt  0.692 0.489 0.000\nvt  0.631 0.558 0.000\nvt  0.622 0.562 0.000\nvt  0.626 0.560 0.000\nvt  0.555 0.413 0.000\nvt  0.570 0.429 0.000\nvt  0.539 0.440 0.000\nvt  0.524 0.607 0.000\nvt  0.531 0.591 0.000\nvt  0.500 0.361 0.000\nvt  0.500 0.321 0.000\nvt  0.500 0.312 0.000\nvt  0.500 0.336 0.000\nvt  0.500 0.294 0.000\nvt  0.500 0.273 0.000\nvt  0.622 0.549 0.000\nvt  0.616 0.554 0.000\nvt  0.607 0.509 0.000\nvt  0.701 0.520 0.000\nvt  0.500 0.421 0.000\nvt  0.564 0.403 0.000\nvt  0.511 0.615 0.000\nvt  0.500 0.618 0.000\nvt  0.617 0.568 0.000\nvt  0.636 0.139 0.000\nvt  0.764 0.192 0.000\nvt  0.921 0.220 0.000\nvt  0.967 0.219 0.000\nvt  0.708 0.168 0.000\nvt  0.999 0.218 0.000\nvt  0.803 0.523 0.000\nvt  0.794 0.535 0.000\nvt  0.783 0.527 0.000\nvt  0.791 0.508 0.000\nvt  0.789 0.571 0.000\nvt  0.797 0.562 0.000\nvt  0.813 0.591 0.000\nvt  0.815 0.578 0.000\nvt  0.839 0.583 0.000\nvt  0.835 0.574 0.000\nvt  0.850 0.569 0.000\nvt  0.845 0.560 0.000\nvt  0.855 0.539 0.000\nvt  0.847 0.535 0.000\nvt  0.850 0.501 0.000\nvt  0.841 0.502 0.000\nvt  0.814 0.438 0.000\nvt  0.836 0.464 0.000\nvt  0.828 0.472 0.000\nvt  0.809 0.452 0.000\nvt  0.792 0.427 0.000\nvt  0.790 0.441 0.000\nvt  0.818 0.567 0.000\nvt  0.807 0.550 0.000\nvt  0.831 0.561 0.000\nvt  0.839 0.553 0.000\nvt  0.837 0.534 0.000\nvt  0.831 0.505 0.000\nvt  0.820 0.479 0.000\nvt  0.804 0.465 0.000\nvt  0.786 0.460 0.000\nvt  0.773 0.456 0.000\nvt  0.779 0.433 0.000\nvt  0.797 0.489 0.000\nvt  0.785 0.495 0.000\nvt  0.789 0.486 0.000\nvt  0.772 0.537 0.000\nvt  0.781 0.583 0.000\nvt  0.812 0.602 0.000\nvt  0.848 0.587 0.000\nvt  0.862 0.546 0.000\nvt  0.859 0.500 0.000\nvt  0.820 0.412 0.000\nvt  0.843 0.450 0.000\nvt  0.791 0.404 0.000\nvt  0.773 0.417 0.000\nvt  0.764 0.447 0.000\nvt  0.801 0.477 0.000\nvt  0.813 0.487 0.000\nvt  0.806 0.496 0.000\nvt  0.787 0.478 0.000\nvt  0.778 0.489 0.000\nvt  0.822 0.538 0.000\nvt  0.822 0.510 0.000\nvt  0.767 0.492 0.000\nvt  0.870 0.496 0.000\nvt  0.851 0.425 0.000\nvt  0.872 0.552 0.000\nvt  0.500 0.183 0.000\nvt  0.516 0.930 0.000\nvt  0.500 0.928 0.000\nvt  0.528 0.934 0.000\nvt  0.537 0.938 0.000\nvt  0.516 0.970 0.000\nvt  0.520 0.955 0.000\nvt  0.530 0.952 0.000\nvt  0.522 0.944 0.000\nvt  0.512 0.942 0.000\nvt  0.615 0.572 0.000\nvt  0.612 0.569 0.000\nvt  0.576 0.968 0.000\nvt  0.573 0.973 0.000\nvt  0.562 0.969 0.000\nvt  0.563 0.961 0.000\nvt  0.571 0.956 0.000\nvt  0.582 0.961 0.000\nvt  0.611 0.961 0.000\nvt  0.606 0.967 0.000\nvt  0.595 0.960 0.000\nvt  0.601 0.955 0.000\nvt  0.570 0.569 0.000\nvt  0.595 0.566 0.000\nvt  0.616 0.967 0.000\nvt  0.617 0.975 0.000\nvt  0.607 0.978 0.000\nvt  0.614 0.982 0.000\nvt  0.605 0.991 0.000\nvt  0.599 0.986 0.000\nvt  0.593 0.996 0.000\nvt  0.589 0.989 0.000\nvt  0.562 0.570 0.000\nvt  0.573 0.994 0.000\nvt  0.579 0.987 0.000\nvt  0.584 0.996 0.000\nvt  0.581 0.953 0.000\nvt  0.592 0.953 0.000\nvt  0.561 0.988 0.000\nvt  0.572 0.981 0.000\nvt  0.563 0.978 0.000\nvt  0.500 0.970 0.000\nvt  0.500 0.943 0.000\nvt  0.511 0.956 0.000\nvt  0.500 0.956 0.000\nvt  0.868 0.132 0.000\nvt  0.867 0.090 0.000\nvt  0.916 0.092 0.000\nvt  0.918 0.133 0.000\nvt  0.554 0.066 0.000\nvt  0.612 0.070 0.000\nvt  0.619 0.103 0.000\nvt  0.558 0.095 0.000\nvt  0.815 0.169 0.000\nvt  0.758 0.148 0.000\nvt  0.747 0.102 0.000\nvt  0.814 0.126 0.000\nvt  0.770 0.072 0.000\nvt  0.817 0.087 0.000\nvt  0.552 0.038 0.000\nvt  0.551 0.020 0.000\nvt  0.602 0.021 0.000\nvt  0.605 0.039 0.000\nvt  0.821 0.050 0.000\nvt  0.867 0.055 0.000\nvt  0.712 0.053 0.000\nvt  0.700 0.022 0.000\nvt  0.739 0.023 0.000\nvt  0.740 0.052 0.000\nvt  0.652 0.022 0.000\nvt  0.659 0.043 0.000\nvt  0.913 0.055 0.000\nvt  0.959 0.055 0.000\nvt  0.960 0.091 0.000\nvt  0.999 0.089 0.000\nvt  0.999 0.131 0.000\nvt  0.962 0.133 0.000\nvt  0.999 0.053 0.000\nvt  0.778 0.038 0.000\nvt  0.917 0.177 0.000\nvt  0.965 0.178 0.000\nvt  0.674 0.083 0.000\nvt  0.685 0.124 0.000\nvt  0.999 0.175 0.000\nvt  0.500 0.037 0.000\nvt  0.500 0.066 0.000\nvt  0.871 0.175 0.000\nvt  0.500 0.019 0.000\nvt  0.500 0.092 0.000\nvt  0.999 0.002 0.000\nvt  0.958 0.002 0.000\nvt  0.867 0.002 0.000\nvt  0.823 0.002 0.000\nvt  0.908 0.002 0.000\nvt  0.601 0.002 0.000\nvt  0.550 0.002 0.000\nvt  0.697 0.002 0.000\nvt  0.650 0.002 0.000\nvt  0.782 0.002 0.000\nvt  0.740 0.002 0.000\nvt  0.500 0.002 0.000\nvt  0.468 0.923 0.000\nvt  0.459 0.929 0.000\nvt  0.458 0.923 0.000\nvt  0.465 0.917 0.000\nvt  0.479 0.984 0.000\nvt  0.495 0.998 0.000\nvt  0.479 0.996 0.000\nvt  0.496 0.917 0.000\nvt  0.485 0.918 0.000\nvt  0.484 0.910 0.000\nvt  0.493 0.910 0.000\nvt  0.477 0.921 0.000\nvt  0.475 0.913 0.000\nvt  0.451 0.958 0.000\nvt  0.450 0.946 0.000\nvt  0.456 0.942 0.000\nvt  0.462 0.954 0.000\nvt  0.455 0.935 0.000\nvt  0.450 0.932 0.000\nvt  0.467 0.967 0.000\nvt  0.453 0.974 0.000\nvt  0.467 0.994 0.000\nvt  0.458 0.987 0.000\nvt  0.384 0.254 0.000\nvt  0.381 0.292 0.000\nvt  0.342 0.307 0.000\nvt  0.347 0.261 0.000\nvt  0.364 0.438 0.000\nvt  0.353 0.414 0.000\nvt  0.373 0.396 0.000\nvt  0.380 0.419 0.000\nvt  0.114 0.312 0.000\nvt  0.156 0.308 0.000\nvt  0.140 0.369 0.000\nvt  0.103 0.370 0.000\nvt  0.260 0.593 0.000\nvt  0.232 0.598 0.000\nvt  0.241 0.541 0.000\nvt  0.259 0.542 0.000\nvt  0.356 0.213 0.000\nvt  0.356 0.174 0.000\nvt  0.434 0.146 0.000\nvt  0.439 0.175 0.000\nvt  0.420 0.254 0.000\nvt  0.435 0.256 0.000\nvt  0.435 0.268 0.000\nvt  0.415 0.277 0.000\nvt  0.456 0.195 0.000\nvt  0.410 0.217 0.000\nvt  0.229 0.721 0.000\nvt  0.206 0.663 0.000\nvt  0.242 0.653 0.000\nvt  0.264 0.712 0.000\nvt  0.331 0.622 0.000\nvt  0.348 0.651 0.000\nvt  0.335 0.669 0.000\nvt  0.315 0.632 0.000\nvt  0.377 0.588 0.000\nvt  0.373 0.599 0.000\nvt  0.361 0.590 0.000\nvt  0.368 0.582 0.000\nvt  0.359 0.632 0.000\nvt  0.343 0.612 0.000\nvt  0.381 0.580 0.000\nvt  0.373 0.576 0.000\nvt  0.377 0.573 0.000\nvt  0.383 0.575 0.000\nvt  0.292 0.702 0.000\nvt  0.271 0.646 0.000\nvt  0.353 0.601 0.000\nvt  0.367 0.614 0.000\nvt  0.396 0.718 0.000\nvt  0.404 0.682 0.000\nvt  0.433 0.686 0.000\nvt  0.426 0.725 0.000\nvt  0.410 0.649 0.000\nvt  0.438 0.648 0.000\nvt  0.416 0.769 0.000\nvt  0.382 0.756 0.000\nvt  0.414 0.587 0.000\nvt  0.414 0.580 0.000\nvt  0.432 0.579 0.000\nvt  0.434 0.586 0.000\nvt  0.431 0.574 0.000\nvt  0.414 0.573 0.000\nvt  0.413 0.627 0.000\nvt  0.438 0.627 0.000\nvt  0.413 0.610 0.000\nvt  0.413 0.596 0.000\nvt  0.435 0.595 0.000\nvt  0.437 0.608 0.000\nvt  0.479 0.441 0.000\nvt  0.483 0.445 0.000\nvt  0.480 0.450 0.000\nvt  0.474 0.450 0.000\nvt  0.280 0.504 0.000\nvt  0.262 0.494 0.000\nvt  0.273 0.446 0.000\nvt  0.291 0.467 0.000\nvt  0.344 0.383 0.000\nvt  0.327 0.403 0.000\nvt  0.316 0.368 0.000\nvt  0.340 0.348 0.000\nvt  0.428 0.371 0.000\nvt  0.419 0.374 0.000\nvt  0.419 0.364 0.000\nvt  0.427 0.365 0.000\nvt  0.307 0.431 0.000\nvt  0.292 0.400 0.000\nvt  0.391 0.383 0.000\nvt  0.396 0.401 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.366 0.000\nvt  0.441 0.365 0.000\nvt  0.448 0.367 0.000\nvt  0.448 0.364 0.000\nvt  0.432 0.377 0.000\nvt  0.434 0.370 0.000\nvt  0.439 0.374 0.000\nvt  0.406 0.377 0.000\nvt  0.406 0.363 0.000\nvt  0.347 0.551 0.000\nvt  0.334 0.545 0.000\nvt  0.342 0.523 0.000\nvt  0.356 0.534 0.000\nvt  0.363 0.480 0.000\nvt  0.351 0.459 0.000\nvt  0.375 0.458 0.000\nvt  0.338 0.434 0.000\nvt  0.443 0.345 0.000\nvt  0.454 0.337 0.000\nvt  0.457 0.349 0.000\nvt  0.447 0.353 0.000\nvt  0.414 0.403 0.000\nvt  0.409 0.389 0.000\nvt  0.421 0.382 0.000\nvt  0.427 0.392 0.000\nvt  0.428 0.343 0.000\nvt  0.422 0.353 0.000\nvt  0.410 0.347 0.000\nvt  0.416 0.331 0.000\nvt  0.457 0.355 0.000\nvt  0.447 0.358 0.000\nvt  0.447 0.499 0.000\nvt  0.447 0.477 0.000\nvt  0.458 0.484 0.000\nvt  0.459 0.507 0.000\nvt  0.461 0.532 0.000\nvt  0.469 0.513 0.000\nvt  0.471 0.541 0.000\nvt  0.449 0.538 0.000\nvt  0.448 0.521 0.000\nvt  0.462 0.552 0.000\nvt  0.124 0.429 0.000\nvt  0.092 0.437 0.000\nvt  0.392 0.340 0.000\nvt  0.371 0.336 0.000\nvt  0.401 0.314 0.000\nvt  0.309 0.326 0.000\nvt  0.252 0.426 0.000\nvt  0.277 0.365 0.000\nvt  0.245 0.489 0.000\nvt  0.436 0.825 0.000\nvt  0.467 0.834 0.000\nvt  0.442 0.886 0.000\nvt  0.410 0.868 0.000\nvt  0.363 0.789 0.000\nvt  0.335 0.817 0.000\nvt  0.298 0.774 0.000\nvt  0.327 0.755 0.000\nvt  0.260 0.787 0.000\nvt  0.460 0.686 0.000\nvt  0.455 0.727 0.000\nvt  0.462 0.572 0.000\nvt  0.449 0.550 0.000\nvt  0.480 0.546 0.000\nvt  0.478 0.517 0.000\nvt  0.479 0.728 0.000\nvt  0.476 0.777 0.000\nvt  0.448 0.775 0.000\nvt  0.482 0.687 0.000\nvt  0.485 0.650 0.000\nvt  0.375 0.671 0.000\nvt  0.382 0.644 0.000\nvt  0.409 0.533 0.000\nvt  0.411 0.518 0.000\nvt  0.431 0.527 0.000\nvt  0.429 0.539 0.000\nvt  0.455 0.436 0.000\nvt  0.451 0.425 0.000\nvt  0.472 0.413 0.000\nvt  0.475 0.427 0.000\nvt  0.444 0.449 0.000\nvt  0.437 0.439 0.000\nvt  0.486 0.395 0.000\nvt  0.487 0.409 0.000\nvt  0.468 0.396 0.000\nvt  0.434 0.511 0.000\nvt  0.416 0.500 0.000\nvt  0.423 0.478 0.000\nvt  0.436 0.490 0.000\nvt  0.429 0.457 0.000\nvt  0.439 0.468 0.000\nvt  0.446 0.561 0.000\nvt  0.452 0.569 0.000\nvt  0.448 0.569 0.000\nvt  0.443 0.563 0.000\nvt  0.373 0.847 0.000\nvt  0.355 0.898 0.000\nvt  0.326 0.871 0.000\nvt  0.224 0.920 0.000\nvt  0.217 0.887 0.000\nvt  0.271 0.888 0.000\nvt  0.291 0.921 0.000\nvt  0.379 0.920 0.000\nvt  0.307 0.947 0.000\nvt  0.465 0.642 0.000\nvt  0.455 0.599 0.000\nvt  0.458 0.618 0.000\nvt  0.448 0.377 0.000\nvt  0.441 0.383 0.000\nvt  0.469 0.470 0.000\nvt  0.472 0.457 0.000\nvt  0.483 0.456 0.000\nvt  0.480 0.472 0.000\nvt  0.470 0.438 0.000\nvt  0.483 0.436 0.000\nvt  0.472 0.383 0.000\nvt  0.474 0.374 0.000\nvt  0.488 0.374 0.000\nvt  0.487 0.384 0.000\nvt  0.474 0.366 0.000\nvt  0.488 0.367 0.000\nvt  0.474 0.362 0.000\nvt  0.488 0.362 0.000\nvt  0.489 0.422 0.000\nvt  0.492 0.457 0.000\nvt  0.489 0.472 0.000\nvt  0.479 0.491 0.000\nvt  0.488 0.491 0.000\nvt  0.488 0.519 0.000\nvt  0.489 0.550 0.000\nvt  0.490 0.583 0.000\nvt  0.480 0.576 0.000\nvt  0.346 0.584 0.000\nvt  0.334 0.589 0.000\nvt  0.331 0.567 0.000\nvt  0.344 0.568 0.000\nvt  0.295 0.639 0.000\nvt  0.282 0.591 0.000\nvt  0.320 0.592 0.000\nvt  0.316 0.563 0.000\nvt  0.363 0.575 0.000\nvt  0.355 0.579 0.000\nvt  0.355 0.567 0.000\nvt  0.364 0.566 0.000\nvt  0.277 0.546 0.000\nvt  0.298 0.554 0.000\nvt  0.303 0.592 0.000\nvt  0.421 0.298 0.000\nvt  0.440 0.287 0.000\nvt  0.446 0.307 0.000\nvt  0.430 0.317 0.000\nvt  0.466 0.318 0.000\nvt  0.462 0.300 0.000\nvt  0.481 0.296 0.000\nvt  0.483 0.314 0.000\nvt  0.438 0.362 0.000\nvt  0.441 0.360 0.000\nvt  0.443 0.362 0.000\nvt  0.441 0.363 0.000\nvt  0.439 0.368 0.000\nvt  0.437 0.365 0.000\nvt  0.469 0.351 0.000\nvt  0.469 0.358 0.000\nvt  0.457 0.360 0.000\nvt  0.389 0.437 0.000\nvt  0.387 0.475 0.000\nvt  0.376 0.497 0.000\nvt  0.420 0.445 0.000\nvt  0.410 0.466 0.000\nvt  0.402 0.418 0.000\nvt  0.352 0.501 0.000\nvt  0.367 0.516 0.000\nvt  0.359 0.554 0.000\nvt  0.370 0.541 0.000\nvt  0.267 0.331 0.000\nvt  0.249 0.313 0.000\nvt  0.294 0.252 0.000\nvt  0.304 0.288 0.000\nvt  0.317 0.535 0.000\nvt  0.326 0.508 0.000\nvt  0.001 0.696 0.000\nvt  0.033 0.695 0.000\nvt  0.050 0.772 0.000\nvt  0.014 0.778 0.000\nvt  0.400 0.811 0.000\nvt  0.448 0.361 0.000\nvt  0.454 0.364 0.000\nvt  0.453 0.367 0.000\nvt  0.475 0.254 0.000\nvt  0.478 0.274 0.000\nvt  0.458 0.280 0.000\nvt  0.454 0.261 0.000\nvt  0.369 0.369 0.000\nvt  0.322 0.460 0.000\nvt  0.338 0.482 0.000\nvt  0.324 0.977 0.000\nvt  0.238 0.981 0.000\nvt  0.230 0.948 0.000\nvt  0.155 0.915 0.000\nvt  0.165 0.891 0.000\nvt  0.431 0.560 0.000\nvt  0.431 0.564 0.000\nvt  0.420 0.563 0.000\nvt  0.418 0.558 0.000\nvt  0.410 0.544 0.000\nvt  0.429 0.548 0.000\nvt  0.349 0.731 0.000\nvt  0.365 0.701 0.000\nvt  0.391 0.606 0.000\nvt  0.393 0.593 0.000\nvt  0.457 0.570 0.000\nvt  0.447 0.556 0.000\nvt  0.444 0.574 0.000\nvt  0.448 0.580 0.000\nvt  0.415 0.551 0.000\nvt  0.431 0.554 0.000\nvt  0.441 0.566 0.000\nvt  0.450 0.458 0.000\nvt  0.451 0.325 0.000\nvt  0.468 0.330 0.000\nvt  0.390 0.364 0.000\nvt  0.411 0.432 0.000\nvt  0.422 0.417 0.000\nvt  0.430 0.357 0.000\nvt  0.435 0.351 0.000\nvt  0.438 0.356 0.000\nvt  0.435 0.360 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.371 0.000\nvt  0.452 0.371 0.000\nvt  0.238 0.385 0.000\nvt  0.487 0.445 0.000\nvt  0.492 0.444 0.000\nvt  0.061 0.378 0.000\nvt  0.026 0.384 0.000\nvt  0.028 0.321 0.000\nvt  0.068 0.316 0.000\nvt  0.395 0.572 0.000\nvt  0.395 0.578 0.000\nvt  0.395 0.584 0.000\nvt  0.441 0.571 0.000\nvt  0.438 0.333 0.000\nvt  0.469 0.343 0.000\nvt  0.486 0.338 0.000\nvt  0.484 0.324 0.000\nvt  0.468 0.488 0.000\nvt  0.466 0.448 0.000\nvt  0.462 0.455 0.000\nvt  0.455 0.448 0.000\nvt  0.460 0.446 0.000\nvt  0.459 0.466 0.000\nvt  0.388 0.623 0.000\nvt  0.433 0.366 0.000\nvt  0.487 0.356 0.000\nvt  0.486 0.348 0.000\nvt  0.457 0.363 0.000\nvt  0.448 0.364 0.000\nvt  0.469 0.362 0.000\nvt  0.488 0.361 0.000\nvt  0.491 0.433 0.000\nvt  0.401 0.557 0.000\nvt  0.397 0.551 0.000\nvt  0.373 0.570 0.000\nvt  0.369 0.571 0.000\nvt  0.375 0.566 0.000\nvt  0.379 0.567 0.000\nvt  0.378 0.569 0.000\nvt  0.471 0.234 0.000\nvt  0.450 0.245 0.000\nvt  0.143 0.816 0.000\nvt  0.114 0.748 0.000\nvt  0.149 0.737 0.000\nvt  0.175 0.804 0.000\nvt  0.202 0.856 0.000\nvt  0.179 0.866 0.000\nvt  0.190 0.729 0.000\nvt  0.217 0.797 0.000\nvt  0.245 0.848 0.000\nvt  0.466 0.215 0.000\nvt  0.437 0.233 0.000\nvt  0.452 0.588 0.000\nvt  0.092 0.854 0.000\nvt  0.116 0.835 0.000\nvt  0.081 0.761 0.000\nvt  0.053 0.512 0.000\nvt  0.026 0.519 0.000\nvt  0.026 0.452 0.000\nvt  0.056 0.446 0.000\nvt  0.113 0.498 0.000\nvt  0.085 0.504 0.000\nvt  0.110 0.556 0.000\nvt  0.083 0.564 0.000\nvt  0.001 0.634 0.000\nvt  0.001 0.579 0.000\nvt  0.025 0.577 0.000\nvt  0.027 0.633 0.000\nvt  0.118 0.614 0.000\nvt  0.132 0.671 0.000\nvt  0.099 0.679 0.000\nvt  0.089 0.622 0.000\nvt  0.167 0.667 0.000\nvt  0.292 0.836 0.000\nvt  0.199 0.303 0.000\nvt  0.174 0.364 0.000\nvt  0.393 0.544 0.000\nvt  0.387 0.529 0.000\nvt  0.459 0.380 0.000\nvt  0.462 0.372 0.000\nvt  0.463 0.366 0.000\nvt  0.463 0.363 0.000\nvt  0.402 0.945 0.000\nvt  0.476 0.902 0.000\nvt  0.401 0.489 0.000\nvt  0.391 0.563 0.000\nvt  0.388 0.559 0.000\nvt  0.404 0.563 0.000\nvt  0.443 0.569 0.000\nvt  0.380 0.571 0.000\nvt  0.382 0.569 0.000\nvt  0.384 0.569 0.000\nvt  0.439 0.568 0.000\nvt  0.431 0.568 0.000\nvt  0.421 0.567 0.000\nvt  0.393 0.567 0.000\nvt  0.387 0.567 0.000\nvt  0.384 0.564 0.000\nvt  0.394 0.568 0.000\nvt  0.413 0.568 0.000\nvt  0.370 0.565 0.000\nvt  0.452 0.389 0.000\nvt  0.399 0.452 0.000\nvt  0.471 0.566 0.000\nvt  0.316 0.686 0.000\nvt  0.128 0.222 0.000\nvt  0.179 0.214 0.000\nvt  0.175 0.258 0.000\nvt  0.124 0.265 0.000\nvt  0.439 0.119 0.000\nvt  0.229 0.304 0.000\nvt  0.203 0.363 0.000\nvt  0.274 0.227 0.000\nvt  0.223 0.371 0.000\nvt  0.053 0.571 0.000\nvt  0.001 0.388 0.000\nvt  0.001 0.456 0.000\nvt  0.001 0.524 0.000\nvt  0.064 0.877 0.000\nvt  0.144 0.945 0.000\nvt  0.001 0.323 0.000\nvt  0.065 0.689 0.000\nvt  0.224 0.240 0.000\nvt  0.072 0.265 0.000\nvt  0.001 0.267 0.000\nvt  0.031 0.264 0.000\nvt  0.057 0.628 0.000\nvt  0.194 0.622 0.000\nvt  0.149 0.611 0.000\nvt  0.308 0.489 0.000\nvt  0.369 0.558 0.000\nvt  0.374 0.560 0.000\nvt  0.378 0.562 0.000\nvt  0.445 0.413 0.000\nvt  0.430 0.429 0.000\nvt  0.461 0.440 0.000\nvt  0.476 0.607 0.000\nvt  0.469 0.591 0.000\nvt  0.378 0.549 0.000\nvt  0.384 0.554 0.000\nvt  0.393 0.509 0.000\nvt  0.299 0.520 0.000\nvt  0.436 0.403 0.000\nvt  0.489 0.615 0.000\nvt  0.383 0.568 0.000\nvt  0.364 0.139 0.000\nvt  0.236 0.192 0.000\nvt  0.033 0.219 0.000\nvt  0.079 0.220 0.000\nvt  0.292 0.168 0.000\nvt  0.001 0.218 0.000\nvt  0.197 0.523 0.000\nvt  0.209 0.508 0.000\nvt  0.217 0.527 0.000\nvt  0.206 0.535 0.000\nvt  0.211 0.571 0.000\nvt  0.203 0.562 0.000\nvt  0.187 0.591 0.000\nvt  0.185 0.578 0.000\nvt  0.161 0.583 0.000\nvt  0.165 0.574 0.000\nvt  0.150 0.569 0.000\nvt  0.155 0.560 0.000\nvt  0.145 0.539 0.000\nvt  0.153 0.535 0.000\nvt  0.150 0.501 0.000\nvt  0.159 0.502 0.000\nvt  0.186 0.438 0.000\nvt  0.191 0.452 0.000\nvt  0.172 0.472 0.000\nvt  0.164 0.464 0.000\nvt  0.208 0.427 0.000\nvt  0.210 0.441 0.000\nvt  0.182 0.567 0.000\nvt  0.193 0.550 0.000\nvt  0.169 0.561 0.000\nvt  0.161 0.553 0.000\nvt  0.163 0.534 0.000\nvt  0.169 0.505 0.000\nvt  0.196 0.465 0.000\nvt  0.180 0.479 0.000\nvt  0.214 0.460 0.000\nvt  0.227 0.456 0.000\nvt  0.221 0.433 0.000\nvt  0.203 0.489 0.000\nvt  0.211 0.486 0.000\nvt  0.215 0.495 0.000\nvt  0.228 0.537 0.000\nvt  0.219 0.583 0.000\nvt  0.188 0.602 0.000\nvt  0.152 0.587 0.000\nvt  0.138 0.546 0.000\nvt  0.141 0.500 0.000\nvt  0.157 0.450 0.000\nvt  0.180 0.412 0.000\nvt  0.209 0.404 0.000\nvt  0.227 0.417 0.000\nvt  0.236 0.447 0.000\nvt  0.194 0.496 0.000\nvt  0.187 0.487 0.000\nvt  0.199 0.477 0.000\nvt  0.213 0.478 0.000\nvt  0.222 0.489 0.000\nvt  0.178 0.538 0.000\nvt  0.178 0.510 0.000\nvt  0.233 0.492 0.000\nvt  0.130 0.496 0.000\nvt  0.149 0.425 0.000\nvt  0.128 0.552 0.000\nvt  0.484 0.930 0.000\nvt  0.472 0.934 0.000\nvt  0.463 0.938 0.000\nvt  0.470 0.952 0.000\nvt  0.480 0.955 0.000\nvt  0.484 0.970 0.000\nvt  0.488 0.942 0.000\nvt  0.478 0.944 0.000\nvt  0.388 0.569 0.000\nvt  0.385 0.572 0.000\nvt  0.424 0.968 0.000\nvt  0.437 0.961 0.000\nvt  0.438 0.969 0.000\nvt  0.427 0.973 0.000\nvt  0.418 0.961 0.000\nvt  0.429 0.956 0.000\nvt  0.389 0.961 0.000\nvt  0.399 0.955 0.000\nvt  0.405 0.960 0.000\nvt  0.394 0.967 0.000\nvt  0.429 0.569 0.000\nvt  0.405 0.566 0.000\nvt  0.393 0.978 0.000\nvt  0.383 0.975 0.000\nvt  0.384 0.967 0.000\nvt  0.401 0.986 0.000\nvt  0.395 0.991 0.000\nvt  0.386 0.982 0.000\nvt  0.411 0.989 0.000\nvt  0.407 0.996 0.000\nvt  0.438 0.570 0.000\nvt  0.427 0.994 0.000\nvt  0.416 0.996 0.000\nvt  0.421 0.987 0.000\nvt  0.419 0.953 0.000\nvt  0.408 0.953 0.000\nvt  0.439 0.988 0.000\nvt  0.428 0.981 0.000\nvt  0.437 0.978 0.000\nvt  0.489 0.956 0.000\nvt  0.132 0.132 0.000\nvt  0.082 0.133 0.000\nvt  0.084 0.092 0.000\nvt  0.133 0.090 0.000\nvt  0.446 0.066 0.000\nvt  0.442 0.095 0.000\nvt  0.381 0.103 0.000\nvt  0.388 0.070 0.000\nvt  0.185 0.169 0.000\nvt  0.186 0.126 0.000\nvt  0.253 0.102 0.000\nvt  0.242 0.148 0.000\nvt  0.230 0.072 0.000\nvt  0.183 0.087 0.000\nvt  0.448 0.038 0.000\nvt  0.395 0.039 0.000\nvt  0.398 0.021 0.000\nvt  0.449 0.020 0.000\nvt  0.133 0.055 0.000\nvt  0.179 0.050 0.000\nvt  0.288 0.053 0.000\nvt  0.260 0.052 0.000\nvt  0.261 0.023 0.000\nvt  0.300 0.022 0.000\nvt  0.341 0.043 0.000\nvt  0.348 0.022 0.000\nvt  0.087 0.055 0.000\nvt  0.040 0.091 0.000\nvt  0.041 0.055 0.000\nvt  0.038 0.133 0.000\nvt  0.001 0.131 0.000\nvt  0.001 0.089 0.000\nvt  0.001 0.053 0.000\nvt  0.222 0.038 0.000\nvt  0.083 0.177 0.000\nvt  0.035 0.178 0.000\nvt  0.326 0.083 0.000\nvt  0.315 0.124 0.000\nvt  0.001 0.175 0.000\nvt  0.129 0.175 0.000\nvt  0.001 0.002 0.000\nvt  0.042 0.002 0.000\nvt  0.133 0.002 0.000\nvt  0.177 0.002 0.000\nvt  0.092 0.002 0.000\nvt  0.399 0.002 0.000\nvt  0.450 0.002 0.000\nvt  0.303 0.002 0.000\nvt  0.350 0.002 0.000\nvt  0.218 0.002 0.000\nvt  0.260 0.002 0.000\nvt  0.558 0.967 0.000\nvt  0.557 0.976 0.000\nvt  0.500 0.997 0.000\nvt  0.588 0.975 0.000\nvt  0.442 0.967 0.000\nvt  0.443 0.976 0.000\nvt  0.412 0.975 0.000\n# 1339 texture vertices\n\nvn  0.001 0.482 -0.876\nvn  -0.001 0.661 0.751\nvn  0.136 0.595 0.792\nvn  -0.203 0.679 0.706\nvn  -0.092 0.474 0.876\nvn  -0.184 0.792 0.581\nvn  -0.098 0.863 0.495\nvn  -0.449 0.820 0.356\nvn  -0.220 0.748 0.626\nvn  -0.560 0.798 -0.222\nvn  -0.233 0.531 -0.815\nvn  0.001 0.534 -0.845\nvn  -0.135 0.596 0.791\nvn  0.203 0.676 0.708\nvn  0.091 0.476 0.875\nvn  0.189 0.792 0.581\nvn  0.099 0.862 0.496\nvn  0.444 0.821 0.360\nvn  0.221 0.747 0.627\nvn  0.556 0.801 -0.221\nvn  0.228 0.532 -0.815\nvn  -0.002 0.536 -0.844\nvn  -0.574 0.744 -0.343\nvn  -0.485 0.523 -0.701\nvn  -0.121 0.869 -0.480\nvn  -0.215 0.930 -0.298\nvn  -0.000 -0.806 -0.591\nvn  -0.277 -0.779 -0.562\nvn  -0.258 -0.731 -0.632\nvn  -0.046 -0.809 -0.586\nvn  -0.210 0.565 -0.798\nvn  -0.094 0.624 -0.775\nvn  0.015 0.952 -0.307\nvn  0.045 0.919 -0.392\nvn  -0.099 0.857 -0.505\nvn  -0.379 0.493 -0.783\nvn  -0.947 0.285 -0.149\nvn  -0.809 -0.421 -0.411\nvn  -0.895 -0.443 -0.043\nvn  -0.999 -0.020 0.035\nvn  -0.359 0.933 -0.019\nvn  -0.809 0.586 0.047\nvn  -0.667 -0.516 -0.538\nvn  -0.726 -0.626 -0.285\nvn  -0.001 0.671 -0.741\nvn  -0.001 0.945 -0.327\nvn  -0.531 -0.632 -0.565\nvn  -0.618 -0.566 -0.546\nvn  0.800 -0.473 0.369\nvn  0.618 -0.771 0.151\nvn  0.693 -0.711 0.116\nvn  0.818 -0.467 0.335\nvn  0.849 -0.259 0.460\nvn  0.775 -0.130 0.619\nvn  0.667 -0.132 0.733\nvn  0.775 -0.270 0.571\nvn  0.958 -0.057 -0.280\nvn  0.763 0.033 -0.646\nvn  0.763 -0.153 -0.628\nvn  0.911 -0.129 -0.391\nvn  0.990 0.067 0.126\nvn  0.979 0.090 0.185\nvn  0.981 0.057 0.184\nvn  0.996 0.020 0.090\nvn  0.770 -0.392 0.504\nvn  0.657 -0.721 0.219\nvn  0.478 -0.656 0.584\nvn  0.599 -0.389 0.700\nvn  0.498 -0.846 0.192\nvn  0.537 -0.840 0.082\nvn  0.740 -0.557 0.378\nvn  0.668 -0.570 0.479\nvn  0.280 -0.914 0.294\nvn  0.421 -0.898 0.126\nvn  0.991 0.084 0.103\nvn  0.964 0.223 0.143\nvn  0.960 0.189 0.207\nvn  0.979 0.103 0.175\nvn  0.868 0.172 0.465\nvn  0.907 0.085 0.413\nvn  0.938 0.144 0.316\nvn  0.897 0.178 0.405\nvn  0.662 -0.174 0.729\nvn  0.583 -0.417 0.697\nvn  0.627 -0.449 0.637\nvn  0.685 -0.405 0.605\nvn  0.827 0.091 0.555\nvn  0.890 0.018 0.455\nvn  0.663 -0.395 0.636\nvn  0.606 -0.428 0.671\nvn  0.313 -0.735 0.602\nvn  -0.136 -0.864 0.485\nvn  0.951 0.158 0.267\nvn  0.964 0.113 0.241\nvn  0.731 -0.036 0.681\nvn  0.819 -0.134 0.558\nvn  0.546 0.270 0.793\nvn  0.602 0.237 0.763\nvn  0.444 0.233 0.865\nvn  0.353 0.173 0.920\nvn  0.240 -0.093 0.966\nvn  0.498 0.051 0.866\nvn  0.675 0.338 0.656\nvn  0.480 0.400 0.780\nvn  0.064 -0.572 0.818\nvn  0.126 -0.313 0.941\nvn  0.207 -0.613 0.763\nvn  0.221 -0.810 0.544\nvn  0.598 -0.694 -0.401\nvn  0.124 -0.977 -0.175\nvn  0.218 -0.333 0.917\nvn  0.377 -0.161 0.912\nvn  0.142 -0.210 0.967\nvn  0.256 -0.155 0.954\nvn  0.111 -0.351 0.930\nvn  0.107 -0.480 0.871\nvn  0.675 -0.732 -0.096\nvn  0.496 -0.844 0.206\nvn  -0.016 -0.986 0.167\nvn  0.304 -0.948 0.097\nvn  0.982 -0.082 0.171\nvn  0.963 -0.002 0.269\nvn  0.967 -0.134 0.216\nvn  0.969 -0.177 0.175\nvn  0.916 -0.244 0.319\nvn  0.853 -0.341 0.394\nvn  0.837 -0.365 0.407\nvn  0.886 -0.281 0.368\nvn  0.422 -0.292 0.858\nvn  0.039 -0.571 0.820\nvn  -0.011 -0.399 0.917\nvn  0.333 -0.349 0.876\nvn  0.935 -0.237 0.263\nvn  0.949 -0.159 0.273\nvn  0.697 -0.213 0.685\nvn  0.568 -0.123 0.814\nvn  -0.938 0.322 0.130\nvn  -0.609 -0.738 -0.291\nvn  -0.447 -0.857 -0.258\nvn  0.259 -0.528 0.809\nvn  0.137 -0.704 0.697\nvn  -0.107 -0.741 0.663\nvn  0.647 -0.296 0.703\nvn  0.603 -0.168 0.780\nvn  0.836 0.072 0.545\nvn  0.744 0.114 0.659\nvn  0.701 0.149 0.698\nvn  0.802 0.157 0.577\nvn  0.823 -0.080 0.562\nvn  0.690 0.142 0.710\nvn  0.628 0.036 0.778\nvn  0.894 -0.247 0.373\nvn  0.624 -0.153 0.766\nvn  0.661 0.110 0.742\nvn  0.712 0.424 0.559\nvn  0.701 0.284 0.654\nvn  0.504 -0.050 0.862\nvn  0.413 0.027 0.910\nvn  0.569 0.046 0.821\nvn  0.488 -0.134 0.862\nvn  0.411 -0.180 0.894\nvn  0.610 -0.024 0.792\nvn  0.747 -0.250 0.616\nvn  0.672 -0.313 0.671\nvn  0.536 0.762 0.363\nvn  0.559 0.768 0.312\nvn  0.802 0.272 0.531\nvn  0.618 0.206 0.759\nvn  0.717 0.383 0.583\nvn  0.780 0.464 0.420\nvn  0.617 0.401 0.678\nvn  0.658 0.397 0.640\nvn  0.672 0.440 0.596\nvn  0.501 0.314 0.807\nvn  0.612 0.527 0.589\nvn  0.679 0.320 0.661\nvn  0.732 -0.406 -0.547\nvn  0.885 -0.261 -0.386\nvn  0.842 -0.347 0.414\nvn  0.782 -0.349 0.517\nvn  0.784 -0.368 0.500\nvn  0.858 -0.453 0.244\nvn  0.953 -0.279 0.118\nvn  0.977 -0.189 0.104\nvn  0.989 -0.110 0.102\nvn  0.142 0.669 0.730\nvn  0.300 0.652 0.696\nvn  0.291 0.792 0.536\nvn  0.143 0.821 0.553\nvn  0.737 0.561 0.378\nvn  0.716 0.470 0.515\nvn  0.884 0.306 0.353\nvn  0.898 0.354 0.263\nvn  0.890 0.423 0.171\nvn  0.174 0.078 0.982\nvn  0.219 0.254 0.942\nvn  0.665 -0.104 0.739\nvn  0.671 0.390 0.631\nvn  0.596 0.435 0.675\nvn  0.636 0.467 0.614\nvn  0.076 0.244 0.967\nvn  0.261 0.437 0.861\nvn  0.107 0.440 0.892\nvn  0.011 0.082 0.997\nvn  0.005 0.082 0.997\nvn  0.028 -0.027 0.999\nvn  0.073 -0.057 0.996\nvn  0.006 0.228 0.974\nvn  0.683 0.140 0.717\nvn  0.724 0.233 0.650\nvn  0.400 0.338 0.852\nvn  0.270 0.126 0.955\nvn  0.357 0.433 0.828\nvn  0.503 0.485 0.716\nvn  0.536 0.133 0.834\nvn  0.416 -0.306 0.856\nvn  0.337 0.097 0.937\nvn  0.262 0.372 0.891\nvn  0.425 0.075 0.902\nvn  0.701 -0.147 0.698\nvn  -0.056 0.558 0.828\nvn  0.005 0.605 0.796\nvn  0.483 0.327 0.812\nvn  0.497 0.276 0.823\nvn  0.505 0.283 0.815\nvn  0.340 -0.030 0.940\nvn  0.332 0.066 0.941\nvn  0.026 0.644 0.765\nvn  0.021 0.538 0.843\nvn  0.170 -0.012 0.985\nvn  0.365 -0.067 0.929\nvn  0.826 -0.173 0.537\nvn  0.320 0.415 0.852\nvn  0.384 0.739 0.554\nvn  0.987 -0.013 0.160\nvn  0.495 0.720 0.487\nvn  0.490 0.830 0.268\nvn  0.279 0.906 0.317\nvn  0.431 0.899 -0.074\nvn  0.267 0.957 -0.112\nvn  0.283 0.953 0.107\nvn  0.471 0.877 0.092\nvn  0.132 0.985 0.113\nvn  0.135 0.931 0.339\nvn  0.190 -0.184 0.964\nvn  0.292 -0.372 0.881\nvn  0.307 -0.447 0.840\nvn  0.393 -0.580 0.713\nvn  0.524 -0.286 0.802\nvn  0.380 -0.582 0.719\nvn  0.697 0.212 0.685\nvn  0.603 0.070 0.795\nvn  0.558 -0.571 0.602\nvn  -0.089 -0.701 0.707\nvn  0.794 -0.345 0.500\nvn  0.345 -0.517 0.783\nvn  0.481 0.101 0.871\nvn  0.134 0.283 0.950\nvn  0.113 -0.558 0.822\nvn  -0.073 -0.993 0.089\nvn  -0.041 -0.994 0.103\nvn  0.084 -0.038 0.996\nvn  -0.012 -0.622 0.783\nvn  -0.002 0.254 0.967\nvn  0.004 -0.997 0.079\nvn  0.001 -0.832 -0.555\nvn  0.477 -0.363 0.801\nvn  0.414 0.160 0.896\nvn  0.395 0.485 0.780\nvn  0.611 0.484 0.627\nvn  0.406 0.510 0.758\nvn  0.375 0.498 0.782\nvn  0.555 0.314 0.770\nvn  0.349 0.411 0.842\nvn  0.012 0.247 0.969\nvn  0.002 -0.369 0.930\nvn  -0.003 0.509 0.861\nvn  0.876 -0.041 0.481\nvn  0.757 -0.214 0.618\nvn  0.737 -0.048 0.674\nvn  0.840 -0.012 0.542\nvn  0.960 0.137 0.243\nvn  0.969 0.103 0.226\nvn  0.909 0.015 0.417\nvn  0.906 0.015 0.423\nvn  0.676 -0.276 0.683\nvn  0.688 -0.223 0.691\nvn  0.691 0.035 0.722\nvn  0.719 -0.082 0.691\nvn  0.964 0.062 0.260\nvn  0.956 0.070 0.286\nvn  0.953 0.037 0.300\nvn  -0.003 -0.415 0.910\nvn  -0.001 -0.380 0.925\nvn  0.658 -0.419 0.625\nvn  0.735 -0.421 0.532\nvn  0.663 -0.303 0.685\nvn  0.550 -0.321 0.771\nvn  0.423 -0.236 0.875\nvn  0.326 -0.294 0.899\nvn  0.124 -0.396 0.910\nvn  0.218 -0.177 0.960\nvn  0.530 0.781 0.331\nvn  0.167 0.827 0.537\nvn  0.094 0.948 0.303\nvn  0.313 0.934 0.171\nvn  -0.406 -0.892 0.201\nvn  -0.743 0.107 0.661\nvn  0.455 0.704 0.546\nvn  0.288 0.957 0.025\nvn  0.245 0.958 0.150\nvn  0.532 -0.027 0.846\nvn  0.566 0.213 0.796\nvn  0.508 0.208 0.836\nvn  0.173 0.028 0.984\nvn  0.371 0.122 0.921\nvn  0.429 -0.045 0.902\nvn  0.614 0.165 0.772\nvn  0.737 0.157 0.657\nvn  0.726 0.057 0.685\nvn  0.662 0.061 0.747\nvn  0.845 -0.523 -0.112\nvn  0.845 -0.501 -0.185\nvn  0.744 -0.668 0.009\nvn  0.773 -0.630 0.079\nvn  0.889 0.108 0.445\nvn  0.899 0.077 0.430\nvn  0.184 0.204 -0.961\nvn  0.005 0.202 -0.979\nvn  -0.000 0.485 -0.875\nvn  0.159 0.484 -0.861\nvn  0.499 0.592 0.633\nvn  0.305 0.950 0.065\nvn  -0.274 -0.953 -0.127\nvn  0.245 -0.456 0.856\nvn  0.083 -0.881 0.465\nvn  0.435 -0.739 0.515\nvn  0.504 -0.429 0.750\nvn  0.818 -0.367 0.443\nvn  0.933 -0.162 0.322\nvn  0.872 0.029 0.489\nvn  0.002 0.994 0.113\nvn  0.133 0.983 -0.126\nvn  -0.001 0.992 -0.127\nvn  0.280 0.892 -0.356\nvn  0.126 0.916 -0.381\nvn  0.210 0.974 -0.083\nvn  -0.082 0.663 0.745\nvn  -0.059 0.391 0.919\nvn  0.111 0.992 -0.055\nvn  0.081 -0.190 0.978\nvn  0.035 0.076 0.996\nvn  0.852 0.236 0.467\nvn  0.775 0.219 0.593\nvn  0.505 -0.109 0.856\nvn  0.446 -0.314 0.838\nvn  0.511 0.200 0.836\nvn  0.623 -0.242 0.744\nvn  0.436 -0.554 0.709\nvn  0.599 -0.742 0.300\nvn  -0.036 0.177 0.984\nvn  -0.039 -0.159 0.987\nvn  0.308 0.942 -0.135\nvn  0.989 0.093 -0.111\nvn  0.477 -0.259 0.840\nvn  0.473 -0.423 0.773\nvn  0.774 -0.329 0.541\nvn  0.285 0.019 0.958\nvn  0.350 0.101 0.931\nvn  0.579 0.261 0.773\nvn  0.298 0.015 0.954\nvn  0.165 0.336 0.927\nvn  0.577 0.511 0.636\nvn  0.254 -0.834 0.490\nvn  -0.114 -0.925 0.363\nvn  0.941 -0.280 -0.188\nvn  0.460 -0.738 0.493\nvn  0.740 -0.635 0.221\nvn  0.003 0.529 0.849\nvn  0.206 -0.427 -0.881\nvn  0.497 -0.316 -0.808\nvn  0.457 -0.144 -0.878\nvn  0.179 -0.244 -0.953\nvn  -0.182 -0.980 -0.078\nvn  0.342 -0.427 0.837\nvn  0.424 -0.296 0.856\nvn  0.896 -0.357 -0.264\nvn  0.594 -0.104 0.798\nvn  0.012 0.528 0.849\nvn  0.042 0.469 0.882\nvn  0.624 0.102 0.775\nvn  0.324 -0.123 0.938\nvn  0.202 -0.638 0.743\nvn  0.714 0.512 0.477\nvn  0.433 -0.511 0.742\nvn  -0.350 -0.708 0.613\nvn  0.095 -0.410 0.907\nvn  0.622 -0.593 0.512\nvn  0.846 0.304 0.437\nvn  0.582 -0.043 0.812\nvn  -0.226 -0.380 0.897\nvn  0.215 0.644 0.734\nvn  0.123 0.952 0.280\nvn  -0.004 0.956 0.293\nvn  -0.005 0.635 0.772\nvn  0.325 -0.730 0.601\nvn  -0.017 -0.840 0.543\nvn  0.017 -0.788 0.616\nvn  0.294 -0.138 0.946\nvn  0.214 0.401 0.891\nvn  -0.150 0.490 0.859\nvn  0.573 -0.125 0.810\nvn  -0.134 0.957 0.258\nvn  0.252 0.828 0.501\nvn  -0.673 0.643 0.364\nvn  0.004 -0.960 0.279\nvn  0.032 -0.991 0.133\nvn  0.006 -0.908 0.419\nvn  0.180 -0.980 0.086\nvn  0.740 0.403 -0.538\nvn  0.627 0.652 -0.426\nvn  0.814 0.561 -0.149\nvn  0.925 0.321 -0.206\nvn  0.492 0.825 -0.280\nvn  0.649 0.757 -0.076\nvn  0.966 0.258 0.022\nvn  0.864 0.501 0.053\nvn  0.680 0.729 0.077\nvn  0.272 -0.962 -0.032\nvn  0.225 -0.968 0.111\nvn  0.288 -0.510 0.810\nvn  0.126 0.748 -0.651\nvn  0.340 0.725 -0.598\nvn  0.421 0.466 -0.778\nvn  0.205 -0.458 -0.865\nvn  0.489 -0.479 -0.729\nvn  0.500 -0.523 -0.690\nvn  0.210 -0.566 -0.798\nvn  0.895 -0.322 -0.309\nvn  0.759 -0.434 -0.485\nvn  0.797 -0.287 -0.532\nvn  0.937 -0.248 -0.245\nvn  -0.001 -0.238 -0.971\nvn  -0.000 -0.025 -1.000\nvn  0.194 -0.025 -0.981\nvn  0.201 -0.248 -0.948\nvn  0.969 0.094 -0.229\nvn  0.968 -0.101 -0.228\nvn  0.814 -0.088 -0.575\nvn  0.800 0.142 -0.583\nvn  0.998 0.061 -0.010\nvn  0.726 0.657 0.205\nvn  0.000 -0.985 0.174\nvn  0.985 -0.166 0.038\nvn  0.955 -0.220 -0.200\nvn  0.472 0.076 0.879\nvn  0.343 -0.235 0.909\nvn  0.464 -0.641 0.612\nvn  0.578 -0.186 0.795\nvn  -0.189 -0.982 0.010\nvn  0.004 0.938 0.345\nvn  0.002 0.829 0.559\nvn  0.445 0.232 0.865\nvn  0.463 0.340 0.818\nvn  -0.116 0.983 0.143\nvn  0.004 0.995 0.102\nvn  0.978 0.204 0.044\nvn  -0.967 -0.216 -0.137\nvn  -0.911 -0.347 0.224\nvn  -0.728 0.350 0.590\nvn  0.426 0.738 -0.523\nvn  0.618 0.786 0.011\nvn  0.151 0.857 -0.493\nvn  -0.333 0.912 -0.241\nvn  -0.277 0.956 0.095\nvn  -0.569 0.822 -0.032\nvn  -0.341 -0.671 -0.658\nvn  0.161 -0.736 -0.657\nvn  0.528 0.432 0.731\nvn  0.586 0.105 0.803\nvn  0.436 0.074 0.897\nvn  0.621 0.267 0.737\nvn  0.936 0.153 0.316\nvn  0.999 -0.010 0.042\nvn  0.826 0.281 -0.489\nvn  0.775 0.178 -0.606\nvn  0.995 -0.039 -0.095\nvn  0.005 -0.414 0.910\nvn  0.580 -0.243 0.778\nvn  0.938 -0.339 -0.068\nvn  0.925 -0.371 0.080\nvn  0.888 -0.269 0.373\nvn  0.923 -0.371 -0.106\nvn  0.494 -0.274 -0.825\nvn  -0.001 -0.456 -0.890\nvn  -0.002 -0.569 -0.822\nvn  -0.001 -0.452 -0.892\nvn  -0.003 0.749 -0.663\nvn  -0.000 0.920 -0.391\nvn  -0.001 -0.280 -0.960\nvn  0.470 0.194 -0.861\nvn  0.965 -0.123 0.234\nvn  0.400 -0.039 -0.916\nvn  0.142 -0.166 -0.976\nvn  -0.000 -0.194 -0.981\nvn  0.497 -0.049 -0.867\nvn  0.998 0.042 0.045\nvn  0.996 -0.037 -0.082\nvn  0.009 0.433 0.901\nvn  0.004 0.669 0.743\nvn  0.955 0.004 0.296\nvn  0.737 -0.001 0.675\nvn  0.707 0.177 0.684\nvn  0.484 0.627 0.610\nvn  0.515 0.250 0.820\nvn  0.360 0.121 0.925\nvn  -0.544 -0.573 0.613\nvn  0.382 -0.114 0.917\nvn  0.489 -0.108 0.866\nvn  -0.002 -0.670 0.742\nvn  0.002 -0.394 0.919\nvn  -0.004 -0.168 0.986\nvn  0.007 -0.109 0.994\nvn  0.009 -0.519 0.855\nvn  0.660 -0.118 0.742\nvn  0.621 -0.127 0.774\nvn  0.416 0.220 0.882\nvn  0.946 0.046 0.322\nvn  0.014 0.006 1.000\nvn  0.569 0.184 0.802\nvn  0.218 0.013 0.976\nvn  0.044 0.087 0.995\nvn  -0.419 0.862 0.284\nvn  0.647 -0.120 0.753\nvn  0.954 -0.017 0.301\nvn  0.352 0.140 -0.926\nvn  0.095 -0.050 -0.994\nvn  0.770 0.025 0.638\nvn  0.000 -0.078 -0.997\nvn  0.985 -0.172 0.009\nvn  0.920 -0.340 0.195\nvn  0.929 -0.331 -0.163\nvn  0.969 -0.237 0.074\nvn  0.969 -0.183 0.165\nvn  0.801 0.160 0.577\nvn  0.954 -0.021 0.301\nvn  0.293 0.803 0.520\nvn  0.977 0.170 0.129\nvn  0.134 0.985 -0.104\nvn  0.994 0.106 -0.036\nvn  0.099 0.675 -0.731\nvn  0.997 -0.079 -0.000\nvn  0.197 0.126 -0.972\nvn  0.978 -0.175 -0.110\nvn  0.110 -0.321 -0.941\nvn  0.939 -0.332 -0.089\nvn  0.400 -0.789 -0.467\nvn  0.171 -0.673 -0.720\nvn  0.931 -0.336 -0.144\nvn  0.854 -0.500 0.146\nvn  0.161 -0.985 -0.069\nvn  0.931 -0.304 -0.200\nvn  0.813 -0.565 -0.143\nvn  0.823 -0.546 0.154\nvn  0.795 -0.387 0.467\nvn  0.809 -0.168 0.563\nvn  0.826 0.053 0.562\nvn  0.925 0.261 0.275\nvn  0.990 0.071 0.119\nvn  0.951 0.129 0.281\nvn  0.810 -0.147 0.568\nvn  0.383 -0.603 0.699\nvn  0.769 0.635 0.079\nvn  0.786 0.352 0.508\nvn  0.919 0.082 -0.386\nvn  0.937 0.163 0.310\nvn  0.974 -0.026 0.224\nvn  0.787 0.550 0.279\nvn  0.517 0.758 -0.397\nvn  0.337 0.112 -0.935\nvn  0.221 -0.300 -0.928\nvn  0.395 -0.578 -0.714\nvn  0.521 -0.711 -0.472\nvn  0.432 -0.901 -0.043\nvn  0.826 -0.520 0.218\nvn  0.885 -0.217 0.412\nvn  0.786 -0.107 0.609\nvn  0.864 0.400 0.304\nvn  0.954 0.061 0.293\nvn  0.949 0.313 0.046\nvn  0.991 0.028 -0.131\nvn  0.945 -0.116 0.305\nvn  0.970 -0.241 0.032\nvn  0.946 -0.038 0.322\nvn  0.886 -0.270 -0.376\nvn  0.855 -0.272 -0.441\nvn  0.952 -0.122 -0.281\nvn  0.002 -0.883 0.469\nvn  -0.001 0.792 -0.611\nvn  -0.180 0.823 -0.539\nvn  -0.642 0.677 -0.360\nvn  -0.957 0.288 -0.031\nvn  -0.912 -0.300 0.281\nvn  -0.454 -0.866 0.207\nvn  -0.855 -0.043 0.517\nvn  -0.834 0.460 0.305\nvn  -0.242 0.911 0.334\nvn  -0.720 -0.667 -0.192\nvn  -0.762 -0.580 -0.288\nvn  0.452 0.774 0.444\nvn  0.857 0.048 0.513\nvn  0.966 0.131 0.225\nvn  0.211 0.953 0.219\nvn  -0.108 0.726 0.679\nvn  0.021 0.946 0.324\nvn  0.566 -0.691 -0.450\nvn  -0.068 0.939 -0.338\nvn  -0.261 -0.298 0.918\nvn  -0.200 -0.891 0.407\nvn  0.124 -0.991 0.059\nvn  0.913 -0.350 -0.211\nvn  0.488 -0.838 0.244\nvn  0.738 -0.593 0.322\nvn  0.994 -0.060 -0.087\nvn  -0.000 -0.981 0.193\nvn  0.000 0.974 0.227\nvn  -0.350 -0.016 0.936\nvn  0.000 -0.017 1.000\nvn  0.252 0.455 -0.854\nvn  0.774 0.620 -0.127\nvn  0.634 0.759 -0.148\nvn  0.192 0.569 -0.800\nvn  0.405 -0.094 0.909\nvn  0.031 0.149 0.988\nvn  0.360 0.283 0.889\nvn  0.469 0.080 0.880\nvn  0.769 0.452 0.452\nvn  0.946 0.185 0.266\nvn  0.893 0.181 0.413\nvn  0.654 0.429 0.623\nvn  0.506 0.610 0.610\nvn  0.436 0.659 0.613\nvn  0.160 0.558 0.814\nvn  -0.285 0.396 0.873\nvn  -0.223 0.539 0.812\nvn  0.037 0.570 0.821\nvn  0.623 0.727 -0.289\nvn  0.456 0.738 0.497\nvn  0.382 0.656 0.651\nvn  0.278 0.687 0.671\nvn  0.213 0.798 0.563\nvn  0.171 0.844 0.508\nvn  0.300 0.690 0.659\nvn  0.144 0.793 0.591\nvn  0.204 0.541 -0.816\nvn  -0.001 0.494 -0.870\nvn  0.029 0.458 -0.888\nvn  0.060 0.366 -0.929\nvn  0.000 0.421 -0.907\nvn  0.000 0.386 -0.922\nvn  0.001 0.455 -0.891\nvn  0.264 0.718 0.644\nvn  0.307 0.317 -0.897\nvn  0.056 0.164 -0.985\nvn  0.717 0.079 0.693\nvn  0.638 0.188 0.746\nvn  0.000 0.202 -0.979\nvn  0.006 -0.044 0.999\nvn  0.001 0.405 0.914\nvn  0.805 0.560 -0.194\nvn  0.002 0.627 0.779\nvn  0.010 -0.298 0.954\nvn  0.124 0.870 -0.477\nvn  0.488 0.530 -0.693\nvn  0.566 0.756 -0.329\nvn  0.213 0.932 -0.294\nvn  0.245 -0.741 -0.626\nvn  0.275 -0.782 -0.559\nvn  0.044 -0.811 -0.584\nvn  -0.012 0.949 -0.315\nvn  0.097 0.621 -0.778\nvn  0.215 0.561 -0.799\nvn  -0.030 0.913 -0.407\nvn  0.378 0.505 -0.776\nvn  0.084 0.865 -0.495\nvn  0.892 -0.451 -0.026\nvn  0.803 -0.447 -0.394\nvn  0.954 0.274 -0.123\nvn  0.998 -0.024 0.066\nvn  0.806 0.588 0.057\nvn  0.351 0.936 -0.012\nvn  0.662 -0.536 -0.524\nvn  0.725 -0.630 -0.278\nvn  0.524 -0.662 -0.536\nvn  0.620 -0.585 -0.522\nvn  -0.694 -0.711 0.115\nvn  -0.621 -0.770 0.148\nvn  -0.805 -0.470 0.362\nvn  -0.819 -0.465 0.335\nvn  -0.680 -0.145 0.719\nvn  -0.763 -0.140 0.631\nvn  -0.840 -0.272 0.470\nvn  -0.773 -0.256 0.580\nvn  -0.763 -0.155 -0.627\nvn  -0.763 0.034 -0.645\nvn  -0.958 -0.057 -0.281\nvn  -0.910 -0.129 -0.393\nvn  -0.983 0.060 0.175\nvn  -0.980 0.096 0.177\nvn  -0.990 0.069 0.123\nvn  -0.996 0.023 0.083\nvn  -0.484 -0.649 0.587\nvn  -0.662 -0.717 0.220\nvn  -0.775 -0.388 0.499\nvn  -0.606 -0.384 0.697\nvn  -0.748 -0.556 0.363\nvn  -0.539 -0.840 0.071\nvn  -0.496 -0.849 0.183\nvn  -0.668 -0.580 0.467\nvn  -0.280 -0.913 0.296\nvn  -0.424 -0.897 0.125\nvn  -0.960 0.187 0.209\nvn  -0.965 0.222 0.143\nvn  -0.991 0.084 0.104\nvn  -0.979 0.104 0.175\nvn  -0.940 0.170 0.295\nvn  -0.909 0.107 0.404\nvn  -0.862 0.204 0.464\nvn  -0.896 0.204 0.395\nvn  -0.570 -0.493 0.658\nvn  -0.531 -0.465 0.709\nvn  -0.651 -0.181 0.737\nvn  -0.688 -0.376 0.620\nvn  -0.892 0.030 0.452\nvn  -0.827 0.122 0.549\nvn  -0.345 -0.706 0.619\nvn  -0.566 -0.461 0.684\nvn  -0.543 -0.393 0.742\nvn  -0.097 -0.841 0.533\nvn  -0.964 0.119 0.237\nvn  -0.950 0.158 0.268\nvn  -0.733 -0.024 0.679\nvn  -0.825 -0.117 0.552\nvn  -0.442 0.232 0.866\nvn  -0.605 0.237 0.760\nvn  -0.556 0.267 0.787\nvn  -0.350 0.172 0.921\nvn  -0.239 -0.096 0.966\nvn  -0.501 0.068 0.863\nvn  -0.679 0.342 0.650\nvn  -0.486 0.403 0.776\nvn  -0.211 -0.600 0.772\nvn  -0.123 -0.334 0.934\nvn  -0.052 -0.530 0.847\nvn  -0.176 -0.798 0.577\nvn  -0.131 -0.968 -0.212\nvn  -0.598 -0.684 -0.418\nvn  -0.205 -0.329 0.922\nvn  -0.374 -0.151 0.915\nvn  -0.117 -0.376 0.919\nvn  -0.246 -0.160 0.956\nvn  -0.126 -0.268 0.955\nvn  -0.137 -0.531 0.837\nvn  0.062 -0.980 0.190\nvn  -0.478 -0.855 0.203\nvn  -0.669 -0.734 -0.114\nvn  -0.286 -0.955 0.083\nvn  -0.967 -0.136 0.215\nvn  -0.965 -0.005 0.263\nvn  -0.983 -0.085 0.164\nvn  -0.969 -0.182 0.170\nvn  -0.840 -0.358 0.408\nvn  -0.857 -0.341 0.386\nvn  -0.910 -0.256 0.326\nvn  -0.884 -0.284 0.371\nvn  0.022 -0.449 0.893\nvn  -0.046 -0.611 0.791\nvn  -0.478 -0.294 0.827\nvn  -0.375 -0.338 0.863\nvn  -0.935 -0.243 0.259\nvn  -0.949 -0.164 0.269\nvn  -0.736 -0.207 0.645\nvn  -0.587 -0.108 0.802\nvn  0.945 0.284 0.163\nvn  0.592 -0.756 -0.279\nvn  0.442 -0.866 -0.236\nvn  -0.053 -0.740 0.670\nvn  -0.228 -0.529 0.817\nvn  0.170 -0.772 0.613\nvn  -0.609 -0.162 0.777\nvn  -0.663 -0.292 0.690\nvn  -0.713 0.145 0.686\nvn  -0.759 0.059 0.648\nvn  -0.825 0.047 0.564\nvn  -0.809 0.158 0.566\nvn  -0.637 0.025 0.770\nvn  -0.687 0.129 0.715\nvn  -0.821 -0.086 0.564\nvn  -0.891 -0.252 0.378\nvn  -0.721 0.489 0.490\nvn  -0.698 0.164 0.697\nvn  -0.646 -0.143 0.750\nvn  -0.712 0.352 0.608\nvn  -0.567 0.074 0.821\nvn  -0.464 0.032 0.885\nvn  -0.518 -0.023 0.855\nvn  -0.550 -0.128 0.825\nvn  -0.756 -0.260 0.601\nvn  -0.645 -0.025 0.764\nvn  -0.437 -0.158 0.885\nvn  -0.687 -0.310 0.657\nvn  -0.541 0.781 0.313\nvn  -0.565 0.780 0.270\nvn  -0.712 0.385 0.587\nvn  -0.611 0.201 0.765\nvn  -0.859 0.335 0.388\nvn  -0.775 0.474 0.417\nvn  -0.673 0.387 0.630\nvn  -0.628 0.400 0.668\nvn  -0.676 0.438 0.592\nvn  -0.698 0.309 0.646\nvn  -0.622 0.535 0.573\nvn  -0.511 0.327 0.795\nvn  -0.733 -0.405 -0.547\nvn  -0.884 -0.261 -0.388\nvn  -0.791 -0.366 0.490\nvn  -0.793 -0.344 0.502\nvn  -0.844 -0.347 0.408\nvn  -0.858 -0.453 0.243\nvn  -0.953 -0.280 0.116\nvn  -0.976 -0.193 0.100\nvn  -0.989 -0.113 0.096\nvn  -0.289 0.792 0.537\nvn  -0.301 0.654 0.693\nvn  -0.134 0.672 0.728\nvn  -0.137 0.821 0.554\nvn  -0.884 0.305 0.354\nvn  -0.716 0.471 0.515\nvn  -0.736 0.562 0.377\nvn  -0.897 0.355 0.265\nvn  -0.890 0.422 0.171\nvn  -0.179 0.082 0.981\nvn  -0.216 0.250 0.944\nvn  -0.661 -0.125 0.740\nvn  -0.679 0.371 0.633\nvn  -0.636 0.460 0.620\nvn  -0.594 0.426 0.682\nvn  -0.258 0.436 0.862\nvn  -0.070 0.240 0.968\nvn  -0.095 0.440 0.893\nvn  -0.011 0.089 0.996\nvn  -0.069 -0.049 0.996\nvn  -0.719 0.247 0.649\nvn  -0.673 0.172 0.719\nvn  -0.353 0.447 0.822\nvn  -0.270 0.134 0.954\nvn  -0.440 0.328 0.836\nvn  -0.511 0.490 0.706\nvn  -0.342 0.114 0.933\nvn  -0.435 -0.298 0.849\nvn  -0.552 0.158 0.818\nvn  -0.273 0.369 0.888\nvn  -0.705 -0.192 0.683\nvn  -0.357 0.088 0.930\nvn  -0.499 0.346 0.795\nvn  0.009 0.585 0.811\nvn  0.086 0.584 0.807\nvn  -0.348 -0.035 0.937\nvn  -0.516 0.299 0.803\nvn  -0.512 0.295 0.806\nvn  -0.339 0.070 0.938\nvn  -0.348 -0.070 0.935\nvn  -0.148 -0.003 0.989\nvn  -0.349 0.750 0.561\nvn  -0.322 0.418 0.849\nvn  -0.890 -0.163 0.425\nvn  -0.990 -0.001 0.144\nvn  -0.500 0.824 0.267\nvn  -0.501 0.717 0.484\nvn  -0.285 0.905 0.315\nvn  -0.282 0.954 0.103\nvn  -0.268 0.957 -0.114\nvn  -0.433 0.898 -0.078\nvn  -0.473 0.876 0.093\nvn  -0.131 0.985 0.111\nvn  -0.127 0.932 0.339\nvn  -0.211 -0.186 0.960\nvn  -0.293 -0.359 0.886\nvn  -0.344 -0.465 0.816\nvn  -0.382 -0.591 0.710\nvn  -0.525 -0.255 0.812\nvn  -0.598 0.089 0.796\nvn  -0.688 0.244 0.683\nvn  -0.344 -0.576 0.742\nvn  -0.544 -0.583 0.603\nvn  0.098 -0.695 0.712\nvn  -0.805 -0.326 0.496\nvn  -0.132 0.306 0.943\nvn  -0.485 0.160 0.860\nvn  -0.351 -0.498 0.793\nvn  -0.141 -0.499 0.855\nvn  0.065 -0.990 0.123\nvn  0.037 -0.989 0.143\nvn  -0.065 -0.055 0.996\nvn  -0.473 -0.369 0.800\nvn  -0.396 0.179 0.900\nvn  -0.600 0.505 0.620\nvn  -0.387 0.499 0.776\nvn  -0.398 0.505 0.766\nvn  -0.358 0.488 0.796\nvn  -0.570 0.304 0.763\nvn  -0.317 0.412 0.854\nvn  -0.742 -0.129 0.658\nvn  -0.771 -0.207 0.602\nvn  -0.881 -0.036 0.472\nvn  -0.841 -0.052 0.538\nvn  -0.972 0.111 0.208\nvn  -0.961 0.151 0.230\nvn  -0.916 -0.004 0.402\nvn  -0.913 0.013 0.408\nvn  -0.689 0.026 0.724\nvn  -0.641 -0.316 0.699\nvn  -0.647 -0.304 0.699\nvn  -0.697 -0.094 0.711\nvn  -0.966 0.063 0.249\nvn  -0.963 0.075 0.259\nvn  -0.958 0.031 0.287\nvn  -0.681 -0.315 0.661\nvn  -0.745 -0.412 0.525\nvn  -0.666 -0.413 0.621\nvn  -0.548 -0.335 0.767\nvn  -0.107 -0.395 0.913\nvn  -0.299 -0.320 0.899\nvn  -0.418 -0.236 0.877\nvn  -0.210 -0.169 0.963\nvn  -0.090 0.952 0.291\nvn  -0.166 0.838 0.520\nvn  -0.523 0.797 0.302\nvn  -0.302 0.941 0.154\nvn  0.408 -0.888 0.211\nvn  0.735 0.117 0.668\nvn  -0.279 0.960 0.001\nvn  -0.468 0.706 0.531\nvn  -0.232 0.964 0.131\nvn  -0.555 -0.033 0.831\nvn  -0.517 0.199 0.833\nvn  -0.549 0.222 0.806\nvn  -0.376 0.125 0.918\nvn  -0.210 0.031 0.977\nvn  -0.435 -0.045 0.899\nvn  -0.739 0.154 0.656\nvn  -0.610 0.153 0.777\nvn  -0.663 0.041 0.748\nvn  -0.733 0.013 0.681\nvn  -0.744 -0.668 0.007\nvn  -0.845 -0.501 -0.187\nvn  -0.845 -0.522 -0.114\nvn  -0.774 -0.629 0.079\nvn  -0.897 0.040 0.440\nvn  -0.896 0.094 0.434\nvn  -0.179 0.204 -0.962\nvn  -0.157 0.488 -0.858\nvn  -0.506 0.590 0.630\nvn  -0.305 0.951 0.047\nvn  0.267 -0.958 -0.102\nvn  -0.432 -0.745 0.509\nvn  -0.075 -0.883 0.463\nvn  -0.236 -0.454 0.859\nvn  -0.504 -0.423 0.753\nvn  -0.821 -0.351 0.449\nvn  -0.876 0.033 0.481\nvn  -0.934 -0.155 0.322\nvn  -0.134 0.983 -0.126\nvn  -0.128 0.916 -0.381\nvn  -0.284 0.891 -0.353\nvn  0.055 0.396 0.917\nvn  0.092 0.644 0.760\nvn  -0.199 0.976 -0.093\nvn  -0.109 0.991 -0.072\nvn  -0.039 0.079 0.996\nvn  -0.081 -0.191 0.978\nvn  -0.854 0.239 0.462\nvn  -0.774 0.223 0.593\nvn  -0.502 -0.119 0.856\nvn  -0.403 -0.420 0.813\nvn  -0.680 -0.255 0.687\nvn  -0.525 0.172 0.834\nvn  -0.376 -0.531 0.759\nvn  -0.576 -0.754 0.316\nvn  0.040 0.159 0.986\nvn  0.036 -0.180 0.983\nvn  -0.308 0.943 -0.129\nvn  -0.983 0.074 -0.170\nvn  -0.456 -0.445 0.771\nvn  -0.476 -0.297 0.828\nvn  -0.788 -0.316 0.528\nvn  -0.393 0.095 0.915\nvn  -0.308 0.018 0.951\nvn  -0.125 0.331 0.935\nvn  -0.283 0.033 0.959\nvn  -0.598 0.322 0.734\nvn  -0.575 0.559 0.598\nvn  -0.216 -0.852 0.476\nvn  0.156 -0.927 0.342\nvn  -0.941 -0.282 -0.189\nvn  -0.739 -0.637 0.221\nvn  -0.469 -0.731 0.495\nvn  -0.458 -0.139 -0.878\nvn  -0.498 -0.315 -0.808\nvn  -0.210 -0.426 -0.880\nvn  -0.182 -0.243 -0.953\nvn  -0.334 -0.402 0.853\nvn  0.221 -0.960 -0.173\nvn  -0.414 -0.366 0.834\nvn  -0.902 -0.373 -0.218\nvn  -0.632 -0.114 0.767\nvn  -0.642 0.122 0.757\nvn  -0.194 -0.651 0.734\nvn  -0.351 -0.095 0.931\nvn  -0.707 0.530 0.467\nvn  -0.087 -0.550 0.831\nvn  0.352 -0.710 0.610\nvn  -0.500 -0.482 0.720\nvn  -0.653 -0.626 0.427\nvn  -0.856 0.328 0.399\nvn  -0.578 -0.029 0.816\nvn  0.275 -0.432 0.859\nvn  -0.123 0.953 0.277\nvn  -0.228 0.657 0.719\nvn  -0.298 -0.735 0.609\nvn  -0.300 -0.179 0.937\nvn  -0.219 0.400 0.890\nvn  -0.587 -0.175 0.791\nvn  0.175 0.460 0.870\nvn  -0.179 0.856 0.485\nvn  0.114 0.959 0.259\nvn  0.664 0.620 0.418\nvn  -0.026 -0.991 0.129\nvn  -0.184 -0.979 0.082\nvn  -0.810 0.566 -0.151\nvn  -0.628 0.654 -0.422\nvn  -0.741 0.405 -0.536\nvn  -0.924 0.322 -0.207\nvn  -0.493 0.823 -0.280\nvn  -0.648 0.758 -0.080\nvn  -0.966 0.258 0.022\nvn  -0.864 0.501 0.051\nvn  -0.679 0.730 0.075\nvn  -0.221 -0.970 0.105\nvn  -0.271 -0.962 -0.038\nvn  -0.376 -0.516 0.769\nvn  -0.124 0.748 -0.652\nvn  -0.339 0.727 -0.598\nvn  -0.420 0.469 -0.777\nvn  -0.500 -0.524 -0.690\nvn  -0.489 -0.481 -0.728\nvn  -0.206 -0.458 -0.865\nvn  -0.212 -0.565 -0.797\nvn  -0.893 -0.325 -0.312\nvn  -0.759 -0.435 -0.485\nvn  -0.796 -0.289 -0.532\nvn  -0.937 -0.249 -0.246\nvn  -0.193 -0.029 -0.981\nvn  -0.202 -0.249 -0.947\nvn  -0.814 -0.090 -0.574\nvn  -0.969 -0.102 -0.227\nvn  -0.969 0.093 -0.229\nvn  -0.801 0.142 -0.581\nvn  -0.998 0.061 -0.010\nvn  -0.718 0.664 0.209\nvn  -0.985 -0.168 0.036\nvn  -0.954 -0.222 -0.201\nvn  -0.451 0.039 0.891\nvn  -0.341 -0.253 0.905\nvn  -0.604 -0.144 0.784\nvn  -0.472 -0.641 0.606\nvn  0.107 -0.991 0.080\nvn  -0.463 0.274 0.843\nvn  -0.002 0.997 0.081\nvn  0.083 0.977 0.195\nvn  -0.466 0.366 0.805\nvn  -0.977 0.200 0.072\nvn  0.916 -0.331 0.226\nvn  0.929 -0.364 -0.067\nvn  0.728 0.359 0.584\nvn  -0.419 0.737 -0.531\nvn  -0.638 0.769 0.043\nvn  -0.146 0.857 -0.494\nvn  0.280 0.954 0.105\nvn  0.343 0.909 -0.237\nvn  0.546 0.838 -0.008\nvn  0.342 -0.678 -0.651\nvn  -0.159 -0.734 -0.660\nvn  -0.545 0.363 0.756\nvn  -0.599 0.165 0.783\nvn  -0.447 0.066 0.892\nvn  -0.645 0.255 0.721\nvn  -0.936 0.164 0.311\nvn  -0.776 0.182 -0.604\nvn  -0.827 0.285 -0.485\nvn  -0.999 -0.012 0.041\nvn  -0.995 -0.037 -0.093\nvn  -0.586 -0.252 0.770\nvn  -0.926 -0.370 0.079\nvn  -0.938 -0.339 -0.067\nvn  -0.889 -0.266 0.372\nvn  -0.922 -0.372 -0.106\nvn  -0.493 -0.275 -0.825\nvn  -0.473 0.194 -0.860\nvn  -0.965 -0.122 0.231\nvn  -0.401 -0.036 -0.915\nvn  -0.143 -0.164 -0.976\nvn  -0.496 -0.052 -0.867\nvn  -0.996 -0.037 -0.083\nvn  -0.998 0.042 0.045\nvn  -0.950 0.012 0.313\nvn  -0.733 -0.008 0.681\nvn  -0.670 0.247 0.700\nvn  -0.408 0.697 0.589\nvn  -0.330 0.155 0.931\nvn  -0.517 0.244 0.821\nvn  0.568 -0.625 0.535\nvn  -0.512 -0.108 0.852\nvn  -0.414 -0.112 0.903\nvn  -0.654 -0.140 0.743\nvn  -0.608 -0.086 0.789\nvn  -0.422 0.215 0.881\nvn  -0.943 0.031 0.332\nvn  -0.549 0.190 0.814\nvn  -0.193 0.018 0.981\nvn  0.358 0.872 0.335\nvn  -0.651 -0.118 0.750\nvn  -0.954 -0.010 0.300\nvn  -0.352 0.145 -0.925\nvn  -0.095 -0.049 -0.994\nvn  -0.769 0.031 0.639\nvn  -0.929 -0.329 -0.171\nvn  -0.923 -0.336 0.190\nvn  -0.985 -0.174 0.005\nvn  -0.970 -0.234 0.068\nvn  -0.801 0.162 0.576\nvn  -0.969 -0.184 0.166\nvn  -0.293 0.803 0.519\nvn  -0.954 -0.019 0.300\nvn  -0.133 0.986 -0.105\nvn  -0.976 0.175 0.130\nvn  -0.098 0.675 -0.732\nvn  -0.993 0.112 -0.041\nvn  -0.197 0.127 -0.972\nvn  -0.997 -0.077 -0.003\nvn  -0.112 -0.322 -0.940\nvn  -0.978 -0.176 -0.109\nvn  -0.171 -0.674 -0.719\nvn  -0.397 -0.789 -0.468\nvn  -0.937 -0.337 -0.091\nvn  -0.929 -0.341 -0.146\nvn  -0.158 -0.985 -0.070\nvn  -0.854 -0.500 0.145\nvn  -0.814 -0.564 -0.141\nvn  -0.931 -0.306 -0.199\nvn  -0.824 -0.545 0.156\nvn  -0.797 -0.383 0.466\nvn  -0.811 -0.165 0.562\nvn  -0.824 0.053 0.564\nvn  -0.926 0.257 0.275\nvn  -0.991 0.062 0.118\nvn  -0.952 0.122 0.281\nvn  -0.383 -0.604 0.699\nvn  -0.810 -0.150 0.567\nvn  -0.784 0.355 0.509\nvn  -0.761 0.645 0.076\nvn  -0.920 0.079 -0.385\nvn  -0.975 -0.023 0.222\nvn  -0.937 0.166 0.308\nvn  -0.787 0.551 0.279\nvn  -0.517 0.758 -0.396\nvn  -0.337 0.112 -0.935\nvn  -0.221 -0.301 -0.928\nvn  -0.395 -0.579 -0.714\nvn  -0.520 -0.711 -0.473\nvn  -0.426 -0.904 -0.044\nvn  -0.824 -0.523 0.219\nvn  -0.886 -0.220 0.409\nvn  -0.863 0.404 0.303\nvn  -0.782 -0.104 0.615\nvn  -0.953 0.066 0.297\nvn  -0.949 0.312 0.046\nvn  -0.991 0.025 -0.134\nvn  -0.944 -0.116 0.308\nvn  -0.971 -0.237 0.041\nvn  -0.947 -0.041 0.318\nvn  -0.854 -0.274 -0.443\nvn  -0.885 -0.271 -0.378\nvn  -0.952 -0.121 -0.282\nvn  0.180 0.824 -0.537\nvn  0.642 0.679 -0.355\nvn  0.956 0.291 -0.021\nvn  0.453 -0.867 0.208\nvn  0.910 -0.301 0.285\nvn  0.854 -0.043 0.518\nvn  0.833 0.459 0.308\nvn  0.241 0.911 0.334\nvn  0.731 -0.650 -0.206\nvn  0.760 -0.585 -0.282\nvn  -0.814 0.019 0.580\nvn  -0.563 0.638 0.526\nvn  -0.925 -0.012 0.381\nvn  -0.214 0.952 0.217\nvn  0.096 0.721 0.686\nvn  -0.027 0.945 0.325\nvn  -0.555 -0.678 -0.481\nvn  0.062 0.937 -0.343\nvn  0.240 -0.291 0.926\nvn  0.184 -0.889 0.419\nvn  -0.126 -0.990 0.061\nvn  -0.889 -0.369 -0.271\nvn  -0.506 -0.832 0.229\nvn  -0.808 -0.443 0.388\nvn  -0.993 -0.084 0.087\nvn  0.350 -0.016 0.937\nvn  -0.636 0.759 -0.140\nvn  -0.771 0.626 -0.115\nvn  -0.250 0.462 -0.851\nvn  -0.192 0.568 -0.801\nvn  -0.359 0.279 0.891\nvn  -0.026 0.144 0.989\nvn  -0.398 -0.100 0.912\nvn  -0.465 0.084 0.881\nvn  -0.895 0.186 0.405\nvn  -0.947 0.184 0.264\nvn  -0.761 0.459 0.458\nvn  -0.657 0.429 0.620\nvn  -0.426 0.660 0.618\nvn  -0.505 0.610 0.611\nvn  0.223 0.536 0.814\nvn  0.285 0.393 0.874\nvn  -0.163 0.555 0.815\nvn  -0.038 0.570 0.821\nvn  -0.628 0.723 -0.288\nvn  -0.458 0.737 0.497\nvn  -0.212 0.799 0.563\nvn  -0.278 0.687 0.672\nvn  -0.380 0.657 0.651\nvn  -0.170 0.846 0.506\nvn  -0.305 0.687 0.660\nvn  -0.144 0.795 0.589\nvn  0.001 0.494 -0.870\nvn  -0.208 0.539 -0.816\nvn  -0.027 0.458 -0.888\nvn  -0.057 0.367 -0.929\nvn  -0.262 0.718 0.645\nvn  -0.054 0.163 -0.985\nvn  -0.306 0.325 -0.895\nvn  -0.643 0.181 0.744\nvn  -0.717 0.083 0.692\nvn  -0.800 0.573 -0.178\nvn  0.296 -0.070 0.953\nvn  -0.319 -0.065 0.946\n# 1258 vertex normals\n\ng head\ns 1\nf 24/1/24 25/2/25 26/3/26\nf 24/1/24 26/3/26 23/4/23\nf 28/5/28 29/6/29 30/7/30\nf 28/5/28 30/7/30 27/8/27\nf 32/9/32 33/10/33 34/11/34\nf 32/9/32 34/11/34 31/12/31\nf 36/13/36 31/12/31 34/11/34\nf 36/13/36 34/11/34 35/14/35\nf 36/13/36 35/14/35 25/2/25\nf 36/13/36 25/2/25 24/1/24\nf 38/15/38 39/16/39 40/17/40\nf 38/15/38 40/17/40 37/18/37\nf 42/19/42 23/4/23 26/3/26\nf 42/19/42 26/3/26 41/20/41\nf 40/17/40 42/19/42 41/20/41\nf 40/17/40 41/20/41 37/18/37\nf 38/15/38 43/21/43 44/22/44\nf 38/15/38 44/22/44 39/16/39\nf 32/9/32 45/23/45 46/24/46\nf 32/9/32 46/24/46 33/10/33\nf 28/5/28 44/22/44 48/25/48\nf 28/5/28 48/25/48 47/26/47\nf 50/27/50 51/28/51 52/29/52\nf 50/27/50 52/29/52 49/30/49\nf 54/31/54 55/32/55 56/33/56\nf 54/31/54 56/33/56 53/34/53\nf 58/35/58 59/36/59 60/37/60\nf 58/35/58 60/37/60 57/38/57\nf 62/39/62 63/40/63 64/41/64\nf 62/39/62 64/41/64 61/42/61\nf 66/43/66 67/44/67 68/45/68\nf 66/43/66 68/45/68 65/46/65\nf 70/47/70 71/48/71 72/49/72\nf 70/47/70 72/49/72 69/50/69\nf 67/44/67 66/43/66 74/51/74\nf 67/44/67 74/51/74 73/52/73\nf 66/43/66 51/28/51 50/27/50\nf 66/43/66 50/27/50 74/51/74\nf 76/53/76 77/54/77 78/55/78\nf 76/53/76 78/55/78 75/56/75\nf 80/57/80 81/58/81 82/59/82\nf 80/57/80 82/59/82 79/60/79\nf 84/61/84 85/62/85 86/63/86\nf 84/61/84 86/63/86 83/64/83\nf 87/65/87 88/66/88 80/57/80\nf 87/65/87 80/57/80 79/60/79\nf 90/67/90 91/68/91 92/69/92\nf 90/67/90 92/69/92 89/70/89\nf 93/71/93 94/72/94 78/55/78\nf 93/71/93 78/55/78 77/54/77\nf 87/65/87 95/73/95 96/74/96\nf 87/65/87 96/74/96 88/66/88\nf 98/75/98 99/76/99 100/77/100\nf 98/75/98 100/77/100 97/78/97\nf 100/77/100 101/79/101 102/80/102\nf 100/77/100 102/80/102 97/78/97\nf 98/75/98 103/81/103 104/82/104\nf 98/75/98 104/82/104 99/76/99\nf 106/83/106 107/84/107 108/85/108\nf 106/83/106 108/85/108 105/86/105\nf 109/87/109 110/88/110 105/86/105\nf 109/87/109 105/86/105 108/85/108\nf 101/79/101 111/89/111 112/90/112\nf 101/79/101 112/90/112 102/80/102\nf 114/91/114 115/92/115 116/93/116\nf 114/91/114 116/93/116 113/94/113\nf 118/95/118 119/96/119 120/97/120\nf 118/95/118 120/97/120 117/98/117\nf 122/99/122 123/100/123 124/101/124\nf 122/99/122 124/101/124 121/102/121\nf 126/103/126 127/104/127 128/105/128\nf 126/103/126 128/105/128 125/106/125\nf 130/107/130 131/108/131 132/109/132\nf 130/107/130 132/109/132 129/110/129\nf 125/106/125 128/105/128 134/111/134\nf 125/106/125 134/111/134 133/112/133\nf 56/33/56 55/32/55 136/113/136\nf 56/33/56 136/113/136 135/114/135\nf 37/115/37 137/116/137 138/117/138\nf 37/115/37 138/117/138 38/118/38\nf 139/119/139 43/120/43 38/118/38\nf 139/119/139 38/118/38 138/117/138\nf 140/121/140 141/122/141 142/123/142\nf 140/121/140 142/123/142 130/107/130\nf 144/124/144 129/110/129 132/109/132\nf 144/124/144 132/109/132 143/125/143\nf 146/126/146 147/127/147 148/128/148\nf 146/126/146 148/128/148 145/129/145\nf 150/130/150 151/131/151 54/31/54\nf 150/130/150 54/31/54 149/132/149\nf 54/31/54 53/34/53 152/133/152\nf 54/31/54 152/133/152 149/132/149\nf 154/134/154 155/135/155 156/136/156\nf 154/134/154 156/136/156 153/137/153\nf 158/138/158 159/139/159 160/140/160\nf 158/138/158 160/140/160 157/141/157\nf 162/142/162 163/143/163 164/144/164\nf 162/142/162 164/144/164 161/145/161\nf 129/110/129 144/124/144 157/141/157\nf 129/110/129 157/141/157 160/140/160\nf 156/136/156 155/135/155 166/146/166\nf 156/136/156 166/146/166 165/147/165\nf 168/148/168 169/149/169 170/150/170\nf 168/148/168 170/150/170 167/151/167\nf 171/152/171 172/153/172 173/154/173\nf 171/152/171 173/154/173 169/149/169\nf 175/155/175 176/156/176 171/152/171\nf 175/155/175 171/152/171 174/157/174\nf 59/36/59 177/158/177 178/159/178\nf 59/36/59 178/159/178 60/37/60\nf 180/160/180 181/161/181 49/30/49\nf 180/160/180 49/30/49 179/162/179\nf 127/104/127 52/29/52 182/163/182\nf 127/104/127 182/163/182 128/105/128\nf 134/111/134 183/164/183 184/165/184\nf 134/111/134 184/165/184 124/101/124\nf 185/166/185 121/102/121 124/101/124\nf 185/166/185 124/101/124 184/165/184\nf 187/167/187 188/168/188 189/169/189\nf 187/167/187 189/169/189 186/170/186\nf 191/171/191 192/172/192 193/173/193\nf 191/171/191 193/173/193 190/174/190\nf 76/53/76 194/175/194 193/173/193\nf 76/53/76 193/173/193 77/54/77\nf 100/77/100 99/76/99 196/176/196\nf 100/77/100 196/176/196 195/177/195\nf 176/156/176 175/155/175 198/178/198\nf 176/156/176 198/178/198 197/179/197\nf 199/180/199 200/181/200 173/154/173\nf 199/180/199 173/154/173 172/153/172\nf 196/176/196 202/182/202 203/183/203\nf 196/176/196 203/183/203 201/184/201\nf 205/185/205 206/186/206 207/187/207\nf 205/185/205 207/187/207 204/188/204\nf 208/189/208 205/185/205 204/188/204\nf 208/189/208 204/188/204 201/184/201\nf 210/190/210 97/78/97 102/80/102\nf 210/190/210 102/80/102 209/191/209\nf 79/60/79 210/190/210 209/191/209\nf 79/60/79 209/191/209 87/65/87\nf 212/192/212 213/193/213 214/194/214\nf 212/192/212 214/194/214 211/195/211\nf 216/196/216 217/197/217 218/198/218\nf 216/196/216 218/198/218 215/199/215\nf 220/200/220 216/196/216 215/199/215\nf 220/200/220 215/199/215 219/201/219\nf 222/202/222 223/203/223 218/198/218\nf 222/202/222 218/198/218 221/204/221\nf 225/205/225 226/206/226 227/207/227\nf 225/205/225 227/207/227 224/208/224\nf 222/202/222 221/204/221 229/209/229\nf 222/202/222 229/209/229 228/210/228\nf 230/211/230 231/212/231 220/200/220\nf 230/211/230 220/200/220 219/201/219\nf 227/207/227 226/206/226 231/212/231\nf 227/207/227 231/212/231 230/211/230\nf 233/213/233 234/214/234 235/215/235\nf 233/213/233 235/215/235 232/216/232\nf 186/170/186 203/183/203 202/182/202\nf 186/170/186 202/182/202 187/167/187\nf 236/217/236 237/218/237 238/219/238\nf 236/217/236 238/219/238 188/168/188\nf 240/220/240 241/221/241 242/222/242\nf 240/220/240 242/222/242 239/223/239\nf 241/221/241 243/224/243 244/225/244\nf 241/221/241 244/225/244 238/219/238\nf 245/226/245 101/79/101 100/77/100\nf 245/226/245 100/77/100 195/177/195\nf 195/177/195 204/188/204 207/187/207\nf 195/177/195 207/187/207 245/226/245\nf 111/89/111 246/227/246 247/228/247\nf 111/89/111 247/228/247 115/92/115\nf 141/122/141 140/121/140 249/229/249\nf 141/122/141 249/229/249 248/230/248\nf 251/231/251 252/232/252 253/233/253\nf 251/231/251 253/233/253 250/234/250\nf 254/235/254 118/95/118 255/236/255\nf 254/235/254 255/236/255 217/197/217\nf 257/237/257 258/238/258 259/239/259\nf 257/237/257 259/239/259 256/240/256\nf 256/240/256 259/239/259 261/241/261\nf 256/240/256 261/241/261 260/242/260\nf 260/242/260 261/241/261 30/243/30\nf 260/242/260 30/243/30 29/244/29\nf 218/198/218 217/197/217 262/245/262\nf 218/198/218 262/245/262 221/204/221\nf 259/239/259 258/238/258 264/246/264\nf 259/239/259 264/246/264 263/247/263\nf 266/248/266 30/243/30 261/241/261\nf 266/248/266 261/241/261 265/249/265\nf 253/233/253 252/232/252 268/250/268\nf 253/233/253 268/250/268 267/251/267\nf 270/252/270 200/181/200 271/253/271\nf 270/252/270 271/253/271 269/254/269\nf 199/180/199 272/255/272 271/253/271\nf 199/180/199 271/253/271 200/181/200\nf 199/180/199 273/256/273 274/257/274\nf 199/180/199 274/257/274 272/255/272\nf 276/258/276 267/251/267 268/250/268\nf 276/258/276 268/250/268 275/259/275\nf 275/259/275 268/250/268 269/254/269\nf 275/259/275 269/254/269 277/260/277\nf 93/71/93 77/54/77 193/173/193\nf 93/71/93 193/173/193 192/172/192\nf 279/261/279 280/262/280 281/263/281\nf 279/261/279 281/263/281 278/264/278\nf 278/264/278 88/66/88 96/74/96\nf 278/264/278 96/74/96 279/261/279\nf 282/265/282 283/266/283 62/39/62\nf 282/265/282 62/39/62 94/72/94\nf 281/263/281 284/267/284 285/268/285\nf 281/263/281 285/268/285 278/264/278\nf 287/269/287 288/270/288 289/271/289\nf 287/269/287 289/271/289 286/272/286\nf 63/40/63 62/39/62 283/266/283\nf 63/40/63 283/266/283 290/273/290\nf 283/266/283 291/274/291 292/275/292\nf 283/266/283 292/275/292 290/273/290\nf 293/276/293 294/277/294 68/45/68\nf 293/276/293 68/45/68 67/44/67\nf 296/278/296 297/279/297 298/280/298\nf 296/278/296 298/280/298 295/281/295\nf 300/282/300 301/283/301 302/284/302\nf 300/282/300 302/284/302 299/285/299\nf 304/286/304 305/287/305 306/288/306\nf 304/286/304 306/288/306 303/289/303\nf 138/117/138 137/116/137 308/290/308\nf 138/117/138 308/290/308 307/291/307\nf 165/147/165 310/292/310 311/293/311\nf 165/147/165 311/293/311 309/294/309\nf 312/295/312 55/32/55 54/31/54\nf 312/295/312 54/31/54 151/131/151\nf 314/296/314 151/131/151 150/130/150\nf 314/296/314 150/130/150 313/297/313\nf 315/298/315 316/299/316 227/207/227\nf 315/298/315 227/207/227 230/211/230\nf 136/113/136 317/300/317 158/138/158\nf 136/113/136 158/138/158 157/141/157\nf 319/301/319 148/128/148 147/127/147\nf 319/301/319 147/127/147 318/302/318\nf 320/303/320 321/304/321 147/127/147\nf 320/303/320 147/127/147 146/126/146\nf 323/305/323 324/306/324 325/307/325\nf 323/305/323 325/307/325 322/308/322\nf 80/57/80 88/66/88 278/264/278\nf 80/57/80 278/264/278 285/268/285\nf 327/309/327 145/129/145 148/128/148\nf 327/309/327 148/128/148 326/310/326\nf 279/261/279 286/272/286 289/271/289\nf 279/261/279 289/271/289 280/262/280\nf 329/311/329 330/312/330 331/313/331\nf 329/311/329 331/313/331 328/314/328\nf 187/167/187 202/182/202 104/82/104\nf 187/167/187 104/82/104 332/315/332\nf 236/217/236 332/315/332 191/171/191\nf 236/217/236 191/171/191 190/174/190\nf 165/147/165 166/146/166 333/316/333\nf 165/147/165 333/316/333 310/292/310\nf 139/119/139 334/317/334 48/318/48\nf 139/119/139 48/318/48 43/120/43\nf 336/319/336 337/320/337 338/321/338\nf 336/319/336 338/321/338 335/322/335\nf 51/28/51 324/306/324 182/163/182\nf 51/28/51 182/163/182 52/29/52\nf 339/323/339 126/103/126 53/34/53\nf 339/323/339 53/34/53 56/33/56\nf 340/324/340 341/325/341 149/132/149\nf 340/324/340 149/132/149 152/133/152\nf 243/224/243 343/326/343 344/327/344\nf 243/224/243 344/327/344 342/328/342\nf 346/329/346 343/326/343 240/220/240\nf 346/329/346 240/220/240 345/330/345\nf 348/331/348 349/332/349 350/333/350\nf 348/331/348 350/333/350 347/334/347\nf 351/335/351 352/336/352 213/193/213\nf 351/335/351 213/193/213 212/192/212\nf 128/105/128 182/163/182 183/164/183\nf 128/105/128 183/164/183 134/111/134\nf 103/81/103 98/75/98 354/337/354\nf 103/81/103 354/337/354 353/338/353\nf 114/91/114 113/94/113 356/339/356\nf 114/91/114 356/339/356 355/340/355\nf 358/341/358 197/179/197 198/178/198\nf 358/341/358 198/178/198 357/342/357\nf 107/84/107 359/343/359 360/344/360\nf 107/84/107 360/344/360 108/85/108\nf 348/331/348 361/345/361 362/346/362\nf 348/331/348 362/346/362 349/332/349\nf 347/334/347 363/347/363 234/214/234\nf 347/334/347 234/214/234 348/331/348\nf 220/200/220 231/212/231 167/151/167\nf 220/200/220 167/151/167 364/348/364\nf 153/137/153 366/349/366 300/282/300\nf 153/137/153 300/282/300 365/350/365\nf 295/281/295 72/49/72 71/48/71\nf 295/281/295 71/48/71 296/278/296\nf 179/162/179 339/323/339 367/351/367\nf 179/162/179 367/351/367 180/160/180\nf 368/352/368 369/353/369 158/138/158\nf 368/352/368 158/138/158 317/300/317\nf 317/300/317 136/113/136 55/32/55\nf 317/300/317 55/32/55 312/295/312\nf 371/354/371 372/355/372 373/356/373\nf 371/354/371 373/356/373 370/357/370\nf 41/358/41 26/359/26 306/288/306\nf 41/358/41 306/288/306 305/287/305\nf 305/287/305 137/116/137 37/115/37\nf 305/287/305 37/115/37 41/358/41\nf 248/230/248 374/360/374 375/361/375\nf 248/230/248 375/361/375 141/122/141\nf 66/43/66 325/307/325 324/306/324\nf 66/43/66 324/306/324 51/28/51\nf 183/164/183 323/305/323 376/362/376\nf 183/164/183 376/362/376 184/165/184\nf 378/363/378 253/233/253 267/251/267\nf 378/363/378 267/251/267 377/364/377\nf 269/254/269 271/253/271 379/365/379\nf 269/254/269 379/365/379 277/260/277\nf 381/366/381 382/367/382 383/368/383\nf 381/366/381 383/368/383 380/369/380\nf 384/370/384 385/371/385 105/86/105\nf 384/370/384 105/86/105 110/88/110\nf 105/86/105 385/371/385 386/372/386\nf 105/86/105 386/372/386 106/83/106\nf 360/344/360 387/373/387 109/87/109\nf 360/344/360 109/87/109 108/85/108\nf 181/161/181 180/160/180 164/144/164\nf 181/161/181 164/144/164 163/143/163\nf 365/350/365 388/374/388 154/134/154\nf 365/350/365 154/134/154 153/137/153\nf 168/148/168 167/151/167 231/212/231\nf 168/148/168 231/212/231 226/206/226\nf 81/58/81 291/274/291 283/266/283\nf 81/58/81 283/266/283 282/265/282\nf 272/255/272 389/375/389 379/365/379\nf 272/255/272 379/365/379 271/253/271\nf 274/257/274 390/376/390 389/375/389\nf 274/257/274 389/375/389 272/255/272\nf 139/119/139 375/361/375 374/360/374\nf 139/119/139 374/360/374 334/317/334\nf 391/377/391 366/349/366 153/137/153\nf 391/377/391 153/137/153 156/136/156\nf 392/378/392 393/379/393 366/349/366\nf 392/378/392 366/349/366 391/377/391\nf 173/154/173 200/181/200 270/252/270\nf 173/154/173 270/252/270 394/380/394\nf 301/283/301 300/282/300 366/349/366\nf 301/283/301 366/349/366 393/379/393\nf 396/381/396 397/382/397 398/383/398\nf 396/381/396 398/383/398 395/384/395\nf 399/385/399 364/348/364 167/151/167\nf 399/385/399 167/151/167 170/150/170\nf 394/380/394 251/231/251 399/385/399\nf 394/380/394 399/385/399 170/150/170\nf 270/252/270 252/232/252 251/231/251\nf 270/252/270 251/231/251 394/380/394\nf 102/80/102 112/90/112 400/386/400\nf 102/80/102 400/386/400 209/191/209\nf 131/108/131 401/387/401 372/355/372\nf 131/108/131 372/355/372 371/354/371\nf 391/377/391 156/136/156 165/147/165\nf 391/377/391 165/147/165 309/294/309\nf 403/388/403 404/389/404 405/390/405\nf 403/388/403 405/390/405 402/391/402\nf 402/391/402 392/378/392 391/377/391\nf 402/391/402 391/377/391 309/294/309\nf 35/392/35 310/292/310 333/316/333\nf 35/392/35 333/316/333 25/393/25\nf 35/392/35 34/394/34 311/293/311\nf 35/392/35 311/293/311 310/292/310\nf 34/394/34 33/395/33 403/388/403\nf 34/394/34 403/388/403 311/293/311\nf 406/396/406 262/245/262 217/197/217\nf 406/396/406 217/197/217 255/236/255\nf 377/364/377 407/397/407 408/398/408\nf 377/364/377 408/398/408 406/396/406\nf 117/98/117 378/363/378 255/236/255\nf 117/98/117 255/236/255 118/95/118\nf 270/252/270 269/254/269 268/250/268\nf 270/252/270 268/250/268 252/232/252\nf 304/286/304 303/289/303 373/356/373\nf 304/286/304 373/356/373 372/355/372\nf 362/346/362 409/399/409 410/400/410\nf 362/346/362 410/400/410 349/332/349\nf 411/401/411 412/402/412 89/70/89\nf 411/401/411 89/70/89 92/69/92\nf 414/403/414 411/401/411 415/404/415\nf 414/403/414 415/404/415 413/405/413\nf 417/406/417 336/319/336 418/407/418\nf 417/406/417 418/407/418 416/408/416\nf 337/320/337 419/409/419 69/50/69\nf 337/320/337 69/50/69 72/49/72\nf 421/410/421 422/411/422 423/412/423\nf 421/410/421 423/412/423 420/413/420\nf 421/410/421 424/414/424 425/415/425\nf 421/410/421 425/415/425 422/411/422\nf 423/412/423 422/411/422 427/416/427\nf 423/412/423 427/416/427 426/417/426\nf 239/223/239 242/222/242 428/418/428\nf 239/223/239 428/418/428 425/415/425\nf 430/419/430 73/52/73 74/51/74\nf 430/419/430 74/51/74 429/420/429\nf 70/47/70 69/50/69 419/409/419\nf 70/47/70 419/409/419 429/420/429\nf 247/228/247 431/421/431 116/93/116\nf 247/228/247 116/93/116 115/92/115\nf 346/329/346 345/330/345 433/422/433\nf 346/329/346 433/422/433 432/423/432\nf 433/422/433 421/410/421 420/413/420\nf 433/422/433 420/413/420 434/424/434\nf 436/425/436 437/426/437 438/427/438\nf 436/425/436 438/427/438 435/428/435\nf 437/426/437 381/366/381 380/369/380\nf 437/426/437 380/369/380 438/427/438\nf 178/159/178 177/158/177 440/429/440\nf 178/159/178 440/429/440 439/430/439\nf 440/429/440 441/431/441 442/432/442\nf 440/429/440 442/432/442 439/430/439\nf 444/433/444 445/434/445 446/435/446\nf 444/433/444 446/435/446 443/436/443\nf 324/306/324 323/305/323 183/164/183\nf 324/306/324 183/164/183 182/163/182\nf 213/193/213 352/336/352 357/342/357\nf 213/193/213 357/342/357 198/178/198\nf 214/194/214 175/155/175 174/157/174\nf 214/194/214 174/157/174 225/205/225\nf 448/437/448 449/438/449 450/439/450\nf 448/437/448 450/439/450 447/440/447\nf 423/412/423 426/417/426 451/441/451\nf 423/412/423 451/441/451 447/440/447\nf 75/56/75 451/441/451 426/417/426\nf 75/56/75 426/417/426 76/53/76\nf 78/55/78 94/72/94 62/39/62\nf 78/55/78 62/39/62 61/42/61\nf 286/272/286 86/63/86 85/62/85\nf 286/272/286 85/62/85 287/269/287\nf 95/73/95 87/65/87 209/191/209\nf 95/73/95 209/191/209 400/386/400\nf 237/218/237 452/442/452 428/418/428\nf 237/218/237 428/418/428 242/222/242\nf 190/174/190 193/173/193 194/175/194\nf 190/174/190 194/175/194 452/442/452\nf 237/218/237 236/217/236 190/174/190\nf 237/218/237 190/174/190 452/442/452\nf 79/60/79 82/59/82 354/337/354\nf 79/60/79 354/337/354 210/190/210\nf 286/272/286 279/261/279 96/74/96\nf 286/272/286 96/74/96 86/63/86\nf 430/419/430 417/406/417 416/408/416\nf 430/419/430 416/408/416 453/443/453\nf 338/321/338 295/281/295 298/280/298\nf 338/321/338 298/280/298 299/285/299\nf 57/38/57 60/37/60 455/444/455\nf 57/38/57 455/444/455 454/445/454\nf 212/192/212 456/446/456 457/447/457\nf 212/192/212 457/447/457 351/335/351\nf 83/64/83 355/340/355 356/339/356\nf 83/64/83 356/339/356 84/61/84\nf 142/123/142 141/122/141 375/361/375\nf 142/123/142 375/361/375 307/291/307\nf 401/387/401 142/123/142 307/291/307\nf 401/387/401 307/291/307 308/290/308\nf 459/448/459 257/237/257 256/240/256\nf 459/448/459 256/240/256 458/449/458\nf 228/210/228 264/246/264 258/238/258\nf 228/210/228 258/238/258 222/202/222\nf 256/240/256 260/242/260 460/450/460\nf 256/240/256 460/450/460 458/449/458\nf 460/450/460 260/242/260 29/244/29\nf 460/450/460 29/244/29 47/451/47\nf 263/247/263 265/249/265 261/241/261\nf 263/247/263 261/241/261 259/239/259\nf 461/452/461 462/453/462 189/169/189\nf 461/452/461 189/169/189 244/225/244\nf 227/207/227 316/299/316 463/454/463\nf 227/207/227 463/454/463 224/208/224\nf 465/455/465 466/456/466 410/400/410\nf 465/455/465 410/400/410 464/457/464\nf 90/67/90 386/372/386 385/371/385\nf 90/67/90 385/371/385 91/68/91\nf 233/213/233 361/345/361 348/331/348\nf 233/213/233 348/331/348 234/214/234\nf 235/215/235 234/214/234 363/347/363\nf 235/215/235 363/347/363 467/458/467\nf 338/321/338 337/320/337 72/49/72\nf 338/321/338 72/49/72 295/281/295\nf 338/321/338 299/285/299 302/284/302\nf 338/321/338 302/284/302 335/322/335\nf 468/459/468 469/460/469 470/461/470\nf 468/459/468 470/461/470 415/404/415\nf 347/334/347 471/462/471 472/463/472\nf 347/334/347 472/463/472 363/347/363\nf 471/462/471 347/334/347 350/333/350\nf 471/462/471 350/333/350 473/464/473\nf 465/455/465 475/465/475 476/466/476\nf 465/455/465 476/466/476 474/467/474\nf 384/370/384 110/88/110 478/468/478\nf 384/370/384 478/468/478 477/469/477\nf 414/403/414 479/470/479 412/402/412\nf 414/403/414 412/402/412 411/401/411\nf 288/270/288 287/269/287 412/402/412\nf 288/270/288 412/402/412 479/470/479\nf 85/62/85 84/61/84 90/67/90\nf 85/62/85 90/67/90 89/70/89\nf 386/372/386 356/339/356 113/94/113\nf 386/372/386 113/94/113 106/83/106\nf 232/216/232 358/341/358 357/342/357\nf 232/216/232 357/342/357 233/213/233\nf 297/279/297 296/278/296 181/161/181\nf 297/279/297 181/161/181 163/143/163\nf 419/409/419 337/320/337 336/319/336\nf 419/409/419 336/319/336 417/406/417\nf 49/30/49 52/29/52 127/104/127\nf 49/30/49 127/104/127 179/162/179\nf 26/359/26 25/393/25 333/316/333\nf 26/359/26 333/316/333 306/288/306\nf 371/354/371 370/357/370 162/142/162\nf 371/354/371 162/142/162 161/145/161\nf 258/238/258 257/237/257 223/203/223\nf 258/238/258 223/203/223 222/202/222\nf 257/237/257 459/448/459 480/471/480\nf 257/237/257 480/471/480 223/203/223\nf 211/195/211 214/194/214 225/205/225\nf 211/195/211 225/205/225 224/208/224\nf 316/299/316 481/472/481 314/296/314\nf 316/299/316 314/296/314 463/454/463\nf 171/152/171 169/149/169 168/148/168\nf 171/152/171 168/148/168 174/157/174\nf 273/256/273 199/180/199 172/153/172\nf 273/256/273 172/153/172 482/473/482\nf 168/148/168 226/206/226 225/205/225\nf 168/148/168 225/205/225 174/157/174\nf 245/226/245 246/227/246 111/89/111\nf 245/226/245 111/89/111 101/79/101\nf 114/91/114 112/90/112 111/89/111\nf 114/91/114 111/89/111 115/92/115\nf 210/190/210 354/337/354 98/75/98\nf 210/190/210 98/75/98 97/78/97\nf 431/421/431 358/341/358 232/216/232\nf 431/421/431 232/216/232 359/343/359\nf 235/215/235 360/344/360 359/343/359\nf 235/215/235 359/343/359 232/216/232\nf 360/344/360 235/215/235 467/458/467\nf 360/344/360 467/458/467 387/373/387\nf 81/58/81 282/265/282 483/474/483\nf 81/58/81 483/474/483 82/59/82\nf 485/475/485 486/476/486 487/477/487\nf 485/475/485 487/477/487 484/478/484\nf 489/479/489 68/45/68 294/277/294\nf 489/479/489 294/277/294 488/480/488\nf 491/481/491 454/445/454 455/444/455\nf 491/481/491 455/444/455 490/482/490\nf 154/134/154 370/357/370 373/356/373\nf 154/134/154 373/356/373 155/135/155\nf 491/481/491 322/308/322 325/307/325\nf 491/481/491 325/307/325 492/483/492\nf 491/481/491 490/482/490 493/484/493\nf 491/481/491 493/484/493 322/308/322\nf 436/425/436 435/428/435 446/435/446\nf 436/425/436 446/435/446 494/485/494\nf 495/486/495 496/487/496 438/427/438\nf 495/486/495 438/427/438 380/369/380\nf 496/487/496 497/488/497 435/428/435\nf 496/487/496 435/428/435 438/427/438\nf 331/313/331 330/312/330 498/489/498\nf 331/313/331 498/489/498 432/423/432\nf 499/490/499 346/329/346 432/423/432\nf 499/490/499 432/423/432 498/489/498\nf 380/369/380 383/368/383 500/491/500\nf 380/369/380 500/491/500 495/486/495\nf 501/492/501 328/314/328 331/313/331\nf 501/492/501 331/313/331 434/424/434\nf 499/490/499 344/327/344 343/326/343\nf 499/490/499 343/326/343 346/329/346\nf 492/483/492 502/493/502 454/445/454\nf 492/483/492 454/445/454 491/481/491\nf 454/445/454 502/493/502 487/477/487\nf 454/445/454 487/477/487 57/38/57\nf 486/476/486 58/35/58 57/38/57\nf 486/476/486 57/38/57 487/477/487\nf 58/35/58 486/476/486 503/494/503\nf 58/35/58 503/494/503 382/367/382\nf 383/368/383 504/495/504 505/496/505\nf 383/368/383 505/496/505 500/491/500\nf 447/440/447 450/439/450 420/413/420\nf 447/440/447 420/413/420 423/412/423\nf 329/311/329 328/314/328 445/434/445\nf 329/311/329 445/434/445 444/433/444\nf 450/439/450 449/438/449 506/497/506\nf 450/439/450 506/497/506 501/492/501\nf 507/498/507 508/499/508 451/441/451\nf 507/498/507 451/441/451 75/56/75\nf 99/76/99 104/82/104 202/182/202\nf 99/76/99 202/182/202 196/176/196\nf 509/500/509 208/189/208 201/184/201\nf 509/500/509 201/184/201 203/183/203\nf 201/184/201 204/188/204 195/177/195\nf 201/184/201 195/177/195 196/176/196\nf 462/453/462 510/501/510 186/170/186\nf 462/453/462 186/170/186 189/169/189\nf 203/183/203 186/170/186 510/501/510\nf 203/183/203 510/501/510 509/500/509\nf 148/128/148 319/301/319 341/325/341\nf 148/128/148 341/325/341 326/310/326\nf 326/310/326 341/325/341 340/324/340\nf 326/310/326 340/324/340 511/502/511\nf 123/100/123 511/502/511 340/324/340\nf 123/100/123 340/324/340 133/112/133\nf 71/48/71 49/30/49 181/161/181\nf 71/48/71 181/161/181 296/278/296\nf 154/134/154 388/374/388 162/142/162\nf 154/134/154 162/142/162 370/357/370\nf 155/135/155 373/356/373 303/289/303\nf 155/135/155 303/289/303 166/146/166\nf 166/146/166 303/289/303 306/288/306\nf 166/146/166 306/288/306 333/316/333\nf 512/503/512 320/303/320 289/271/289\nf 512/503/512 289/271/289 288/270/288\nf 479/470/479 414/403/414 514/504/514\nf 479/470/479 514/504/514 513/505/513\nf 414/403/414 413/405/413 475/465/475\nf 414/403/414 475/465/475 514/504/514\nf 513/505/513 512/503/512 288/270/288\nf 513/505/513 288/270/288 479/470/479\nf 191/171/191 103/81/103 353/338/353\nf 191/171/191 353/338/353 192/172/192\nf 332/315/332 104/82/104 103/81/103\nf 332/315/332 103/81/103 191/171/191\nf 82/59/82 483/474/483 353/338/353\nf 82/59/82 353/338/353 354/337/354\nf 83/64/83 86/63/86 96/74/96\nf 83/64/83 96/74/96 95/73/95\nf 83/64/83 95/73/95 400/386/400\nf 83/64/83 400/386/400 355/340/355\nf 355/340/355 400/386/400 112/90/112\nf 355/340/355 112/90/112 114/91/114\nf 144/124/144 135/114/135 136/113/136\nf 144/124/144 136/113/136 157/141/157\nf 298/280/298 365/350/365 300/282/300\nf 298/280/298 300/282/300 299/285/299\nf 298/280/298 297/279/297 388/374/388\nf 298/280/298 388/374/388 365/350/365\nf 367/351/367 143/125/143 164/144/164\nf 367/351/367 164/144/164 180/160/180\nf 515/506/515 516/507/516 219/201/219\nf 515/506/515 219/201/219 215/199/215\nf 254/235/254 217/197/217 216/196/216\nf 254/235/254 216/196/216 517/508/517\nf 398/383/398 364/348/364 399/385/399\nf 398/383/398 399/385/399 395/384/395\nf 398/383/398 397/382/397 517/508/517\nf 398/383/398 517/508/517 216/196/216\nf 518/509/518 519/510/519 246/227/246\nf 518/509/518 246/227/246 245/226/245\nf 319/301/319 150/130/150 149/132/149\nf 319/301/319 149/132/149 341/325/341\nf 429/420/429 419/409/419 417/406/417\nf 429/420/429 417/406/417 430/419/430\nf 33/395/33 46/511/46 404/389/404\nf 33/395/33 404/389/404 403/388/403\nf 403/388/403 402/391/402 309/294/309\nf 403/388/403 309/294/309 311/293/311\nf 393/379/393 520/512/520 521/513/521\nf 393/379/393 521/513/521 301/283/301\nf 522/514/522 520/512/520 393/379/393\nf 522/514/522 393/379/393 392/378/392\nf 302/284/302 301/283/301 521/513/521\nf 302/284/302 521/513/521 523/515/523\nf 302/284/302 523/515/523 524/516/524\nf 302/284/302 524/516/524 335/322/335\nf 321/304/321 456/446/456 318/302/318\nf 321/304/321 318/302/318 147/127/147\nf 456/446/456 321/304/321 525/517/525\nf 456/446/456 525/517/525 457/447/457\nf 410/400/410 409/399/409 526/518/526\nf 410/400/410 526/518/526 464/457/464\nf 410/400/410 466/456/466 350/333/350\nf 410/400/410 350/333/350 349/332/349\nf 456/446/456 212/192/212 211/195/211\nf 456/446/456 211/195/211 527/519/527\nf 211/195/211 224/208/224 463/454/463\nf 211/195/211 463/454/463 527/519/527\nf 407/397/407 377/364/377 267/251/267\nf 407/397/407 267/251/267 276/258/276\nf 378/363/378 377/364/377 406/396/406\nf 378/363/378 406/396/406 255/236/255\nf 175/155/175 214/194/214 213/193/213\nf 175/155/175 213/193/213 198/178/198\nf 386/372/386 90/67/90 84/61/84\nf 386/372/386 84/61/84 356/339/356\nf 409/399/409 362/346/362 351/335/351\nf 409/399/409 351/335/351 457/447/457\nf 85/62/85 89/70/89 412/402/412\nf 85/62/85 412/402/412 287/269/287\nf 361/345/361 233/213/233 357/342/357\nf 361/345/361 357/342/357 352/336/352\nf 116/93/116 431/421/431 359/343/359\nf 116/93/116 359/343/359 107/84/107\nf 116/93/116 107/84/107 106/83/106\nf 116/93/116 106/83/106 113/94/113\nf 352/336/352 351/335/351 362/346/362\nf 352/336/352 362/346/362 361/345/361\nf 513/505/513 514/504/514 464/457/464\nf 513/505/513 464/457/464 526/518/526\nf 526/518/526 409/399/409 457/447/457\nf 526/518/526 457/447/457 525/517/525\nf 514/504/514 475/465/475 465/455/465\nf 514/504/514 465/455/465 464/457/464\nf 358/341/358 431/421/431 247/228/247\nf 358/341/358 247/228/247 197/179/197\nf 176/156/176 482/473/482 172/153/172\nf 176/156/176 172/153/172 171/152/171\nf 396/381/396 395/384/395 250/234/250\nf 396/381/396 250/234/250 119/96/119\nf 395/384/395 399/385/399 251/231/251\nf 395/384/395 251/231/251 250/234/250\nf 291/274/291 81/58/81 80/57/80\nf 291/274/291 80/57/80 285/268/285\nf 284/267/284 292/275/292 291/274/291\nf 284/267/284 291/274/291 285/268/285\nf 528/520/528 327/309/327 326/310/326\nf 528/520/528 326/310/326 511/502/511\nf 126/103/126 125/106/125 152/133/152\nf 126/103/126 152/133/152 53/34/53\nf 152/133/152 125/106/125 133/112/133\nf 152/133/152 133/112/133 340/324/340\nf 127/104/127 126/103/126 339/323/339\nf 127/104/127 339/323/339 179/162/179\nf 56/33/56 135/114/135 367/351/367\nf 56/33/56 367/351/367 339/323/339\nf 124/101/124 123/100/123 133/112/133\nf 124/101/124 133/112/133 134/111/134\nf 143/125/143 367/351/367 135/114/135\nf 143/125/143 135/114/135 144/124/144\nf 164/144/164 143/125/143 132/109/132\nf 164/144/164 132/109/132 161/145/161\nf 401/387/401 131/108/131 130/107/130\nf 401/387/401 130/107/130 142/123/142\nf 292/275/292 528/520/528 122/99/122\nf 292/275/292 122/99/122 290/273/290\nf 61/42/61 507/498/507 75/56/75\nf 61/42/61 75/56/75 78/55/78\nf 320/303/320 512/503/512 525/517/525\nf 320/303/320 525/517/525 321/304/321\nf 512/503/512 513/505/513 526/518/526\nf 512/503/512 526/518/526 525/517/525\nf 123/100/123 122/99/122 528/520/528\nf 123/100/123 528/520/528 511/502/511\nf 262/245/262 529/521/529 229/209/229\nf 262/245/262 229/209/229 221/204/221\nf 316/299/316 315/298/315 368/352/368\nf 316/299/316 368/352/368 481/472/481\nf 516/507/516 315/298/315 230/211/230\nf 516/507/516 230/211/230 219/201/219\nf 515/506/515 530/522/530 369/353/369\nf 515/506/515 369/353/369 516/507/516\nf 530/522/530 515/506/515 223/203/223\nf 530/522/530 223/203/223 480/471/480\nf 215/199/215 218/198/218 223/203/223\nf 215/199/215 223/203/223 515/506/515\nf 459/448/459 458/449/458 374/360/374\nf 459/448/459 374/360/374 248/230/248\nf 458/449/458 460/450/460 334/317/334\nf 458/449/458 334/317/334 374/360/374\nf 334/317/334 460/450/460 47/451/47\nf 334/317/334 47/451/47 48/318/48\nf 459/448/459 248/230/248 249/229/249\nf 459/448/459 249/229/249 480/471/480\nf 253/233/253 120/97/120 119/96/119\nf 253/233/253 119/96/119 250/234/250\nf 394/380/394 170/150/170 169/149/169\nf 394/380/394 169/149/169 173/154/173\nf 519/510/519 482/473/482 176/156/176\nf 519/510/519 176/156/176 197/179/197\nf 518/509/518 273/256/273 482/473/482\nf 518/509/518 482/473/482 519/510/519\nf 531/523/531 274/257/274 273/256/273\nf 531/523/531 273/256/273 518/509/518\nf 532/524/532 390/376/390 274/257/274\nf 532/524/532 274/257/274 531/523/531\nf 343/326/343 243/224/243 241/221/241\nf 343/326/343 241/221/241 240/220/240\nf 188/168/188 238/219/238 244/225/244\nf 188/168/188 244/225/244 189/169/189\nf 187/167/187 332/315/332 236/217/236\nf 187/167/187 236/217/236 188/168/188\nf 447/440/447 451/441/451 508/499/508\nf 447/440/447 508/499/508 448/437/448\nf 162/142/162 388/374/388 297/279/297\nf 162/142/162 297/279/297 163/143/163\nf 392/378/392 402/391/402 405/390/405\nf 392/378/392 405/390/405 522/514/522\nf 533/525/533 413/405/413 415/404/415\nf 533/525/533 415/404/415 470/461/470\nf 534/526/534 65/46/65 68/45/68\nf 534/526/534 68/45/68 489/479/489\nf 502/493/502 535/527/535 484/478/484\nf 502/493/502 484/478/484 487/477/487\nf 503/494/503 536/528/536 537/529/537\nf 503/494/503 537/529/537 504/495/504\nf 492/483/492 538/530/538 535/527/535\nf 492/483/492 535/527/535 502/493/502\nf 492/483/492 325/307/325 66/43/66\nf 492/483/492 66/43/66 65/46/65\nf 504/495/504 537/529/537 539/531/539\nf 504/495/504 539/531/539 505/496/505\nf 239/223/239 424/414/424 345/330/345\nf 239/223/239 345/330/345 240/220/240\nf 59/36/59 58/35/58 382/367/382\nf 59/36/59 382/367/382 381/366/381\nf 432/423/432 433/422/433 434/424/434\nf 432/423/432 434/424/434 331/313/331\nf 437/426/437 436/425/436 440/429/440\nf 437/426/437 440/429/440 177/158/177\nf 381/366/381 437/426/437 177/158/177\nf 381/366/381 177/158/177 59/36/59\nf 449/438/449 441/431/441 494/485/494\nf 449/438/449 494/485/494 506/497/506\nf 450/439/450 501/492/501 434/424/434\nf 450/439/450 434/424/434 420/413/420\nf 382/367/382 503/494/503 504/495/504\nf 382/367/382 504/495/504 383/368/383\nf 501/492/501 506/497/506 445/434/445\nf 501/492/501 445/434/445 328/314/328\nf 536/528/536 503/494/503 486/476/486\nf 536/528/536 486/476/486 485/475/485\nf 313/297/313 150/130/150 319/301/319\nf 313/297/313 319/301/319 318/302/318\nf 327/309/327 284/267/284 281/263/281\nf 327/309/327 281/263/281 145/129/145\nf 483/474/483 93/71/93 192/172/192\nf 483/474/483 192/172/192 353/338/353\nf 483/474/483 282/265/282 94/72/94\nf 483/474/483 94/72/94 93/71/93\nf 422/411/422 425/415/425 428/418/428\nf 422/411/422 428/418/428 427/416/427\nf 421/410/421 433/422/433 345/330/345\nf 421/410/421 345/330/345 424/414/424\nf 463/454/463 314/296/314 313/297/313\nf 463/454/463 313/297/313 527/519/527\nf 315/298/315 516/507/516 369/353/369\nf 315/298/315 369/353/369 368/352/368\nf 314/296/314 481/472/481 312/295/312\nf 314/296/314 312/295/312 151/131/151\nf 368/352/368 317/300/317 312/295/312\nf 368/352/368 312/295/312 481/472/481\nf 369/353/369 530/522/530 159/139/159\nf 369/353/369 159/139/159 158/138/158\nf 480/471/480 249/229/249 159/139/159\nf 480/471/480 159/139/159 530/522/530\nf 262/245/262 406/396/406 408/398/408\nf 262/245/262 408/398/408 529/521/529\nf 398/383/398 216/196/216 220/200/220\nf 398/383/398 220/200/220 364/348/364\nf 541/532/541 542/533/542 543/534/543\nf 541/532/541 543/534/543 540/535/540\nf 545/536/545 543/534/543 542/533/542\nf 545/536/545 542/533/542 544/537/544\nf 547/538/547 545/536/545 544/537/544\nf 547/538/547 544/537/544 546/539/546\nf 549/540/549 547/538/547 546/539/546\nf 549/540/549 546/539/546 548/541/548\nf 551/542/551 549/540/549 548/541/548\nf 551/542/551 548/541/548 550/543/550\nf 553/544/553 551/542/551 550/543/550\nf 553/544/553 550/543/550 552/545/552\nf 555/546/555 553/544/553 552/545/552\nf 555/546/555 552/545/552 554/547/554\nf 557/548/557 558/549/558 559/550/559\nf 557/548/557 559/550/559 556/551/556\nf 561/552/561 557/548/557 556/551/556\nf 561/552/561 556/551/556 560/553/560\nf 563/554/563 546/539/546 544/537/544\nf 563/554/563 544/537/544 562/555/562\nf 564/556/564 548/541/548 546/539/546\nf 564/556/564 546/539/546 563/554/563\nf 565/557/565 550/543/550 548/541/548\nf 565/557/565 548/541/548 564/556/564\nf 566/558/566 552/545/552 550/543/550\nf 566/558/566 550/543/550 565/557/565\nf 552/545/552 566/558/566 567/559/567\nf 552/545/552 567/559/567 554/547/554\nf 559/550/559 568/560/568 569/561/569\nf 559/550/559 569/561/569 556/551/556\nf 570/562/570 560/553/560 556/551/556\nf 570/562/570 556/551/556 569/561/569\nf 571/563/571 572/564/572 560/553/560\nf 571/563/571 560/553/560 570/562/570\nf 574/565/574 540/535/540 575/566/575\nf 574/565/574 575/566/575 573/567/573\nf 577/568/577 543/534/543 545/536/545\nf 577/568/577 545/536/545 576/569/576\nf 545/536/545 547/538/547 578/570/578\nf 545/536/545 578/570/578 576/569/576\nf 579/571/579 578/570/578 547/538/547\nf 579/571/579 547/538/547 549/540/549\nf 580/572/580 579/571/579 551/542/551\nf 580/572/580 551/542/551 553/544/553\nf 580/572/580 553/544/553 555/546/555\nf 580/572/580 555/546/555 581/573/581\nf 558/549/558 557/548/557 583/574/583\nf 558/549/558 583/574/583 582/575/582\nf 561/552/561 584/576/584 583/574/583\nf 561/552/561 583/574/583 557/548/557\nf 561/552/561 572/564/572 585/577/585\nf 561/552/561 585/577/585 584/576/584\nf 571/563/571 586/578/586 585/577/585\nf 571/563/571 585/577/585 572/564/572\nf 544/537/544 542/533/542 541/532/541\nf 544/537/544 541/532/541 562/555/562\nf 574/565/574 588/579/588 589/580/589\nf 574/565/574 589/580/589 587/581/587\nf 574/565/574 573/567/573 590/582/590\nf 574/565/574 590/582/590 588/579/588\nf 590/582/590 573/567/573 575/566/575\nf 590/582/590 575/566/575 591/583/591\nf 575/566/575 540/535/540 543/534/543\nf 575/566/575 543/534/543 591/583/591\nf 564/556/564 592/584/592 566/558/566\nf 564/556/564 566/558/566 565/557/565\nf 592/584/592 593/585/593 567/559/567\nf 592/584/592 567/559/567 566/558/566\nf 568/560/568 559/550/559 554/547/554\nf 568/560/568 554/547/554 567/559/567\nf 554/547/554 559/550/559 558/549/558\nf 554/547/554 558/549/558 555/546/555\nf 582/575/582 581/573/581 555/546/555\nf 582/575/582 555/546/555 558/549/558\nf 592/584/592 564/556/564 563/554/563\nf 592/584/592 563/554/563 562/555/562\nf 589/580/589 568/560/568 567/559/567\nf 589/580/589 567/559/567 593/585/593\nf 540/535/540 574/565/574 587/581/587\nf 540/535/540 587/581/587 541/532/541\nf 571/563/571 570/562/570 590/582/590\nf 571/563/571 590/582/590 591/583/591\nf 589/580/589 588/579/588 569/561/569\nf 589/580/589 569/561/569 568/560/568\nf 543/534/543 577/568/577 594/586/594\nf 543/534/543 594/586/594 591/583/591\nf 594/586/594 586/578/586 571/563/571\nf 594/586/594 571/563/571 591/583/591\nf 596/587/596 581/573/581 582/575/582\nf 596/587/596 582/575/582 595/588/595\nf 596/587/596 597/589/597 580/572/580\nf 596/587/596 580/572/580 581/573/581\nf 583/574/583 490/482/490 455/444/455\nf 583/574/583 455/444/455 595/588/595\nf 583/574/583 584/576/584 493/484/493\nf 583/574/583 493/484/493 490/482/490\nf 597/589/597 508/499/508 579/571/579\nf 597/589/597 579/571/579 580/572/580\nf 442/432/442 448/437/448 508/499/508\nf 442/432/442 508/499/508 597/589/597\nf 60/37/60 178/159/178 595/588/595\nf 60/37/60 595/588/595 455/444/455\nf 178/159/178 439/430/439 596/587/596\nf 178/159/178 596/587/596 595/588/595\nf 577/568/577 64/41/64 185/166/185\nf 577/568/577 185/166/185 594/586/594\nf 586/578/586 184/165/184 376/362/376\nf 586/578/586 376/362/376 585/577/585\nf 590/582/590 570/562/570 569/561/569\nf 590/582/590 569/561/569 588/579/588\nf 61/42/61 576/569/576 578/570/578\nf 61/42/61 578/570/578 507/498/507\nf 585/577/585 376/362/376 493/484/493\nf 585/577/585 493/484/493 584/576/584\nf 453/443/453 598/590/598 73/52/73\nf 453/443/453 73/52/73 430/419/430\nf 519/510/519 197/179/197 247/228/247\nf 519/510/519 247/228/247 246/227/246\nf 281/263/281 280/262/280 146/126/146\nf 281/263/281 146/126/146 145/129/145\nf 64/41/64 63/40/63 121/102/121\nf 64/41/64 121/102/121 185/166/185\nf 284/267/284 327/309/327 528/520/528\nf 284/267/284 528/520/528 292/275/292\nf 290/273/290 122/99/122 121/102/121\nf 290/273/290 121/102/121 63/40/63\nf 280/262/280 289/271/289 320/303/320\nf 280/262/280 320/303/320 146/126/146\nf 184/165/184 586/578/586 594/586/594\nf 184/165/184 594/586/594 185/166/185\nf 253/233/253 378/363/378 117/98/117\nf 253/233/253 117/98/117 120/97/120\nf 249/229/249 140/121/140 160/140/160\nf 249/229/249 160/140/160 159/139/159\nf 129/110/129 160/140/160 140/121/140\nf 129/110/129 140/121/140 130/107/130\nf 161/145/161 132/109/132 131/108/131\nf 161/145/161 131/108/131 371/354/371\nf 313/297/313 318/302/318 456/446/456\nf 313/297/313 456/446/456 527/519/527\nf 492/483/492 65/46/65 534/526/534\nf 492/483/492 534/526/534 538/530/538\nf 441/431/441 449/438/449 448/437/448\nf 441/431/441 448/437/448 442/432/442\nf 443/436/443 446/435/446 435/428/435\nf 443/436/443 435/428/435 497/488/497\nf 446/435/446 445/434/445 506/497/506\nf 446/435/446 506/497/506 494/485/494\nf 441/431/441 440/429/440 436/425/436\nf 441/431/441 436/425/436 494/485/494\nf 596/587/596 439/430/439 442/432/442\nf 596/587/596 442/432/442 597/589/597\nf 577/568/577 576/569/576 61/42/61\nf 577/568/577 61/42/61 64/41/64\nf 238/219/238 237/218/237 242/222/242\nf 238/219/238 242/222/242 241/221/241\nf 194/175/194 76/53/76 426/417/426\nf 194/175/194 426/417/426 427/416/427\nf 452/442/452 194/175/194 427/416/427\nf 452/442/452 427/416/427 428/418/428\nf 461/452/461 244/225/244 243/224/243\nf 461/452/461 243/224/243 342/328/342\nf 508/499/508 507/498/507 578/570/578\nf 508/499/508 578/570/578 579/571/579\nf 245/226/245 207/187/207 531/523/531\nf 245/226/245 531/523/531 518/509/518\nf 206/186/206 532/524/532 531/523/531\nf 206/186/206 531/523/531 207/187/207\nf 32/9/32 31/12/31 600/591/600\nf 32/9/32 600/591/600 599/592/599\nf 601/593/601 600/591/600 36/13/36\nf 601/593/601 36/13/36 24/1/24\nf 602/594/602 601/593/601 24/1/24\nf 602/594/602 24/1/24 23/4/23\nf 40/17/40 602/594/602 23/4/23\nf 40/17/40 23/4/23 42/19/42\nf 44/22/44 604/595/604 605/596/605\nf 44/22/44 605/596/605 603/597/603\nf 39/16/39 603/597/603 602/594/602\nf 39/16/39 602/594/602 40/17/40\nf 601/593/601 606/598/606 607/599/607\nf 601/593/601 607/599/607 600/591/600\nf 468/459/468 608/600/608 609/601/609\nf 468/459/468 609/601/609 469/460/469\nf 477/469/477 609/601/609 608/600/608\nf 477/469/477 608/600/608 384/370/384\nf 610/602/610 611/603/611 612/604/612\nf 610/602/610 612/604/612 472/605/472\nf 610/602/610 472/605/472 471/606/471\nf 610/602/610 471/606/471 613/607/613\nf 476/608/476 614/609/614 615/610/615\nf 476/608/476 615/610/615 474/611/474\nf 478/468/478 110/88/110 109/87/109\nf 478/468/478 109/87/109 616/612/616\nf 466/456/466 465/455/465 474/467/474\nf 466/456/466 474/467/474 617/613/617\nf 466/456/466 617/613/617 473/464/473\nf 466/456/466 473/464/473 350/333/350\nf 614/609/614 533/614/533 470/615/470\nf 614/609/614 470/615/470 618/616/618\nf 475/465/475 413/405/413 533/525/533\nf 475/465/475 533/525/533 476/466/476\nf 618/616/618 469/617/469 609/618/609\nf 618/616/618 609/618/609 619/619/619\nf 619/619/619 609/618/609 477/620/477\nf 619/619/619 477/620/477 620/621/620\nf 387/373/387 621/622/621 616/612/616\nf 387/373/387 616/612/616 109/87/109\nf 616/623/616 622/624/622 620/621/620\nf 616/623/616 620/621/620 478/625/478\nf 473/626/473 617/627/617 615/610/615\nf 473/626/473 615/610/615 613/607/613\nf 621/628/621 623/629/623 622/624/622\nf 621/628/621 622/624/622 616/623/616\nf 624/630/624 612/604/612 611/603/611\nf 624/630/624 611/603/611 623/629/623\nf 49/30/49 71/48/71 70/47/70\nf 49/30/49 70/47/70 50/27/50\nf 336/319/336 335/322/335 524/516/524\nf 336/319/336 524/516/524 418/407/418\nf 598/590/598 293/276/293 67/44/67\nf 598/590/598 67/44/67 73/52/73\nf 50/27/50 70/47/70 429/420/429\nf 50/27/50 429/420/429 74/51/74\nf 322/308/322 493/484/493 376/362/376\nf 322/308/322 376/362/376 323/305/323\nf 589/580/589 593/585/593 592/584/592\nf 589/580/589 592/584/592 587/581/587\nf 396/381/396 119/96/119 118/95/118\nf 396/381/396 118/95/118 254/235/254\nf 517/508/517 397/382/397 396/381/396\nf 517/508/517 396/381/396 254/235/254\nf 28/5/28 27/8/27 625/631/625\nf 28/5/28 625/631/625 604/595/604\nf 600/591/600 607/599/607 626/632/626\nf 600/591/600 626/632/626 599/592/599\nf 607/599/607 627/633/627 628/634/628\nf 607/599/607 628/634/628 626/632/626\nf 604/595/604 625/631/625 628/634/628\nf 604/595/604 628/634/628 627/633/627\nf 630/635/630 631/636/631 632/637/632\nf 630/635/630 632/637/632 629/638/629\nf 634/639/634 635/640/635 636/641/636\nf 634/639/634 636/641/636 633/642/633\nf 638/643/638 639/644/639 640/645/640\nf 638/643/638 640/645/640 637/646/637\nf 641/647/641 642/648/642 637/646/637\nf 641/647/641 637/646/637 640/645/640\nf 644/649/644 645/650/645 646/651/646\nf 644/649/644 646/651/646 643/652/643\nf 631/636/631 642/648/642 648/653/648\nf 631/636/631 648/653/648 647/654/647\nf 650/655/650 651/656/651 652/657/652\nf 650/655/650 652/657/652 649/658/649\nf 643/652/643 646/651/646 654/659/654\nf 643/652/643 654/659/654 653/660/653\nf 654/659/654 651/656/651 650/655/650\nf 654/659/654 650/655/650 653/660/653\nf 655/661/655 656/662/656 657/663/657\nf 655/661/655 657/663/657 632/637/632\nf 657/663/657 659/664/659 660/665/660\nf 657/663/657 660/665/660 658/666/658\nf 661/667/661 659/664/659 657/663/657\nf 661/667/661 657/663/657 656/662/656\nf 631/636/631 647/654/647 655/661/655\nf 631/636/631 655/661/655 632/637/632\nf 637/646/637 642/648/642 631/636/631\nf 637/646/637 631/636/631 630/635/630\nf 640/645/640 650/655/650 649/658/649\nf 640/645/640 649/658/649 641/647/641\nf 652/657/652 662/668/662 641/647/641\nf 652/657/652 641/647/641 649/658/649\nf 648/653/648 642/648/642 641/647/641\nf 648/653/648 641/647/641 662/668/662\nf 663/669/663 664/670/664 537/529/537\nf 663/669/663 537/529/537 536/528/536\nf 666/671/666 640/645/640 639/644/639\nf 666/671/666 639/644/639 665/672/665\nf 666/671/666 665/672/665 636/641/636\nf 666/671/666 636/641/636 635/640/635\nf 667/673/667 539/531/539 537/529/537\nf 667/673/667 537/529/537 664/670/664\nf 634/639/634 644/649/644 643/652/643\nf 634/639/634 643/652/643 635/640/635\nf 653/660/653 650/655/650 640/645/640\nf 653/660/653 640/645/640 666/671/666\nf 666/671/666 635/640/635 643/652/643\nf 666/671/666 643/652/643 653/660/653\nf 669/674/669 644/649/644 634/639/634\nf 669/674/669 634/639/634 668/675/668\nf 638/643/638 637/646/637 630/635/630\nf 638/643/638 630/635/630 670/676/670\nf 645/650/645 644/649/644 669/674/669\nf 645/650/645 669/674/669 671/677/671\nf 638/643/638 670/676/670 485/475/485\nf 638/643/638 485/475/485 484/478/484\nf 672/678/672 633/642/633 489/479/489\nf 672/678/672 489/479/489 488/480/488\nf 632/637/632 657/663/657 658/666/658\nf 632/637/632 658/666/658 629/638/629\nf 670/676/670 663/669/663 536/528/536\nf 670/676/670 536/528/536 485/475/485\nf 633/642/633 636/641/636 534/526/534\nf 633/642/633 534/526/534 489/479/489\nf 484/478/484 535/527/535 639/644/639\nf 484/478/484 639/644/639 638/643/638\nf 629/638/629 658/666/658 664/670/664\nf 629/638/629 664/670/664 663/669/663\nf 665/672/665 639/644/639 535/527/535\nf 665/672/665 535/527/535 538/530/538\nf 636/641/636 665/672/665 538/530/538\nf 636/641/636 538/530/538 534/526/534\nf 660/665/660 667/673/667 664/670/664\nf 660/665/660 664/670/664 658/666/658\nf 668/675/668 634/639/634 633/642/633\nf 668/675/668 633/642/633 672/678/672\nf 630/635/630 629/638/629 663/669/663\nf 630/635/630 663/669/663 670/676/670\nf 1/679/1 661/667/661 656/662/656\nf 1/679/1 656/662/656 22/680/22\nf 20/681/20 647/654/647 648/653/648\nf 20/681/20 648/653/648 18/682/18\nf 647/654/647 20/681/20 21/683/21\nf 647/654/647 21/683/21 655/661/655\nf 15/684/15 646/651/646 645/650/645\nf 15/684/15 645/650/645 13/685/13\nf 19/686/19 651/656/651 654/659/654\nf 19/686/19 654/659/654 14/687/14\nf 648/653/648 662/668/662 16/688/16\nf 648/653/648 16/688/16 18/682/18\nf 17/689/17 652/657/652 651/656/651\nf 17/689/17 651/656/651 19/686/19\nf 21/683/21 22/680/22 656/662/656\nf 21/683/21 656/662/656 655/661/655\nf 13/685/13 645/650/645 671/677/671\nf 13/685/13 671/677/671 2/690/2\nf 646/651/646 15/684/15 14/687/14\nf 646/651/646 14/687/14 654/659/654\nf 17/689/17 16/688/16 662/668/662\nf 17/689/17 662/668/662 652/657/652\nf 608/600/608 91/68/91 385/371/385\nf 608/600/608 385/371/385 384/370/384\nf 304/286/304 372/355/372 401/387/401\nf 304/286/304 401/387/401 308/290/308\nf 468/459/468 415/404/415 411/401/411\nf 468/459/468 411/401/411 92/69/92\nf 602/594/602 603/597/603 606/598/606\nf 602/594/602 606/598/606 601/593/601\nf 608/600/608 468/459/468 92/69/92\nf 608/600/608 92/69/92 91/68/91\nf 305/287/305 304/286/304 308/290/308\nf 305/287/305 308/290/308 137/116/137\nf 139/119/139 138/117/138 307/291/307\nf 139/119/139 307/291/307 375/361/375\nf 674/691/674 675/692/675 676/693/676\nf 674/691/674 676/693/676 673/694/673\nf 678/695/678 27/8/27 679/696/679\nf 678/695/678 679/696/679 677/697/677\nf 681/698/681 682/699/682 683/700/683\nf 681/698/681 683/700/683 680/701/680\nf 684/702/684 685/703/685 683/700/683\nf 684/702/684 683/700/683 682/699/682\nf 684/702/684 674/691/674 673/694/673\nf 684/702/684 673/694/673 685/703/685\nf 687/704/687 688/705/688 689/706/689\nf 687/704/687 689/706/689 686/707/686\nf 690/708/690 691/709/691 676/693/676\nf 690/708/690 676/693/676 675/692/675\nf 689/706/689 688/705/688 691/709/691\nf 689/706/689 691/709/691 690/708/690\nf 687/704/687 686/707/686 693/710/693\nf 687/704/687 693/710/693 692/711/692\nf 681/698/681 680/701/680 46/24/46\nf 681/698/681 46/24/46 45/23/45\nf 678/695/678 694/712/694 695/713/695\nf 678/695/678 695/713/695 693/710/693\nf 697/714/697 698/715/698 699/716/699\nf 697/714/697 699/716/699 696/717/696\nf 701/718/701 702/719/702 703/720/703\nf 701/718/701 703/720/703 700/721/700\nf 705/722/705 706/723/706 707/724/707\nf 705/722/705 707/724/707 704/725/704\nf 709/726/709 710/727/710 711/728/711\nf 709/726/709 711/728/711 708/729/708\nf 713/730/713 714/731/714 715/732/715\nf 713/730/713 715/732/715 712/733/712\nf 717/734/717 718/735/718 719/736/719\nf 717/734/717 719/736/719 716/737/716\nf 712/733/712 720/738/720 721/739/721\nf 712/733/712 721/739/721 713/730/713\nf 713/730/713 721/739/721 697/714/697\nf 713/730/713 697/714/697 696/717/696\nf 723/740/723 724/741/724 725/742/725\nf 723/740/723 725/742/725 722/743/722\nf 727/744/727 728/745/728 729/746/729\nf 727/744/727 729/746/729 726/747/726\nf 731/748/731 732/749/732 733/750/733\nf 731/748/731 733/750/733 730/751/730\nf 735/752/735 728/745/728 727/744/727\nf 735/752/735 727/744/727 734/753/734\nf 737/754/737 738/755/738 739/756/739\nf 737/754/737 739/756/739 736/757/736\nf 741/758/741 722/743/722 725/742/725\nf 741/758/741 725/742/725 740/759/740\nf 735/752/735 734/753/734 743/760/743\nf 735/752/735 743/760/743 742/761/742\nf 745/762/745 746/763/746 747/764/747\nf 745/762/745 747/764/747 744/765/744\nf 747/764/747 746/763/746 749/766/749\nf 747/764/747 749/766/749 748/767/748\nf 745/762/745 744/765/744 751/768/751\nf 745/762/745 751/768/751 750/769/750\nf 753/770/753 754/771/754 755/772/755\nf 753/770/753 755/772/755 752/773/752\nf 757/774/757 755/772/755 754/771/754\nf 757/774/757 754/771/754 756/775/756\nf 748/767/748 749/766/749 759/776/759\nf 748/767/748 759/776/759 758/777/758\nf 761/778/761 762/779/762 763/780/763\nf 761/778/761 763/780/763 760/781/760\nf 765/782/765 766/783/766 767/784/767\nf 765/782/765 767/784/767 764/785/764\nf 769/786/769 770/787/770 771/788/771\nf 769/786/769 771/788/771 768/789/768\nf 773/790/773 774/791/774 775/792/775\nf 773/790/773 775/792/775 772/793/772\nf 777/794/777 778/795/778 779/796/779\nf 777/794/777 779/796/779 776/797/776\nf 774/791/774 780/798/780 781/799/781\nf 774/791/774 781/799/781 775/792/775\nf 703/720/703 782/800/782 783/801/783\nf 703/720/703 783/801/783 700/721/700\nf 688/802/688 687/803/687 785/804/785\nf 688/802/688 785/804/785 784/805/784\nf 786/806/786 785/804/785 687/803/687\nf 786/806/786 687/803/687 692/807/692\nf 788/808/788 777/794/777 789/809/789\nf 788/808/788 789/809/789 787/810/787\nf 790/811/790 791/812/791 779/796/779\nf 790/811/790 779/796/779 778/795/778\nf 793/813/793 794/814/794 795/815/795\nf 793/813/793 795/815/795 792/816/792\nf 797/817/797 798/818/798 701/718/701\nf 797/817/797 701/718/701 796/819/796\nf 701/718/701 798/818/798 799/820/799\nf 701/718/701 799/820/799 702/719/702\nf 801/821/801 802/822/802 803/823/803\nf 801/821/801 803/823/803 800/824/800\nf 805/825/805 806/826/806 807/827/807\nf 805/825/805 807/827/807 804/828/804\nf 809/829/809 810/830/810 811/831/811\nf 809/829/809 811/831/811 808/832/808\nf 778/795/778 807/827/807 806/826/806\nf 778/795/778 806/826/806 790/811/790\nf 803/823/803 812/833/812 813/834/813\nf 803/823/803 813/834/813 800/824/800\nf 815/835/815 816/836/816 817/837/817\nf 815/835/815 817/837/817 814/838/814\nf 819/839/819 814/838/814 820/840/820\nf 819/839/819 820/840/820 818/841/818\nf 822/842/822 823/843/823 819/839/819\nf 822/842/822 819/839/819 821/844/821\nf 704/725/704 707/724/707 825/845/825\nf 704/725/704 825/845/825 824/846/824\nf 827/847/827 828/848/828 698/715/698\nf 827/847/827 698/715/698 826/849/826\nf 772/793/772 775/792/775 829/850/829\nf 772/793/772 829/850/829 699/716/699\nf 781/799/781 771/788/771 831/851/831\nf 781/799/781 831/851/831 830/852/830\nf 832/853/832 831/851/831 771/788/771\nf 832/853/832 771/788/771 770/787/770\nf 834/854/834 835/855/835 836/856/836\nf 834/854/834 836/856/836 833/857/833\nf 838/858/838 839/859/839 840/860/840\nf 838/858/838 840/860/840 837/861/837\nf 723/740/723 722/743/722 840/860/840\nf 723/740/723 840/860/840 841/862/841\nf 747/764/747 842/863/842 843/864/843\nf 747/764/747 843/864/843 744/765/744\nf 821/844/821 844/865/844 845/866/845\nf 821/844/821 845/866/845 822/842/822\nf 847/867/847 818/841/818 820/840/820\nf 847/867/847 820/840/820 846/868/846\nf 843/864/843 849/869/849 850/870/850\nf 843/864/843 850/870/850 848/871/848\nf 205/185/205 851/872/851 852/873/852\nf 205/185/205 852/873/852 206/186/206\nf 208/189/208 849/869/849 851/872/851\nf 208/189/208 851/872/851 205/185/205\nf 853/874/853 854/875/854 749/766/749\nf 853/874/853 749/766/749 746/763/746\nf 728/745/728 735/752/735 854/875/854\nf 728/745/728 854/875/854 853/874/853\nf 856/876/856 857/877/857 858/878/858\nf 856/876/856 858/878/858 855/879/855\nf 860/880/860 861/881/861 862/882/862\nf 860/880/860 862/882/862 859/883/859\nf 863/884/863 864/885/864 861/881/861\nf 863/884/863 861/881/861 860/880/860\nf 866/886/866 867/887/867 862/882/862\nf 866/886/866 862/882/862 865/888/865\nf 869/889/869 870/890/870 871/891/871\nf 869/889/869 871/891/871 868/892/868\nf 866/886/866 228/210/228 229/209/229\nf 866/886/866 229/209/229 867/887/867\nf 873/893/873 864/885/864 863/884/863\nf 873/893/873 863/884/863 872/894/872\nf 871/891/871 873/893/873 872/894/872\nf 871/891/871 872/894/872 868/892/868\nf 875/895/875 876/896/876 877/897/877\nf 875/895/875 877/897/877 874/898/874\nf 835/855/835 834/854/834 848/871/848\nf 835/855/835 848/871/848 850/870/850\nf 879/899/879 833/857/833 880/900/880\nf 879/899/879 880/900/880 878/901/878\nf 882/902/882 883/903/883 884/904/884\nf 882/902/882 884/904/884 881/905/881\nf 881/905/881 880/900/880 886/906/886\nf 881/905/881 886/906/886 885/907/885\nf 887/908/887 842/863/842 747/764/747\nf 887/908/887 747/764/747 748/767/748\nf 842/863/842 887/908/887 852/873/852\nf 842/863/842 852/873/852 851/872/851\nf 758/777/758 760/781/760 889/909/889\nf 758/777/758 889/909/889 888/910/888\nf 787/810/787 890/911/890 891/912/891\nf 787/810/787 891/912/891 788/808/788\nf 893/913/893 894/914/894 895/915/895\nf 893/913/893 895/915/895 892/916/892\nf 896/917/896 859/883/859 897/918/897\nf 896/917/896 897/918/897 765/782/765\nf 899/919/899 900/920/900 901/921/901\nf 899/919/899 901/921/901 898/922/898\nf 900/920/900 902/923/902 903/924/903\nf 900/920/900 903/924/903 901/921/901\nf 902/923/902 677/925/677 679/926/679\nf 902/923/902 679/926/679 903/924/903\nf 862/882/862 867/887/867 904/927/904\nf 862/882/862 904/927/904 859/883/859\nf 901/921/901 263/247/263 264/246/264\nf 901/921/901 264/246/264 898/922/898\nf 266/248/266 265/249/265 903/924/903\nf 266/248/266 903/924/903 679/926/679\nf 895/915/895 905/928/905 906/929/906\nf 895/915/895 906/929/906 892/916/892\nf 907/930/907 908/931/908 909/932/909\nf 907/930/907 909/932/909 846/868/846\nf 847/867/847 846/868/846 909/932/909\nf 847/867/847 909/932/909 910/933/910\nf 847/867/847 910/933/910 912/934/912\nf 847/867/847 912/934/912 911/935/911\nf 276/258/276 275/259/275 906/929/906\nf 276/258/276 906/929/906 905/928/905\nf 275/259/275 277/260/277 908/931/908\nf 275/259/275 908/931/908 906/929/906\nf 741/758/741 837/861/837 840/860/840\nf 741/758/741 840/860/840 722/743/722\nf 914/936/914 915/937/915 916/938/916\nf 914/936/914 916/938/916 913/939/913\nf 915/937/915 914/936/914 743/760/743\nf 915/937/915 743/760/743 734/753/734\nf 918/940/918 740/759/740 709/726/709\nf 918/940/918 709/726/709 917/941/917\nf 916/938/916 915/937/915 920/942/920\nf 916/938/916 920/942/920 919/943/919\nf 922/944/922 923/945/923 924/946/924\nf 922/944/922 924/946/924 921/947/921\nf 708/729/708 925/948/925 917/941/917\nf 708/729/708 917/941/917 709/726/709\nf 917/941/917 925/948/925 927/949/927\nf 917/941/917 927/949/927 926/950/926\nf 293/276/293 712/733/712 715/732/715\nf 293/276/293 715/732/715 294/277/294\nf 929/951/929 930/952/930 931/953/931\nf 929/951/929 931/953/931 928/954/928\nf 933/955/933 934/956/934 935/957/935\nf 933/955/933 935/957/935 932/958/932\nf 937/959/937 938/960/938 939/961/939\nf 937/959/937 939/961/939 936/962/936\nf 785/804/785 940/963/940 941/964/941\nf 785/804/785 941/964/941 784/805/784\nf 812/833/812 943/965/943 944/966/944\nf 812/833/812 944/966/944 942/967/942\nf 945/968/945 796/819/796 701/718/701\nf 945/968/945 701/718/701 700/721/700\nf 946/969/946 947/970/947 797/817/797\nf 946/969/946 797/817/797 796/819/796\nf 949/971/949 873/893/873 871/891/871\nf 949/971/949 871/891/871 948/972/948\nf 783/801/783 806/826/806 805/825/805\nf 783/801/783 805/825/805 950/973/950\nf 951/974/951 952/975/952 792/816/792\nf 951/974/951 792/816/792 795/815/795\nf 954/976/954 793/813/793 792/816/792\nf 954/976/954 792/816/792 953/977/953\nf 956/978/956 957/979/957 958/980/958\nf 956/978/956 958/980/958 955/981/955\nf 727/744/727 920/942/920 915/937/915\nf 727/744/727 915/937/915 734/753/734\nf 959/982/959 960/983/960 795/815/795\nf 959/982/959 795/815/795 794/814/794\nf 914/936/914 913/939/913 924/946/924\nf 914/936/914 924/946/924 923/945/923\nf 329/984/329 961/985/961 962/986/962\nf 329/984/329 962/986/962 330/987/330\nf 834/854/834 963/988/963 751/768/751\nf 834/854/834 751/768/751 848/871/848\nf 879/899/879 839/859/839 838/858/838\nf 879/899/879 838/858/838 963/988/963\nf 812/833/812 942/967/942 964/989/964\nf 812/833/812 964/989/964 813/834/813\nf 786/806/786 692/807/692 695/990/695\nf 786/806/786 695/990/695 965/991/965\nf 967/992/967 968/993/968 969/994/969\nf 967/992/967 969/994/969 966/995/966\nf 696/717/696 699/716/699 829/850/829\nf 696/717/696 829/850/829 955/981/955\nf 970/996/970 703/720/703 702/719/702\nf 970/996/970 702/719/702 773/790/773\nf 972/997/972 799/820/799 798/818/798\nf 972/997/972 798/818/798 971/998/971\nf 885/907/885 342/999/342 344/1000/344\nf 885/907/885 344/1000/344 973/1001/973\nf 974/1002/974 975/1003/975 882/902/882\nf 974/1002/974 882/902/882 973/1001/973\nf 977/1004/977 978/1005/978 979/1006/979\nf 977/1004/977 979/1006/979 976/1007/976\nf 981/1008/981 856/876/856 855/879/855\nf 981/1008/981 855/879/855 980/1009/980\nf 775/792/775 781/799/781 830/852/830\nf 775/792/775 830/852/830 829/850/829\nf 750/769/750 982/1010/982 983/1011/983\nf 750/769/750 983/1011/983 745/762/745\nf 761/778/761 984/1012/984 985/1013/985\nf 761/778/761 985/1013/985 762/779/762\nf 986/1014/986 987/1015/987 845/866/845\nf 986/1014/986 845/866/845 844/865/844\nf 752/773/752 755/772/755 989/1016/989\nf 752/773/752 989/1016/989 988/1017/988\nf 977/1004/977 976/1007/976 991/1018/991\nf 977/1004/977 991/1018/991 990/1019/990\nf 978/1005/978 977/1004/977 874/898/874\nf 978/1005/978 874/898/874 992/1020/992\nf 863/884/863 993/1021/993 816/836/816\nf 863/884/863 816/836/816 872/894/872\nf 802/822/802 995/1022/995 933/955/933\nf 802/822/802 933/955/933 994/1023/994\nf 930/952/930 929/951/929 716/737/716\nf 930/952/930 716/737/716 719/736/719\nf 828/848/828 827/847/827 996/1024/996\nf 828/848/828 996/1024/996 970/996/970\nf 998/1025/998 950/973/950 805/825/805\nf 998/1025/998 805/825/805 997/1026/997\nf 950/973/950 945/968/945 700/721/700\nf 950/973/950 700/721/700 783/801/783\nf 1000/1027/1000 1001/1028/1001 1002/1029/1002\nf 1000/1027/1000 1002/1029/1002 999/1030/999\nf 691/1031/691 936/962/936 939/961/939\nf 691/1031/691 939/961/939 676/1032/676\nf 936/962/936 691/1031/691 688/802/688\nf 936/962/936 688/802/688 784/805/784\nf 890/911/890 787/810/787 1004/1033/1004\nf 890/911/890 1004/1033/1004 1003/1034/1003\nf 713/730/713 696/717/696 955/981/955\nf 713/730/713 955/981/955 958/980/958\nf 830/852/830 831/851/831 1005/1035/1005\nf 830/852/830 1005/1035/1005 956/978/956\nf 1006/1036/1006 1007/1037/1007 905/928/905\nf 1006/1036/1006 905/928/905 895/915/895\nf 908/931/908 277/260/277 379/365/379\nf 908/931/908 379/365/379 909/932/909\nf 1009/1038/1009 1010/1039/1010 1011/1040/1011\nf 1009/1038/1009 1011/1040/1011 1008/1041/1008\nf 1013/1042/1013 756/775/756 754/771/754\nf 1013/1042/1013 754/771/754 1012/1043/1012\nf 754/771/754 753/770/753 1014/1044/1014\nf 754/771/754 1014/1044/1014 1012/1043/1012\nf 989/1016/989 755/772/755 757/774/757\nf 989/1016/989 757/774/757 1015/1045/1015\nf 826/849/826 808/832/808 811/831/811\nf 826/849/826 811/831/811 827/847/827\nf 995/1022/995 802/822/802 801/821/801\nf 995/1022/995 801/821/801 1016/1046/1016\nf 815/835/815 868/892/868 872/894/872\nf 815/835/815 872/894/872 816/836/816\nf 726/747/726 918/940/918 917/941/917\nf 726/747/726 917/941/917 926/950/926\nf 910/933/910 909/932/909 379/365/379\nf 910/933/910 379/365/379 389/375/389\nf 912/934/912 910/933/910 389/375/389\nf 912/934/912 389/375/389 390/376/390\nf 786/806/786 965/991/965 1003/1034/1003\nf 786/806/786 1003/1034/1003 1004/1033/1004\nf 1017/1047/1017 803/823/803 802/822/802\nf 1017/1047/1017 802/822/802 994/1023/994\nf 1019/1048/1019 1017/1047/1017 994/1023/994\nf 1019/1048/1019 994/1023/994 1018/1049/1018\nf 820/840/820 1020/1050/1020 907/930/907\nf 820/840/820 907/930/907 846/868/846\nf 932/958/932 1018/1049/1018 994/1023/994\nf 932/958/932 994/1023/994 933/955/933\nf 1022/1051/1022 1023/1052/1023 1024/1053/1024\nf 1022/1051/1022 1024/1053/1024 1021/1054/1021\nf 1025/1055/1025 817/837/817 816/836/816\nf 1025/1055/1025 816/836/816 993/1021/993\nf 1020/1050/1020 817/837/817 1025/1055/1025\nf 1020/1050/1020 1025/1055/1025 893/913/893\nf 907/930/907 1020/1050/1020 893/913/893\nf 907/930/907 893/913/893 892/916/892\nf 749/766/749 854/875/854 1026/1056/1026\nf 749/766/749 1026/1056/1026 759/776/759\nf 776/797/776 1000/1027/1000 999/1030/999\nf 776/797/776 999/1030/999 1027/1057/1027\nf 1017/1047/1017 943/965/943 812/833/812\nf 1017/1047/1017 812/833/812 803/823/803\nf 1028/1058/1028 1029/1059/1029 405/390/405\nf 1028/1058/1028 405/390/405 404/389/404\nf 1029/1059/1029 943/965/943 1017/1047/1017\nf 1029/1059/1029 1017/1047/1017 1019/1048/1019\nf 685/1060/685 673/1061/673 964/989/964\nf 685/1060/685 964/989/964 942/967/942\nf 685/1060/685 942/967/942 944/966/944\nf 685/1060/685 944/966/944 683/1062/683\nf 683/1062/683 944/966/944 1028/1058/1028\nf 683/1062/683 1028/1058/1028 680/1063/680\nf 1030/1064/1030 897/918/897 859/883/859\nf 1030/1064/1030 859/883/859 904/927/904\nf 1007/1037/1007 1030/1064/1030 408/398/408\nf 1007/1037/1007 408/398/408 407/397/407\nf 766/783/766 765/782/765 897/918/897\nf 766/783/766 897/918/897 1006/1036/1006\nf 907/930/907 892/916/892 906/929/906\nf 907/930/907 906/929/906 908/931/908\nf 937/959/937 999/1030/999 1002/1029/1002\nf 937/959/937 1002/1029/1002 938/960/938\nf 991/1018/991 976/1007/976 1032/1065/1032\nf 991/1018/991 1032/1065/1032 1031/1066/1031\nf 1034/1067/1034 739/756/739 738/755/738\nf 1034/1067/1034 738/755/738 1033/1068/1033\nf 1035/1069/1035 1036/1070/1036 1037/1071/1037\nf 1035/1069/1035 1037/1071/1037 1034/1067/1034\nf 1038/1072/1038 416/408/416 418/407/418\nf 1038/1072/1038 418/407/418 967/992/967\nf 966/995/966 719/736/719 718/735/718\nf 966/995/966 718/735/718 1039/1073/1039\nf 1041/1074/1041 1042/1075/1042 1043/1076/1043\nf 1041/1074/1041 1043/1076/1043 1040/1077/1040\nf 1041/1074/1041 1040/1077/1040 1045/1078/1045\nf 1041/1074/1041 1045/1078/1045 1044/1079/1044\nf 1043/1076/1043 1046/1080/1046 1047/1081/1047\nf 1043/1076/1043 1047/1081/1047 1040/1077/1040\nf 883/903/883 1045/1078/1045 1048/1082/1048\nf 883/903/883 1048/1082/1048 884/904/884\nf 1049/1083/1049 1050/1084/1050 721/739/721\nf 1049/1083/1049 721/739/721 720/738/720\nf 717/734/717 1050/1084/1050 1039/1073/1039\nf 717/734/717 1039/1073/1039 718/735/718\nf 889/909/889 760/781/760 763/780/763\nf 889/909/889 763/780/763 1051/1085/1051\nf 974/1002/974 1052/1086/1052 1053/1087/1053\nf 974/1002/974 1053/1087/1053 975/1003/975\nf 1053/1087/1053 1054/1088/1054 1042/1075/1042\nf 1053/1087/1053 1042/1075/1042 1041/1074/1041\nf 1056/1089/1056 1057/1090/1057 1058/1091/1058\nf 1056/1089/1056 1058/1091/1058 1055/1092/1055\nf 1055/1092/1055 1058/1091/1058 1010/1039/1010\nf 1055/1092/1055 1010/1039/1010 1009/1038/1009\nf 825/845/825 1059/1093/1059 1060/1094/1060\nf 825/845/825 1060/1094/1060 824/846/824\nf 1060/1094/1060 1059/1093/1059 1062/1095/1062\nf 1060/1094/1060 1062/1095/1062 1061/1096/1061\nf 444/1097/444 443/1098/443 1064/1099/1064\nf 444/1097/444 1064/1099/1064 1063/1100/1063\nf 955/981/955 829/850/829 830/852/830\nf 955/981/955 830/852/830 956/978/956\nf 855/879/855 845/866/845 987/1015/987\nf 855/879/855 987/1015/987 980/1009/980\nf 858/878/858 869/889/869 823/843/823\nf 858/878/858 823/843/823 822/842/822\nf 1066/1101/1066 1067/1102/1067 1068/1103/1068\nf 1066/1101/1066 1068/1103/1068 1065/1104/1065\nf 1043/1076/1043 1067/1102/1067 1069/1105/1069\nf 1043/1076/1043 1069/1105/1069 1046/1080/1046\nf 724/741/724 723/740/723 1046/1080/1046\nf 724/741/724 1046/1080/1046 1069/1105/1069\nf 725/742/725 710/727/710 709/726/709\nf 725/742/725 709/726/709 740/759/740\nf 923/945/923 922/944/922 730/751/730\nf 923/945/923 730/751/730 733/750/733\nf 742/761/742 1026/1056/1026 854/875/854\nf 742/761/742 854/875/854 735/752/735\nf 878/901/878 884/904/884 1048/1082/1048\nf 878/901/878 1048/1082/1048 1070/1106/1070\nf 839/859/839 1070/1106/1070 841/862/841\nf 839/859/839 841/862/841 840/860/840\nf 878/901/878 1070/1106/1070 839/859/839\nf 878/901/878 839/859/839 879/899/879\nf 728/745/728 853/874/853 983/1011/983\nf 728/745/728 983/1011/983 729/746/729\nf 923/945/923 733/750/733 743/760/743\nf 923/945/923 743/760/743 914/936/914\nf 1049/1083/1049 453/443/453 416/408/416\nf 1049/1083/1049 416/408/416 1038/1072/1038\nf 969/994/969 934/956/934 931/953/931\nf 969/994/969 931/953/931 930/952/930\nf 706/723/706 1071/1107/1071 1072/1108/1072\nf 706/723/706 1072/1108/1072 707/724/707\nf 856/876/856 981/1008/981 1074/1109/1074\nf 856/876/856 1074/1109/1074 1073/1110/1073\nf 732/749/732 731/748/731 985/1013/985\nf 732/749/732 985/1013/985 984/1012/984\nf 789/809/789 940/963/940 1004/1033/1004\nf 789/809/789 1004/1033/1004 787/810/787\nf 1027/1057/1027 941/964/941 940/963/940\nf 1027/1057/1027 940/963/940 789/809/789\nf 1075/1111/1075 1076/1112/1076 900/920/900\nf 1075/1111/1075 900/920/900 899/919/899\nf 228/210/228 866/886/866 898/922/898\nf 228/210/228 898/922/898 264/246/264\nf 900/920/900 1076/1112/1076 1077/1113/1077\nf 900/920/900 1077/1113/1077 902/923/902\nf 1077/1113/1077 694/1114/694 677/925/677\nf 1077/1113/1077 677/925/677 902/923/902\nf 263/247/263 901/921/901 903/924/903\nf 263/247/263 903/924/903 265/249/265\nf 461/1115/461 886/906/886 836/856/836\nf 461/1115/461 836/856/836 462/1116/462\nf 871/891/871 870/890/870 1078/1117/1078\nf 871/891/871 1078/1117/1078 948/972/948\nf 1080/1118/1080 1081/1119/1081 1032/1065/1032\nf 1080/1118/1080 1032/1065/1032 1079/1120/1079\nf 737/754/737 736/757/736 1012/1043/1012\nf 737/754/737 1012/1043/1012 1014/1044/1014\nf 875/895/875 874/898/874 977/1004/977\nf 875/895/875 977/1004/977 990/1019/990\nf 877/897/877 1082/1121/1082 992/1020/992\nf 877/897/877 992/1020/992 874/898/874\nf 969/994/969 930/952/930 719/736/719\nf 969/994/969 719/736/719 966/995/966\nf 969/994/969 968/993/968 935/957/935\nf 969/994/969 935/957/935 934/956/934\nf 1084/1122/1084 1037/1071/1037 1085/1123/1085\nf 1084/1122/1084 1085/1123/1085 1083/1124/1083\nf 978/1005/978 992/1020/992 1087/1125/1087\nf 978/1005/978 1087/1125/1087 1086/1126/1086\nf 1086/1126/1086 1088/1127/1088 979/1006/979\nf 1086/1126/1086 979/1006/979 978/1005/978\nf 1080/1118/1080 1090/1128/1090 1091/1129/1091\nf 1080/1118/1080 1091/1129/1091 1089/1130/1089\nf 1013/1042/1013 1092/1131/1092 1093/1132/1093\nf 1013/1042/1013 1093/1132/1093 756/775/756\nf 1035/1069/1035 1034/1067/1034 1033/1068/1033\nf 1035/1069/1035 1033/1068/1033 1094/1133/1094\nf 921/947/921 1094/1133/1094 1033/1068/1033\nf 921/947/921 1033/1068/1033 922/944/922\nf 730/751/730 738/755/738 737/754/737\nf 730/751/730 737/754/737 731/748/731\nf 1014/1044/1014 753/770/753 762/779/762\nf 1014/1044/1014 762/779/762 985/1013/985\nf 876/896/876 875/895/875 987/1015/987\nf 876/896/876 987/1015/987 986/1014/986\nf 928/954/928 808/832/808 826/849/826\nf 928/954/928 826/849/826 929/951/929\nf 1039/1073/1039 1038/1072/1038 967/992/967\nf 1039/1073/1039 967/992/967 966/995/966\nf 698/715/698 828/848/828 772/793/772\nf 698/715/698 772/793/772 699/716/699\nf 676/1032/676 939/961/939 964/989/964\nf 676/1032/676 964/989/964 673/1061/673\nf 1000/1027/1000 810/830/810 809/829/809\nf 1000/1027/1000 809/829/809 1001/1028/1001\nf 898/922/898 866/886/866 865/888/865\nf 898/922/898 865/888/865 899/919/899\nf 899/919/899 865/888/865 1095/1134/1095\nf 899/919/899 1095/1134/1095 1075/1111/1075\nf 857/877/857 870/890/870 869/889/869\nf 857/877/857 869/889/869 858/878/858\nf 948/972/948 1078/1117/1078 946/969/946\nf 948/972/948 946/969/946 1096/1135/1096\nf 819/839/819 823/843/823 815/835/815\nf 819/839/819 815/835/815 814/838/814\nf 911/935/911 1097/1136/1097 818/841/818\nf 911/935/911 818/841/818 847/867/847\nf 815/835/815 823/843/823 869/889/869\nf 815/835/815 869/889/869 868/892/868\nf 887/908/887 748/767/748 758/777/758\nf 887/908/887 758/777/758 888/910/888\nf 761/778/761 760/781/760 758/777/758\nf 761/778/761 758/777/758 759/776/759\nf 853/874/853 746/763/746 745/762/745\nf 853/874/853 745/762/745 983/1011/983\nf 1051/1085/1051 988/1017/988 876/896/876\nf 1051/1085/1051 876/896/876 986/1014/986\nf 877/897/877 876/896/876 988/1017/988\nf 877/897/877 988/1017/988 989/1016/989\nf 989/1016/989 1015/1045/1015 1082/1121/1082\nf 989/1016/989 1082/1121/1082 877/897/877\nf 726/747/726 729/746/729 1098/1137/1098\nf 726/747/726 1098/1137/1098 918/940/918\nf 1100/1138/1100 1101/1139/1101 1102/1140/1102\nf 1100/1138/1100 1102/1140/1102 1099/1141/1099\nf 1103/1142/1103 488/480/488 294/277/294\nf 1103/1142/1103 294/277/294 715/732/715\nf 1104/1143/1104 1105/1144/1105 1072/1108/1072\nf 1104/1143/1104 1072/1108/1072 1071/1107/1071\nf 801/821/801 800/824/800 1002/1029/1002\nf 801/821/801 1002/1029/1002 1001/1028/1001\nf 1104/1143/1104 1106/1145/1106 958/980/958\nf 1104/1143/1104 958/980/958 957/979/957\nf 1104/1143/1104 957/979/957 1107/1146/1107\nf 1104/1143/1104 1107/1146/1107 1105/1144/1105\nf 1056/1089/1056 1108/1147/1108 1064/1099/1064\nf 1056/1089/1056 1064/1099/1064 1057/1090/1057\nf 495/1148/495 1010/1039/1010 1058/1091/1058\nf 495/1148/495 1058/1091/1058 496/1149/496\nf 496/1149/496 1058/1091/1058 1057/1090/1057\nf 496/1149/496 1057/1090/1057 497/1150/497\nf 962/986/962 1052/1086/1052 498/1151/498\nf 962/986/962 498/1151/498 330/987/330\nf 499/1152/499 498/1151/498 1052/1086/1052\nf 499/1152/499 1052/1086/1052 974/1002/974\nf 1010/1039/1010 495/1148/495 500/1153/500\nf 1010/1039/1010 500/1153/500 1011/1040/1011\nf 1109/1154/1109 1054/1088/1054 962/986/962\nf 1109/1154/1109 962/986/962 961/985/961\nf 499/1152/499 974/1002/974 973/1001/973\nf 499/1152/499 973/1001/973 344/1000/344\nf 1106/1145/1106 1104/1143/1104 1071/1107/1071\nf 1106/1145/1106 1071/1107/1071 1110/1155/1110\nf 1071/1107/1071 706/723/706 1102/1140/1102\nf 1071/1107/1071 1102/1140/1102 1110/1155/1110\nf 1099/1141/1099 1102/1140/1102 706/723/706\nf 1099/1141/1099 706/723/706 705/722/705\nf 705/722/705 1008/1041/1008 1111/1156/1111\nf 705/722/705 1111/1156/1111 1099/1141/1099\nf 1011/1040/1011 500/1153/500 505/1157/505\nf 1011/1040/1011 505/1157/505 1112/1158/1112\nf 1067/1102/1067 1043/1076/1043 1042/1075/1042\nf 1067/1102/1067 1042/1075/1042 1068/1103/1068\nf 329/984/329 444/1097/444 1063/1100/1063\nf 329/984/329 1063/1100/1063 961/985/961\nf 1068/1103/1068 1109/1154/1109 1113/1159/1113\nf 1068/1103/1068 1113/1159/1113 1065/1104/1065\nf 1115/1160/1115 724/741/724 1069/1105/1069\nf 1115/1160/1115 1069/1105/1069 1114/1161/1114\nf 744/765/744 843/864/843 848/871/848\nf 744/765/744 848/871/848 751/768/751\nf 509/500/509 850/870/850 849/869/849\nf 509/500/509 849/869/849 208/189/208\nf 849/869/849 843/864/843 842/863/842\nf 849/869/849 842/863/842 851/872/851\nf 462/1116/462 836/856/836 835/855/835\nf 462/1116/462 835/855/835 510/501/510\nf 850/870/850 509/500/509 510/501/510\nf 850/870/850 510/501/510 835/855/835\nf 795/815/795 960/983/960 971/998/971\nf 795/815/795 971/998/971 951/974/951\nf 960/983/960 1116/1162/1116 972/997/972\nf 960/983/960 972/997/972 971/998/971\nf 768/789/768 780/798/780 972/997/972\nf 768/789/768 972/997/972 1116/1162/1116\nf 716/737/716 929/951/929 826/849/826\nf 716/737/716 826/849/826 698/715/698\nf 801/821/801 1001/1028/1001 809/829/809\nf 801/821/801 809/829/809 1016/1046/1016\nf 800/824/800 813/834/813 938/960/938\nf 800/824/800 938/960/938 1002/1029/1002\nf 813/834/813 964/989/964 939/961/939\nf 813/834/813 939/961/939 938/960/938\nf 1117/1163/1117 921/947/921 924/946/924\nf 1117/1163/1117 924/946/924 954/976/954\nf 1094/1133/1094 1118/1164/1118 1119/1165/1119\nf 1094/1133/1094 1119/1165/1119 1035/1069/1035\nf 1035/1069/1035 1119/1165/1119 1089/1130/1089\nf 1035/1069/1035 1089/1130/1089 1036/1070/1036\nf 1118/1164/1118 1094/1133/1094 921/947/921\nf 1118/1164/1118 921/947/921 1117/1163/1117\nf 838/858/838 837/861/837 982/1010/982\nf 838/858/838 982/1010/982 750/769/750\nf 963/988/963 838/858/838 750/769/750\nf 963/988/963 750/769/750 751/768/751\nf 729/746/729 983/1011/983 982/1010/982\nf 729/746/729 982/1010/982 1098/1137/1098\nf 732/749/732 742/761/742 743/760/743\nf 732/749/732 743/760/743 733/750/733\nf 732/749/732 984/1012/984 1026/1056/1026\nf 732/749/732 1026/1056/1026 742/761/742\nf 984/1012/984 761/778/761 759/776/759\nf 984/1012/984 759/776/759 1026/1056/1026\nf 790/811/790 806/826/806 783/801/783\nf 790/811/790 783/801/783 782/800/782\nf 931/953/931 934/956/934 933/955/933\nf 931/953/931 933/955/933 995/1022/995\nf 931/953/931 995/1022/995 1016/1046/1016\nf 931/953/931 1016/1046/1016 928/954/928\nf 996/1024/996 827/847/827 811/831/811\nf 996/1024/996 811/831/811 791/812/791\nf 1121/1166/1121 861/881/861 864/885/864\nf 1121/1166/1121 864/885/864 1120/1167/1120\nf 896/917/896 1122/1168/1122 860/880/860\nf 896/917/896 860/880/860 859/883/859\nf 1024/1053/1024 1023/1052/1023 1025/1055/1025\nf 1024/1053/1024 1025/1055/1025 993/1021/993\nf 1024/1053/1024 860/880/860 1122/1168/1122\nf 1024/1053/1024 1122/1168/1122 1021/1054/1021\nf 1124/1169/1124 887/908/887 888/910/888\nf 1124/1169/1124 888/910/888 1123/1170/1123\nf 951/974/951 971/998/971 798/818/798\nf 951/974/951 798/818/798 797/817/797\nf 1050/1084/1050 1049/1083/1049 1038/1072/1038\nf 1050/1084/1050 1038/1072/1038 1039/1073/1039\nf 680/1063/680 1028/1058/1028 404/389/404\nf 680/1063/680 404/389/404 46/511/46\nf 1028/1058/1028 944/966/944 943/965/943\nf 1028/1058/1028 943/965/943 1029/1059/1029\nf 1018/1049/1018 932/958/932 521/513/521\nf 1018/1049/1018 521/513/521 520/512/520\nf 522/514/522 1019/1048/1019 1018/1049/1018\nf 522/514/522 1018/1049/1018 520/512/520\nf 935/957/935 523/515/523 521/513/521\nf 935/957/935 521/513/521 932/958/932\nf 935/957/935 968/993/968 524/516/524\nf 935/957/935 524/516/524 523/515/523\nf 953/977/953 792/816/792 952/975/952\nf 953/977/953 952/975/952 1073/1110/1073\nf 1073/1110/1073 1074/1109/1074 1125/1171/1125\nf 1073/1110/1073 1125/1171/1125 953/977/953\nf 1032/1065/1032 1081/1119/1081 1126/1172/1126\nf 1032/1065/1032 1126/1172/1126 1031/1066/1031\nf 1032/1065/1032 976/1007/976 979/1006/979\nf 1032/1065/1032 979/1006/979 1079/1120/1079\nf 1073/1110/1073 1127/1173/1127 857/877/857\nf 1073/1110/1073 857/877/857 856/876/856\nf 857/877/857 1127/1173/1127 1078/1117/1078\nf 857/877/857 1078/1117/1078 870/890/870\nf 407/397/407 276/258/276 905/928/905\nf 407/397/407 905/928/905 1007/1037/1007\nf 1006/1036/1006 897/918/897 1030/1064/1030\nf 1006/1036/1006 1030/1064/1030 1007/1037/1007\nf 822/842/822 845/866/845 855/879/855\nf 822/842/822 855/879/855 858/878/858\nf 1014/1044/1014 985/1013/985 731/748/731\nf 1014/1044/1014 731/748/731 737/754/737\nf 1031/1066/1031 1074/1109/1074 981/1008/981\nf 1031/1066/1031 981/1008/981 991/1018/991\nf 730/751/730 922/944/922 1033/1068/1033\nf 730/751/730 1033/1068/1033 738/755/738\nf 990/1019/990 980/1009/980 987/1015/987\nf 990/1019/990 987/1015/987 875/895/875\nf 763/780/763 752/773/752 988/1017/988\nf 763/780/763 988/1017/988 1051/1085/1051\nf 763/780/763 762/779/762 753/770/753\nf 763/780/763 753/770/753 752/773/752\nf 980/1009/980 990/1019/990 991/1018/991\nf 980/1009/980 991/1018/991 981/1008/981\nf 1118/1164/1118 1126/1172/1126 1081/1119/1081\nf 1118/1164/1118 1081/1119/1081 1119/1165/1119\nf 1126/1172/1126 1125/1171/1125 1074/1109/1074\nf 1126/1172/1126 1074/1109/1074 1031/1066/1031\nf 1119/1165/1119 1081/1119/1081 1080/1118/1080\nf 1119/1165/1119 1080/1118/1080 1089/1130/1089\nf 986/1014/986 844/865/844 889/909/889\nf 986/1014/986 889/909/889 1051/1085/1051\nf 821/844/821 819/839/819 818/841/818\nf 821/844/821 818/841/818 1097/1136/1097\nf 1022/1051/1022 764/785/764 894/914/894\nf 1022/1051/1022 894/914/894 1023/1052/1023\nf 1023/1052/1023 894/914/894 893/913/893\nf 1023/1052/1023 893/913/893 1025/1055/1025\nf 926/950/926 920/942/920 727/744/727\nf 926/950/926 727/744/727 726/747/726\nf 919/943/919 920/942/920 926/950/926\nf 919/943/919 926/950/926 927/949/927\nf 1128/1174/1128 1116/1162/1116 960/983/960\nf 1128/1174/1128 960/983/960 959/982/959\nf 773/790/773 702/719/702 799/820/799\nf 773/790/773 799/820/799 774/791/774\nf 799/820/799 972/997/972 780/798/780\nf 799/820/799 780/798/780 774/791/774\nf 772/793/772 828/848/828 970/996/970\nf 772/793/772 970/996/970 773/790/773\nf 703/720/703 970/996/970 996/1024/996\nf 703/720/703 996/1024/996 782/800/782\nf 771/788/771 781/799/781 780/798/780\nf 771/788/771 780/798/780 768/789/768\nf 791/812/791 790/811/790 782/800/782\nf 791/812/791 782/800/782 996/1024/996\nf 811/831/811 810/830/810 779/796/779\nf 811/831/811 779/796/779 791/812/791\nf 1027/1057/1027 789/809/789 777/794/777\nf 1027/1057/1027 777/794/777 776/797/776\nf 927/949/927 925/948/925 769/786/769\nf 927/949/927 769/786/769 1128/1174/1128\nf 710/727/710 725/742/725 724/741/724\nf 710/727/710 724/741/724 1115/1160/1115\nf 954/976/954 953/977/953 1125/1171/1125\nf 954/976/954 1125/1171/1125 1117/1163/1117\nf 1117/1163/1117 1125/1171/1125 1126/1172/1126\nf 1117/1163/1117 1126/1172/1126 1118/1164/1118\nf 768/789/768 1116/1162/1116 1128/1174/1128\nf 768/789/768 1128/1174/1128 769/786/769\nf 904/927/904 867/887/867 229/209/229\nf 904/927/904 229/209/229 529/521/529\nf 948/972/948 1096/1135/1096 998/1025/998\nf 948/972/948 998/1025/998 949/971/949\nf 1120/1167/1120 864/885/864 873/893/873\nf 1120/1167/1120 873/893/873 949/971/949\nf 1121/1166/1121 1120/1167/1120 997/1026/997\nf 1121/1166/1121 997/1026/997 1129/1175/1129\nf 1129/1175/1129 1095/1134/1095 865/888/865\nf 1129/1175/1129 865/888/865 1121/1166/1121\nf 861/881/861 1121/1166/1121 865/888/865\nf 861/881/861 865/888/865 862/882/862\nf 1075/1111/1075 890/911/890 1003/1034/1003\nf 1075/1111/1075 1003/1034/1003 1076/1112/1076\nf 1076/1112/1076 1003/1034/1003 965/991/965\nf 1076/1112/1076 965/991/965 1077/1113/1077\nf 965/991/965 695/990/695 694/1114/694\nf 965/991/965 694/1114/694 1077/1113/1077\nf 1075/1111/1075 1095/1134/1095 891/912/891\nf 1075/1111/1075 891/912/891 890/911/890\nf 895/915/895 894/914/894 764/785/764\nf 895/915/895 764/785/764 767/784/767\nf 1020/1050/1020 820/840/820 814/838/814\nf 1020/1050/1020 814/838/814 817/837/817\nf 1123/1170/1123 844/865/844 821/844/821\nf 1123/1170/1123 821/844/821 1097/1136/1097\nf 1124/1169/1124 1123/1170/1123 1097/1136/1097\nf 1124/1169/1124 1097/1136/1097 911/935/911\nf 1130/1176/1130 1124/1169/1124 911/935/911\nf 1130/1176/1130 911/935/911 912/934/912\nf 532/524/532 1130/1176/1130 912/934/912\nf 532/524/532 912/934/912 390/376/390\nf 973/1001/973 882/902/882 881/905/881\nf 973/1001/973 881/905/881 885/907/885\nf 833/857/833 836/856/836 886/906/886\nf 833/857/833 886/906/886 880/900/880\nf 834/854/834 833/857/833 879/899/879\nf 834/854/834 879/899/879 963/988/963\nf 1067/1102/1067 1066/1101/1066 1114/1161/1114\nf 1067/1102/1067 1114/1161/1114 1069/1105/1069\nf 809/829/809 808/832/808 928/954/928\nf 809/829/809 928/954/928 1016/1046/1016\nf 1019/1048/1019 522/514/522 405/390/405\nf 1019/1048/1019 405/390/405 1029/1059/1029\nf 1131/1177/1131 1085/1123/1085 1037/1071/1037\nf 1131/1177/1131 1037/1071/1037 1036/1070/1036\nf 1132/1178/1132 1103/1142/1103 715/732/715\nf 1132/1178/1132 715/732/715 714/731/714\nf 1110/1155/1110 1102/1140/1102 1101/1139/1101\nf 1110/1155/1110 1101/1139/1101 1133/1179/1133\nf 1111/1156/1111 1112/1158/1112 1135/1180/1135\nf 1111/1156/1111 1135/1180/1135 1134/1181/1134\nf 1106/1145/1106 1110/1155/1110 1133/1179/1133\nf 1106/1145/1106 1133/1179/1133 1136/1182/1136\nf 1106/1145/1106 714/731/714 713/730/713\nf 1106/1145/1106 713/730/713 958/980/958\nf 1112/1158/1112 505/1157/505 539/1183/539\nf 1112/1158/1112 539/1183/539 1135/1180/1135\nf 883/903/883 882/902/882 975/1003/975\nf 883/903/883 975/1003/975 1044/1079/1044\nf 704/725/704 1009/1038/1009 1008/1041/1008\nf 704/725/704 1008/1041/1008 705/722/705\nf 1052/1086/1052 962/986/962 1054/1088/1054\nf 1052/1086/1052 1054/1088/1054 1053/1087/1053\nf 1055/1092/1055 824/846/824 1060/1094/1060\nf 1055/1092/1055 1060/1094/1060 1056/1089/1056\nf 1009/1038/1009 704/725/704 824/846/824\nf 1009/1038/1009 824/846/824 1055/1092/1055\nf 1065/1104/1065 1113/1159/1113 1108/1147/1108\nf 1065/1104/1065 1108/1147/1108 1061/1096/1061\nf 1068/1103/1068 1042/1075/1042 1054/1088/1054\nf 1068/1103/1068 1054/1088/1054 1109/1154/1109\nf 1008/1041/1008 1011/1040/1011 1112/1158/1112\nf 1008/1041/1008 1112/1158/1112 1111/1156/1111\nf 1109/1154/1109 961/985/961 1063/1100/1063\nf 1109/1154/1109 1063/1100/1063 1113/1159/1113\nf 1134/1181/1134 1100/1138/1100 1099/1141/1099\nf 1134/1181/1134 1099/1141/1099 1111/1156/1111\nf 947/970/947 952/975/952 951/974/951\nf 947/970/947 951/974/951 797/817/797\nf 959/982/959 794/814/794 916/938/916\nf 959/982/959 916/938/916 919/943/919\nf 1098/1137/1098 982/1010/982 837/861/837\nf 1098/1137/1098 837/861/837 741/758/741\nf 1098/1137/1098 741/758/741 740/759/740\nf 1098/1137/1098 740/759/740 918/940/918\nf 1040/1077/1040 1047/1081/1047 1048/1082/1048\nf 1040/1077/1040 1048/1082/1048 1045/1078/1045\nf 1041/1074/1041 1044/1079/1044 975/1003/975\nf 1041/1074/1041 975/1003/975 1053/1087/1053\nf 1078/1117/1078 1127/1173/1127 947/970/947\nf 1078/1117/1078 947/970/947 946/969/946\nf 949/971/949 998/1025/998 997/1026/997\nf 949/971/949 997/1026/997 1120/1167/1120\nf 946/969/946 796/819/796 945/968/945\nf 946/969/946 945/968/945 1096/1135/1096\nf 998/1025/998 1096/1135/1096 945/968/945\nf 998/1025/998 945/968/945 950/973/950\nf 997/1026/997 805/825/805 804/828/804\nf 997/1026/997 804/828/804 1129/1175/1129\nf 1095/1134/1095 1129/1175/1129 804/828/804\nf 1095/1134/1095 804/828/804 891/912/891\nf 904/927/904 529/521/529 408/398/408\nf 904/927/904 408/398/408 1030/1064/1030\nf 1024/1053/1024 993/1021/993 863/884/863\nf 1024/1053/1024 863/884/863 860/880/860\nf 1138/1184/1138 1139/1185/1139 1140/1186/1140\nf 1138/1184/1138 1140/1186/1140 1137/1187/1137\nf 1141/1188/1141 1142/1189/1142 1137/1187/1137\nf 1141/1188/1141 1137/1187/1137 1140/1186/1140\nf 1143/1190/1143 1144/1191/1144 1142/1189/1142\nf 1143/1190/1143 1142/1189/1142 1141/1188/1141\nf 1145/1192/1145 1146/1193/1146 1144/1191/1144\nf 1145/1192/1145 1144/1191/1144 1143/1190/1143\nf 1147/1194/1147 1148/1195/1148 1146/1193/1146\nf 1147/1194/1147 1146/1193/1146 1145/1192/1145\nf 1149/1196/1149 1150/1197/1150 1148/1195/1148\nf 1149/1196/1149 1148/1195/1148 1147/1194/1147\nf 1151/1198/1151 1152/1199/1152 1150/1197/1150\nf 1151/1198/1151 1150/1197/1150 1149/1196/1149\nf 1154/1200/1154 1155/1201/1155 1156/1202/1156\nf 1154/1200/1154 1156/1202/1156 1153/1203/1153\nf 1157/1204/1157 1158/1205/1158 1155/1201/1155\nf 1157/1204/1157 1155/1201/1155 1154/1200/1154\nf 1159/1206/1159 1160/1207/1160 1142/1189/1142\nf 1159/1206/1159 1142/1189/1142 1144/1191/1144\nf 1161/1208/1161 1159/1206/1159 1144/1191/1144\nf 1161/1208/1161 1144/1191/1144 1146/1193/1146\nf 1162/1209/1162 1161/1208/1161 1146/1193/1146\nf 1162/1209/1162 1146/1193/1146 1148/1195/1148\nf 1163/1210/1163 1162/1209/1162 1148/1195/1148\nf 1163/1210/1163 1148/1195/1148 1150/1197/1150\nf 1150/1197/1150 1152/1199/1152 1164/1211/1164\nf 1150/1197/1150 1164/1211/1164 1163/1210/1163\nf 1156/1202/1156 1155/1201/1155 1166/1212/1166\nf 1156/1202/1156 1166/1212/1166 1165/1213/1165\nf 1167/1214/1167 1166/1212/1166 1155/1201/1155\nf 1167/1214/1167 1155/1201/1155 1158/1205/1158\nf 1169/1215/1169 1167/1214/1167 1158/1205/1158\nf 1169/1215/1169 1158/1205/1158 1168/1216/1168\nf 1170/1217/1170 1171/1218/1171 1172/1219/1172\nf 1170/1217/1170 1172/1219/1172 1139/1185/1139\nf 1173/1220/1173 1174/1221/1174 1141/1188/1141\nf 1173/1220/1173 1141/1188/1141 1140/1186/1140\nf 1141/1188/1141 1174/1221/1174 1175/1222/1175\nf 1141/1188/1141 1175/1222/1175 1143/1190/1143\nf 1176/1223/1176 1145/1192/1145 1143/1190/1143\nf 1176/1223/1176 1143/1190/1143 1175/1222/1175\nf 1177/1224/1177 1149/1196/1149 1147/1194/1147\nf 1177/1224/1177 1147/1194/1147 1176/1223/1176\nf 1177/1224/1177 1178/1225/1178 1151/1198/1151\nf 1177/1224/1177 1151/1198/1151 1149/1196/1149\nf 1153/1203/1153 1179/1226/1179 1180/1227/1180\nf 1153/1203/1153 1180/1227/1180 1154/1200/1154\nf 1157/1204/1157 1154/1200/1154 1180/1227/1180\nf 1157/1204/1157 1180/1227/1180 1181/1228/1181\nf 1157/1204/1157 1181/1228/1181 1182/1229/1182\nf 1157/1204/1157 1182/1229/1182 1168/1216/1168\nf 1169/1215/1169 1168/1216/1168 1182/1229/1182\nf 1169/1215/1169 1182/1229/1182 1183/1230/1183\nf 1142/1189/1142 1160/1207/1160 1138/1184/1138\nf 1142/1189/1142 1138/1184/1138 1137/1187/1137\nf 1170/1217/1170 1185/1231/1185 1186/1232/1186\nf 1170/1217/1170 1186/1232/1186 1184/1233/1184\nf 1170/1217/1170 1184/1233/1184 1187/1234/1187\nf 1170/1217/1170 1187/1234/1187 1171/1218/1171\nf 1187/1234/1187 1188/1235/1188 1172/1219/1172\nf 1187/1234/1187 1172/1219/1172 1171/1218/1171\nf 1172/1219/1172 1188/1235/1188 1140/1186/1140\nf 1172/1219/1172 1140/1186/1140 1139/1185/1139\nf 1161/1208/1161 1162/1209/1162 1163/1210/1163\nf 1161/1208/1161 1163/1210/1163 1189/1236/1189\nf 1189/1236/1189 1163/1210/1163 1164/1211/1164\nf 1189/1236/1189 1164/1211/1164 1190/1237/1190\nf 1165/1213/1165 1164/1211/1164 1152/1199/1152\nf 1165/1213/1165 1152/1199/1152 1156/1202/1156\nf 1152/1199/1152 1151/1198/1151 1153/1203/1153\nf 1152/1199/1152 1153/1203/1153 1156/1202/1156\nf 1179/1226/1179 1153/1203/1153 1151/1198/1151\nf 1179/1226/1179 1151/1198/1151 1178/1225/1178\nf 1189/1236/1189 1160/1207/1160 1159/1206/1159\nf 1189/1236/1189 1159/1206/1159 1161/1208/1161\nf 1186/1232/1186 1190/1237/1190 1164/1211/1164\nf 1186/1232/1186 1164/1211/1164 1165/1213/1165\nf 1139/1185/1139 1138/1184/1138 1185/1231/1185\nf 1139/1185/1139 1185/1231/1185 1170/1217/1170\nf 1169/1215/1169 1188/1235/1188 1187/1234/1187\nf 1169/1215/1169 1187/1234/1187 1167/1214/1167\nf 1186/1232/1186 1165/1213/1165 1166/1212/1166\nf 1186/1232/1186 1166/1212/1166 1184/1233/1184\nf 1140/1186/1140 1188/1235/1188 1191/1238/1191\nf 1140/1186/1140 1191/1238/1191 1173/1220/1173\nf 1191/1238/1191 1188/1235/1188 1169/1215/1169\nf 1191/1238/1191 1169/1215/1169 1183/1230/1183\nf 1192/1239/1192 1193/1240/1193 1179/1226/1179\nf 1192/1239/1192 1179/1226/1179 1178/1225/1178\nf 1192/1239/1192 1178/1225/1178 1177/1224/1177\nf 1192/1239/1192 1177/1224/1177 1194/1241/1194\nf 1180/1227/1180 1193/1240/1193 1072/1108/1072\nf 1180/1227/1180 1072/1108/1072 1105/1144/1105\nf 1180/1227/1180 1105/1144/1105 1107/1146/1107\nf 1180/1227/1180 1107/1146/1107 1181/1228/1181\nf 1194/1241/1194 1177/1224/1177 1176/1223/1176\nf 1194/1241/1194 1176/1223/1176 1114/1161/1114\nf 1062/1095/1062 1194/1241/1194 1114/1161/1114\nf 1062/1095/1062 1114/1161/1114 1066/1101/1066\nf 707/724/707 1072/1108/1072 1193/1240/1193\nf 707/724/707 1193/1240/1193 825/845/825\nf 825/845/825 1193/1240/1193 1192/1239/1192\nf 825/845/825 1192/1239/1192 1059/1093/1059\nf 1173/1220/1173 1191/1238/1191 832/853/832\nf 1173/1220/1173 832/853/832 711/728/711\nf 1183/1230/1183 1182/1229/1182 1005/1035/1005\nf 1183/1230/1183 1005/1035/1005 831/851/831\nf 1187/1234/1187 1184/1233/1184 1166/1212/1166\nf 1187/1234/1187 1166/1212/1166 1167/1214/1167\nf 710/727/710 1115/1160/1115 1175/1222/1175\nf 710/727/710 1175/1222/1175 1174/1221/1174\nf 1182/1229/1182 1181/1228/1181 1107/1146/1107\nf 1182/1229/1182 1107/1146/1107 1005/1035/1005\nf 453/443/453 1049/1083/1049 720/738/720\nf 453/443/453 720/738/720 598/590/598\nf 1123/1170/1123 888/910/888 889/909/889\nf 1123/1170/1123 889/909/889 844/865/844\nf 916/938/916 794/814/794 793/813/793\nf 916/938/916 793/813/793 913/939/913\nf 711/728/711 832/853/832 770/787/770\nf 711/728/711 770/787/770 708/729/708\nf 919/943/919 927/949/927 1128/1174/1128\nf 919/943/919 1128/1174/1128 959/982/959\nf 925/948/925 708/729/708 770/787/770\nf 925/948/925 770/787/770 769/786/769\nf 913/939/913 793/813/793 954/976/954\nf 913/939/913 954/976/954 924/946/924\nf 831/851/831 832/853/832 1191/1238/1191\nf 831/851/831 1191/1238/1191 1183/1230/1183\nf 895/915/895 767/784/767 766/783/766\nf 895/915/895 766/783/766 1006/1036/1006\nf 891/912/891 804/828/804 807/827/807\nf 891/912/891 807/827/807 788/808/788\nf 778/795/778 777/794/777 788/808/788\nf 778/795/778 788/808/788 807/827/807\nf 810/830/810 1000/1027/1000 776/797/776\nf 810/830/810 776/797/776 779/796/779\nf 947/970/947 1127/1173/1127 1073/1110/1073\nf 947/970/947 1073/1110/1073 952/975/952\nf 1106/1145/1106 1136/1182/1136 1132/1178/1132\nf 1106/1145/1106 1132/1178/1132 714/731/714\nf 1061/1096/1061 1062/1095/1062 1066/1101/1066\nf 1061/1096/1061 1066/1101/1066 1065/1104/1065\nf 443/1098/443 497/1150/497 1057/1090/1057\nf 443/1098/443 1057/1090/1057 1064/1099/1064\nf 1064/1099/1064 1108/1147/1108 1113/1159/1113\nf 1064/1099/1064 1113/1159/1113 1063/1100/1063\nf 1061/1096/1061 1108/1147/1108 1056/1089/1056\nf 1061/1096/1061 1056/1089/1056 1060/1094/1060\nf 1192/1239/1192 1194/1241/1194 1062/1095/1062\nf 1192/1239/1192 1062/1095/1062 1059/1093/1059\nf 1173/1220/1173 711/728/711 710/727/710\nf 1173/1220/1173 710/727/710 1174/1221/1174\nf 880/900/880 881/905/881 884/904/884\nf 880/900/880 884/904/884 878/901/878\nf 841/862/841 1047/1081/1047 1046/1080/1046\nf 841/862/841 1046/1080/1046 723/740/723\nf 1070/1106/1070 1048/1082/1048 1047/1081/1047\nf 1070/1106/1070 1047/1081/1047 841/862/841\nf 461/1115/461 342/999/342 885/907/885\nf 461/1115/461 885/907/885 886/906/886\nf 1114/1161/1114 1176/1223/1176 1175/1222/1175\nf 1114/1161/1114 1175/1222/1175 1115/1160/1115\nf 887/908/887 1124/1169/1124 1130/1176/1130\nf 887/908/887 1130/1176/1130 852/873/852\nf 206/186/206 852/873/852 1130/1176/1130\nf 206/186/206 1130/1176/1130 532/524/532\nf 681/698/681 599/592/599 1195/1242/1195\nf 681/698/681 1195/1242/1195 682/699/682\nf 1196/1243/1196 674/691/674 684/702/684\nf 1196/1243/1196 684/702/684 1195/1242/1195\nf 1197/1244/1197 675/692/675 674/691/674\nf 1197/1244/1197 674/691/674 1196/1243/1196\nf 689/706/689 690/708/690 675/692/675\nf 689/706/689 675/692/675 1197/1244/1197\nf 693/710/693 1199/1245/1199 1200/1246/1200\nf 693/710/693 1200/1246/1200 1198/1247/1198\nf 686/707/686 689/706/689 1197/1244/1197\nf 686/707/686 1197/1244/1197 1199/1245/1199\nf 1196/1243/1196 1195/1242/1195 1202/1248/1202\nf 1196/1243/1196 1202/1248/1202 1201/1249/1201\nf 1084/1122/1084 1083/1124/1083 1204/1250/1204\nf 1084/1122/1084 1204/1250/1204 1203/1251/1203\nf 1092/1131/1092 1013/1042/1013 1203/1251/1203\nf 1092/1131/1092 1203/1251/1203 1204/1250/1204\nf 1206/1252/1206 1087/1253/1087 1207/1254/1207\nf 1206/1252/1206 1207/1254/1207 1205/1255/1205\nf 1206/1252/1206 1208/1256/1208 1086/1257/1086\nf 1206/1252/1206 1086/1257/1086 1087/1253/1087\nf 1091/1258/1091 1090/1259/1090 1210/1260/1210\nf 1091/1258/1091 1210/1260/1210 1209/1261/1209\nf 1093/1132/1093 1211/1262/1211 757/774/757\nf 1093/1132/1093 757/774/757 756/775/756\nf 1079/1120/1079 1212/1263/1212 1090/1128/1090\nf 1079/1120/1079 1090/1128/1090 1080/1118/1080\nf 1079/1120/1079 979/1006/979 1088/1127/1088\nf 1079/1120/1079 1088/1127/1088 1212/1263/1212\nf 1209/1261/1209 1213/1264/1213 1085/1265/1085\nf 1209/1261/1209 1085/1265/1085 1131/1266/1131\nf 1089/1130/1089 1091/1129/1091 1131/1177/1131\nf 1089/1130/1089 1131/1177/1131 1036/1070/1036\nf 1213/1264/1213 1214/1267/1214 1204/1268/1204\nf 1213/1264/1213 1204/1268/1204 1083/1269/1083\nf 1214/1267/1214 1215/1270/1215 1092/1271/1092\nf 1214/1267/1214 1092/1271/1092 1204/1268/1204\nf 1015/1045/1015 757/774/757 1211/1262/1211\nf 1015/1045/1015 1211/1262/1211 1216/1272/1216\nf 1211/1273/1211 1093/1274/1093 1215/1270/1215\nf 1211/1273/1211 1215/1270/1215 1217/1275/1217\nf 1088/1276/1088 1208/1256/1208 1210/1260/1210\nf 1088/1276/1088 1210/1260/1210 1212/1277/1212\nf 1216/1278/1216 1211/1273/1211 1217/1275/1217\nf 1216/1278/1216 1217/1275/1217 1218/1279/1218\nf 1219/1280/1219 1218/1279/1218 1205/1255/1205\nf 1219/1280/1219 1205/1255/1205 1207/1254/1207\nf 698/715/698 697/714/697 717/734/717\nf 698/715/698 717/734/717 716/737/716\nf 967/992/967 418/407/418 524/516/524\nf 967/992/967 524/516/524 968/993/968\nf 598/590/598 720/738/720 712/733/712\nf 598/590/598 712/733/712 293/276/293\nf 697/714/697 721/739/721 1050/1084/1050\nf 697/714/697 1050/1084/1050 717/734/717\nf 957/979/957 956/978/956 1005/1035/1005\nf 957/979/957 1005/1035/1005 1107/1146/1107\nf 1186/1232/1186 1185/1231/1185 1189/1236/1189\nf 1186/1232/1186 1189/1236/1189 1190/1237/1190\nf 1022/1051/1022 896/917/896 765/782/765\nf 1022/1051/1022 765/782/765 764/785/764\nf 1122/1168/1122 896/917/896 1022/1051/1022\nf 1122/1168/1122 1022/1051/1022 1021/1054/1021\nf 678/695/678 1198/1247/1198 625/631/625\nf 678/695/678 625/631/625 27/8/27\nf 1195/1242/1195 599/592/599 626/632/626\nf 1195/1242/1195 626/632/626 1202/1248/1202\nf 1202/1248/1202 626/632/626 628/634/628\nf 1202/1248/1202 628/634/628 1220/1281/1220\nf 1198/1247/1198 1220/1281/1220 628/634/628\nf 1198/1247/1198 628/634/628 625/631/625\nf 1222/1282/1222 1223/1283/1223 1224/1284/1224\nf 1222/1282/1222 1224/1284/1224 1221/1285/1221\nf 1226/1286/1226 1227/1287/1227 1228/1288/1228\nf 1226/1286/1226 1228/1288/1228 1225/1289/1225\nf 1230/1290/1230 1231/1291/1231 1232/1292/1232\nf 1230/1290/1230 1232/1292/1232 1229/1293/1229\nf 1234/1294/1234 1232/1292/1232 1231/1291/1231\nf 1234/1294/1234 1231/1291/1231 1233/1295/1233\nf 1236/1296/1236 1237/1297/1237 1238/1298/1238\nf 1236/1296/1236 1238/1298/1238 1235/1299/1235\nf 1221/1285/1221 1239/1300/1239 1240/1301/1240\nf 1221/1285/1221 1240/1301/1240 1233/1295/1233\nf 1242/1302/1242 1243/1303/1243 1244/1304/1244\nf 1242/1302/1242 1244/1304/1244 1241/1305/1241\nf 1237/1297/1237 1245/1306/1245 1246/1307/1246\nf 1237/1297/1237 1246/1307/1246 1238/1298/1238\nf 1246/1307/1246 1245/1306/1245 1242/1302/1242\nf 1246/1307/1246 1242/1302/1242 1241/1305/1241\nf 1248/1308/1248 1224/1284/1224 1249/1309/1249\nf 1248/1308/1248 1249/1309/1249 1247/1310/1247\nf 1249/1309/1249 1250/1311/1250 660/1312/660\nf 1249/1309/1249 660/1312/660 659/1313/659\nf 661/1314/661 1247/1310/1247 1249/1309/1249\nf 661/1314/661 1249/1309/1249 659/1313/659\nf 1221/1285/1221 1224/1284/1224 1248/1308/1248\nf 1221/1285/1221 1248/1308/1248 1239/1300/1239\nf 1231/1291/1231 1222/1282/1222 1221/1285/1221\nf 1231/1291/1231 1221/1285/1221 1233/1295/1233\nf 1232/1292/1232 1234/1294/1234 1243/1303/1243\nf 1232/1292/1232 1243/1303/1243 1242/1302/1242\nf 1244/1304/1244 1243/1303/1243 1234/1294/1234\nf 1244/1304/1244 1234/1294/1234 1251/1315/1251\nf 1240/1301/1240 1251/1315/1251 1234/1294/1234\nf 1240/1301/1240 1234/1294/1234 1233/1295/1233\nf 1253/1316/1253 1134/1181/1134 1135/1180/1135\nf 1253/1316/1253 1135/1180/1135 1252/1317/1252\nf 1254/1318/1254 1255/1319/1255 1229/1293/1229\nf 1254/1318/1254 1229/1293/1229 1232/1292/1232\nf 1254/1318/1254 1225/1289/1225 1228/1288/1228\nf 1254/1318/1254 1228/1288/1228 1255/1319/1255\nf 667/1320/667 1252/1317/1252 1135/1180/1135\nf 667/1320/667 1135/1180/1135 539/1183/539\nf 1226/1286/1226 1225/1289/1225 1237/1297/1237\nf 1226/1286/1226 1237/1297/1237 1236/1296/1236\nf 1245/1306/1245 1254/1318/1254 1232/1292/1232\nf 1245/1306/1245 1232/1292/1232 1242/1302/1242\nf 1254/1318/1254 1245/1306/1245 1237/1297/1237\nf 1254/1318/1254 1237/1297/1237 1225/1289/1225\nf 669/674/669 668/675/668 1226/1286/1226\nf 669/674/669 1226/1286/1226 1236/1296/1236\nf 1230/1290/1230 1256/1321/1256 1222/1282/1222\nf 1230/1290/1230 1222/1282/1222 1231/1291/1231\nf 1235/1299/1235 671/677/671 669/674/669\nf 1235/1299/1235 669/674/669 1236/1296/1236\nf 1230/1290/1230 1101/1139/1101 1100/1138/1100\nf 1230/1290/1230 1100/1138/1100 1256/1321/1256\nf 672/678/672 488/480/488 1103/1142/1103\nf 672/678/672 1103/1142/1103 1227/1287/1227\nf 1224/1284/1224 1223/1283/1223 1250/1311/1250\nf 1224/1284/1224 1250/1311/1250 1249/1309/1249\nf 1256/1321/1256 1100/1138/1100 1134/1181/1134\nf 1256/1321/1256 1134/1181/1134 1253/1316/1253\nf 1227/1287/1227 1103/1142/1103 1132/1178/1132\nf 1227/1287/1227 1132/1178/1132 1228/1288/1228\nf 1101/1139/1101 1230/1290/1230 1229/1293/1229\nf 1101/1139/1101 1229/1293/1229 1133/1179/1133\nf 1223/1283/1223 1253/1316/1253 1252/1317/1252\nf 1223/1283/1223 1252/1317/1252 1250/1311/1250\nf 1255/1319/1255 1136/1182/1136 1133/1179/1133\nf 1255/1319/1255 1133/1179/1133 1229/1293/1229\nf 1228/1288/1228 1132/1178/1132 1136/1182/1136\nf 1228/1288/1228 1136/1182/1136 1255/1319/1255\nf 660/1312/660 1250/1311/1250 1252/1317/1252\nf 660/1312/660 1252/1317/1252 667/1320/667\nf 668/675/668 672/678/672 1227/1287/1227\nf 668/675/668 1227/1287/1227 1226/1286/1226\nf 1222/1282/1222 1256/1321/1256 1253/1316/1253\nf 1222/1282/1222 1253/1316/1253 1223/1283/1223\nf 1/1322/1 12/1323/12 1247/1310/1247\nf 1/1322/1 1247/1310/1247 661/1314/661\nf 10/1324/10 8/1325/8 1240/1301/1240\nf 10/1324/10 1240/1301/1240 1239/1300/1239\nf 1239/1300/1239 1248/1308/1248 11/1326/11\nf 1239/1300/1239 11/1326/11 10/1324/10\nf 5/1327/5 3/1328/3 1235/1299/1235\nf 5/1327/5 1235/1299/1235 1238/1298/1238\nf 9/1329/9 4/1330/4 1246/1307/1246\nf 9/1329/9 1246/1307/1246 1241/1305/1241\nf 1240/1301/1240 8/1325/8 6/1331/6\nf 1240/1301/1240 6/1331/6 1251/1315/1251\nf 7/1332/7 9/1329/9 1241/1305/1241\nf 7/1332/7 1241/1305/1241 1244/1304/1244\nf 11/1326/11 1248/1308/1248 1247/1310/1247\nf 11/1326/11 1247/1310/1247 12/1323/12\nf 3/1328/3 2/690/2 671/677/671\nf 3/1328/3 671/677/671 1235/1299/1235\nf 1238/1298/1238 1246/1307/1246 4/1330/4\nf 1238/1298/1238 4/1330/4 5/1327/5\nf 7/1332/7 1244/1304/1244 1251/1315/1251\nf 7/1332/7 1251/1315/1251 6/1331/6\nf 1203/1251/1203 1013/1042/1013 1012/1043/1012\nf 1203/1251/1203 1012/1043/1012 736/757/736\nf 937/959/937 941/964/941 1027/1057/1027\nf 937/959/937 1027/1057/1027 999/1030/999\nf 1084/1122/1084 739/756/739 1034/1067/1034\nf 1084/1122/1084 1034/1067/1034 1037/1071/1037\nf 1197/1244/1197 1196/1243/1196 1201/1249/1201\nf 1197/1244/1197 1201/1249/1201 1199/1245/1199\nf 1203/1251/1203 736/757/736 739/756/739\nf 1203/1251/1203 739/756/739 1084/1122/1084\nf 936/962/936 784/805/784 941/964/941\nf 936/962/936 941/964/941 937/959/937\nf 786/806/786 1004/1033/1004 940/963/940\nf 786/806/786 940/963/940 785/804/785\nf 467/1333/467 612/604/612 387/1334/387\nf 612/604/612 624/630/624 387/1334/387\nf 621/628/621 387/1334/387 624/630/624\nf 604/595/604 44/22/44 28/5/28\nf 472/605/472 612/604/612 467/1333/467\nf 29/6/29 28/5/28 47/26/47\nf 43/21/43 48/25/48 44/22/44\nf 30/7/30 266/1335/266 27/8/27\nf 424/414/424 239/223/239 425/415/425\nf 467/458/467 363/347/363 472/463/472\nf 561/552/561 560/553/560 572/564/572\nf 549/540/549 551/542/551 579/571/579\nf 583/574/583 595/588/595 582/575/582\nf 31/12/31 36/13/36 600/591/600\nf 39/16/39 44/22/44 603/597/603\nf 32/9/32 599/592/599 45/23/45\nf 473/626/473 613/607/613 471/606/471\nf 477/620/477 478/625/478 620/621/620\nf 474/611/474 615/610/615 617/627/617\nf 1257/1336/1257 614/609/614 618/616/618\nf 1257/1336/1257 620/621/620 622/624/622\nf 1257/1336/1257 618/616/618 619/619/619\nf 1257/1336/1257 613/607/613 615/610/615\nf 614/609/614 1257/1336/1257 615/610/615\nf 622/624/622 623/629/623 1257/1336/1257\nf 1257/1336/1257 623/629/623 611/603/611\nf 624/630/624 623/629/623 621/628/621\nf 469/617/469 618/616/618 470/615/470\nf 614/609/614 476/608/476 533/614/533\nf 610/602/610 1257/1336/1257 611/603/611\nf 613/607/613 1257/1336/1257 610/602/610\nf 620/621/620 1257/1336/1257 619/619/619\nf 541/532/541 592/584/592 562/555/562\nf 541/532/541 587/581/587 592/584/592\nf 627/633/627 607/599/607 605/596/605\nf 627/633/627 605/596/605 604/595/604\nf 605/596/605 606/598/606 603/597/603\nf 607/599/607 606/598/606 605/596/605\nf 1207/1254/1207 1082/1337/1082 1015/1338/1015\nf 1219/1280/1219 1207/1254/1207 1015/1338/1015\nf 1015/1338/1015 1216/1278/1216 1219/1280/1219\nf 693/710/693 1198/1247/1198 678/695/678\nf 1207/1254/1207 1087/1253/1087 1082/1337/1082\nf 678/695/678 677/697/677 694/712/694\nf 695/713/695 692/711/692 693/710/693\nf 266/1335/266 679/696/679 27/8/27\nf 883/903/883 1044/1079/1044 1045/1078/1045\nf 992/1020/992 1082/1121/1082 1087/1125/1087\nf 1158/1205/1158 1157/1204/1157 1168/1216/1168\nf 1147/1194/1147 1145/1192/1145 1176/1223/1176\nf 1193/1240/1193 1180/1227/1180 1179/1226/1179\nf 684/702/684 682/699/682 1195/1242/1195\nf 693/710/693 686/707/686 1199/1245/1199\nf 599/592/599 681/698/681 45/23/45\nf 1208/1256/1208 1088/1276/1088 1086/1257/1086\nf 1093/1274/1093 1092/1271/1092 1215/1270/1215\nf 1210/1260/1210 1090/1259/1090 1212/1277/1212\nf 1209/1261/1209 1258/1339/1258 1213/1264/1213\nf 1215/1270/1215 1258/1339/1258 1217/1275/1217\nf 1213/1264/1213 1258/1339/1258 1214/1267/1214\nf 1208/1256/1208 1258/1339/1258 1210/1260/1210\nf 1258/1339/1258 1209/1261/1209 1210/1260/1210\nf 1218/1279/1218 1217/1275/1217 1258/1339/1258\nf 1218/1279/1218 1258/1339/1258 1205/1255/1205\nf 1218/1279/1218 1219/1280/1219 1216/1278/1216\nf 1213/1264/1213 1083/1269/1083 1085/1265/1085\nf 1091/1258/1091 1209/1261/1209 1131/1266/1131\nf 1258/1339/1258 1206/1252/1206 1205/1255/1205\nf 1258/1339/1258 1208/1256/1208 1206/1252/1206\nf 1258/1339/1258 1215/1270/1215 1214/1267/1214\nf 1189/1236/1189 1138/1184/1138 1160/1207/1160\nf 1185/1231/1185 1138/1184/1138 1189/1236/1189\nf 1202/1248/1202 1220/1281/1220 1200/1246/1200\nf 1200/1246/1200 1220/1281/1220 1198/1247/1198\nf 1201/1249/1201 1200/1246/1200 1199/1245/1199\nf 1201/1249/1201 1202/1248/1202 1200/1246/1200\n# 2492 faces\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6.workbook/obj/diablo3_pose.obj",
    "content": "v 0.11526 0.700717 0.0677257\nv 0.114223 0.654606 0.0821706\nv 0.119952 0.67202 0.101202\nv 0.12069 0.712368 0.0932415\nv 0.120409 0.670105 0.118388\nv 0.103434 0.63749 0.102854\nv 0.0998313 0.642305 0.121165\nv 0.113204 0.661161 0.119513\nv 0.110674 0.71474 0.118248\nv 0.114329 0.673286 0.128141\nv 0.0938038 0.672987 0.125628\nv 0.0910976 0.702896 0.120497\nv 0.107546 0.664288 0.12793\nv 0.116526 0.652831 0.0186975\nv 0.122606 0.631867 0.0339156\nv 0.123238 0.584561 0.0390644\nv 0.113679 0.582153 0.0698344\nv 0.107247 0.593611 0.124012\nv 0.099392 0.618107 0.132025\nv 0.0519629 0.664482 0.148508\nv 0.056813 0.67065 0.139722\nv 0.0671458 0.660001 0.134186\nv 0.0799037 0.658226 0.13039\nv 0.0872667 0.645679 0.131726\nv 0.0690261 0.645978 0.151671\nv 0.0731557 0.627719 0.151074\nv 0.0524549 0.654325 0.16232\nv 0.0402945 0.655625 0.166186\nv 0.0399431 0.667873 0.157259\nv 0.0514006 0.648069 0.163058\nv 0.0395565 0.644343 0.164429\nv 0.0403297 0.634327 0.163322\nv 0.048132 0.610076 0.154571\nv 0.021597 0.677468 0.15559\nv 0.0424033 0.672267 0.161494\nv 0.0551611 0.669385 0.152479\nv 0.0324219 0.694391 0.157312\nv 0.0500123 0.692264 0.158015\nv 0.0621024 0.681106 0.149088\nv 0.042087 0.725178 0.149141\nv 0.0617158 0.711489 0.15088\nv 0.0706604 0.695445 0.133782\nv 0.0129512 0.710365 0.135873\nv 0.0267634 0.736074 0.134696\nv 0.0996029 0.759463 0.122043\nv 0.127526 0.758813 0.113749\nv 0.0634907 0.787228 0.117404\nv 0.0781113 0.602994 0.15624\nv 0.0661442 0.626208 0.15269\nv 0.0892525 0.572418 0.146698\nv 0.0501705 0.601641 0.155028\nv 0.0637543 0.593944 0.162443\nv 0.0649668 0.641321 0.158156\nv 0.0678663 0.629969 0.156521\nv 0.0497663 0.643588 0.152233\nv 0.0475697 0.626384 0.148209\nv 0.0605209 0.610199 0.15566\nv 0.0599761 0.626419 0.15429\nv 0.0643869 0.628457 0.153182\nv 0.0578146 0.640741 0.152849\nv 0.0813095 0.813025 0.103117\nv 0.135047 0.790409 0.0950163\nv 0.116789 0.817945 0.0520332\nv 0.0892876 0.821565 0.0596598\nv 0.0257091 0.775507 0.125488\nv 0.0636313 0.679507 0.139194\nv 0.0781289 0.671792 0.13872\nv 0.0878993 0.595034 0.00293464\nv 0.116772 0.566636 0.0537026\nv 0.114417 0.562155 0.0744385\nv 0.128176 0.558166 0.0246547\nv 0.107194 0.567445 0.09651\nv 0.0944716 0.545496 0.110902\nv 0.0712403 0.535304 0.117264\nv 0.112431 0.54474 0.087214\nv 0.0971602 0.533775 0.0882684\nv 0.0731382 0.524128 0.0962816\nv 0.106368 0.520964 0.0665483\nv 0.099392 0.514164 0.0756159\nv 0.0780586 0.512283 0.0791129\nv 0.1141 0.533037 0.0671107\nv 0.115436 0.533582 0.0411731\nv 0.115752 0.527449 0.0417179\nv 0.114469 0.546304 0.0516993\nv 0.102151 0.525076 0.0562506\nv 0.0970021 0.503198 0.0402242\nv 0.100605 0.498208 0.054177\nv 0.0863529 0.491407 0.0541595\nv 0.0949988 0.486943 0.0309282\nv 0.0732963 0.583559 0.000140556\nv 0.0795522 0.555653 0.0176783\nv 0.0874073 0.557569 0.0307173\nv 0.0843848 0.502601 0.03439\nv 0.0989175 0.529927 0.0420342\nv 0.0913612 0.482164 0.025094\nv 0.0906759 0.48197 0.0349172\nv 0.00242505 0.842706 0.085773\nv -0.0105613 0.872456 0.0789021\nv -0.0279935 0.869416 0.0666186\nv -0.0107546 0.825273 0.0714863\nv -0.00999895 0.80039 0.118951\nv -0.0275542 0.855217 0.105806\nv 0.00233719 0.823744 0.11222\nv -0.0122131 0.863705 0.0988999\nv -0.039451 0.902576 0.0606087\nv -0.00137068 0.808351 0.0664078\nv 0.0207008 0.806207 0.0844902\nv 0.0138474 0.77795 0.120374\nv -0.00152884 0.759691 0.126718\nv -0.0331072 0.875532 0.0913612\nv 0.0211577 0.79605 0.104594\nv -0.226707 -0.278811 0.0844199\nv -0.164271 -0.310688 0.0763188\nv -0.190121 -0.154536 0.0547394\nv -0.115682 -0.174358 0.0460584\nv -0.102748 -0.13025 0.0384494\nv -0.268074 -0.269339 0.0650371\nv -0.243946 -0.149703 0.0212455\nv -0.189084 -0.00231963 -0.0608723\nv -0.259147 -0.376006 0.0909394\nv -0.140495 -0.0527185 0.0225987\nv -0.164921 -0.01086 -0.00980567\nv -0.129125 -0.0841915 0.0319474\nv -0.116754 -0.0240045 0.0389238\nv -0.120655 -0.0525252 0.0430183\nv -0.0982849 -0.162391 0.0430007\nv -0.203775 -0.406776 0.0984782\nv -0.145872 -0.436597 0.059484\nv -0.112062 -0.35411 0.0492742\nv -0.237813 -0.446297 0.116033\nv -0.20511 -0.499332 0.0841563\nv -0.272291 -0.426932 0.106158\nv -0.270692 -0.459635 0.163568\nv -0.233912 -0.504639 0.102661\nv -0.283362 -0.512406 0.0865638\nv -0.252293 -0.489931 0.130584\nv -0.29858 -0.454451 0.1128\nv -0.291674 -0.453854 0.139897\nv -0.284153 -0.488068 0.128897\nv -0.294415 -0.476822 0.0981619\nv -0.302639 -0.443292 0.0965276\nv -0.311004 -0.454768 0.12489\nv -0.320423 -0.453836 0.0878993\nv -0.311865 -0.403683 0.0613995\nv -0.328718 -0.434137 0.0385899\nv -0.328278 -0.278442 -0.00706431\nv -0.321495 -0.34311 0.0478333\nv -0.297754 -0.253506 -0.137736\nv -0.214301 -0.520314 0.0970899\nv -0.231346 -0.516958 0.105876\nv -0.24356 -0.52411 0.101887\nv -0.222419 -0.53743 0.100727\nv -0.238007 -0.537219 0.100323\nv -0.233315 -0.527818 0.121288\nv -0.226268 -0.536639 0.0605033\nv -0.180209 -0.502091 0.0646329\nv -0.2563 -0.52404 0.0890767\nv -0.278617 -0.532422 0.106368\nv -0.24739 -0.547007 0.0609426\nv -0.272256 -0.556567 0.0515938\nv -0.237128 -0.554546 -0.0027238\nv -0.329438 -0.473131 0.0214564\nv -0.328981 -0.486733 0.0608371\nv -0.307384 -0.510948 0.0583242\nv -0.214266 -0.520806 0.0641936\nv -0.209187 -0.532686 0.0775489\nv -0.210118 -0.541472 0.0516817\nv -0.18448 -0.526307 0.0144449\nv -0.202369 -0.52469 0.046691\nv -0.13995 -0.494078 -0.0121604\nv -0.076477 -0.16464 -0.246828\nv -0.215215 -0.18578 -0.218676\nv -0.177468 -0.0685341 -0.2912\nv -0.300513 -0.164886 -0.0611535\nv -0.328489 -0.511264 -0.0174498\nv -0.32754 -0.511071 0.0356377\nv -0.294732 -0.547429 -0.00166944\nv -0.313974 -0.486012 0.0562506\nv -0.113872 -0.083102 0.0324922\nv -0.0877061 -0.1322 0.0504868\nv -0.0748427 -0.168576 0.02896\nv -0.0878115 -0.13336 0.0293466\nv -0.106439 -0.0435104 0.0336695\nv -0.100411 -0.0729097 0.019664\nv -0.0763716 -0.204442 0.0280814\nv -0.155678 -0.252803 -0.213914\nv -0.270464 -0.298615 -0.174779\nv -0.227252 -0.0342143 -0.120321\nv -0.229097 -0.0836292 -0.207834\nv -0.0959301 -0.172671 -0.22314\nv -0.18571 -0.119987 -0.24421\nv -0.0694303 -0.201104 0.043317\nv -0.0647911 -0.227656 0.0175025\nv -0.0861948 -0.217271 0.0386778\nv -0.0703792 -0.219379 0.0386251\nv -0.099515 -0.241258 0.0468492\nv -0.0809229 -0.241837 0.0346185\nv -0.361825 -0.347046 -0.0517169\nv -0.356465 -0.383352 0.0123713\nv -0.365041 -0.413717 -0.0374302\nv -0.198011 -0.343672 -0.195164\nv -0.222542 -0.382104 -0.170984\nv -0.0891119 -0.308386 -0.115946\nv -0.0247777 -0.200436 -0.16942\nv -0.122096 -0.400907 -0.110357\nv -0.0774611 -0.32262 -0.0285383\nv -0.0899027 -0.36237 -0.0259375\nv -0.0697642 -0.274013 0.00676553\nv -0.126085 -0.453625 -0.0196289\nv -0.150986 -0.459249 -0.0810108\nv -0.343496 -0.37142 -0.228429\nv -0.232489 -0.383334 -0.251801\nv -0.17195 -0.413577 -0.222964\nv -0.319439 -0.410818 -0.323955\nv -0.242874 -0.411029 -0.323674\nv -0.300373 -0.419147 -0.372492\nv -0.241398 -0.423136 -0.377693\nv -0.280023 -0.359242 -0.238586\nv -0.336608 -0.363635 -0.116596\nv -0.341528 -0.467894 -0.310635\nv -0.376516 -0.419341 -0.17\nv -0.34021 -0.470987 -0.359734\nv -0.356922 -0.494693 -0.23154\nv -0.3678 -0.432415 -0.235687\nv -0.3691 -0.469423 -0.118248\nv -0.337117 -0.518838 -0.136945\nv -0.268197 -0.578551 -0.134977\nv -0.192633 -0.538994 -0.0549854\nv -0.157927 -0.511422 -0.0755105\nv -0.170052 -0.525604 -0.152884\nv -0.146153 -0.481074 -0.182283\nv -0.185956 -0.440973 -0.312691\nv -0.281376 -0.36418 -0.154307\nv -0.159315 -0.374846 -0.160071\nv -0.177029 -0.419499 -0.142814\nv -0.207623 -0.455523 -0.380628\nv -0.20019 -0.524444 -0.379503\nv -0.332267 -0.533529 -0.224792\nv -0.27563 -0.574175 -0.229923\nv -0.175816 -0.507697 -0.257214\nv -0.293695 -0.535023 0.0562506\nv -0.0170808 -0.191808 -0.0932415\nv -0.0249886 -0.115858 -0.00550031\nv -0.0118968 -0.173286 -0.0372369\nv -0.216093 -0.549345 -0.141426\nv -0.23291 -0.571153 -0.356694\nv -0.211893 -0.551805 -0.242365\nv -0.213334 -0.49464 -0.477524\nv -0.24196 -0.540681 -0.524602\nv -0.222824 -0.433786 -0.46568\nv -0.322303 -0.541771 -0.514656\nv -0.347767 -0.520121 -0.487664\nv -0.280392 -0.547306 -0.527994\nv -0.286262 -0.580027 -0.331002\nv -0.335676 -0.543387 -0.345904\nv -0.371261 -0.533406 -0.419358\nv -0.324289 -0.469845 -0.50427\nv -0.359347 -0.47343 -0.451956\nv -0.242259 -0.468843 -0.513584\nv -0.328155 -0.438284 -0.464064\nv -0.274066 -0.472727 -0.520121\nv -0.268636 -0.418778 -0.47336\nv -0.26405 -0.676959 -0.365744\nv -0.223509 -0.587302 -0.461551\nv -0.229431 -0.689242 -0.390381\nv -0.217798 -0.629336 -0.456683\nv -0.244421 -0.666872 -0.48132\nv -0.27078 -0.728043 -0.425509\nv -0.283204 -0.679841 -0.483376\nv -0.276843 -0.784821 -0.410097\nv -0.244755 -0.72734 -0.414403\nv -0.238868 -0.781991 -0.378519\nv -0.24739 -0.767353 -0.363354\nv -0.241451 -0.720768 -0.382596\nv -0.268583 -0.7146 -0.363898\nv -0.251221 -0.79851 -0.377096\nv -0.273469 -0.798422 -0.39191\nv -0.263188 -0.827716 -0.377482\nv -0.25326 -0.811514 -0.363354\nv -0.282466 -0.829192 -0.392033\nv -0.274997 -0.828366 -0.372615\nv -0.275489 -0.81487 -0.357748\nv -0.239852 -0.749868 -0.402822\nv -0.257881 -0.783801 -0.405107\nv -0.234703 -0.689839 -0.458511\nv -0.328454 -0.660264 -0.488051\nv -0.367167 -0.637666 -0.455101\nv -0.388641 -0.741943 -0.435631\nv -0.376199 -0.631515 -0.395108\nv -0.400098 -0.749288 -0.367958\nv -0.383721 -0.823042 -0.261308\nv -0.341229 -0.632657 -0.35462\nv -0.362352 -0.751995 -0.321882\nv -0.42405 -0.853284 -0.300847\nv -0.350174 -0.740432 -0.472639\nv -0.374196 -0.81292 -0.477929\nv -0.319228 -0.757776 -0.318754\nv -0.282642 -0.767582 -0.344621\nv -0.337117 -0.824061 -0.251221\nv -0.378642 -0.839771 -0.211243\nv -0.346519 -0.841335 -0.204056\nv -0.384265 -0.849313 -0.179577\nv -0.353566 -0.852177 -0.173321\nv -0.398341 -0.84731 -0.154711\nv -0.351914 -0.850033 -0.14466\nv -0.403841 -0.868169 -0.125505\nv -0.359206 -0.872685 -0.119829\nv -0.407268 -0.896601 -0.109988\nv -0.428268 -0.941078 -0.0731733\nv -0.385618 -0.936808 -0.0554072\nv -0.427512 -0.988226 -0.0347064\nv -0.40834 -0.985977 -0.0265877\nv -0.418638 -1 -0.0334763\nv -0.409447 -0.922574 -0.0527537\nv -0.368555 -0.903806 -0.104699\nv -0.420114 -0.954082 -0.0233543\nv -0.420711 -0.984887 -0.0225108\nv -0.380716 -0.952641 -0.0529294\nv -0.34615 -0.890767 -0.143553\nv -0.322708 -0.865621 -0.209732\nv -0.305029 -0.838523 -0.25282\nv -0.394229 -0.880435 -0.21279\nv -0.40298 -0.884916 -0.172548\nv -0.339911 -0.878431 -0.173321\nv -0.340333 -0.942467 -0.116332\nv -0.372263 -0.974871 -0.0709767\nv -0.418111 -0.930781 -0.135627\nv -0.368063 -0.961059 -0.140565\nv -0.395266 -0.987225 -0.105613\nv -0.412768 -0.970864 -0.0551963\nv -0.405546 -0.98306 -0.078041\nv -0.434401 -0.949988 -0.0829438\nv -0.430183 -0.963326 -0.099269\nv -0.400661 -0.968861 -0.0308228\nv -0.415563 -0.977208 -0.0443539\nv -0.43173 -0.974168 -0.0451095\nv -0.224142 -0.382578 -0.183021\nv -0.280744 -0.362475 -0.179102\nv -0.344762 -0.376305 -0.133308\nv -0.175869 -0.418251 -0.162514\nv -0.151408 -0.46742 -0.0904298\nv -0.409061 -0.832689 -0.359452\nv -0.436527 -0.875479 -0.277827\nv -0.409078 -0.870471 -0.240203\nv -0.391171 -0.957931 -0.0474467\nv -0.428619 -0.95236 -0.0712403\nv -0.392612 -0.924736 -0.175588\nv -0.355446 -0.943785 -0.177661\nv -0.330826 -0.922803 -0.173795\nv -0.319826 -0.938302 -0.223263\nv -0.383246 -0.93419 -0.226075\nv -0.347784 -0.955277 -0.227568\nv -0.480494 -0.870594 -0.26296\nv -0.466014 -0.867518 -0.233859\nv -0.496784 -0.864953 -0.258479\nv -0.484782 -0.858591 -0.230099\nv -0.519383 -0.873036 -0.246775\nv -0.51021 -0.867501 -0.220557\nv -0.533916 -0.892402 -0.2382\nv -0.52476 -0.883633 -0.21532\nv -0.587987 -0.92753 -0.202176\nv -0.573015 -0.93013 -0.187977\nv -0.603399 -0.965013 -0.185112\nv -0.587759 -0.96807 -0.171968\nv -0.586863 -0.943134 -0.216779\nv -0.594753 -0.980635 -0.201314\nv -0.598478 -0.987506 -0.180719\nv -0.494025 -0.905792 -0.259076\nv -0.524075 -0.915598 -0.247777\nv -0.576249 -0.955312 -0.233332\nv -0.549134 -0.94679 -0.181686\nv -0.488437 -0.883668 -0.221137\nv -0.471251 -0.883334 -0.227797\nv -0.500105 -0.92268 -0.200366\nv -0.542315 -0.9693 -0.213774\nv -0.510175 -0.93665 -0.225196\nv -0.579254 -0.973834 -0.194496\nv -0.562577 -0.97654 -0.205005\nv -0.574913 -0.952009 -0.179278\nv -0.587583 -0.966858 -0.20931\nv -0.586318 -0.976945 -0.189242\nv -0.474519 -0.931536 -0.233244\nv -0.471128 -0.917724 -0.215742\nv -0.419358 -0.91319 -0.226532\nv -0.434822 -0.917548 -0.305978\nv -0.403086 -0.886515 -0.359224\nv -0.386269 -0.851984 -0.4263\nv -0.313341 -0.810829 -0.460127\nv -0.316188 -0.843602 -0.441131\nv -0.336397 -0.967947 -0.279725\nv -0.260763 -0.938847 -0.308069\nv -0.331336 -0.942554 -0.324307\nv -0.331266 -0.886444 -0.370506\nv -0.42948 -0.944575 -0.319878\nv -0.402225 -0.95707 -0.275103\nv -0.289021 -0.878203 -0.359347\nv -0.281288 -0.843813 -0.282975\nv -0.270323 -0.859347 -0.334481\nv -0.24479 -0.877289 -0.243893\nv -0.248199 -0.887095 -0.304731\nv -0.253963 -0.845781 -0.223509\nv -0.303676 -0.75029 -0.466717\nv -0.289108 -0.850455 -0.208502\nv -0.260588 -0.844603 -0.187889\nv -0.228816 -0.848575 -0.203423\nv -0.206727 -0.855376 -0.172688\nv -0.241908 -0.847099 -0.155889\nv -0.203898 -0.870436 -0.156785\nv -0.234949 -0.862159 -0.140811\nv -0.19541 -0.921221 -0.103943\nv -0.216146 -0.921098 -0.103697\nv -0.198591 -0.962798 -0.0907462\nv -0.213334 -0.965487 -0.0940499\nv -0.205005 -0.982515 -0.0964222\nv -0.188469 -0.935121 -0.118687\nv -0.196746 -0.973518 -0.107019\nv -0.22669 -0.884125 -0.210769\nv -0.20989 -0.902594 -0.18202\nv -0.244526 -0.94744 -0.12315\nv -0.259902 -0.893702 -0.160827\nv -0.264629 -0.859558 -0.181721\nv -0.263751 -0.886901 -0.173022\nv -0.23342 -0.952659 -0.161125\nv -0.195779 -0.953432 -0.152198\nv -0.238007 -0.917232 -0.176185\nv -0.212333 -0.960742 -0.113608\nv -0.223579 -0.965434 -0.138123\nv -0.22379 -0.944452 -0.106509\nv -0.197817 -0.949302 -0.126999\nv -0.21047 -0.968914 -0.104084\nv -0.240818 -0.908744 -0.186219\nv -0.307929 -0.903314 -0.210066\nv -0.240484 -0.924402 -0.250308\nv -0.278231 -0.957896 -0.25159\nv -0.268987 -0.933399 -0.223456\nv -0.0218079 -0.117158 0.00576388\nv -0.00451622 -0.172354 -0.017485\nv 0.0111588 -0.124943 0.00857553\nv 0.0238112 -0.188258 -0.0190665\nv -0.0554599 -0.00961236 0.0186623\nv -0.0614171 -0.0116157 0.0119144\nv -0.110744 -0.0432116 0.0195761\nv -0.0848944 0.0545812 0.00748601\nv 0.00130039 -0.0290304 0.0240924\nv 0.0115981 0.0488525 -0.00326856\nv -0.12735 -0.033775 0.0174498\nv -0.137437 0.00885669 0.00472708\nv -0.171651 0.0863529 -0.0459706\nv -0.154799 0.0739816 -0.0121253\nv -0.236794 0.11208 -0.127719\nv -0.00829438 -0.198556 -0.0915369\nv 0.00970021 -0.244807 -0.25275\nv -0.00630865 -0.252961 -0.285629\nv -0.126911 -0.230521 -0.328032\nv -0.0404702 -0.290022 -0.341757\nv -0.15805 -0.313658 -0.37764\nv -0.083225 -0.350771 -0.392753\nv -0.256054 -0.452518 -0.493463\nv -0.20815 -0.500773 -0.534478\nv -0.38785 -0.571943 -0.536727\nv -0.35831 -0.604172 -0.591642\nv -0.540699 -0.660106 -0.534829\nv -0.543475 -0.680473 -0.592679\nv -0.683214 -0.726338 -0.418321\nv -0.724001 -0.750641 -0.408744\nv -0.724388 -0.787808 -0.271782\nv -0.748234 -0.790022 -0.2689\nv -0.211313 -0.245001 -0.433381\nv -0.302499 -0.393263 -0.526043\nv -0.427301 -0.509964 -0.533318\nv -0.554036 -0.612449 -0.514199\nv -0.680245 -0.695516 -0.410888\nv -0.737585 -0.772502 -0.255017\nv -0.178171 -0.180192 -0.381313\nv -0.188715 -0.170773 -0.417759\nv -0.202053 -0.145064 -0.39212\nv -0.206551 -0.151056 -0.425157\nv -0.221031 -0.117808 -0.435455\nv -0.164482 -0.136752 -0.357045\nv -0.188293 -0.11888 -0.377025\nv -0.176484 -0.109971 -0.401733\nv -0.181826 -0.108793 -0.358328\nv -0.109865 -0.184638 -0.285313\nv -0.154623 -0.103557 -0.339982\nv -0.202105 -0.071293 -0.404562\nv -0.154992 -0.0832074 -0.364443\nv -0.237673 -0.218747 -0.499807\nv -0.233719 -0.194953 -0.539715\nv -0.245194 -0.22676 -0.551506\nv -0.263188 -0.209345 -0.57783\nv -0.23089 -0.256071 -0.488666\nv -0.233016 -0.250308 -0.535919\nv -0.207043 -0.223298 -0.566162\nv -0.206217 -0.240853 -0.557498\nv -0.18462 -0.187748 -0.548993\nv -0.212754 -0.192264 -0.556426\nv -0.241556 -0.20678 -0.578357\nv -0.20685 -0.173057 -0.491934\nv -0.20866 -0.138597 -0.47705\nv -0.218413 -0.113661 -0.525147\nv -0.215232 -0.118546 -0.496538\nv -0.224581 -0.051998 -0.457843\nv -0.201227 -0.0994096 -0.483007\nv -0.237444 -0.0798334 -0.476435\nv -0.190437 -0.1364 -0.440147\nv -0.238042 -0.0523847 -0.479932\nv -0.225038 -0.0361825 -0.473184\nv -0.204144 -0.026781 -0.448248\nv -0.221506 -0.00962994 -0.477858\nv -0.204899 -0.0453907 -0.494746\nv -0.219309 -0.0796226 -0.49884\nv -0.252188 -0.0474643 -0.521035\nv -0.151654 -0.104471 -0.517538\nv -0.186817 -0.100341 -0.495466\nv -0.169595 -0.0330721 -0.360524\nv -0.213686 0.0203142 -0.414912\nv -0.201771 -0.0223878 -0.43129\nv -0.22727 0.0430359 -0.42572\nv -0.168734 -0.0770218 -0.383475\nv -0.183689 -0.0212104 -0.453045\nv -0.137332 -0.0663023 -0.501599\nv -0.112677 -0.028714 -0.463185\nv -0.295294 -0.356096 -0.576424\nv -0.431079 -0.483569 -0.569009\nv -0.567901 -0.587179 -0.534109\nv -0.692089 -0.676326 -0.409816\nv -0.255263 -0.307103 -0.551752\nv -0.257512 -0.329192 -0.491811\nv -0.271079 -0.273082 -0.567005\nv -0.224423 -0.265631 -0.564756\nv -0.246758 -0.275191 -0.500949\nv -0.250712 -0.3106 -0.564299\nv -0.247461 -0.264401 -0.533986\nv -0.239676 -0.282202 -0.568868\nv -0.745598 -0.785278 -0.25282\nv -0.17058 -0.14835 -0.537219\nv -0.179348 -0.114329 -0.518979\nv -0.191597 -0.00715217 -0.30814\nv -0.223983 0.0790953 -0.344287\nv -0.260517 0.131884 -0.356869\nv -0.214125 0.0328788 -0.389818\nv -0.18383 0.0240396 -0.427231\nv -0.253137 0.104137 -0.375637\nv -0.27867 0.149861 -0.385531\nv -0.218202 0.115418 -0.406548\nv -0.113731 0.0165009 -0.454627\nv -0.106632 0.064545 -0.41971\nv -0.0471831 0.182318 0.00604504\nv -0.0370084 0.130549 -0.00416479\nv 0.0283977 0.118494 -0.0347767\nv -0.0450743 0.109514 0.0105788\nv -0.0674973 0.0732787 0.00590445\nv -0.0687977 0.109936 0.020279\nv -0.0988824 0.0630865 0.00678309\nv -0.05669 0.128475 -0.0250062\nv -0.0825396 0.0679893 -0.0156926\nv -0.0641233 0.105279 -0.0112818\nv -0.0997083 0.0442132 -0.00295226\nv -0.0515236 0.26368 -0.0284329\nv -0.0974063 0.409869 0.0412259\nv 0.0925034 0.404755 -0.0309634\nv 0.0899027 0.504077 -0.0140231\nv -0.210681 0.101466 -0.0606263\nv -0.165009 0.0900959 -0.0308931\nv -0.230907 0.108987 -0.0835589\nv -0.250554 0.145661 -0.116578\nv -0.200893 0.125663 -0.036534\nv -0.23762 0.0883387 -0.157453\nv -0.243384 0.101887 -0.219081\nv -0.228078 0.108495 -0.156838\nv -0.242119 0.0460057 -0.217148\nv -0.268724 0.124398 -0.177169\nv -0.267652 0.106948 -0.200401\nv -0.25869 0.0981092 -0.257196\nv -0.259709 0.086968 -0.311461\nv -0.245299 0.0941025 -0.28468\nv -0.25695 0.14162 -0.257354\nv -0.196306 0.118845 -0.202369\nv -0.273732 0.14603 -0.312094\nv -0.215056 0.115348 -0.267634\nv -0.170527 0.115172 -0.243489\nv -0.228342 0.113608 -0.289723\nv -0.273556 0.141321 -0.210171\nv -0.227094 0.121639 -0.194883\nv -0.245387 0.132816 -0.1839\nv -0.22669 0.12192 -0.242997\nv -0.203037 0.127825 -0.0755457\nv -0.162478 0.071293 -0.0233016\nv -0.199311 0.0553193 -0.0644221\nv -0.152181 0.114505 -0.0470777\nv -0.147137 0.0883738 -0.0385548\nv -0.02353 0.169859 -0.00704673\nv -0.0356201 0.185991 -0.0167645\nv -0.0239518 0.218184 -0.0281517\nv 0.0821706 0.347187 -0.041015\nv -0.0566197 0.318332 0.0103152\nv -0.0683056 0.370277 0.0193301\nv -0.0364461 0.218097 -0.0120901\nv -0.043317 0.219098 -0.0370436\nv -0.05307 0.172354 -0.0321056\nv -0.0248304 0.275858 -0.0146382\nv 0.0609602 0.245018 -0.0526834\nv -0.0702914 0.389133 0.0130566\nv -0.14104 0.178927 -0.0426493\nv -0.111201 0.22256 -0.0572172\nv -0.142305 0.331863 -0.0111939\nv -0.191509 0.13213 -0.126981\nv -0.171599 0.222419 -0.119566\nv -0.176273 0.291973 -0.0724353\nv -0.199294 0.174323 -0.243278\nv -0.218009 0.268003 -0.221312\nv -0.197079 0.350789 -0.0400134\nv -0.255931 0.328243 -0.16898\nv -0.265297 0.32204 -0.262398\nv -0.295716 0.36794 -0.250501\nv -0.238815 0.310301 -0.361508\nv -0.164552 0.174815 -0.262345\nv -0.192721 0.227779 -0.324852\nv -0.225512 0.270411 -0.334271\nv -0.206534 0.262538 -0.357906\nv -0.28642 0.334306 -0.245914\nv -0.287175 0.361561 -0.288827\nv -0.101905 0.20634 -0.336221\nv -0.211928 0.115524 -0.296419\nv -0.0737884 0.120304 -0.331195\nv -0.224686 0.145942 -0.351773\nv -0.153921 0.104348 -0.353601\nv -0.154729 0.134432 -0.300109\nv -0.0861421 0.470161 0.0632095\nv -0.0696236 0.420026 0.0354971\nv -0.116174 0.456788 0.065986\nv -0.099269 0.427459 0.0370084\nv -0.129213 0.440973 0.0426493\nv -0.0952799 0.419798 0.0239693\nv -0.104365 0.403015 0.0261659\nv -0.0480969 0.358345 0.0105964\nv -0.0635434 0.366148 0.00333882\nv -0.0767054 0.349594 -0.00279411\nv -0.216937 0.325537 -0.317963\nv -0.262064 0.35339 -0.277862\nv -0.251415 0.353232 -0.298896\nv -0.214248 0.287474 -0.268988\nv -0.135996 0.272449 -0.331441\nv -0.185991 0.352002 -0.366183\nv -0.177802 0.298334 -0.299353\nv -0.113152 0.272098 -0.350912\nv -0.134292 0.34789 -0.371683\nv -0.158419 0.209749 -0.320775\nv -0.144818 0.381788 -0.391628\nv -0.21887 0.291006 -0.323709\nv -0.271307 0.36982 -0.273662\nv -0.261308 0.383703 -0.295646\nv -0.297684 0.401206 -0.397586\nv -0.303553 0.405441 -0.369926\nv -0.300302 0.425087 -0.348329\nv -0.40841 0.456244 -0.431378\nv -0.39697 0.473869 -0.44389\nv -0.407022 0.47292 -0.407338\nv -0.474027 0.488859 -0.474607\nv -0.452114 0.485819 -0.465645\nv -0.470091 0.486293 -0.452764\nv -0.444593 0.465276 -0.442396\nv -0.434576 0.480617 -0.454891\nv -0.44758 0.479703 -0.426159\nv -0.460567 0.471971 -0.460742\nv -0.294855 0.443574 -0.346009\nv -0.3969 0.493867 -0.432872\nv -0.403051 0.493762 -0.411802\nv -0.461586 0.496538 -0.458528\nv -0.439356 0.495923 -0.443749\nv -0.444435 0.494289 -0.432222\nv -0.270253 0.463361 -0.397058\nv -0.258426 0.427653 -0.419183\nv -0.285242 0.464714 -0.364232\nv -0.250185 0.415 -0.287913\nv -0.163884 0.398587 -0.370242\nv -0.219731 0.462746 -0.353495\nv -0.188961 0.445067 -0.35411\nv -0.361104 0.568288 -0.308245\nv -0.354374 0.574403 -0.367589\nv -0.300671 0.599989 -0.392384\nv -0.312603 0.471637 -0.212051\nv -0.386058 0.625136 -0.27078\nv -0.440551 0.614206 -0.365181\nv -0.428162 0.646558 -0.388518\nv -0.435631 0.65566 -0.290444\nv -0.412997 0.68636 -0.368063\nv -0.319984 0.679524 -0.371999\nv -0.342003 0.658823 -0.283327\nv -0.419024 0.697079 -0.32218\nv -0.347538 0.705813 -0.334007\nv -0.150898 0.625716 -0.381893\nv -0.217552 0.679577 -0.296735\nv -0.172671 0.673479 -0.332232\nv -0.117756 0.687766 -0.318455\nv -0.274593 0.646874 -0.386726\nv -0.281798 0.677837 -0.329421\nv -0.351615 0.679278 -0.32863\nv -0.320616 0.659386 -0.380259\nv -0.148614 0.556022 -0.396496\nv -0.315696 0.684708 -0.327171\nv -0.223491 0.65812 -0.237216\nv -0.345218 0.671054 -0.308368\nv -0.278635 0.65436 -0.281763\nv -0.268724 0.631164 -0.229431\nv -0.307103 0.626401 -0.26108\nv -0.190244 0.68701 -0.250308\nv -0.138263 0.694531 -0.272678\nv -0.22191 0.704495 -0.291621\nv -0.450023 0.628686 -0.313236\nv -0.43013 0.694039 -0.294784\nv -0.524321 0.683882 -0.367483\nv -0.508716 0.697167 -0.386058\nv -0.526465 0.725723 -0.31835\nv -0.496134 0.739325 -0.369979\nv -0.524426 0.689189 -0.338225\nv -0.511616 0.739975 -0.314009\nv -0.56878 0.72973 -0.383703\nv -0.572558 0.782993 -0.358873\nv -0.575177 0.73994 -0.349489\nv -0.573753 0.771307 -0.338277\nv -0.503356 0.754279 -0.335097\nv -0.573753 0.768566 -0.379872\nv -0.6435 0.751379 -0.372492\nv -0.642481 0.760517 -0.362932\nv -0.631621 0.77621 -0.375321\nv -0.63633 0.76296 -0.380997\nv -0.659632 0.761062 -0.377588\nv -0.185622 0.524198 -0.384898\nv -0.195972 0.482902 -0.368678\nv -0.180772 0.441324 -0.45837\nv -0.208748 0.450216 -0.438776\nv -0.174727 0.536727 -0.443257\nv -0.207518 0.508523 -0.428971\nv -0.219696 0.522564 -0.519102\nv -0.21358 0.496345 -0.511967\nv -0.22379 0.498998 -0.504956\nv -0.212262 0.529558 -0.506203\nv -0.224054 0.519822 -0.500984\nv 0.0923629 0.459284 -0.0198397\nv -0.0165888 0.480195 0.0423329\nv -0.0253752 0.461832 0.0294521\nv 0.0173268 0.396935 0.00817136\nv 0.022792 0.347169 -0.0113345\nv 0.0708713 0.278617 -0.0503638\nv -0.0942256 0.492742 0.0723122\nv -0.144501 0.538379 0.0842617\nv -0.121007 0.498225 0.0578322\nv -0.17738 0.700137 -0.291727\nv -0.197835 0.689418 -0.27085\nv -0.094454 0.718676 -0.274576\nv -0.18643 0.712456 -0.219748\nv -0.132482 0.742681 -0.20374\nv -0.0662145 0.766668 -0.220293\nv -0.122079 0.76593 -0.171388\nv -0.022792 0.82566 -0.153393\nv -0.202527 0.718676 -0.194039\nv -0.172425 0.7327 -0.191245\nv -0.190349 0.696253 -0.212913\nv -0.191298 0.731575 -0.162039\nv -0.199786 0.700418 -0.184655\nv -0.187889 0.720293 -0.151794\nv -0.168893 0.765912 -0.128194\nv -0.118582 0.757196 -0.141215\nv -0.256001 0.688855 -0.215285\nv -0.252697 0.664183 -0.237655\nv -0.299336 0.51694 -0.317787\nv -0.33109 0.484132 -0.307191\nv -0.353232 0.496169 -0.348223\nv -0.305767 0.472376 -0.350227\nv -0.291217 0.558395 -0.371753\nv -0.192616 0.558518 -0.389836\nv -0.173813 0.725266 -0.155959\nv -0.1519 0.741662 -0.109338\nv -0.171072 0.73827 -0.132587\nv -0.101958 0.792395 -0.147788\nv -0.0465856 0.798352 -0.190982\nv -0.114364 0.756071 -0.102959\nv -0.118177 0.801937 -0.175553\nv -0.07479 0.79909 -0.172794\nv -0.109004 0.810284 -0.162285\nv -0.0652304 0.809756 -0.153991\nv -0.0105789 0.847556 -0.114452\nv -0.0680596 0.827646 -0.11881\nv -0.0867747 0.811689 -0.137051\nv -0.0922398 0.784522 -0.0962289\nv -0.119864 0.774751 -0.162531\nv -0.111921 0.777985 -0.16826\nv -0.214582 0.714283 -0.13814\nv -0.219661 0.734 -0.107862\nv -0.202914 0.686272 -0.107229\nv -0.233279 0.688785 -0.156662\nv -0.194514 0.694391 -0.0893579\nv -0.230028 0.679384 -0.12967\nv -0.233016 0.704812 -0.150951\nv -0.241205 0.703089 -0.115735\nv -0.219327 0.697378 -0.120075\nv -0.191702 0.721646 -0.109075\nv -0.160897 0.730977 -0.12113\nv -0.196763 0.675412 -0.0858961\nv -0.233033 0.661213 -0.112413\nv -0.0795698 0.802552 -0.103223\nv -0.0903596 0.821706 -0.135961\nv -0.0982849 0.783924 -0.165132\nv -0.103012 0.778863 -0.108723\nv -0.0882508 0.757337 -0.119337\nv -0.0494324 0.624433 -0.0333006\nv -0.158525 0.619741 -0.0540541\nv -0.0821179 0.708836 -0.110832\nv -0.153165 0.686202 -0.0551963\nv -0.0980037 0.604699 -0.0436334\nv -0.0140407 0.523776 0.0235476\nv -0.112923 0.520789 0.0663375\nv -0.188521 0.609057 -0.033652\nv -0.150652 0.559062 0.0299968\nv -0.222982 0.630021 0.0142516\nv -0.202703 0.545865 0.0467613\nv -0.174129 0.52165 0.0595192\nv -0.186993 0.649211 -0.0749482\nv -0.211805 0.605964 -0.0708713\nv -0.226531 0.680051 -0.0760728\nv -0.236443 0.616016 -0.0921168\nv -0.332777 0.47401 -0.181334\nv -0.361596 0.500176 -0.114786\nv -0.383158 0.42108 -0.117474\nv -0.276632 0.657435 -0.172073\nv -0.331793 0.511493 -0.219977\nv -0.39683 0.498295 -0.216146\nv -0.256599 0.664658 -0.123766\nv -0.271869 0.626226 -0.129916\nv -0.317717 0.629442 -0.1574\nv -0.315134 0.531192 -0.134397\nv -0.332689 0.496116 -0.155783\nv -0.355938 0.566777 -0.148174\nv -0.329842 0.531139 -0.115998\nv -0.348276 0.502003 -0.126577\nv -0.32081 0.521228 -0.148912\nv -0.39495 0.413225 0.045953\nv -0.403332 0.363143 -0.0164833\nv -0.399817 0.398991 -0.0650371\nv -0.392489 0.450181 -0.00407692\nv -0.346308 0.43491 0.123959\nv -0.367518 0.474801 0.0462341\nv -0.332373 0.535427 -0.0382912\nv -0.28171 0.441078 0.132236\nv -0.227849 0.465768 0.117439\nv -0.427459 0.387095 0.09108\nv -0.435789 0.338453 0.0306997\nv -0.381436 0.404456 0.137543\nv -0.445981 0.345218 0.129793\nv -0.40103 0.37815 0.163304\nv -0.343022 0.395828 0.198415\nv -0.247057 0.387112 0.149193\nv -0.301111 0.351193 0.208554\nv -0.502935 0.347099 0.210927\nv -0.414561 0.369135 0.26528\nv -0.472393 0.369047 0.222507\nv -0.525076 0.289671 0.226672\nv -0.448547 0.317436 0.0624011\nv -0.445647 0.289442 0.112765\nv -0.417601 0.287597 0.0317717\nv -0.29619 0.500808 0.109813\nv -0.37685 0.487435 -0.0773381\nv -0.271483 0.550118 0.0389062\nv -0.258215 0.567093 0.00386601\nv -0.136998 0.472797 0.0573753\nv -0.180543 0.516308 0.092644\nv -0.501213 0.341177 0.366253\nv -0.390398 0.318877 0.236513\nv -0.372615 0.303729 0.239026\nv -0.359189 0.311127 0.233859\nv -0.39017 0.326925 0.273469\nv -0.403455 0.34926 0.222015\nv -0.507029 0.287281 0.188065\nv -0.476048 0.350719 0.460285\nv -0.506801 0.306312 0.424876\nv -0.502144 0.329262 0.430622\nv -0.513303 0.304643 0.4609\nv -0.509595 0.322251 0.46554\nv -0.506063 0.31719 0.482867\nv -0.510579 0.288757 0.368063\nv -0.525006 0.295276 0.294152\nv -0.514884 0.339683 0.306224\nv -0.464573 0.372861 0.314378\nv -0.525375 0.258321 0.270218\nv -0.509138 0.244122 0.192212\nv -0.5223 0.242857 0.214107\nv -0.42043 0.246863 0.106316\nv -0.508576 0.232155 0.282606\nv -0.497733 0.22024 0.196499\nv -0.510807 0.219362 0.221734\nv -0.505869 0.288423 0.468931\nv -0.497188 0.29141 0.425948\nv -0.495291 0.25876 0.376164\nv -0.477788 0.219239 0.165835\nv -0.49327 0.246723 0.15921\nv -0.267037 0.352072 -0.149562\nv -0.309581 0.383808 -0.237778\nv -0.241785 0.297719 0.0423857\nv -0.302042 0.39683 -0.224282\nv -0.285277 0.271711 -0.000948948\nv -0.30698 0.390785 -0.281306\nv -0.316698 0.406249 -0.27512\nv -0.2731 0.385249 -0.293677\nv -0.263452 0.412821 -0.286367\nv -0.286156 0.401961 -0.303887\nv -0.314079 0.416002 -0.307226\nv -0.318156 0.421854 -0.302042\nv -0.280621 0.424296 -0.28403\nv -0.311935 0.428074 -0.302042\nv -0.304098 0.422187 -0.306839\nv -0.307331 0.457052 -0.262398\nv -0.370822 0.327382 -0.0895688\nv -0.343953 0.366218 -0.148139\nv -0.300671 0.491583 -0.277616\nv -0.335659 0.290637 -0.0737357\nv -0.320476 0.46496 -0.312111\nv -0.338066 0.474344 -0.340579\nv -0.297455 0.435719 -0.267617\nv -0.256634 0.516343 -0.333726\nv -0.263557 0.467613 -0.353636\nv -0.267793 0.493428 -0.353425\nv -0.301357 0.455242 -0.326503\nv -0.334429 0.500176 -0.33768\nv -0.309809 0.493182 -0.353495\nv -0.421098 0.275489 0.0633149\nv -0.386567 0.326714 -0.0402945\nv -0.335378 0.285875 -0.0232489\nv -0.203247 0.386761 0.0166415\nv -0.149896 0.414297 0.0263241\nv -0.167258 0.475011 0.0974941\nv -0.148438 0.479405 0.0743682\nv -0.35274 0.258619 0.207799\nv -0.291727 0.300443 0.118898\nv -0.249025 0.347099 0.0987418\nv -0.178312 0.408604 -0.0285207\nv -0.208185 0.421116 0.0755808\nv -0.363195 0.231136 0.119407\nv -0.381454 0.243911 0.0394686\nv -0.444241 0.202755 0.242646\nv -0.429023 0.199294 0.184251\nv -0.465821 0.260869 0.409061\nv -0.465557 0.22973 0.327733\nv -0.415211 0.276596 0.412751\nv -0.393597 0.231311 0.322954\nv -0.456859 0.366745 0.377236\nv -0.379275 0.297403 0.336239\nv -0.404 0.318508 0.418778\nv -0.410941 0.343268 0.465909\nv -0.372035 0.293062 0.278196\nv -0.364689 0.249991 0.295505\nv -0.381225 0.262714 0.347626\nv -0.322198 0.264489 0.169402\nv -0.3203 0.246318 0.0940498\nv -0.378115 0.221892 0.213018\nv -0.356131 0.254033 0.246986\nv -0.470144 0.325098 0.522862\nv -0.395406 0.31784 0.498172\nv -0.395582 0.311356 0.464889\nv -0.529013 0.265543 0.56031\nv -0.496521 0.275208 0.59101\nv -0.453555 0.274734 0.607458\nv -0.422012 0.276386 0.605578\nv -0.545127 0.249148 0.535286\nv -0.449671 0.259937 0.639388\nv -0.425755 0.262978 0.637648\nv -0.453432 0.243595 0.685306\nv -0.43918 0.246811 0.686764\nv -0.458844 0.243296 0.700418\nv -0.441359 0.248445 0.704003\nv -0.461111 0.233473 0.724071\nv -0.446245 0.234597 0.726356\nv -0.46684 0.212385 0.754261\nv -0.467807 0.186237 0.773363\nv -0.442291 0.188012 0.777001\nv -0.454803 0.197378 0.773047\nv -0.446543 0.214723 0.759059\nv -0.37337 0.244649 0.570081\nv -0.382438 0.288862 0.488543\nv -0.416617 0.235072 0.660212\nv -0.429603 0.229765 0.707535\nv -0.437212 0.17499 0.772731\nv -0.433434 0.201701 0.754701\nv -0.465382 0.163761 0.788089\nv -0.444066 0.169226 0.791094\nv -0.457614 0.177345 0.796067\nv -0.455699 0.149299 0.809458\nv -0.385355 0.257214 0.483657\nv -0.438987 0.241152 0.490282\nv -0.41428 0.220363 0.525305\nv -0.393983 0.231838 0.499772\nv -0.421625 0.273398 0.459706\nv -0.195111 0.17195 -0.13148\nv -0.221857 0.217675 -0.229484\nv -0.224985 0.237954 -0.304274\nv -0.218975 0.267494 -0.169472\nv -0.216445 0.599743 -0.0423681\nv -0.249605 0.611078 -0.0264823\nv -0.246072 0.579904 -0.0156047\nv -0.222595 0.611429 -0.0137947\nv -0.304256 0.549028 -0.0794644\nv -0.334798 0.551559 -0.0657927\nv -0.307472 0.551383 -0.0465153\nv -0.289021 0.567603 -0.102098\nv -0.29243 0.56096 -0.0901838\nv -0.269251 0.558887 -0.0647735\nv -0.25876 0.58015 -0.0920817\nv -0.279391 0.611588 -0.0779356\nv -0.273152 0.576776 -0.102801\nv -0.297561 0.552402 -0.12496\nv -0.320775 0.592855 -0.0986539\nv -0.326837 0.535023 -0.101132\nv -0.276948 0.558553 -0.0438091\nv -0.299564 0.5724 -0.066109\nv -0.230362 0.584156 -0.0659333\nv -0.242593 0.581556 -0.0777423\nv -0.228728 0.610463 -0.0642639\nv -0.233438 0.59825 -0.0768109\nv -0.257635 0.570063 -0.044758\nv -0.272713 0.570133 -0.0577444\nv -0.255369 0.562401 -0.0579904\nv -0.247812 0.568552 -0.0716796\nv -0.261466 0.562594 -0.0362001\nv -0.32877 0.535163 -0.0792535\nv -0.470899 0.192792 0.742171\nv -0.471145 0.174586 0.765895\nv -0.463132 0.2243 0.646997\nv -0.468 0.226215 0.696974\nv -0.4415 0.16334 0.76419\nv -0.438056 0.191192 0.738885\nv -0.46264 0.184726 0.733262\nv -0.46257 0.162039 0.760974\nv -0.444698 0.163533 0.787703\nv -0.463554 0.161196 0.785207\nv -0.450884 0.150898 0.803694\nv -0.459003 0.147823 0.801163\nv -0.432099 0.208607 0.696271\nv -0.425474 0.212561 0.647243\nv -0.459284 0.201719 0.689804\nv -0.454363 0.142041 0.808228\nv -0.3413 0.250958 0.508997\nv -0.347608 0.255158 0.535497\nv -0.344744 0.220873 0.540681\nv -0.340702 0.215179 0.51557\nv -0.339788 0.207184 0.543915\nv -0.334727 0.203265 0.518118\nv -0.333937 0.192387 0.547271\nv -0.329825 0.18694 0.519928\nv -0.314202 0.176537 0.534865\nv -0.309756 0.176343 0.553826\nv -0.30872 0.165888 0.522405\nv -0.367571 0.23762 0.495044\nv -0.347204 0.191737 0.506976\nv -0.314027 0.149158 0.516975\nv -0.281728 0.160493 0.547042\nv -0.29004 0.156785 0.559484\nv -0.287685 0.154465 0.530981\nv -0.266106 0.136717 0.553966\nv -0.272467 0.130513 0.559941\nv -0.271588 0.128633 0.545162\nv -0.352986 0.197027 0.551928\nv -0.321671 0.166995 0.561698\nv -0.328946 0.144378 0.533599\nv -0.329913 0.151601 0.555882\nv -0.311479 0.14002 0.537167\nv -0.312902 0.145872 0.557287\nv -0.291252 0.150125 0.53193\nv -0.297596 0.152585 0.560995\nv -0.364988 0.1839 0.546357\nv -0.364443 0.178645 0.521316\nv -0.389098 0.217007 0.557797\nv -0.265596 0.126419 0.553035\nv -0.401311 0.24305 0.616209\nv -0.456472 0.223034 0.53186\nv -0.407005 0.219362 0.605578\nv -0.428812 0.21105 0.570239\nv -0.484782 0.249886 0.629547\nv -0.501388 0.247215 0.62185\nv -0.512002 0.199048 0.670843\nv -0.497101 0.202404 0.678136\nv -0.518223 0.179682 0.684655\nv -0.498524 0.184954 0.695305\nv -0.513742 0.153727 0.686747\nv -0.492655 0.152339 0.696675\nv -0.505114 0.106562 0.691034\nv -0.489702 0.109022 0.701262\nv -0.49146 0.0842793 0.696974\nv -0.498594 0.0740871 0.680754\nv -0.472745 0.0792535 0.694707\nv -0.468896 0.221295 0.643184\nv -0.478913 0.169789 0.684462\nv -0.476857 0.112396 0.694057\nv -0.461305 0.0847362 0.683074\nv -0.481742 0.0503462 0.689716\nv -0.483482 0.0493621 0.669525\nv -0.465733 0.0555653 0.684198\nv -0.466594 0.0331951 0.668629\nv -0.469564 0.0414192 0.660458\nv -0.462535 0.0429129 0.668032\nv -0.517169 0.166186 0.667979\nv -0.507152 0.109848 0.668524\nv -0.495783 0.0758795 0.664991\nv -0.50854 0.214195 0.619091\nv -0.461516 0.0807823 0.667944\nv -0.469177 0.118986 0.676133\nv -0.491846 0.114803 0.656978\nv -0.481812 0.0766703 0.653534\nv -0.465136 0.0619618 0.679278\nv -0.480354 0.0565318 0.664781\nv -0.501898 0.157101 0.654061\nv -0.47575 0.165062 0.668734\nv -0.457544 0.197536 0.633764\nv -0.461832 0.0351808 0.660669\nv -0.521843 0.23878 0.604822\nv -0.535708 0.235441 0.591115\nv -0.545373 0.173848 0.626894\nv -0.531561 0.178681 0.634169\nv -0.547605 0.158981 0.631129\nv -0.533265 0.164534 0.643078\nv -0.535866 0.131515 0.627245\nv -0.523723 0.136154 0.637472\nv -0.51267 0.0994974 0.608776\nv -0.499649 0.103276 0.616789\nv -0.497206 0.0910976 0.602836\nv -0.498454 0.0871964 0.588919\nv -0.479756 0.0949636 0.598496\nv -0.511633 0.210452 0.617193\nv -0.512863 0.154641 0.633044\nv -0.48791 0.115102 0.608583\nv -0.471268 0.10194 0.590026\nv -0.479176 0.076108 0.584842\nv -0.482445 0.0781815 0.570573\nv -0.466278 0.0845956 0.584209\nv -0.455014 0.072857 0.550979\nv -0.543493 0.145732 0.618125\nv -0.514884 0.105911 0.59036\nv -0.499016 0.0927846 0.576758\nv -0.536183 0.195322 0.585281\nv -0.472586 0.109725 0.578217\nv -0.493428 0.127139 0.601413\nv -0.509208 0.125716 0.590184\nv -0.4903 0.102081 0.568288\nv -0.465997 0.090342 0.577391\nv -0.482199 0.0845605 0.567866\nv -0.529663 0.153305 0.603926\nv -0.509366 0.155397 0.621253\nv -0.523407 0.185727 0.575036\nv -0.493358 0.190015 0.606825\nv -0.512319 0.245721 0.489158\nv -0.525762 0.224757 0.51926\nv -0.482339 0.268232 0.453801\nv -0.519998 0.277704 0.493621\nv -0.542175 0.230907 0.578305\nv -0.553667 0.225161 0.564053\nv -0.567128 0.187326 0.577795\nv -0.558342 0.186676 0.585703\nv -0.573103 0.16232 0.583172\nv -0.562788 0.163849 0.592574\nv -0.56516 0.146803 0.574122\nv -0.557551 0.144501 0.584209\nv -0.550856 0.125857 0.56205\nv -0.542702 0.126068 0.573121\nv -0.535761 0.121639 0.561558\nv -0.530788 0.128457 0.544055\nv -0.52295 0.125171 0.562963\nv -0.537184 0.193618 0.581854\nv -0.549432 0.168805 0.587073\nv -0.536885 0.134713 0.576126\nv -0.51998 0.132113 0.564457\nv -0.505641 0.12055 0.539398\nv -0.508962 0.127491 0.535163\nv -0.503567 0.128826 0.54887\nv -0.484958 0.135153 0.529733\nv -0.566425 0.169841 0.563157\nv -0.548782 0.139054 0.549397\nv -0.530471 0.137121 0.540224\nv -0.549889 0.211208 0.548132\nv -0.520754 0.139212 0.561575\nv -0.537096 0.140688 0.572137\nv -0.543686 0.146188 0.552701\nv -0.523723 0.147612 0.543159\nv -0.503005 0.133975 0.548729\nv -0.509085 0.131181 0.534882\nv -0.553316 0.166555 0.558412\nv -0.54228 0.167276 0.58073\nv -0.53685 0.196183 0.541577\nv -0.388834 0.216286 0.528855\nv -0.0103153 0.638052 -0.0238288\nv -0.0345658 0.629775 -0.019049\nv 0.00405933 0.557569 -0.00878644\nv 0.0426317 0.577356 -0.0394862\nv 0.0241099 0.566988 -0.0196816\nv 0.0076969 0.631867 0.00458649\nv 0.0390469 0.596791 -0.0216498\nv 0.00486768 0.58514 -0.0238639\nv -0.0266404 0.585053 -0.0152181\nv -0.0916424 0.719766 -0.0684989\nv -0.0402945 0.674287 -0.0183461\nv -0.103855 0.744473 -0.0815204\nv -0.0429129 0.848452 -0.0981092\nv -0.092398 0.884441 -0.0697291\nv -0.125101 0.830369 -0.0901663\nv -0.108389 0.790391 -0.0504165\nv -0.0952272 0.788318 -0.00485012\nv -0.115524 0.871068 -0.115471\nv -0.0911679 0.938144 -0.114979\nv -0.0952272 0.926387 -0.137261\nv -0.107458 0.964485 -0.149984\nv -0.109584 0.95359 -0.159368\nv -0.0954029 0.825888 -0.120778\nv -0.0910625 0.856799 -0.136928\nv -0.078779 0.917917 -0.151337\nv -0.0947528 0.955014 -0.166274\nv -0.052947 0.868327 -0.112958\nv -0.0526658 0.925157 -0.137191\nv -0.0896039 0.964643 -0.158894\nv -0.0641057 0.949953 -0.146927\nv -0.097582 0.969968 -0.151285\nv -0.0716796 0.957878 -0.132165\nv -0.0365691 0.84977 -0.047148\nv -0.0555302 0.884968 -0.0781816\nv -0.0588339 0.934506 -0.1141\nv -0.0658454 0.862739 -0.127298\nv -0.0327733 0.832935 0.00599231\nv -0.0683056 0.893034 -0.0646856\nv -0.0804485 0.947018 -0.113644\nv -0.104031 0.965065 -0.165343\nv -0.0224757 0.610234 0.00912029\nv -0.0561277 0.648034 0.0549327\nv -0.0191193 0.588321 0.0233367\nv -0.0485186 0.620251 0.0886198\nv -0.0482726 0.623309 0.115998\nv -0.0187678 0.599937 0.0937335\nv -0.0111939 0.615418 0.124381\nv -0.0447756 0.661125 0.110357\nv -0.0671107 0.660106 0.104963\nv -0.0315257 0.609813 0.071293\nv 0.00829438 0.549204 0.0310863\nv 0.00829438 0.640758 0.159017\nv -0.00133554 0.652778 0.135381\nv -0.00307525 0.638421 0.128949\nv 0.000843496 0.625013 0.146575\nv -0.00405933 0.586089 0.126507\nv 0.0165712 0.584402 0.148438\nv 0.012301 0.563139 0.116912\nv 0.0242681 0.552736 0.138878\nv -0.0181703 0.606052 0.112361\nv -0.0501529 0.617685 0.105665\nv -0.0705549 0.653587 0.0789723\nv -0.0394159 0.614259 0.108108\nv -0.0376762 0.619654 0.117105\nv -0.0309809 0.634626 0.116315\nv -0.0120198 0.629986 0.123519\nv 0.00490282 0.650019 0.144993\nv 0.0281341 0.654096 0.164095\nv 0.0247953 0.667065 0.155414\nv 0.00774962 0.607616 0.146188\nv 0.0350051 0.632148 0.162514\nv 0.0241275 0.639616 0.163269\nv 0.0169754 0.648455 0.164447\nv 0.0116332 0.659175 0.155151\nv 0.0440727 0.604523 0.154764\nv 0.0376059 0.606843 0.15378\nv 0.0292588 0.630918 0.162496\nv 0.0313675 0.643763 0.16334\nv -0.000984079 0.652128 0.148297\nv 0.00660739 0.661266 0.158823\nv -0.0127755 0.658103 0.1435\nv 0.00296981 0.685341 0.155115\nv -0.0103328 0.673725 0.153516\nv -0.0257091 0.665835 0.126595\nv -0.0210171 0.705778 0.144431\nv -0.029663 0.683408 0.144045\nv -0.0126173 0.723966 0.131761\nv -0.106333 0.734756 -0.0590096\nv -0.1128 0.754437 -0.00653711\nv -0.0787966 0.707061 0.114751\nv 0.0330545 0.585211 0.153288\nv 0.0272555 0.599972 0.153182\nv 0.059115 0.557112 0.14835\nv 0.050434 0.58384 0.154606\nv 0.012547 0.636137 0.160159\nv 0.00590447 0.623168 0.153745\nv 0.0100868 0.612203 0.152216\nv 0.014111 0.610234 0.148807\nv 0.0298211 0.620919 0.146874\nv 0.014234 0.613046 0.149439\nv 0.0127755 0.626911 0.149492\nv 0.0188205 0.613767 0.151214\nv 0.0178716 0.633782 0.149844\nv 0.0405933 0.598707 0.154307\nv -0.120761 0.744948 0.0342846\nv -0.181984 0.660475 0.0333181\nv -0.162689 0.638931 -0.042825\nv -0.215812 0.575581 0.0540716\nv -0.178856 0.511844 0.0236355\nv -0.200981 0.54156 0.0800619\nv -0.135715 0.517749 0.0859312\nv -0.165958 0.54047 0.115787\nv -0.0240396 0.530735 0.175166\nv -0.0771272 0.523372 0.148016\nv -0.0928022 0.541525 0.164482\nv -0.12062 0.656592 0.0797455\nv -0.104875 0.687379 0.0964046\nv -0.143974 0.593382 0.0891119\nv -0.126155 0.710136 0.0755105\nv -0.0166591 0.53671 0.170421\nv -0.0740695 0.562841 0.150582\nv -0.142252 0.814308 -0.0267283\nv -0.170562 0.813236 0.0110709\nv -0.130865 0.792307 0.0589217\nv -0.174639 0.808491 -0.0442309\nv -0.196113 0.814607 -0.0249886\nv -0.21293 0.783485 -0.0637719\nv -0.103416 0.844709 0.0578498\nv -0.158683 0.850912 0.00551786\nv -0.188328 0.840544 -0.0316136\nv -0.206832 0.803852 -0.0627878\nv -0.129688 0.845078 -0.0156047\nv -0.0665483 0.818912 0.00741572\nv -0.121762 0.832021 -0.0222297\nv -0.162215 0.841142 -0.0418234\nv -0.194162 0.795276 -0.0576214\nv -0.208045 0.800706 -0.0498366\nv -0.0959126 0.758567 0.0898851\nv -0.0675851 0.843075 0.0246195\nv -0.0274488 0.815063 0.0534566\nv -0.077918 0.82942 0.0770042\nv -0.0649316 0.749359 0.111447\nv -0.101325 0.762995 0.0454258\nv -0.0159561 0.854989 -0.072119\nv -0.0170808 0.841458 -0.00147615\nv -0.0364461 0.783292 0.0993393\nv -0.0281693 0.75825 0.120725\nv -0.0181527 0.767669 0.117545\nv -0.0282747 0.799986 0.0745264\nv -0.026904 0.792166 0.0829438\nv -0.0282923 0.781218 0.102256\nv -0.0383615 0.830422 0.0836116\nv -0.0465856 0.861508 0.0766527\nv -0.0328788 0.813078 0.110129\nv -0.0438091 0.854075 0.0968263\nv -0.0117914 0.656328 0.133571\nv -0.0192598 0.641848 0.131462\nv -0.0913612 0.64473 -0.0213159\nv -0.0823288 0.621657 0.0387657\nv -0.176607 0.536112 0.00196813\nv -0.116262 0.556813 0.037026\nv -0.139581 0.586511 -0.015306\nv -0.103961 0.538326 0.0664078\nv -0.0602221 0.534583 0.120022\nv -0.0206305 0.520033 0.164868\nv -0.0187854 0.525902 0.156082\nv -0.131814 0.576618 0.104576\nv -0.0118617 0.526236 0.169139\nv 0.0568481 0.578094 -0.0518223\nv 0.0632095 0.595544 -0.0297157\nv 0.0492391 0.583787 0.00488523\nv 0.019418 0.53671 0.0464274\nv 0.0210347 0.533459 0.0674621\nv 0.0300496 0.528503 0.0214916\nv 0.0110885 0.550627 0.0621727\nv 0.020982 0.540945 0.0900784\nv 0.0417179 0.529276 0.106948\nv 0.0491337 0.519014 0.0846835\nv 0.0306646 0.519611 0.0811162\nv 0.0514884 0.507029 0.0627877\nv 0.0406811 0.510614 0.035585\nv 0.0437739 0.505325 0.0363406\nv 0.0385548 0.509823 0.0614698\nv 0.0329315 0.521246 0.0456015\nv 0.0592908 0.505729 0.0730679\nv 0.0708186 0.489052 0.0519629\nv 0.0542649 0.51035 0.0526658\nv 0.0745088 0.496292 0.0385372\nv 0.0665308 0.547886 0.0225459\nv 0.0700453 0.518135 0.0338804\nv 0.0848592 0.483815 0.0301726\nv -0.419446 0.356096 0.403086\nv -0.413717 0.363371 0.323393\nv 0.0299793 -0.116772 -0.00943663\nv 0.0278881 -0.117035 0.0023196\nv 0.0328261 -0.174323 -0.0231435\nv 0.0351457 -0.176607 -0.0447756\nv 0.0457597 -0.00630867 0.0128809\nv 0.0517872 -0.00905004 0.00576388\nv 0.107651 0.0463044 -0.031596\nv 0.102169 0.0571117 -0.0239869\nv 0.0152181 -0.208045 -0.0943662\nv 0.0278354 -0.19954 -0.0988824\nv 0.0328788 -0.19309 -0.102608\nv 0.00843496 -0.221101 -0.18752\nv 0.0369733 -0.196236 -0.178874\nv 0.114382 0.167241 -0.0716093\nv 0.106527 0.129301 -0.0596071\nv 0.144027 0.178364 -0.0871964\nv 0.10925 0.109321 -0.0409272\nv 0.0984782 0.0749657 -0.0309282\nv 0.13438 0.109619 -0.0477981\nv 0.12055 0.0655643 -0.0350227\nv 0.108161 0.105015 -0.0648438\nv 0.105648 0.127157 -0.085527\nv 0.0997259 0.0685692 -0.0509964\nv 0.113644 0.169332 -0.10918\nv 0.119443 0.18267 -0.0928022\nv 0.172214 0.545127 -0.0801146\nv 0.192862 0.504358 -0.0835765\nv 0.225249 0.599919 -0.183267\nv 0.113907 0.214002 -0.10324\nv 0.140038 0.264436 -0.121182\nv 0.131867 0.338962 -0.0827681\nv 0.159649 0.400169 -0.0818543\nv 0.179911 0.300531 -0.144572\nv 0.201139 0.358539 -0.155203\nv 0.181123 0.34137 -0.139441\nv 0.134274 0.213106 -0.104857\nv 0.116666 0.214406 -0.123273\nv 0.13742 0.254982 -0.142656\nv 0.180139 0.331547 -0.170703\nv 0.182424 0.350648 -0.157066\nv 0.218149 0.459003 -0.139441\nv 0.231645 0.475029 -0.169349\nv 0.250431 0.527572 -0.192897\nv 0.231645 0.542122 -0.17608\nv 0.237427 0.455224 -0.162303\nv 0.229062 0.448178 -0.176519\nv 0.219942 0.462746 -0.168155\nv 0.240748 0.503075 -0.204109\nv 0.203827 0.402963 -0.158753\nv 0.1852 0.490353 -0.0985485\nv 0.234931 0.568183 -0.174129\nv 0.229677 0.574263 -0.196394\nv 0.240625 0.539574 -0.218307\nv 0.0274663 0.802411 0.102309\nv 0.0202263 0.814185 0.0757741\nv -0.183496 0.644396 -0.0129336\nv -0.209134 0.549766 0.0197167\nv -0.198714 0.522599 0.0515587\nv -0.0914491 0.62844 0.0662671\nv -0.115383 0.576547 0.0599058\nv -0.108161 0.563139 0.0778653\nv -0.109637 0.603838 0.0616631\nv -0.105718 0.58797 0.0298562\nv 0.0795522 0.555671 0.0176783\nv 0.0844024 0.502601 0.03439\nv 0.0913788 0.482164 0.025094\nv 0.319615 -0.279391 -0.0492391\nv 0.26542 -0.323744 -0.0486416\nv 0.245229 -0.168875 -0.011809\nv 0.175711 -0.204601 -0.00776722\nv 0.131093 -0.152427 0.0120725\nv 0.349541 -0.256388 -0.0736126\nv 0.28417 -0.142199 -0.0529821\nv 0.173532 0.00755631 -0.0877412\nv 0.368221 -0.35534 -0.0836819\nv 0.133079 -0.0532984 0.0125997\nv 0.156627 -0.00543002 -0.0297684\nv 0.132323 -0.0923804 0.0181527\nv 0.101993 -0.0188733 0.0320001\nv 0.106439 -0.0508207 0.037887\nv 0.149053 -0.193354 0.00110707\nv 0.32682 -0.398939 -0.0634907\nv 0.267968 -0.440604 -0.0848241\nv 0.217007 -0.373809 -0.0685517\nv 0.372439 -0.428092 -0.0628405\nv 0.343936 -0.485028 -0.0888659\nv 0.396496 -0.40038 -0.0800267\nv 0.420834 -0.434436 -0.0314378\nv 0.377394 -0.483394 -0.0817137\nv 0.41906 -0.476822 -0.112906\nv 0.400011 -0.46619 -0.0599234\nv 0.428777 -0.419745 -0.08565\nv 0.431097 -0.422328 -0.0587284\nv 0.428197 -0.456015 -0.0710997\nv 0.425157 -0.441149 -0.100745\nv 0.424771 -0.407391 -0.100271\nv 0.444118 -0.417408 -0.0785155\nv 0.440586 -0.412171 -0.115014\nv 0.413085 -0.36613 -0.130144\nv 0.427881 -0.38908 -0.159966\nv 0.382473 -0.23393 -0.155871\nv 0.404685 -0.306558 -0.135838\nv 0.307718 -0.187889 -0.250958\nv 0.361104 -0.502987 -0.0829087\nv 0.3788 -0.495835 -0.0797456\nv 0.390205 -0.499139 -0.0882157\nv 0.373405 -0.517169 -0.0846835\nv 0.387481 -0.512863 -0.0898851\nv 0.387956 -0.506414 -0.0679366\nv 0.363705 -0.513162 -0.122377\nv 0.315468 -0.493182 -0.0992866\nv 0.397673 -0.495009 -0.103873\nv 0.425491 -0.498014 -0.0964046\nv 0.385355 -0.517292 -0.130162\nv 0.40704 -0.519067 -0.148034\nv 0.35824 -0.524989 -0.182213\nv 0.431589 -0.424507 -0.180807\nv 0.446825 -0.439321 -0.146874\nv 0.431536 -0.467525 -0.145907\nv 0.350508 -0.501722 -0.112941\nv 0.352775 -0.514902 -0.100921\nv 0.347134 -0.521456 -0.126103\nv 0.308755 -0.512424 -0.148631\nv 0.334815 -0.507556 -0.125751\nv 0.253084 -0.494429 -0.153446\nv 0.0683584 -0.169156 -0.319492\nv 0.199188 -0.144045 -0.250554\nv 0.104963 -0.0734018 -0.409623\nv 0.31473 -0.122852 -0.14357\nv 0.427881 -0.461305 -0.218132\nv 0.442607 -0.461006 -0.172794\nv 0.4095 -0.503005 -0.198696\nv 0.431466 -0.442361 -0.146294\nv 0.112923 -0.0907462 0.0221242\nv 0.110428 -0.153253 0.0297859\nv 0.118845 -0.198538 -0.00574633\nv 0.111658 -0.154536 0.00688854\nv 0.0916072 -0.0419112 0.0288546\nv 0.093716 -0.0783397 0.0125821\nv 0.140495 -0.2395 -0.0249359\nv 0.151355 -0.217938 -0.267283\nv 0.279162 -0.253611 -0.309071\nv 0.201789 -0.0121956 -0.147208\nv 0.1991 -0.0523144 -0.231715\nv 0.108495 -0.165255 -0.268197\nv 0.166714 -0.0962113 -0.275876\nv 0.136945 -0.241152 -0.00766177\nv 0.133431 -0.26289 -0.0405757\nv 0.159298 -0.253418 -0.024233\nv 0.144185 -0.25927 -0.0205427\nv 0.181545 -0.274769 -0.0289425\nv 0.159895 -0.277458 -0.0354972\nv 0.409851 -0.294099 -0.240801\nv 0.433592 -0.333058 -0.185938\nv 0.432766 -0.361807 -0.239694\nv 0.216374 -0.339244 -0.32863\nv 0.255597 -0.383088 -0.322216\nv 0.131937 -0.302657 -0.197273\nv 0.184989 -0.41254 -0.23096\nv 0.152884 -0.338664 -0.117387\nv 0.173057 -0.376498 -0.130847\nv 0.147524 -0.303659 -0.0683232\nv 0.228675 -0.459829 -0.152444\nv 0.235546 -0.466489 -0.216058\nv 0.347556 -0.362703 -0.420694\nv 0.242066 -0.403894 -0.407233\nv 0.203019 -0.443662 -0.359294\nv 0.307999 -0.418532 -0.501898\nv 0.237796 -0.437089 -0.47763\nv 0.277756 -0.436791 -0.542772\nv 0.223052 -0.455576 -0.529329\nv 0.283046 -0.366323 -0.410273\nv 0.370928 -0.32761 -0.303061\nv 0.34752 -0.466032 -0.493006\nv 0.40776 -0.393122 -0.373265\nv 0.33239 -0.475029 -0.5391\nv 0.393544 -0.478456 -0.420922\nv 0.38423 -0.416459 -0.432099\nv 0.429445 -0.435947 -0.319299\nv 0.410168 -0.494271 -0.323903\nv 0.373388 -0.568727 -0.293045\nv 0.301515 -0.529944 -0.2062\nv 0.257723 -0.516975 -0.212473\nv 0.251907 -0.542807 -0.286613\nv 0.209398 -0.50963 -0.309247\nv 0.197009 -0.478368 -0.447563\nv 0.309721 -0.345271 -0.321917\nv 0.198573 -0.380628 -0.287878\nv 0.231698 -0.430605 -0.282483\nv 0.200067 -0.495185 -0.519418\nv 0.212684 -0.562805 -0.510667\nv 0.387218 -0.520841 -0.402506\nv 0.349928 -0.57291 -0.382297\nv 0.22205 -0.53794 -0.388219\nv 0.423541 -0.493551 -0.14712\nv 0.305469 -0.553035 -0.288177\nv 0.26238 -0.594788 -0.493481\nv 0.273785 -0.569026 -0.380786\nv 0.189541 -0.547218 -0.610674\nv 0.216093 -0.59217 -0.660229\nv 0.181141 -0.483692 -0.607599\nv 0.293185 -0.57226 -0.675201\nv 0.31791 -0.54091 -0.659122\nv 0.252434 -0.589815 -0.674656\nv 0.322163 -0.585228 -0.48248\nv 0.352441 -0.541894 -0.517186\nv 0.362018 -0.536358 -0.599427\nv 0.277493 -0.500914 -0.672126\nv 0.325098 -0.487295 -0.63271\nv 0.197607 -0.521105 -0.656117\nv 0.283116 -0.463062 -0.637701\nv 0.227516 -0.518416 -0.671652\nv 0.21822 -0.460039 -0.630514\nv 0.322479 -0.683461 -0.487488\nv 0.229958 -0.631181 -0.589534\nv 0.287316 -0.705884 -0.494658\nv 0.238551 -0.671054 -0.575757\nv 0.266808 -0.701807 -0.595913\nv 0.322426 -0.739377 -0.53866\nv 0.304309 -0.703687 -0.60607\nv 0.345341 -0.788089 -0.520262\nv 0.302745 -0.741433 -0.516888\nv 0.324272 -0.788089 -0.473817\nv 0.334815 -0.771202 -0.465171\nv 0.309932 -0.73089 -0.485854\nv 0.338769 -0.717253 -0.480934\nv 0.338927 -0.801708 -0.477718\nv 0.35223 -0.799441 -0.501494\nv 0.354058 -0.82761 -0.483218\nv 0.34926 -0.812621 -0.465997\nv 0.364795 -0.827013 -0.505114\nv 0.366974 -0.826047 -0.484466\nv 0.371701 -0.811672 -0.471427\nv 0.308034 -0.760746 -0.499807\nv 0.330123 -0.789583 -0.507047\nv 0.269989 -0.718237 -0.563069\nv 0.339033 -0.676185 -0.628633\nv 0.377535 -0.639757 -0.613204\nv 0.423505 -0.727762 -0.592029\nv 0.401856 -0.620515 -0.559607\nv 0.461797 -0.72553 -0.536569\nv 0.513303 -0.800513 -0.446912\nv 0.383035 -0.622852 -0.510069\nv 0.448107 -0.729765 -0.477735\nv 0.530296 -0.825572 -0.503884\nv 0.376041 -0.738815 -0.609795\nv 0.396707 -0.799494 -0.624504\nv 0.412663 -0.743243 -0.456507\nv 0.372597 -0.76289 -0.464257\nv 0.478649 -0.807454 -0.416828\nv 0.534478 -0.816434 -0.403859\nv 0.507152 -0.819439 -0.384634\nv 0.549678 -0.820353 -0.371841\nv 0.522915 -0.823674 -0.355709\nv 0.570379 -0.816487 -0.34991\nv 0.528187 -0.818807 -0.326205\nv 0.583489 -0.839648 -0.320616\nv 0.54221 -0.842618 -0.302868\nv 0.588374 -0.870646 -0.307191\nv 0.613521 -0.919376 -0.279619\nv 0.577531 -0.914543 -0.250712\nv 0.619443 -0.969705 -0.245914\nv 0.603328 -0.967209 -0.23277\nv 0.610375 -0.981074 -0.243191\nv 0.602151 -0.901856 -0.253559\nv 0.552525 -0.876568 -0.291902\nv 0.617861 -0.936386 -0.230503\nv 0.616403 -0.967121 -0.23212\nv 0.572277 -0.930271 -0.248164\nv 0.525147 -0.860349 -0.323006\nv 0.486487 -0.846765 -0.378853\nv 0.45417 -0.827013 -0.401873\nv 0.552402 -0.855745 -0.409781\nv 0.572365 -0.854919 -0.370594\nv 0.511827 -0.850947 -0.350244\nv 0.53504 -0.916933 -0.301093\nv 0.557938 -0.950339 -0.264893\nv 0.596405 -0.902963 -0.342337\nv 0.567585 -0.936632 -0.340228\nv 0.576038 -0.961024 -0.307525\nv 0.601132 -0.949812 -0.260324\nv 0.587302 -0.959512 -0.281218\nv 0.616244 -0.927635 -0.291358\nv 0.607669 -0.93918 -0.307331\nv 0.596088 -0.949425 -0.233508\nv 0.606228 -0.957245 -0.251134\nv 0.621797 -0.954996 -0.256001\nv 0.253805 -0.386954 -0.335255\nv 0.301655 -0.350701 -0.347767\nv 0.37706 -0.347028 -0.326345\nv 0.224862 -0.434313 -0.30148\nv 0.235705 -0.476927 -0.224897\nv 0.486803 -0.80705 -0.539311\nv 0.564088 -0.845289 -0.496591\nv 0.552771 -0.845025 -0.446104\nv 0.583383 -0.936545 -0.24609\nv 0.613503 -0.930781 -0.27867\nv 0.572962 -0.897884 -0.379767\nv 0.549714 -0.924085 -0.370365\nv 0.524426 -0.904984 -0.351246\nv 0.495115 -0.924683 -0.389959\nv 0.546199 -0.911451 -0.424367\nv 0.519049 -0.937581 -0.409834\nv 0.620497 -0.845658 -0.491126\nv 0.612501 -0.842372 -0.459723\nv 0.638 -0.842741 -0.488314\nv 0.631744 -0.836028 -0.458423\nv 0.660686 -0.852388 -0.479422\nv 0.656187 -0.84629 -0.452378\nv 0.676379 -0.870646 -0.472622\nv 0.671036 -0.861456 -0.449021\nv 0.736899 -0.902436 -0.443082\nv 0.724528 -0.905142 -0.426616\nv 0.756634 -0.938548 -0.42753\nv 0.743419 -0.941781 -0.411978\nv 0.734264 -0.918603 -0.456824\nv 0.746301 -0.955137 -0.441658\nv 0.753576 -0.961041 -0.421731\nv 0.632253 -0.881348 -0.491794\nv 0.666151 -0.893474 -0.481724\nv 0.721787 -0.931853 -0.471128\nv 0.702861 -0.922504 -0.41623\nv 0.635328 -0.862053 -0.449619\nv 0.617861 -0.859558 -0.4541\nv 0.653464 -0.898763 -0.432889\nv 0.692229 -0.94642 -0.446315\nv 0.658419 -0.913665 -0.457614\nv 0.731768 -0.948758 -0.432679\nv 0.713791 -0.952571 -0.440305\nv 0.728816 -0.926581 -0.417636\nv 0.737304 -0.941992 -0.448828\nv 0.739711 -0.951341 -0.428514\nv 0.619952 -0.902717 -0.468773\nv 0.622184 -0.891013 -0.448389\nv 0.570924 -0.885864 -0.441992\nv 0.553175 -0.886849 -0.523407\nv 0.486733 -0.862704 -0.544407\nv 0.436175 -0.832935 -0.588163\nv 0.356834 -0.808614 -0.579535\nv 0.370066 -0.837258 -0.56502\nv 0.483482 -0.952536 -0.448898\nv 0.401293 -0.935525 -0.430816\nv 0.452167 -0.928848 -0.482146\nv 0.422223 -0.873687 -0.514832\nv 0.537448 -0.915563 -0.531227\nv 0.538256 -0.931167 -0.479844\nv 0.391171 -0.871859 -0.483183\nv 0.420536 -0.835378 -0.412048\nv 0.38532 -0.855323 -0.451112\nv 0.418304 -0.875303 -0.361104\nv 0.385689 -0.885583 -0.417513\nv 0.43737 -0.84608 -0.344305\nv 0.340087 -0.757196 -0.585158\nv 0.469634 -0.844937 -0.353952\nv 0.463501 -0.850525 -0.319984\nv 0.42948 -0.855042 -0.316698\nv 0.426792 -0.862317 -0.284293\nv 0.46554 -0.856043 -0.287562\nv 0.431185 -0.874688 -0.270481\nv 0.46633 -0.868836 -0.272713\nv 0.445647 -0.914016 -0.213949\nv 0.463782 -0.91725 -0.223544\nv 0.451376 -0.953414 -0.196095\nv 0.462306 -0.958897 -0.205374\nv 0.452501 -0.974467 -0.200243\nv 0.431255 -0.928303 -0.22075\nv 0.440885 -0.965645 -0.207219\nv 0.421801 -0.889766 -0.325695\nv 0.42159 -0.909043 -0.292342\nv 0.476786 -0.950111 -0.248902\nv 0.476031 -0.902383 -0.300724\nv 0.470407 -0.867255 -0.319176\nv 0.473237 -0.895284 -0.313763\nv 0.449812 -0.958036 -0.277932\nv 0.420008 -0.952061 -0.250079\nv 0.448441 -0.924841 -0.300267\nv 0.452255 -0.956595 -0.222701\nv 0.449724 -0.96619 -0.248445\nv 0.467051 -0.941676 -0.225091\nv 0.434084 -0.944734 -0.229624\nv 0.454609 -0.963044 -0.212034\nv 0.446174 -0.916406 -0.31306\nv 0.484923 -0.891418 -0.370365\nv 0.412944 -0.9234 -0.3704\nv 0.448547 -0.950989 -0.393632\nv 0.452237 -0.928373 -0.363494\nv 0.0993217 -0.0437212 0.013039\nv 0.117 -0.0326855 0.00843494\nv 0.132956 0.0132675 -0.0162198\nv 0.174393 0.0882332 -0.136154\nv 0.172284 0.0767757 -0.0868099\nv 0.171159 0.108829 -0.285049\nv 0.00316311 -0.239694 -0.424384\nv -0.0470776 -0.322356 -0.4651\nv -0.206288 -0.446754 -0.598162\nv -0.387411 -0.551928 -0.631445\nv -0.577268 -0.63445 -0.594559\nv -0.729255 -0.698028 -0.432784\nv -0.756634 -0.767687 -0.272432\nv -0.0792359 -0.255087 -0.536024\nv -0.261572 -0.388817 -0.610832\nv -0.427213 -0.493516 -0.610639\nv -0.583787 -0.592222 -0.559713\nv -0.7104 -0.676994 -0.421221\nv -0.0270973 -0.190806 -0.492918\nv -0.0579904 -0.180034 -0.514849\nv -0.023407 -0.156609 -0.518012\nv -0.0553017 -0.161248 -0.534214\nv -0.0514006 -0.128001 -0.550258\nv -0.00166942 -0.146557 -0.467385\nv -0.00917302 -0.129371 -0.496679\nv -0.035708 -0.118283 -0.496187\nv 0.007117 -0.119214 -0.480547\nv 0.0405405 -0.19309 -0.383492\nv 0.0145679 -0.112326 -0.445964\nv -0.0222824 -0.0805364 -0.516835\nv -0.00671283 -0.090834 -0.457034\nv -0.131445 -0.226655 -0.581046\nv -0.161038 -0.199944 -0.592732\nv -0.186729 -0.231417 -0.598092\nv -0.191685 -0.214336 -0.630531\nv -0.136365 -0.263962 -0.566109\nv -0.184778 -0.254472 -0.576389\nv -0.182881 -0.19432 -0.578199\nv -0.199258 -0.209767 -0.609725\nv -0.121833 -0.178909 -0.554037\nv -0.100534 -0.145644 -0.553632\nv -0.130584 -0.118546 -0.582259\nv -0.109795 -0.124855 -0.567726\nv -0.0574456 -0.0602397 -0.560046\nv -0.0993393 -0.105314 -0.550575\nv -0.0711524 -0.0882332 -0.579341\nv -0.0723474 -0.144238 -0.524584\nv -0.0709416 -0.0606088 -0.58203\nv -0.069729 -0.0438443 -0.568077\nv -0.0576565 -0.0340386 -0.537799\nv -0.0776895 -0.0167997 -0.565898\nv -0.0986539 -0.0506449 -0.559677\nv -0.099761 -0.0857555 -0.573349\nv -0.100692 -0.0549151 -0.613608\nv -0.116982 -0.104435 -0.542157\nv 0.00662496 -0.0410502 -0.463958\nv -0.0404878 0.0115278 -0.520332\nv -0.0445472 -0.0301902 -0.527414\nv -0.0606439 0.0340737 -0.528099\nv -0.0182758 -0.0848768 -0.478104\nv -0.0715566 -0.026781 -0.521632\nv -0.237427 -0.307929 -0.574316\nv -0.176308 -0.333954 -0.587425\nv -0.239694 -0.275841 -0.599304\nv -0.156925 -0.283221 -0.579623\nv -0.18947 -0.269655 -0.585211\nv -0.144132 -0.116473 -0.542983\nv 0.0806769 -0.0121428 -0.424314\nv -0.00416476 0.0702035 -0.465505\nv -0.0435982 0.121868 -0.484852\nv -0.0251292 0.0236179 -0.502829\nv -0.0629459 0.0179594 -0.50065\nv -0.0487998 0.0939092 -0.497382\nv -0.0861245 0.139528 -0.506537\nv -0.0925386 0.109092 -0.482779\nv 0.199487 0.100938 -0.197782\nv 0.17738 0.0913612 -0.124627\nv 0.19831 0.106421 -0.242382\nv 0.175887 0.137174 -0.313728\nv 0.206639 0.121463 -0.19787\nv 0.162514 0.0891997 -0.289969\nv 0.111763 0.0971251 -0.364724\nv 0.147348 0.106263 -0.297948\nv 0.154588 0.0526482 -0.320616\nv 0.144045 0.11635 -0.363319\nv 0.133835 0.100376 -0.371753\nv 0.0854743 0.0908691 -0.411521\nv 0.0331424 0.0769514 -0.462359\nv 0.0567427 0.0864408 -0.42709\nv 0.0578674 0.132394 -0.418814\nv 0.0914666 0.115664 -0.319017\nv 0.0016167 0.135241 -0.468404\nv 0.0493445 0.109145 -0.391611\nv 0.0489404 0.111588 -0.338225\nv 0.0333533 0.106052 -0.420044\nv 0.108635 0.131322 -0.399483\nv 0.111939 0.116701 -0.338611\nv 0.12431 0.125769 -0.350754\nv 0.0719081 0.115612 -0.379767\nv 0.181773 0.124222 -0.225758\nv 0.173251 0.074421 -0.0969318\nv 0.187168 0.0622078 -0.136506\nv 0.161776 0.113239 -0.152321\nv 0.156644 0.0894457 -0.11577\nv 0.163533 0.173005 -0.186237\nv 0.138052 0.21655 -0.187854\nv 0.189839 0.314607 -0.241785\nv 0.139194 0.129389 -0.254472\nv 0.103065 0.216954 -0.298123\nv 0.140635 0.300373 -0.309159\nv 0.0359189 0.167785 -0.365445\nv 0.0516114 0.260623 -0.381559\nv 0.184603 0.382684 -0.320423\nv 0.12243 0.350279 -0.409394\nv 0.048132 0.337785 -0.456929\nv 0.0643166 0.384441 -0.477665\nv -0.0773381 0.303975 -0.46568\nv 0.00256563 0.170052 -0.349875\nv -0.0538783 0.223702 -0.407795\nv -0.0493797 0.267019 -0.444101\nv -0.0796753 0.25999 -0.437142\nv 0.0692721 0.35274 -0.468861\nv 0.0275191 0.374653 -0.486399\nv 0.0205427 0.1086 -0.41363\nv -0.0501353 0.13879 -0.453133\nv -0.0464977 0.100271 -0.41247\nv -0.0154465 0.130267 -0.371507\nv -0.0440024 0.319562 -0.428795\nv 0.0268162 0.364338 -0.458932\nv -0.00581661 0.351791 -0.455365\nv 0.0063438 0.282782 -0.404316\nv -0.0853337 0.271272 -0.362405\nv -0.10846 0.346167 -0.416951\nv -0.0374653 0.295681 -0.386321\nv -0.0625417 0.206727 -0.376322\nv -0.0438442 0.287351 -0.433715\nv 0.0339859 0.382596 -0.465118\nv 0.00667768 0.391382 -0.464749\nv -0.070801 0.407426 -0.540962\nv -0.0435104 0.41254 -0.534267\nv -0.0234422 0.43969 -0.521738\nv -0.0482902 0.500281 -0.651337\nv -0.0672513 0.516044 -0.644853\nv -0.0307876 0.517503 -0.637455\nv -0.0628756 0.544547 -0.724528\nv -0.0640882 0.538362 -0.701508\nv -0.0449865 0.543862 -0.711173\nv -0.0430886 0.519154 -0.686553\nv -0.0613995 0.531069 -0.681756\nv -0.0303483 0.535427 -0.679946\nv -0.0533863 0.527115 -0.708256\nv -0.0242681 0.461129 -0.514744\nv -0.0612941 0.537131 -0.637367\nv -0.0400309 0.539012 -0.633325\nv -0.0557762 0.551488 -0.705216\nv -0.0525076 0.548237 -0.678892\nv -0.0398552 0.548835 -0.678206\nv -0.081907 0.478157 -0.513935\nv -0.106122 0.434717 -0.514796\nv -0.0461814 0.483745 -0.512512\nv 0.00878642 0.425755 -0.450708\nv -0.115998 0.394985 -0.40161\nv -0.0658279 0.470935 -0.449812\nv -0.0820652 0.444083 -0.422504\nv 0.0177661 0.620304 -0.538432\nv -0.03859 0.617158 -0.559537\nv -0.0890064 0.628668 -0.521052\nv 0.0423505 0.613222 -0.466664\nv 0.0536323 0.686571 -0.536639\nv -0.00625593 0.673022 -0.629178\nv -0.0384669 0.699329 -0.6254\nv 0.0489579 0.721295 -0.585\nv -0.0350051 0.73755 -0.597828\nv -0.0781464 0.71228 -0.518996\nv 0.0140231 0.706112 -0.49993\nv 0.00576389 0.754613 -0.580378\nv -0.0378695 0.747759 -0.522247\nv -0.053193 0.699698 -0.395407\nv -0.10556 0.682195 -0.37279\nv -0.104717 0.669894 -0.489984\nv -0.0573753 0.708238 -0.465838\nv -0.0261484 0.723351 -0.526465\nv -0.0811865 0.691825 -0.525797\nv -0.0417882 0.721804 -0.493656\nv 0.00660739 0.685288 -0.375514\nv -0.00962992 0.716515 -0.512354\nv -0.00961234 0.688381 -0.444909\nv 0.0383615 0.66833 -0.415703\nv 0.026658 0.667786 -0.464433\nv -0.0246723 0.706305 -0.348962\nv -0.0683584 0.702334 -0.313992\nv -0.0517344 0.7256 -0.393684\nv 0.0405933 0.695129 -0.611465\nv 0.0352335 0.757073 -0.577654\nv 0.0150951 0.756932 -0.695357\nv -0.0106491 0.764612 -0.688803\nv 0.0508909 0.803922 -0.669314\nv -0.0103504 0.805117 -0.665255\nv 0.0397146 0.765596 -0.681141\nv 0.0453731 0.815397 -0.652567\nv 0.0115454 0.808333 -0.736443\nv 0.0245493 0.863863 -0.72184\nv 0.042333 0.823586 -0.724862\nv 0.0454082 0.855165 -0.714635\nv 0.0204724 0.825221 -0.653516\nv 0.00950691 0.847573 -0.734404\nv 0.0500826 0.845324 -0.794099\nv 0.0562331 0.855147 -0.78765\nv 0.037518 0.866833 -0.782062\nv 0.0372193 0.854198 -0.790409\nv 0.0508558 0.857291 -0.809458\nv -0.115981 0.531051 -0.427653\nv -0.0912382 0.489737 -0.433873\nv -0.149598 0.450497 -0.476435\nv -0.14299 0.513847 -0.468949\nv -0.202931 0.499982 -0.518047\nv -0.201086 0.521492 -0.515271\nv 0.24551 0.627122 -0.204091\nv -0.0693424 0.71286 -0.356043\nv -0.0400134 0.70808 -0.365023\nv -0.00474467 0.733877 -0.327874\nv -0.0193301 0.755263 -0.270218\nv 0.0036903 0.780181 -0.243208\nv 0.0229326 0.74602 -0.328753\nv 0.0102098 0.754086 -0.299599\nv 0.00609778 0.719309 -0.329983\nv 0.0434576 0.75992 -0.30206\nv 0.0336344 0.728377 -0.324201\nv 0.0531227 0.749165 -0.295522\nv 0.0597301 0.793361 -0.261589\nv 0.0312621 0.774259 -0.225389\nv 0.0324395 0.725214 -0.389414\nv 0.0169051 0.697308 -0.400467\nv -0.00803079 0.556391 -0.494851\nv 0.0222648 0.52302 -0.523969\nv -0.00615049 0.534162 -0.561224\nv -0.0252697 0.499192 -0.523231\nv -0.0669877 0.58876 -0.508066\nv -0.125417 0.567093 -0.430728\nv 0.042825 0.750641 -0.284592\nv 0.061628 0.772854 -0.233508\nv 0.0597828 0.765438 -0.269286\nv 0.0325976 0.812586 -0.209451\nv 0.065986 0.777791 -0.199803\nv 0.0765473 0.852494 -0.202088\nv 0.0429129 0.830651 -0.188346\nv 0.073349 0.858293 -0.18158\nv 0.0397498 0.837978 -0.164499\nv 0.0480969 0.863108 -0.110902\nv 0.0721189 0.858996 -0.130742\nv 0.0882508 0.835413 -0.0971251\nv 0.0114399 0.790057 -0.23588\nv 0.0655643 0.817155 -0.217868\nv 0.076969 0.750589 -0.313306\nv 0.0968439 0.77686 -0.299687\nv 0.105226 0.724177 -0.29243\nv 0.0745088 0.727182 -0.342143\nv 0.103662 0.737919 -0.272274\nv 0.0993393 0.720768 -0.328208\nv 0.0754929 0.7437 -0.336907\nv 0.109865 0.748111 -0.327944\nv 0.0984255 0.737075 -0.311426\nv 0.0810811 0.760693 -0.274699\nv 0.0665483 0.757688 -0.255263\nv 0.121094 0.716146 -0.278178\nv 0.117931 0.712403 -0.323235\nv 0.0691316 0.846431 -0.0978456\nv 0.0713985 0.870945 -0.125593\nv 0.068868 0.826275 -0.191509\nv 0.0580782 0.800214 -0.187871\nv 0.086845 0.798914 -0.148578\nv 0.114751 0.643904 -0.123924\nv 0.148297 0.657769 -0.237269\nv 0.101149 0.750343 -0.149756\nv 0.10867 0.729361 -0.215478\nv 0.125769 0.632622 -0.179788\nv 0.183127 0.658788 -0.255931\nv 0.213598 0.618933 -0.212913\nv 0.2353 0.68701 -0.26043\nv 0.246108 0.624381 -0.262942\nv 0.246231 0.594612 -0.24428\nv 0.134907 0.692247 -0.26716\nv 0.15682 0.673374 -0.290022\nv 0.14176 0.728904 -0.299564\nv 0.14241 0.691157 -0.318385\nv 0.0764946 0.682582 -0.44642\nv 0.16898 0.688715 -0.44447\nv 0.144554 0.645696 -0.50297\nv 0.0820827 0.709943 -0.390381\nv 0.0476224 0.665009 -0.471971\nv 0.0828384 0.701191 -0.526412\nv 0.115787 0.719748 -0.348944\nv 0.120567 0.709556 -0.362791\nv 0.105349 0.729378 -0.41196\nv 0.143834 0.710558 -0.388746\nv 0.114346 0.702105 -0.422346\nv 0.136154 0.738569 -0.429164\nv 0.16464 0.704442 -0.400221\nv 0.15081 0.694602 -0.431659\nv 0.127842 0.713352 -0.399431\nv 0.20207 0.501476 -0.500211\nv 0.160106 0.53193 -0.529821\nv 0.158015 0.590377 -0.519488\nv 0.223896 0.560995 -0.485028\nv 0.256563 0.454416 -0.452413\nv 0.265016 0.527994 -0.443749\nv 0.244895 0.63814 -0.399466\nv 0.256599 0.444646 -0.385179\nv 0.261027 0.474555 -0.31429\nv 0.207096 0.454434 -0.539117\nv 0.134731 0.469335 -0.554212\nv 0.246319 0.427196 -0.491178\nv 0.203335 0.399448 -0.562718\nv 0.258989 0.384687 -0.510315\nv 0.276473 0.37272 -0.454065\nv 0.228974 0.39625 -0.360278\nv 0.253207 0.32812 -0.415615\nv 0.237128 0.345201 -0.636998\nv 0.313095 0.320775 -0.570081\nv 0.278846 0.350262 -0.607915\nv 0.193477 0.292799 -0.652023\nv 0.138333 0.431976 -0.568886\nv 0.150529 0.375584 -0.569465\nv 0.0929076 0.432819 -0.542017\nv 0.278477 0.478895 -0.362194\nv 0.20316 0.651619 -0.462851\nv 0.274787 0.562858 -0.330475\nv 0.265578 0.603855 -0.31603\nv 0.261045 0.516518 -0.253102\nv 0.328911 0.233965 -0.682055\nv 0.267494 0.304783 -0.533037\nv 0.266896 0.292605 -0.516255\nv 0.264665 0.29851 -0.495835\nv 0.298281 0.285225 -0.544828\nv 0.274013 0.333814 -0.537799\nv 0.173778 0.317612 -0.624205\nv 0.408217 0.176133 -0.686571\nv 0.341563 0.162848 -0.698169\nv 0.36258 0.179032 -0.699821\nv 0.365058 0.133571 -0.711577\nv 0.380136 0.147313 -0.71358\nv 0.390925 0.132851 -0.712298\nv 0.293062 0.194742 -0.677925\nv 0.242277 0.250431 -0.672249\nv 0.282694 0.274294 -0.677486\nv 0.329842 0.292008 -0.639335\nv 0.202474 0.24008 -0.656521\nv 0.147296 0.283292 -0.616033\nv 0.15617 0.267423 -0.634046\nv 0.112185 0.350402 -0.549872\nv 0.200401 0.21242 -0.637771\nv 0.139212 0.26289 -0.600622\nv 0.150617 0.245036 -0.619566\nv 0.364531 0.115418 -0.701121\nv 0.336063 0.14849 -0.686905\nv 0.285084 0.167258 -0.658419\nv 0.125576 0.283098 -0.573331\nv 0.134274 0.307261 -0.593628\nv 0.138597 0.37706 -0.411363\nv 0.0770921 0.39987 -0.484308\nv 0.0934172 0.420325 -0.4011\nv 0.0719608 0.423136 -0.473324\nv 0.0955084 0.416072 -0.450866\nv 0.0423681 0.409148 -0.500088\nv 0.0506801 0.425087 -0.505377\nv 0.015675 0.397744 -0.475047\nv 0.0168524 0.426598 -0.462113\nv 0.0130742 0.419675 -0.490862\nv 0.0217727 0.438354 -0.516536\nv 0.0273433 0.444013 -0.517538\nv 0.0263241 0.441992 -0.475925\nv 0.0241451 0.450005 -0.511581\nv 0.0173795 0.444259 -0.507029\nv 0.0509437 0.486276 -0.487154\nv 0.0784276 0.575598 -0.52353\nv 0.064176 0.613837 -0.497276\nv 0.0314027 0.540769 -0.479809\nv 0.0544231 0.526728 -0.505465\nv 0.0159737 0.495642 -0.519945\nv -0.00274136 0.50717 -0.547218\nv 0.0469195 0.453713 -0.483359\nv -0.0390293 0.540347 -0.467104\nv -0.0466559 0.483991 -0.488384\nv -0.0477103 0.51506 -0.489017\nv -0.00442836 0.478684 -0.510755\nv -0.00618564 0.540382 -0.538151\nv -0.0295927 0.52585 -0.525006\nv 0.105103 0.401504 -0.546972\nv 0.104207 0.515816 -0.532932\nv 0.0946122 0.458774 -0.492145\nv 0.190279 0.441061 -0.330967\nv 0.24117 0.472446 -0.223931\nv 0.241345 0.485274 -0.25927\nv 0.250237 0.511282 -0.227305\nv 0.219573 0.280656 -0.478192\nv 0.180069 0.338207 -0.41066\nv 0.175535 0.389432 -0.375514\nv 0.206165 0.45772 -0.26665\nv 0.197782 0.47111 -0.320529\nv 0.107388 0.326697 -0.496327\nv 0.0789372 0.389432 -0.516852\nv 0.179155 0.218009 -0.559572\nv 0.14589 0.253084 -0.530506\nv 0.317014 0.141936 -0.644554\nv 0.245334 0.179243 -0.609971\nv 0.346747 0.156943 -0.603592\nv 0.270323 0.183056 -0.542403\nv 0.369364 0.244579 -0.650564\nv 0.32689 0.221769 -0.549643\nv 0.38604 0.180666 -0.601237\nv 0.425649 0.174639 -0.626156\nv 0.287474 0.258268 -0.525024\nv 0.274804 0.215232 -0.512705\nv 0.311602 0.188767 -0.545812\nv 0.184181 0.305539 -0.441377\nv 0.130197 0.35998 -0.470566\nv 0.195814 0.251643 -0.495115\nv 0.247812 0.251415 -0.492145\nv 0.434506 0.136682 -0.691509\nv 0.435929 0.145978 -0.608934\nv 0.408498 0.156117 -0.605332\nv 0.438319 0.0318771 -0.703652\nv 0.476294 0.0384669 -0.672354\nv 0.495976 0.0486416 -0.630812\nv 0.498823 0.0632798 -0.604172\nv 0.402611 0.0256212 -0.716831\nv 0.518399 0.0263768 -0.614206\nv 0.52049 0.039943 -0.594243\nv 0.552209 -0.00880402 -0.600868\nv 0.555829 -0.000369045 -0.588655\nv 0.56523 -0.0182758 -0.601606\nv 0.571574 -0.0077145 -0.587196\nv 0.581064 -0.0372896 -0.593593\nv 0.584068 -0.030401 -0.58022\nv 0.596633 -0.0694479 -0.582803\nv 0.600341 -0.0983025 -0.568517\nv 0.605156 -0.0864935 -0.546041\nv 0.605964 -0.0835413 -0.561874\nv 0.602573 -0.0602046 -0.564914\nv 0.461217 0.0783397 -0.548659\nv 0.41261 0.136242 -0.587513\nv 0.528029 0.0128106 -0.569202\nv 0.565881 -0.017854 -0.567462\nv 0.595175 -0.0921344 -0.536921\nv 0.592767 -0.0619619 -0.548747\nv 0.602169 -0.120813 -0.553703\nv 0.608108 -0.107915 -0.536639\nv 0.616016 -0.11034 -0.550996\nv 0.614013 -0.136734 -0.534583\nv 0.394229 0.109215 -0.580695\nv 0.376797 0.0783046 -0.624732\nv 0.402014 0.0526834 -0.590641\nv 0.391523 0.0777422 -0.580132\nv 0.374794 0.125646 -0.617668\nv 0.128036 0.164921 -0.286455\nv 0.0497311 0.209609 -0.381893\nv -0.020982 0.232278 -0.427002\nv 0.102063 0.264014 -0.357713\nv 0.18882 0.668875 -0.281447\nv 0.216779 0.690577 -0.297807\nv 0.236794 0.652673 -0.299213\nv 0.217271 0.672934 -0.273504\nv 0.197413 0.685763 -0.367044\nv 0.218466 0.689558 -0.39089\nv 0.226883 0.66594 -0.366218\nv 0.165167 0.703265 -0.356817\nv 0.182951 0.697255 -0.355094\nv 0.202404 0.672249 -0.331389\nv 0.159069 0.690542 -0.332654\nv 0.173409 0.718518 -0.338752\nv 0.155484 0.696394 -0.348065\nv 0.147647 0.708326 -0.370348\nv 0.176554 0.726742 -0.379538\nv 0.179366 0.696781 -0.394897\nv 0.22437 0.658402 -0.336625\nv 0.212631 0.695357 -0.351105\nv 0.172003 0.674217 -0.301568\nv 0.165237 0.682476 -0.314554\nv 0.166397 0.689154 -0.297596\nv 0.158226 0.68513 -0.30749\nv 0.21648 0.666011 -0.314905\nv 0.213405 0.678259 -0.327575\nv 0.200313 0.667206 -0.318982\nv 0.17789 0.675869 -0.31712\nv 0.228377 0.650371 -0.320915\nv 0.200225 0.682301 -0.395336\nv 0.576389 -0.080923 -0.580572\nv 0.588022 -0.105455 -0.568042\nv 0.507715 -0.0106667 -0.609479\nv 0.553615 -0.0340386 -0.602766\nv 0.581889 -0.0992339 -0.537518\nv 0.573736 -0.0651425 -0.551664\nv 0.564932 -0.0792008 -0.57175\nv 0.57783 -0.108758 -0.55618\nv 0.602344 -0.111025 -0.53548\nv 0.598461 -0.12062 -0.551611\nv 0.609918 -0.130689 -0.532211\nv 0.605964 -0.135733 -0.538572\nv 0.545689 -0.0302077 -0.563122\nv 0.505377 -0.0027238 -0.569747\nv 0.535761 -0.0454961 -0.586107\nv 0.609426 -0.141075 -0.530559\nv 0.413067 0.126893 -0.532193\nv 0.438056 0.116877 -0.536059\nv 0.432784 0.101799 -0.505571\nv 0.408252 0.109461 -0.50188\nv 0.43187 0.0954732 -0.489439\nv 0.407268 0.104857 -0.486328\nv 0.429498 0.0848065 -0.475011\nv 0.402594 0.092644 -0.472235\nv 0.409693 0.0749657 -0.45243\nv 0.425421 0.0643869 -0.447686\nv 0.392542 0.0690437 -0.44816\nv 0.392981 0.10129 -0.551137\nv 0.391171 0.092644 -0.493305\nv 0.379644 0.0546867 -0.453168\nv 0.410537 0.0548624 -0.420413\nv 0.420096 0.044881 -0.427284\nv 0.393684 0.0560749 -0.427038\nv 0.405335 0.0327558 -0.401979\nv 0.407954 0.0237409 -0.407145\nv 0.393948 0.0289249 -0.407303\nv 0.433575 0.0765121 -0.495009\nv 0.428057 0.0499947 -0.45786\nv 0.392577 0.0409798 -0.465469\nv 0.415598 0.037026 -0.465522\nv 0.393122 0.0375004 -0.448652\nv 0.413717 0.0333357 -0.449021\nv 0.392612 0.0513654 -0.430043\nv 0.419692 0.0395389 -0.434225\nv 0.421678 0.0610305 -0.500685\nv 0.397058 0.0669876 -0.500879\nv 0.436931 0.0567075 -0.547324\nv 0.399765 0.0241451 -0.400485\nv 0.494289 0.0443187 -0.56755\nv 0.401188 0.0382385 -0.628335\nv 0.473412 0.0279935 -0.564106\nv 0.435824 0.025709 -0.587372\nv 0.501283 0.00789019 -0.642639\nv 0.491723 0.00207358 -0.657488\nv 0.510737 -0.0610481 -0.639722\nv 0.520174 -0.0554072 -0.626876\nv 0.514164 -0.0838225 -0.6364\nv 0.527765 -0.0760728 -0.61953\nv 0.507785 -0.104348 -0.623168\nv 0.518996 -0.101378 -0.603047\nv 0.501529 -0.143728 -0.601536\nv 0.513478 -0.139493 -0.587847\nv 0.505342 -0.16218 -0.583243\nv 0.487717 -0.170878 -0.587038\nv 0.504903 -0.162109 -0.564264\nv 0.50188 -0.0136717 -0.614311\nv 0.513355 -0.0773381 -0.596071\nv 0.508224 -0.131339 -0.576143\nv 0.495361 -0.152532 -0.553703\nv 0.495484 -0.191245 -0.56581\nv 0.475257 -0.189646 -0.56581\nv 0.492373 -0.181809 -0.551155\nv 0.474115 -0.201262 -0.545549\nv 0.466787 -0.192827 -0.549784\nv 0.47517 -0.190911 -0.543879\nv 0.493481 -0.0884968 -0.631146\nv 0.479809 -0.136348 -0.603434\nv 0.47278 -0.166169 -0.583664\nv 0.473483 -0.0254279 -0.650072\nv 0.479949 -0.154184 -0.551875\nv 0.492549 -0.119197 -0.569835\nv 0.470759 -0.125066 -0.589569\nv 0.463097 -0.160616 -0.569518\nv 0.488384 -0.174779 -0.551735\nv 0.471796 -0.181334 -0.564141\nv 0.478262 -0.0850526 -0.614311\nv 0.497171 -0.0737357 -0.592451\nv 0.483763 -0.0229677 -0.595385\nv 0.467016 -0.197132 -0.540822\nv 0.470776 -0.00569362 -0.674639\nv 0.455576 -0.00808352 -0.687573\nv 0.457562 -0.0733666 -0.665027\nv 0.467402 -0.0675676 -0.653464\nv 0.455769 -0.0879169 -0.661635\nv 0.470038 -0.0832074 -0.649334\nv 0.445876 -0.107827 -0.643447\nv 0.457509 -0.103662 -0.63257\nv 0.426387 -0.129846 -0.616297\nv 0.435771 -0.1254 -0.604471\nv 0.420694 -0.134749 -0.599445\nv 0.406196 -0.136594 -0.599111\nv 0.418181 -0.127561 -0.582469\nv 0.469757 -0.0288019 -0.651443\nv 0.457685 -0.0812744 -0.626296\nv 0.429955 -0.110849 -0.594085\nv 0.411292 -0.118142 -0.574614\nv 0.402084 -0.143799 -0.577971\nv 0.387991 -0.140214 -0.580677\nv 0.403631 -0.133483 -0.566566\nv 0.370189 -0.138509 -0.551611\nv 0.438882 -0.0935754 -0.653481\nv 0.408832 -0.121182 -0.618406\nv 0.394791 -0.129406 -0.599779\nv 0.432222 -0.0367624 -0.671107\nv 0.400467 -0.108987 -0.576389\nv 0.4234 -0.0987067 -0.600446\nv 0.411257 -0.100921 -0.615489\nv 0.38829 -0.117703 -0.592099\nv 0.397691 -0.126823 -0.566812\nv 0.386198 -0.133536 -0.581274\nv 0.428074 -0.0769866 -0.642656\nv 0.446772 -0.0745264 -0.62366\nv 0.420026 -0.0341792 -0.657347\nv 0.453063 -0.0321583 -0.62793\nv 0.358662 0.0625769 -0.692915\nv 0.377957 0.0218782 -0.692651\nv 0.349471 0.110709 -0.671283\nv 0.375655 0.085404 -0.71235\nv 0.441219 -0.00864585 -0.693635\nv 0.424613 -0.0115629 -0.703652\nv 0.418954 -0.0527713 -0.696113\nv 0.426528 -0.0531227 -0.687028\nv 0.410853 -0.0766528 -0.68933\nv 0.42101 -0.0754051 -0.679753\nv 0.395758 -0.0803079 -0.675939\nv 0.404439 -0.0834359 -0.666995\nv 0.376322 -0.0832777 -0.655028\nv 0.387007 -0.0848417 -0.646505\nv 0.375022 -0.0797983 -0.639458\nv 0.362422 -0.064053 -0.639335\nv 0.378642 -0.0719959 -0.628844\nv 0.428391 -0.0369909 -0.67181\nv 0.419815 -0.0633677 -0.67072\nv 0.394247 -0.0771096 -0.644677\nv 0.383088 -0.0658806 -0.628563\nv 0.35636 -0.0587812 -0.613714\nv 0.355235 -0.0525955 -0.619847\nv 0.36852 -0.0550733 -0.613819\nv 0.354901 -0.0347767 -0.601184\nv 0.397287 -0.0588515 -0.689084\nv 0.371015 -0.0659685 -0.659878\nv 0.362633 -0.0551084 -0.642709\nv 0.404 -0.0135311 -0.696763\nv 0.383439 -0.0591853 -0.632306\nv 0.393509 -0.0707659 -0.647946\nv 0.377711 -0.0597828 -0.657962\nv 0.370049 -0.0449338 -0.640056\nv 0.370576 -0.0505219 -0.615225\nv 0.356518 -0.0494676 -0.621358\nv 0.393069 -0.0537729 -0.676853\nv 0.414438 -0.0587636 -0.664763\nv 0.391488 -0.0168172 -0.680877\nv 0.410484 0.0641409 -0.552121\nv 0.102871 0.658261 -0.0631041\nv 0.121024 0.65146 -0.094208\nv 0.127596 0.573472 -0.0729976\nv 0.0750185 0.581661 -0.0556708\nv 0.104998 0.578059 -0.0594314\nv 0.102871 0.655291 -0.00917304\nv 0.0840509 0.604927 -0.0374478\nv 0.106509 0.598566 -0.0755281\nv 0.129529 0.604207 -0.100341\nv 0.123695 0.779303 -0.0699751\nv 0.101606 0.7146 -0.016044\nv 0.118125 0.805346 -0.0877764\nv 0.0132675 0.865726 -0.0939093\nv 0.0375356 0.9221 -0.06755\nv 0.0895336 0.896338 -0.0741398\nv 0.0928022 0.85223 -0.0353917\nv 0.0770218 0.841265 0.0080132\nv 0.0623836 0.925737 -0.102204\nv 0.00576389 0.967736 -0.108618\nv 0.0187502 0.960936 -0.130514\nv 0.00847011 1 -0.14176\nv 0.0176431 0.992479 -0.15067\nv 0.0718026 0.877131 -0.108793\nv 0.0532633 0.90117 -0.126155\nv 0.0110357 0.945524 -0.144625\nv 0.00553544 0.985608 -0.159561\nv 0.0123889 0.888413 -0.108073\nv -0.0163076 0.936334 -0.134467\nv -0.00506098 0.990493 -0.153077\nv -0.0194707 0.963659 -0.143588\nv -0.00254806 0.999104 -0.144537\nv -0.0197167 0.973852 -0.128282\nv 0.000421748 0.861139 -0.044389\nv 0.000474467 0.90219 -0.0739993\nv -0.0196113 0.946561 -0.111166\nv 0.0279935 0.891593 -0.120286\nv 0.0138123 0.848592 0.00926086\nv 0.00954205 0.91674 -0.0609251\nv -0.00832953 0.969054 -0.108829\nv 0.00736302 0.999157 -0.157558\nv 0.123379 0.805363 -0.0418761\nv 0.110551 0.823077 0.0101395\nv 0.214248 0.782255 0.0628932\nv 0.220838 0.756809 -0.0141989\nv 0.28656 0.729993 0.091572\nv 0.298563 0.657189 0.0578498\nv 0.289899 0.69244 0.116719\nv 0.259674 0.63155 0.114821\nv 0.257003 0.670474 0.147348\nv 0.138281 0.580607 0.187291\nv 0.189506 0.605332 0.167926\nv 0.189962 0.628422 0.185587\nv 0.159913 0.742822 0.100675\nv 0.213088 0.703125 0.11577\nv 0.129547 0.581643 0.181334\nv 0.164605 0.63619 0.1684\nv 0.103943 0.889977 -0.00834712\nv 0.122571 0.903332 0.0329491\nv 0.0952799 0.861807 0.0758092\nv 0.136067 0.903982 -0.0210347\nv 0.147594 0.920255 0.000667753\nv 0.184005 0.905493 -0.034144\nv 0.0506976 0.891224 0.0661969\nv 0.0925562 0.928127 0.0242681\nv 0.127632 0.937652 -0.00801324\nv 0.167504 0.918901 -0.034847\nv 0.0749482 0.907971 -0.000333902\nv 0.0480969 0.851843 0.00903242\nv 0.0766527 0.893017 -0.00741575\nv 0.107317 0.92398 -0.0217025\nv 0.161231 0.904509 -0.031104\nv 0.168506 0.916441 -0.02172\nv 0.0276421 0.872825 0.0308052\nv 0.00883914 0.827734 0.0575335\nv 0.0361825 0.863828 0.0831547\nv 0.156451 0.720609 -0.00374304\nv 0.153674 0.694197 0.0563736\nv 0.290532 0.680332 0.0269743\nv 0.220188 0.660299 0.0603451\nv 0.231505 0.700858 0.00569359\nv 0.217956 0.637384 0.0884441\nv 0.173215 0.606333 0.137455\nv 0.142867 0.570274 0.177082\nv 0.139282 0.574474 0.167873\nv 0.2104 0.681809 0.130127\nv 0.131656 0.570344 0.179858\nv 0.0881278 0.595016 0.00268863\nv 0.128264 0.558201 0.0246547\nv 0.115524 0.533617 0.0411731\nv 0.11584 0.527484 0.0417179\nv 0.0849823 0.499508 0.039328\nv 0.0874952 0.557604 0.0307173\nv 0.0989878 0.529944 0.0420518\nv 0.0950866 0.486961 0.0309282\nv 0.388992 0.221172 -0.621499\nv 0.347503 0.278723 -0.594384\nv 0.230767 0.771711 0.0179946\nv 0.300162 0.706305 0.0577268\nv 0.302516 0.67666 0.0889713\nv 0.153604 0.703757 0.0845605\nv 0.203054 0.674428 0.0836819\nv 0.202193 0.658525 0.101026\nv 0.182863 0.693741 0.0835061\nv 0.192844 0.679717 0.0521562\n# 2519 vertices\n\nvt  0.644 0.154 0.599\nvt  0.632 0.188 0.600\nvt  0.640 0.183 0.600\nvt  0.656 0.168 0.599\nvt  0.643 0.221 0.601\nvt  0.656 0.202 0.601\nvt  0.639 0.194 0.600\nvt  0.621 0.228 0.601\nvt  0.586 0.119 0.597\nvt  0.562 0.130 0.598\nvt  0.578 0.188 0.600\nvt  0.615 0.158 0.599\nvt  0.614 0.081 0.598\nvt  0.644 0.095 0.597\nvt  0.695 0.188 0.602\nvt  0.671 0.180 0.600\nvt  0.673 0.195 0.601\nvt  0.684 0.201 0.602\nvt  0.647 0.189 0.600\nvt  0.595 0.214 0.600\nvt  0.703 0.208 0.602\nvt  0.713 0.199 0.602\nvt  0.719 0.214 0.603\nvt  0.724 0.204 0.603\nvt  0.715 0.196 0.602\nvt  0.728 0.196 0.602\nvt  0.735 0.206 0.602\nvt  0.734 0.198 0.602\nvt  0.734 0.218 0.603\nvt  0.730 0.165 0.600\nvt  0.731 0.189 0.602\nvt  0.734 0.188 0.602\nvt  0.733 0.162 0.600\nvt  0.734 0.227 0.602\nvt  0.716 0.218 0.603\nvt  0.703 0.212 0.603\nvt  0.717 0.236 0.602\nvt  0.702 0.230 0.602\nvt  0.694 0.221 0.602\nvt  0.697 0.257 0.602\nvt  0.682 0.239 0.602\nvt  0.673 0.225 0.602\nvt  0.734 0.260 0.602\nvt  0.710 0.276 0.602\nvt  0.637 0.273 0.601\nvt  0.598 0.264 0.601\nvt  0.659 0.309 0.601\nvt  0.704 0.152 0.599\nvt  0.706 0.125 0.597\nvt  0.682 0.130 0.598\nvt  0.677 0.154 0.599\nvt  0.719 0.150 0.599\nvt  0.733 0.122 0.597\nvt  0.703 0.187 0.602\nvt  0.703 0.177 0.601\nvt  0.699 0.172 0.601\nvt  0.707 0.175 0.602\nvt  0.711 0.186 0.606\nvt  0.717 0.188 0.606\nvt  0.706 0.173 0.601\nvt  0.717 0.161 0.601\nvt  0.730 0.159 0.599\nvt  0.624 0.324 0.601\nvt  0.578 0.291 0.600\nvt  0.734 0.303 0.601\nvt  0.700 0.310 0.601\nvt  0.715 0.317 0.601\nvt  0.673 0.210 0.602\nvt  0.692 0.216 0.602\nvt  0.691 0.211 0.602\nvt  0.641 0.070 0.597\nvt  0.662 0.081 0.596\nvt  0.676 0.098 0.596\nvt  0.705 0.093 0.595\nvt  0.733 0.096 0.595\nvt  0.686 0.077 0.596\nvt  0.704 0.073 0.595\nvt  0.733 0.077 0.595\nvt  0.711 0.057 0.595\nvt  0.697 0.054 0.595\nvt  0.661 0.057 0.597\nvt  0.682 0.060 0.596\nvt  0.674 0.039 0.597\nvt  0.670 0.043 0.597\nvt  0.694 0.044 0.596\nvt  0.719 0.033 0.595\nvt  0.711 0.023 0.596\nvt  0.733 0.053 0.594\nvt  0.734 0.032 0.594\nvt  0.275 0.976 0.506\nvt  0.271 0.991 0.510\nvt  0.241 0.990 0.536\nvt  0.236 0.970 0.540\nvt  0.325 0.976 0.455\nvt  0.322 0.987 0.457\nvt  0.299 0.955 0.477\nvt  0.305 0.955 0.472\nvt  0.302 0.969 0.479\nvt  0.339 0.984 0.440\nvt  0.336 0.990 0.443\nvt  0.733 0.014 0.595\nvt  0.727 0.011 0.596\nvt  0.298 0.668 0.427\nvt  0.321 0.707 0.450\nvt  0.332 0.693 0.450\nvt  0.323 0.665 0.434\nvt  0.339 0.678 0.447\nvt  0.337 0.640 0.426\nvt  0.307 0.634 0.413\nvt  0.288 0.655 0.417\nvt  0.352 0.621 0.416\nvt  0.352 0.584 0.395\nvt  0.333 0.597 0.401\nvt  0.320 0.616 0.409\nvt  0.597 0.747 -0.465\nvt  0.621 0.733 -0.465\nvt  0.638 0.776 -0.437\nvt  0.611 0.783 -0.437\nvt  0.648 0.761 -0.440\nvt  0.645 0.778 -0.437\nvt  0.644 0.754 -0.446\nvt  0.579 0.752 -0.465\nvt  0.590 0.787 -0.440\nvt  0.542 0.754 -0.462\nvt  0.556 0.791 -0.451\nvt  0.606 0.693 -0.456\nvt  0.634 0.678 -0.468\nvt  0.643 0.715 -0.465\nvt  0.572 0.710 -0.457\nvt  0.571 0.695 -0.460\nvt  0.593 0.685 -0.461\nvt  0.563 0.668 -0.455\nvt  0.566 0.684 -0.426\nvt  0.561 0.686 -0.437\nvt  0.553 0.670 -0.459\nvt  0.547 0.707 -0.450\nvt  0.554 0.695 -0.446\nvt  0.541 0.682 -0.446\nvt  0.525 0.688 -0.442\nvt  0.556 0.654 -0.501\nvt  0.569 0.652 -0.505\nvt  0.576 0.668 -0.453\nvt  0.603 0.655 -0.496\nvt  0.586 0.664 -0.492\nvt  0.585 0.658 -0.494\nvt  0.595 0.649 -0.493\nvt  0.577 0.651 -0.498\nvt  0.586 0.642 -0.488\nvt  0.577 0.645 -0.494\nvt  0.570 0.634 -0.513\nvt  0.582 0.634 -0.511\nvt  0.563 0.651 -0.516\nvt  0.557 0.631 -0.502\nvt  0.521 0.674 -0.487\nvt  0.533 0.670 -0.497\nvt  0.588 0.624 -0.500\nvt  0.564 0.611 -0.444\nvt  0.609 0.620 -0.451\nvt  0.597 0.626 -0.482\nvt  0.454 0.857 -0.466\nvt  0.462 0.834 -0.465\nvt  0.497 0.846 -0.461\nvt  0.485 0.886 -0.467\nvt  0.525 0.846 -0.458\nvt  0.518 0.777 -0.462\nvt  0.563 0.844 -0.459\nvt  0.645 0.790 -0.437\nvt  0.643 0.805 -0.440\nvt  0.636 0.805 -0.444\nvt  0.640 0.813 -0.425\nvt  0.650 0.809 -0.442\nvt  0.644 0.817 -0.430\nvt  0.653 0.790 -0.438\nvt  0.657 0.776 -0.440\nvt  0.654 0.769 -0.436\nvt  0.467 0.802 -0.465\nvt  0.470 0.774 -0.467\nvt  0.499 0.775 -0.465\nvt  0.498 0.818 -0.462\nvt  0.661 0.741 -0.451\nvt  0.651 0.753 -0.447\nvt  0.517 0.713 -0.454\nvt  0.544 0.728 -0.465\nvt  0.512 0.735 -0.456\nvt  0.499 0.707 -0.479\nvt  0.386 0.562 -0.685\nvt  0.424 0.552 -0.685\nvt  0.411 0.596 -0.685\nvt  0.388 0.597 -0.685\nvt  0.423 0.813 -0.467\nvt  0.431 0.768 -0.467\nvt  0.441 0.742 -0.469\nvt  0.449 0.721 -0.469\nvt  0.460 0.745 -0.469\nvt  0.456 0.760 -0.468\nvt  0.408 0.746 -0.469\nvt  0.413 0.734 -0.469\nvt  0.667 0.706 -0.465\nvt  0.670 0.722 -0.461\nvt  0.430 0.709 -0.454\nvt  0.397 0.522 -0.685\nvt  0.389 0.523 -0.685\nvt  0.387 0.496 -0.685\nvt  0.395 0.491 -0.685\nvt  0.389 0.442 -0.685\nvt  0.409 0.461 -0.685\nvt  0.384 0.469 -0.685\nvt  0.367 0.448 -0.685\nvt  0.457 0.478 -0.685\nvt  0.437 0.450 -0.685\nvt  0.453 0.440 -0.697\nvt  0.468 0.464 -0.696\nvt  0.445 0.513 -0.685\nvt  0.425 0.499 -0.685\nvt  0.477 0.499 -0.685\nvt  0.495 0.484 -0.696\nvt  0.497 0.445 -0.646\nvt  0.510 0.452 -0.642\nvt  0.423 0.527 -0.685\nvt  0.462 0.528 -0.685\nvt  0.474 0.542 -0.685\nvt  0.445 0.562 -0.685\nvt  0.367 0.420 -0.685\nvt  0.334 0.432 -0.685\nvt  0.351 0.404 -0.685\nvt  0.323 0.418 -0.685\nvt  0.422 0.427 -0.685\nvt  0.395 0.403 -0.685\nvt  0.474 0.760 -0.468\nvt  0.493 0.756 -0.468\nvt  0.379 0.470 -0.685\nvt  0.447 0.388 -0.709\nvt  0.448 0.419 -0.705\nvt  0.485 0.401 -0.627\nvt  0.480 0.420 -0.637\nvt  0.478 0.587 -0.685\nvt  0.496 0.568 -0.685\nvt  0.486 0.600 -0.685\nvt  0.515 0.584 -0.685\nvt  0.395 0.801 -0.468\nvt  0.678 0.800 -0.452\nvt  0.660 0.758 -0.446\nvt  0.688 0.779 -0.457\nvt  0.706 0.767 -0.457\nvt  0.467 0.627 -0.685\nvt  0.501 0.611 -0.685\nvt  0.487 0.631 -0.685\nvt  0.538 0.562 -0.685\nvt  0.550 0.583 -0.685\nvt  0.528 0.603 -0.685\nvt  0.513 0.398 -0.667\nvt  0.523 0.406 -0.679\nvt  0.502 0.418 -0.600\nvt  0.496 0.414 -0.604\nvt  0.521 0.549 -0.685\nvt  0.508 0.511 -0.685\nvt  0.486 0.431 -0.620\nvt  0.506 0.432 -0.616\nvt  0.527 0.421 -0.676\nvt  0.545 0.559 -0.712\nvt  0.584 0.532 -0.709\nvt  0.583 0.550 -0.708\nvt  0.551 0.566 -0.701\nvt  0.612 0.550 -0.709\nvt  0.598 0.562 -0.709\nvt  0.589 0.564 -0.710\nvt  0.594 0.551 -0.709\nvt  0.598 0.537 -0.709\nvt  0.611 0.577 -0.710\nvt  0.610 0.570 -0.709\nvt  0.619 0.561 -0.709\nvt  0.617 0.570 -0.710\nvt  0.589 0.577 -0.701\nvt  0.629 0.566 -0.710\nvt  0.625 0.558 -0.709\nvt  0.632 0.555 -0.709\nvt  0.632 0.565 -0.709\nvt  0.620 0.536 -0.709\nvt  0.576 0.387 -0.709\nvt  0.605 0.396 -0.709\nvt  0.603 0.416 -0.709\nvt  0.574 0.413 -0.709\nvt  0.609 0.439 -0.709\nvt  0.570 0.439 -0.708\nvt  0.620 0.466 -0.709\nvt  0.572 0.467 -0.708\nvt  0.572 0.490 -0.708\nvt  0.623 0.493 -0.709\nvt  0.538 0.492 -0.708\nvt  0.531 0.463 -0.706\nvt  0.555 0.509 -0.709\nvt  0.623 0.515 -0.709\nvt  0.627 0.419 -0.709\nvt  0.647 0.429 -0.709\nvt  0.524 0.437 -0.666\nvt  0.521 0.356 -0.709\nvt  0.554 0.364 -0.708\nvt  0.662 0.494 -0.709\nvt  0.661 0.511 -0.709\nvt  0.681 0.501 -0.709\nvt  0.680 0.507 -0.709\nvt  0.752 0.685 -0.953\nvt  0.738 0.692 -0.953\nvt  0.731 0.679 -0.953\nvt  0.746 0.673 -0.953\nvt  0.726 0.671 -0.953\nvt  0.742 0.665 -0.954\nvt  0.721 0.659 -0.954\nvt  0.737 0.654 -0.954\nvt  0.716 0.649 -0.955\nvt  0.733 0.642 -0.955\nvt  0.720 0.620 -0.957\nvt  0.711 0.625 -0.957\nvt  0.705 0.612 -0.959\nvt  0.710 0.605 -0.958\nvt  0.700 0.603 -0.961\nvt  0.703 0.601 -0.958\nvt  0.699 0.629 -0.957\nvt  0.694 0.612 -0.958\nvt  0.695 0.604 -0.958\nvt  0.713 0.676 -0.954\nvt  0.698 0.655 -0.954\nvt  0.749 0.652 -0.954\nvt  0.756 0.664 -0.953\nvt  0.681 0.514 -0.709\nvt  0.665 0.524 -0.709\nvt  0.766 0.677 -0.953\nvt  0.684 0.487 -0.709\nvt  0.694 0.494 -0.709\nvt  0.717 0.692 -0.953\nvt  0.748 0.630 -0.954\nvt  0.766 0.647 -0.954\nvt  0.722 0.614 -0.956\nvt  0.733 0.611 -0.955\nvt  0.778 0.662 -0.953\nvt  0.695 0.631 -0.956\nvt  0.690 0.637 -0.955\nvt  0.678 0.661 -0.954\nvt  0.674 0.640 -0.954\nvt  0.747 0.602 -0.954\nvt  0.762 0.619 -0.954\nvt  0.720 0.599 -0.956\nvt  0.733 0.598 -0.955\nvt  0.677 0.627 -0.955\nvt  0.686 0.617 -0.956\nvt  0.718 0.610 -0.957\nvt  0.711 0.598 -0.957\nvt  0.695 0.626 -0.957\nvt  0.688 0.610 -0.957\nvt  0.696 0.597 -0.957\nvt  0.414 0.480 -0.685\nvt  0.360 0.450 -0.685\nvt  0.331 0.436 -0.685\nvt  0.652 0.454 -0.709\nvt  0.698 0.676 -0.954\nvt  0.682 0.679 -0.954\nvt  0.773 0.634 -0.954\nvt  0.695 0.697 -0.953\nvt  0.679 0.699 -0.953\nvt  0.793 0.639 -0.953\nvt  0.788 0.651 -0.953\nvt  0.861 0.723 -0.888\nvt  0.883 0.735 -0.890\nvt  0.863 0.747 -0.890\nvt  0.848 0.731 -0.892\nvt  0.845 0.726 -0.890\nvt  0.855 0.720 -0.882\nvt  0.840 0.719 -0.901\nvt  0.848 0.713 -0.894\nvt  0.833 0.714 -0.922\nvt  0.844 0.708 -0.911\nvt  0.826 0.685 -0.961\nvt  0.820 0.689 -0.959\nvt  0.810 0.676 -0.999\nvt  0.816 0.672 -1.002\nvt  0.813 0.691 -0.977\nvt  0.801 0.679 -1.017\nvt  0.831 0.733 -0.932\nvt  0.823 0.719 -0.947\nvt  0.835 0.680 -0.979\nvt  0.855 0.694 -0.951\nvt  0.859 0.711 -0.910\nvt  0.864 0.716 -0.907\nvt  0.869 0.703 -0.942\nvt  0.808 0.696 -0.991\nvt  0.809 0.722 -0.968\nvt  0.794 0.706 -1.006\nvt  0.848 0.669 -1.006\nvt  0.862 0.685 -0.968\nvt  0.825 0.666 -1.010\nvt  0.824 0.676 -0.985\nvt  0.816 0.666 -1.013\nvt  0.803 0.685 -1.003\nvt  0.795 0.684 -1.010\nvt  0.796 0.678 -1.013\nvt  0.817 0.738 -0.955\nvt  0.876 0.697 -0.955\nvt  0.668 0.471 -0.709\nvt  0.672 0.442 -0.708\nvt  0.691 0.461 -0.709\nvt  0.848 0.762 -0.935\nvt  0.629 0.397 -0.709\nvt  0.644 0.401 -0.709\nvt  0.741 0.427 -0.750\nvt  0.741 0.443 -0.728\nvt  0.718 0.446 -0.708\nvt  0.721 0.422 -0.704\nvt  0.746 0.415 -0.734\nvt  0.733 0.401 -0.694\nvt  0.699 0.454 -0.709\nvt  0.702 0.418 -0.714\nvt  0.711 0.392 -0.725\nvt  0.675 0.413 -0.707\nvt  0.679 0.396 -0.703\nvt  0.840 0.774 -0.966\nvt  0.817 0.772 -0.983\nvt  0.659 0.538 -0.709\nvt  0.651 0.559 -0.709\nvt  0.648 0.573 -0.709\nvt  0.693 0.558 -0.709\nvt  0.679 0.577 -0.709\nvt  0.668 0.560 -0.709\nvt  0.684 0.544 -0.709\nvt  0.685 0.525 -0.709\nvt  0.686 0.533 -0.709\nvt  0.913 0.704 -0.983\nvt  0.887 0.717 -0.934\nvt  0.628 0.574 -0.709\nvt  0.623 0.597 -0.709\nvt  0.610 0.598 -0.709\nvt  0.591 0.597 -0.711\nvt  0.711 0.753 -0.884\nvt  0.725 0.749 -0.889\nvt  0.736 0.760 -0.893\nvt  0.723 0.763 -0.883\nvt  0.737 0.743 -0.895\nvt  0.747 0.754 -0.900\nvt  0.742 0.740 -0.909\nvt  0.752 0.751 -0.914\nvt  0.788 0.725 -1.001\nvt  0.774 0.734 -0.957\nvt  0.769 0.729 -0.962\nvt  0.786 0.720 -1.007\nvt  0.780 0.738 -0.972\nvt  0.794 0.729 -1.014\nvt  0.747 0.772 -0.931\nvt  0.762 0.763 -0.952\nvt  0.734 0.726 -0.947\nvt  0.762 0.715 -0.999\nvt  0.724 0.741 -0.908\nvt  0.726 0.729 -0.939\nvt  0.785 0.751 -0.999\nvt  0.790 0.765 -1.007\nvt  0.771 0.773 -0.970\nvt  0.734 0.713 -0.970\nvt  0.751 0.704 -1.007\nvt  0.779 0.713 -1.005\nvt  0.787 0.716 -1.012\nvt  0.773 0.720 -0.989\nvt  0.799 0.731 -1.012\nvt  0.798 0.739 -1.005\nvt  0.787 0.741 -0.991\nvt  0.762 0.775 -0.961\nvt  0.726 0.715 -0.961\nvt  0.757 0.794 -0.975\nvt  0.740 0.793 -0.968\nvt  0.703 0.714 -0.975\nvt  0.700 0.733 -0.937\nvt  0.022 0.649 0.173\nvt  0.019 0.619 0.173\nvt  0.014 0.626 0.173\nvt  0.017 0.652 0.173\nvt  0.006 0.626 0.173\nvt  0.006 0.652 0.173\nvt  0.006 0.694 0.173\nvt  0.029 0.699 0.173\nvt  0.033 0.697 0.173\nvt  0.659 0.833 -0.454\nvt  0.646 0.821 -0.443\nvt  0.049 0.730 0.173\nvt  0.057 0.726 0.173\nvt  0.006 0.734 0.173\nvt  0.638 0.852 -0.457\nvt  0.628 0.839 -0.451\nvt  0.636 0.824 -0.446\nvt  0.615 0.835 -0.450\nvt  0.630 0.817 -0.442\nvt  0.013 0.588 0.173\nvt  0.006 0.588 0.173\nvt  0.017 0.588 0.172\nvt  0.022 0.546 0.111\nvt  0.006 0.532 0.117\nvt  0.203 0.940 -0.291\nvt  0.213 0.950 -0.291\nvt  0.264 0.917 -0.291\nvt  0.225 0.894 -0.291\nvt  0.281 0.893 -0.291\nvt  0.238 0.881 -0.291\nvt  0.291 0.865 -0.291\nvt  0.255 0.859 -0.291\nvt  0.289 0.825 -0.291\nvt  0.261 0.832 -0.291\nvt  0.268 0.756 -0.291\nvt  0.236 0.767 -0.291\nvt  0.226 0.700 -0.291\nvt  0.203 0.715 -0.291\nvt  0.183 0.647 -0.292\nvt  0.165 0.659 -0.292\nvt  0.146 0.581 -0.292\nvt  0.126 0.574 -0.292\nvt  0.121 0.528 -0.292\nvt  0.116 0.525 -0.292\nvt  0.328 0.815 -0.291\nvt  0.314 0.767 -0.291\nvt  0.295 0.734 -0.291\nvt  0.249 0.684 -0.291\nvt  0.201 0.637 -0.292\nvt  0.158 0.579 -0.292\nvt  0.123 0.522 -0.292\nvt  0.322 0.855 -0.291\nvt  0.338 0.844 -0.290\nvt  0.363 0.821 -0.291\nvt  0.330 0.862 -0.290\nvt  0.340 0.851 -0.290\nvt  0.319 0.881 -0.290\nvt  0.330 0.878 -0.290\nvt  0.325 0.888 -0.290\nvt  0.320 0.900 -0.291\nvt  0.333 0.900 -0.290\nvt  0.342 0.894 -0.290\nvt  0.353 0.802 -0.291\nvt  0.368 0.799 -0.290\nvt  0.368 0.783 -0.285\nvt  0.364 0.783 -0.291\nvt  0.355 0.777 -0.291\nvt  0.340 0.792 -0.291\nvt  0.377 0.783 -0.291\nvt  0.369 0.773 -0.291\nvt  0.381 0.805 -0.291\nvt  0.374 0.796 -0.291\nvt  0.368 0.782 -0.284\nvt  0.314 0.932 -0.291\nvt  0.364 0.837 -0.290\nvt  0.349 0.852 -0.290\nvt  0.374 0.850 -0.290\nvt  0.376 0.877 -0.290\nvt  0.370 0.877 -0.290\nvt  0.374 0.890 -0.290\nvt  0.380 0.880 -0.290\nvt  0.343 0.876 -0.290\nvt  0.385 0.850 -0.290\nvt  0.389 0.841 -0.290\nvt  0.373 0.840 -0.290\nvt  0.379 0.858 -0.290\nvt  0.385 0.871 -0.290\nvt  0.345 0.913 -0.290\nvt  0.398 0.846 -0.291\nvt  0.404 0.867 -0.291\nvt  0.385 0.891 -0.290\nvt  0.386 0.908 -0.290\nvt  0.411 0.901 -0.291\nvt  0.409 0.889 -0.291\nvt  0.315 0.721 -0.291\nvt  0.262 0.675 -0.291\nvt  0.211 0.632 -0.292\nvt  0.163 0.577 -0.292\nvt  0.335 0.781 -0.291\nvt  0.347 0.772 -0.291\nvt  0.372 0.918 -0.290\nvt  0.335 0.938 -0.291\nvt  0.372 0.939 -0.290\nvt  0.385 0.932 -0.287\nvt  0.381 0.927 -0.292\nvt  0.392 0.922 -0.290\nvt  0.419 0.914 -0.291\nvt  0.006 0.768 0.173\nvt  0.043 0.760 0.173\nvt  0.046 0.742 0.173\nvt  0.042 0.774 0.173\nvt  0.056 0.776 0.173\nvt  0.056 0.763 0.173\nvt  0.049 0.797 0.173\nvt  0.060 0.798 0.173\nvt  0.564 0.899 -0.417\nvt  0.556 0.895 -0.436\nvt  0.545 0.910 -0.381\nvt  0.540 0.908 -0.399\nvt  0.534 0.892 -0.435\nvt  0.535 0.915 -0.422\nvt  0.553 0.926 -0.441\nvt  0.533 0.931 -0.422\nvt  0.524 0.931 -0.385\nvt  0.601 0.873 -0.460\nvt  0.605 0.872 -0.459\nvt  0.612 0.875 -0.459\nvt  0.606 0.880 -0.452\nvt  0.006 0.921 0.173\nvt  0.042 0.914 0.173\nvt  0.035 0.886 0.173\nvt  0.006 0.890 0.173\nvt  0.048 0.804 0.173\nvt  0.046 0.816 0.173\nvt  0.055 0.821 0.173\nvt  0.064 0.840 0.173\nvt  0.044 0.821 0.173\nvt  0.052 0.847 0.173\nvt  0.040 0.795 0.173\nvt  0.379 0.374 0.257\nvt  0.397 0.365 0.257\nvt  0.417 0.331 0.257\nvt  0.395 0.331 0.257\nvt  0.369 0.339 0.257\nvt  0.357 0.348 0.257\nvt  0.416 0.362 0.257\nvt  0.432 0.356 0.257\nvt  0.118 0.199 0.365\nvt  0.138 0.210 0.372\nvt  0.133 0.232 0.365\nvt  0.098 0.201 0.360\nvt  0.390 0.287 0.257\nvt  0.399 0.237 0.257\nvt  0.379 0.242 0.257\nvt  0.374 0.298 0.257\nvt  0.392 0.203 0.257\nvt  0.375 0.199 0.257\nvt  0.364 0.236 0.257\nvt  0.393 0.185 0.257\nvt  0.379 0.181 0.257\nvt  0.519 0.123 0.194\nvt  0.504 0.133 0.211\nvt  0.498 0.157 0.248\nvt  0.531 0.162 0.263\nvt  0.413 0.942 -0.291\nvt  0.438 0.941 -0.291\nvt  0.384 0.962 -0.291\nvt  0.412 0.962 -0.291\nvt  0.395 0.939 -0.294\nvt  0.395 0.986 -0.291\nvt  0.376 0.973 -0.291\nvt  0.498 0.055 0.095\nvt  0.491 0.083 0.156\nvt  0.506 0.088 0.158\nvt  0.521 0.069 0.118\nvt  0.355 0.382 0.257\nvt  0.370 0.379 0.257\nvt  0.083 0.929 0.173\nvt  0.109 0.962 0.173\nvt  0.117 0.953 0.173\nvt  0.098 0.934 0.173\nvt  0.092 0.923 0.173\nvt  0.094 0.928 0.173\nvt  0.097 0.920 0.173\nvt  0.118 0.942 0.173\nvt  0.078 0.901 0.173\nvt  0.085 0.881 0.173\nvt  0.078 0.890 0.168\nvt  0.069 0.885 0.173\nvt  0.470 0.350 0.257\nvt  0.466 0.318 0.257\nvt  0.548 0.208 0.346\nvt  0.562 0.190 0.346\nvt  0.544 0.158 0.263\nvt  0.569 0.217 0.399\nvt  0.573 0.203 0.382\nvt  0.803 0.618 0.349\nvt  0.802 0.627 0.353\nvt  0.809 0.631 0.373\nvt  0.817 0.623 0.386\nvt  0.786 0.610 0.318\nvt  0.838 0.598 0.408\nvt  0.835 0.588 0.402\nvt  0.846 0.608 0.435\nvt  0.890 0.638 0.432\nvt  0.911 0.637 0.402\nvt  0.920 0.588 0.479\nvt  0.911 0.586 0.497\nvt  0.887 0.576 0.499\nvt  0.882 0.567 0.479\nvt  0.925 0.574 0.493\nvt  0.916 0.572 0.508\nvt  0.900 0.564 0.511\nvt  0.896 0.558 0.493\nvt  0.925 0.564 0.500\nvt  0.918 0.564 0.514\nvt  0.911 0.558 0.517\nvt  0.907 0.552 0.500\nvt  0.902 0.583 0.521\nvt  0.877 0.626 0.476\nvt  0.853 0.614 0.458\nvt  0.895 0.580 0.522\nvt  0.914 0.561 0.527\nvt  0.909 0.569 0.526\nvt  0.905 0.567 0.526\nvt  0.865 0.619 0.481\nvt  0.828 0.632 0.426\nvt  0.858 0.642 0.476\nvt  0.858 0.656 0.452\nvt  0.870 0.675 0.399\nvt  0.936 0.481 0.530\nvt  0.900 0.508 0.615\nvt  0.913 0.530 0.614\nvt  0.936 0.499 0.553\nvt  0.902 0.477 0.613\nvt  0.867 0.503 0.683\nvt  0.797 0.433 0.635\nvt  0.770 0.443 0.614\nvt  0.760 0.479 0.665\nvt  0.778 0.485 0.697\nvt  0.799 0.492 0.741\nvt  0.813 0.454 0.703\nvt  0.847 0.519 0.718\nvt  0.855 0.482 0.715\nvt  0.830 0.513 0.759\nvt  0.819 0.504 0.759\nvt  0.829 0.478 0.733\nvt  0.872 0.434 0.726\nvt  0.868 0.411 0.712\nvt  0.821 0.436 0.685\nvt  0.846 0.450 0.726\nvt  0.821 0.456 0.726\nvt  0.840 0.463 0.736\nvt  0.831 0.472 0.761\nvt  0.843 0.479 0.726\nvt  0.867 0.459 0.704\nvt  0.878 0.473 0.678\nvt  0.319 0.117 0.426\nvt  0.330 0.095 0.408\nvt  0.337 0.110 0.409\nvt  0.328 0.119 0.417\nvt  0.858 0.530 0.687\nvt  0.753 0.522 0.747\nvt  0.765 0.522 0.759\nvt  0.808 0.551 0.799\nvt  0.824 0.558 0.757\nvt  0.783 0.530 0.806\nvt  0.796 0.539 0.826\nvt  0.805 0.543 0.814\nvt  0.875 0.545 0.665\nvt  0.831 0.568 0.747\nvt  0.795 0.572 0.815\nvt  0.805 0.583 0.799\nvt  0.755 0.549 0.799\nvt  0.766 0.559 0.843\nvt  0.784 0.565 0.850\nvt  0.775 0.562 0.861\nvt  0.750 0.584 0.830\nvt  0.756 0.582 0.841\nvt  0.767 0.589 0.841\nvt  0.769 0.593 0.830\nvt  0.762 0.582 0.856\nvt  0.810 0.388 0.581\nvt  0.798 0.378 0.543\nvt  0.782 0.420 0.591\nvt  0.961 0.985 0.382\nvt  0.947 0.980 0.399\nvt  0.959 0.938 0.454\nvt  0.972 0.944 0.444\nvt  0.918 0.921 0.543\nvt  0.908 0.902 0.575\nvt  0.933 0.899 0.550\nvt  0.941 0.918 0.522\nvt  0.928 0.961 0.452\nvt  0.923 0.942 0.497\nvt  0.973 0.905 0.505\nvt  0.977 0.906 0.501\nvt  0.965 0.892 0.538\nvt  0.967 0.898 0.528\nvt  0.006 0.949 0.173\nvt  0.063 0.948 0.173\nvt  0.070 0.868 0.173\nvt  0.006 0.853 0.173\nvt  0.293 0.111 0.446\nvt  0.304 0.108 0.435\nvt  0.303 0.115 0.440\nvt  0.290 0.118 0.449\nvt  0.282 0.106 0.451\nvt  0.277 0.108 0.452\nvt  0.947 0.645 0.476\nvt  0.960 0.631 0.484\nvt  0.953 0.621 0.516\nvt  0.932 0.645 0.497\nvt  0.845 0.391 0.653\nvt  0.267 0.092 0.439\nvt  0.292 0.099 0.441\nvt  0.278 0.102 0.449\nvt  0.267 0.100 0.447\nvt  0.299 0.045 0.396\nvt  0.307 0.058 0.404\nvt  0.279 0.070 0.423\nvt  0.269 0.058 0.420\nvt  0.288 0.029 0.389\nvt  0.266 0.039 0.406\nvt  0.257 0.025 0.395\nvt  0.277 0.011 0.381\nvt  0.251 0.125 0.456\nvt  0.263 0.135 0.458\nvt  0.256 0.138 0.459\nvt  0.243 0.124 0.453\nvt  0.230 0.042 0.396\nvt  0.255 0.047 0.442\nvt  0.256 0.045 0.457\nvt  0.234 0.058 0.410\nvt  0.257 0.085 0.433\nvt  0.257 0.098 0.443\nvt  0.231 0.101 0.436\nvt  0.223 0.076 0.415\nvt  0.190 0.114 0.418\nvt  0.181 0.094 0.409\nvt  0.209 0.129 0.436\nvt  0.229 0.128 0.449\nvt  0.210 0.144 0.444\nvt  0.228 0.141 0.458\nvt  0.266 0.150 0.460\nvt  0.244 0.144 0.463\nvt  0.265 0.144 0.457\nvt  0.284 0.252 0.376\nvt  0.251 0.260 0.377\nvt  0.258 0.236 0.390\nvt  0.289 0.230 0.388\nvt  0.280 0.276 0.366\nvt  0.250 0.284 0.365\nvt  0.212 0.270 0.374\nvt  0.223 0.288 0.364\nvt  0.279 0.290 0.360\nvt  0.255 0.308 0.356\nvt  0.223 0.310 0.356\nvt  0.199 0.303 0.359\nvt  0.185 0.262 0.371\nvt  0.177 0.311 0.356\nvt  0.165 0.278 0.364\nvt  0.209 0.343 0.348\nvt  0.186 0.346 0.348\nvt  0.267 0.205 0.416\nvt  0.295 0.211 0.405\nvt  0.234 0.239 0.387\nvt  0.240 0.197 0.422\nvt  0.199 0.238 0.383\nvt  0.205 0.202 0.409\nvt  0.235 0.351 0.345\nvt  0.248 0.349 0.345\nvt  0.251 0.386 0.336\nvt  0.229 0.388 0.336\nvt  0.216 0.364 0.343\nvt  0.209 0.388 0.336\nvt  0.197 0.355 0.345\nvt  0.188 0.357 0.345\nvt  0.269 0.410 0.332\nvt  0.266 0.431 0.327\nvt  0.255 0.433 0.326\nvt  0.248 0.409 0.331\nvt  0.268 0.445 0.325\nvt  0.260 0.447 0.324\nvt  0.275 0.448 0.325\nvt  0.261 0.453 0.323\nvt  0.267 0.381 0.336\nvt  0.228 0.413 0.331\nvt  0.286 0.352 0.343\nvt  0.285 0.344 0.345\nvt  0.295 0.345 0.345\nvt  0.293 0.354 0.342\nvt  0.280 0.372 0.338\nvt  0.290 0.376 0.338\nvt  0.286 0.331 0.348\nvt  0.282 0.312 0.354\nvt  0.304 0.315 0.354\nvt  0.298 0.334 0.348\nvt  0.274 0.431 0.329\nvt  0.282 0.412 0.332\nvt  0.241 0.445 0.325\nvt  0.298 0.284 0.364\nvt  0.310 0.258 0.374\nvt  0.329 0.212 0.396\nvt  0.320 0.234 0.385\nvt  0.475 0.201 0.257\nvt  0.465 0.241 0.257\nvt  0.481 0.242 0.257\nvt  0.481 0.203 0.257\nvt  0.493 0.218 0.257\nvt  0.488 0.201 0.257\nvt  0.367 0.022 0.372\nvt  0.384 0.023 0.393\nvt  0.387 0.049 0.417\nvt  0.375 0.047 0.398\nvt  0.410 0.055 0.452\nvt  0.392 0.072 0.442\nvt  0.389 0.068 0.435\nvt  0.384 0.069 0.427\nvt  0.816 0.627 0.389\nvt  0.824 0.635 0.423\nvt  0.425 0.079 0.423\nvt  0.424 0.101 0.389\nvt  0.410 0.092 0.409\nvt  0.415 0.072 0.437\nvt  0.383 0.075 0.434\nvt  0.396 0.078 0.434\nvt  0.351 0.217 0.382\nvt  0.337 0.243 0.377\nvt  0.353 0.236 0.372\nvt  0.360 0.258 0.369\nvt  0.306 0.191 0.446\nvt  0.315 0.180 0.422\nvt  0.333 0.190 0.402\nvt  0.968 0.585 0.515\nvt  0.983 0.599 0.526\nvt  0.985 0.588 0.499\nvt  0.975 0.577 0.490\nvt  0.958 0.563 0.479\nvt  0.965 0.554 0.452\nvt  0.984 0.660 0.426\nvt  0.982 0.628 0.475\nvt  0.974 0.542 0.423\nvt  0.971 0.550 0.437\nvt  0.983 0.570 0.475\nvt  0.979 0.539 0.426\nvt  0.948 0.581 0.530\nvt  0.952 0.599 0.553\nvt  0.972 0.599 0.532\nvt  0.143 0.197 0.377\nvt  0.153 0.202 0.383\nvt  0.152 0.219 0.378\nvt  0.146 0.310 0.354\nvt  0.147 0.283 0.360\nvt  0.164 0.349 0.347\nvt  0.151 0.329 0.350\nvt  0.151 0.247 0.367\nvt  0.172 0.239 0.376\nvt  0.117 0.341 0.348\nvt  0.114 0.323 0.351\nvt  0.320 0.341 0.346\nvt  0.327 0.317 0.352\nvt  0.318 0.294 0.360\nvt  0.342 0.306 0.356\nvt  0.334 0.262 0.369\nvt  0.355 0.272 0.363\nvt  0.318 0.362 0.342\nvt  0.291 0.425 0.332\nvt  0.286 0.439 0.329\nvt  0.160 0.455 0.334\nvt  0.162 0.440 0.336\nvt  0.181 0.432 0.334\nvt  0.184 0.450 0.331\nvt  0.142 0.416 0.339\nvt  0.163 0.399 0.339\nvt  0.200 0.432 0.331\nvt  0.203 0.450 0.328\nvt  0.176 0.404 0.337\nvt  0.185 0.398 0.336\nvt  0.189 0.377 0.341\nvt  0.201 0.371 0.342\nvt  0.171 0.383 0.340\nvt  0.149 0.359 0.345\nvt  0.168 0.365 0.344\nvt  0.129 0.383 0.342\nvt  0.125 0.364 0.345\nvt  0.090 0.293 0.352\nvt  0.112 0.282 0.355\nvt  0.216 0.448 0.327\nvt  0.247 0.465 0.321\nvt  0.216 0.464 0.323\nvt  0.203 0.465 0.325\nvt  0.268 0.497 0.314\nvt  0.283 0.485 0.316\nvt  0.236 0.501 0.318\nvt  0.249 0.504 0.315\nvt  0.280 0.457 0.323\nvt  0.292 0.474 0.319\nvt  0.261 0.517 0.312\nvt  0.272 0.513 0.311\nvt  0.292 0.498 0.312\nvt  0.284 0.506 0.311\nvt  0.245 0.518 0.313\nvt  0.236 0.514 0.315\nvt  0.301 0.485 0.315\nvt  0.297 0.491 0.313\nvt  0.233 0.538 0.310\nvt  0.228 0.535 0.311\nvt  0.231 0.544 0.309\nvt  0.225 0.541 0.310\nvt  0.225 0.553 0.308\nvt  0.220 0.550 0.308\nvt  0.219 0.565 0.306\nvt  0.212 0.562 0.307\nvt  0.205 0.493 0.322\nvt  0.198 0.487 0.324\nvt  0.216 0.542 0.313\nvt  0.222 0.525 0.318\nvt  0.205 0.560 0.312\nvt  0.203 0.571 0.306\nvt  0.198 0.570 0.309\nvt  0.204 0.580 0.303\nvt  0.210 0.570 0.304\nvt  0.213 0.576 0.305\nvt  0.208 0.585 0.309\nvt  0.199 0.579 0.307\nvt  0.198 0.590 0.309\nvt  0.202 0.591 0.311\nvt  0.196 0.588 0.310\nvt  0.189 0.479 0.327\nvt  0.192 0.466 0.328\nvt  0.413 0.279 0.257\nvt  0.421 0.232 0.257\nvt  0.420 0.203 0.257\nvt  0.211 0.163 0.451\nvt  0.209 0.165 0.460\nvt  0.218 0.150 0.456\nvt  0.260 0.159 0.467\nvt  0.251 0.154 0.471\nvt  0.273 0.164 0.459\nvt  0.265 0.164 0.464\nvt  0.234 0.187 0.439\nvt  0.208 0.187 0.428\nvt  0.225 0.178 0.447\nvt  0.236 0.150 0.466\nvt  0.243 0.152 0.467\nvt  0.232 0.155 0.465\nvt  0.229 0.149 0.464\nvt  0.211 0.175 0.448\nvt  0.222 0.170 0.456\nvt  0.219 0.176 0.447\nvt  0.270 0.189 0.433\nvt  0.255 0.180 0.445\nvt  0.261 0.177 0.452\nvt  0.274 0.184 0.440\nvt  0.235 0.549 0.311\nvt  0.225 0.570 0.310\nvt  0.217 0.580 0.310\nvt  0.250 0.533 0.312\nvt  0.192 0.569 0.313\nvt  0.200 0.555 0.317\nvt  0.230 0.573 0.316\nvt  0.220 0.585 0.315\nvt  0.990 0.300 -0.059\nvt  0.991 0.318 -0.059\nvt  0.982 0.319 -0.059\nvt  0.979 0.302 -0.059\nvt  0.992 0.329 -0.059\nvt  0.984 0.330 -0.059\nvt  0.991 0.339 -0.060\nvt  0.988 0.340 -0.060\nvt  0.976 0.280 -0.059\nvt  0.988 0.278 -0.059\nvt  0.971 0.257 -0.059\nvt  0.986 0.256 -0.059\nvt  0.242 0.556 0.316\nvt  0.253 0.541 0.315\nvt  0.213 0.520 0.322\nvt  0.208 0.538 0.318\nvt  0.196 0.503 0.322\nvt  0.189 0.497 0.323\nvt  0.191 0.508 0.322\nvt  0.185 0.501 0.323\nvt  0.186 0.513 0.322\nvt  0.179 0.505 0.323\nvt  0.179 0.497 0.325\nvt  0.166 0.512 0.324\nvt  0.160 0.508 0.327\nvt  0.163 0.525 0.324\nvt  0.173 0.514 0.322\nvt  0.175 0.521 0.323\nvt  0.167 0.529 0.325\nvt  0.159 0.519 0.325\nvt  0.155 0.532 0.325\nvt  0.156 0.535 0.327\nvt  0.151 0.529 0.327\nvt  0.195 0.515 0.323\nvt  0.179 0.526 0.325\nvt  0.211 0.505 0.322\nvt  0.155 0.501 0.329\nvt  0.170 0.493 0.328\nvt  0.197 0.522 0.326\nvt  0.183 0.533 0.328\nvt  0.940 0.076 -0.059\nvt  0.959 0.078 -0.059\nvt  0.958 0.089 -0.059\nvt  0.939 0.088 -0.059\nvt  0.966 0.079 -0.060\nvt  0.965 0.089 -0.060\nvt  0.976 0.079 -0.060\nvt  0.972 0.092 -0.060\nvt  0.987 0.086 -0.063\nvt  0.986 0.093 -0.064\nvt  0.925 0.090 -0.059\nvt  0.922 0.076 -0.059\nvt  0.210 0.519 0.325\nvt  0.172 0.480 0.330\nvt  0.225 0.507 0.320\nvt  0.977 0.223 -0.059\nvt  0.960 0.205 -0.059\nvt  0.977 0.199 -0.059\nvt  0.989 0.207 -0.059\nvt  0.221 0.509 0.324\nvt  0.990 0.237 -0.059\nvt  0.277 0.540 0.307\nvt  0.270 0.543 0.307\nvt  0.280 0.549 0.305\nvt  0.273 0.551 0.305\nvt  0.283 0.557 0.304\nvt  0.275 0.562 0.304\nvt  0.287 0.574 0.301\nvt  0.280 0.576 0.302\nvt  0.266 0.557 0.308\nvt  0.256 0.532 0.312\nvt  0.275 0.578 0.305\nvt  0.281 0.589 0.297\nvt  0.276 0.591 0.304\nvt  0.289 0.595 0.286\nvt  0.285 0.583 0.295\nvt  0.292 0.585 0.297\nvt  0.296 0.596 0.297\nvt  0.284 0.599 0.297\nvt  0.293 0.605 0.292\nvt  0.297 0.604 0.300\nvt  0.288 0.606 0.299\nvt  0.287 0.549 0.307\nvt  0.295 0.570 0.306\nvt  0.298 0.585 0.303\nvt  0.285 0.520 0.310\nvt  0.272 0.596 0.309\nvt  0.268 0.579 0.312\nvt  0.302 0.568 0.312\nvt  0.304 0.586 0.309\nvt  0.955 0.307 -0.059\nvt  0.948 0.325 -0.059\nvt  0.938 0.322 -0.059\nvt  0.943 0.302 -0.059\nvt  0.945 0.335 -0.059\nvt  0.937 0.332 -0.059\nvt  0.939 0.343 -0.059\nvt  0.935 0.341 -0.059\nvt  0.949 0.279 -0.059\nvt  0.962 0.282 -0.059\nvt  0.953 0.248 -0.059\nvt  0.296 0.548 0.313\nvt  0.294 0.526 0.313\nvt  0.259 0.559 0.313\nvt  0.311 0.515 0.307\nvt  0.306 0.520 0.307\nvt  0.315 0.517 0.306\nvt  0.311 0.523 0.306\nvt  0.323 0.524 0.304\nvt  0.319 0.529 0.304\nvt  0.333 0.531 0.303\nvt  0.330 0.535 0.302\nvt  0.310 0.532 0.308\nvt  0.290 0.518 0.310\nvt  0.327 0.542 0.306\nvt  0.337 0.543 0.300\nvt  0.337 0.548 0.306\nvt  0.346 0.541 0.297\nvt  0.337 0.536 0.299\nvt  0.342 0.534 0.301\nvt  0.351 0.539 0.299\nvt  0.344 0.547 0.302\nvt  0.322 0.517 0.308\nvt  0.339 0.526 0.307\nvt  0.346 0.531 0.305\nvt  0.308 0.498 0.313\nvt  0.335 0.553 0.312\nvt  0.322 0.546 0.312\nvt  0.340 0.517 0.313\nvt  0.351 0.529 0.309\nvt  0.932 0.243 -0.059\nvt  0.927 0.260 -0.059\nvt  0.917 0.257 -0.059\nvt  0.923 0.240 -0.059\nvt  0.924 0.270 -0.059\nvt  0.914 0.267 -0.059\nvt  0.927 0.219 -0.059\nvt  0.939 0.224 -0.059\nvt  0.930 0.194 -0.059\nvt  0.950 0.203 -0.059\nvt  0.326 0.509 0.314\nvt  0.313 0.498 0.315\nvt  0.306 0.537 0.313\nvt  0.917 0.159 -0.059\nvt  0.918 0.137 -0.059\nvt  0.954 0.131 -0.059\nvt  0.953 0.158 -0.059\nvt  0.293 0.453 0.326\nvt  0.301 0.463 0.324\nvt  0.490 0.357 0.257\nvt  0.515 0.310 0.257\nvt  0.316 0.486 0.313\nvt  0.316 0.491 0.312\nvt  0.325 0.486 0.311\nvt  0.325 0.491 0.311\nvt  0.331 0.484 0.310\nvt  0.332 0.489 0.310\nvt  0.339 0.484 0.310\nvt  0.340 0.489 0.310\nvt  0.323 0.496 0.313\nvt  0.310 0.496 0.313\nvt  0.340 0.494 0.313\nvt  0.348 0.489 0.310\nvt  0.350 0.493 0.314\nvt  0.356 0.484 0.310\nvt  0.344 0.486 0.309\nvt  0.348 0.480 0.311\nvt  0.356 0.481 0.310\nvt  0.355 0.489 0.313\nvt  0.323 0.478 0.316\nvt  0.339 0.476 0.315\nvt  0.348 0.477 0.314\nvt  0.306 0.478 0.318\nvt  0.351 0.497 0.318\nvt  0.339 0.498 0.317\nvt  0.339 0.471 0.319\nvt  0.350 0.472 0.319\nvt  0.907 0.217 -0.059\nvt  0.897 0.228 -0.059\nvt  0.891 0.223 -0.059\nvt  0.898 0.211 -0.059\nvt  0.892 0.236 -0.059\nvt  0.885 0.233 -0.059\nvt  0.909 0.197 -0.059\nvt  0.920 0.203 -0.059\nvt  0.918 0.178 -0.059\nvt  0.324 0.472 0.320\nvt  0.310 0.470 0.322\nvt  0.323 0.500 0.316\nvt  0.176 0.085 0.401\nvt  0.215 0.062 0.397\nvt  0.153 0.089 0.396\nvt  0.162 0.098 0.403\nvt  0.145 0.098 0.397\nvt  0.142 0.089 0.391\nvt  0.137 0.117 0.393\nvt  0.108 0.087 0.373\nvt  0.147 0.068 0.378\nvt  0.166 0.059 0.379\nvt  0.171 0.074 0.392\nvt  0.141 0.078 0.384\nvt  0.953 0.836 0.434\nvt  0.972 0.813 0.434\nvt  0.986 0.844 0.428\nvt  0.934 0.863 0.427\nvt  0.075 0.646 0.962\nvt  0.074 0.608 0.962\nvt  0.090 0.585 0.962\nvt  0.101 0.665 0.963\nvt  0.100 0.713 0.964\nvt  0.089 0.720 0.963\nvt  0.079 0.677 0.963\nvt  0.101 0.745 0.969\nvt  0.096 0.746 0.962\nvt  0.063 0.684 0.962\nvt  0.058 0.658 0.962\nvt  0.079 0.725 0.963\nvt  0.091 0.752 0.963\nvt  0.053 0.625 0.962\nvt  0.164 0.685 0.962\nvt  0.150 0.699 0.962\nvt  0.142 0.688 0.962\nvt  0.147 0.671 0.962\nvt  0.104 0.747 0.962\nvt  0.110 0.728 0.964\nvt  0.117 0.733 0.963\nvt  0.108 0.750 0.963\nvt  0.116 0.710 0.963\nvt  0.125 0.721 0.963\nvt  0.125 0.672 0.963\nvt  0.133 0.639 0.962\nvt  0.160 0.712 0.962\nvt  0.134 0.738 0.962\nvt  0.114 0.667 0.963\nvt  0.105 0.715 0.963\nvt  0.161 0.043 0.599\nvt  0.176 0.031 0.599\nvt  0.186 0.055 0.382\nvt  0.821 0.154 0.598\nvt  0.830 0.180 0.599\nvt  0.837 0.187 0.599\nvt  0.846 0.183 0.599\nvt  0.824 0.224 0.601\nvt  0.847 0.227 0.600\nvt  0.830 0.192 0.600\nvt  0.813 0.199 0.600\nvt  0.879 0.119 0.598\nvt  0.850 0.158 0.598\nvt  0.888 0.188 0.599\nvt  0.903 0.130 0.599\nvt  0.851 0.081 0.598\nvt  0.822 0.095 0.597\nvt  0.771 0.186 0.601\nvt  0.785 0.197 0.601\nvt  0.795 0.191 0.600\nvt  0.797 0.177 0.600\nvt  0.822 0.187 0.600\nvt  0.873 0.214 0.600\nvt  0.812 0.166 0.599\nvt  0.766 0.207 0.602\nvt  0.755 0.198 0.602\nvt  0.750 0.214 0.602\nvt  0.745 0.203 0.602\nvt  0.753 0.195 0.602\nvt  0.740 0.196 0.602\nvt  0.737 0.165 0.600\nvt  0.737 0.188 0.602\nvt  0.753 0.218 0.602\nvt  0.766 0.212 0.602\nvt  0.751 0.237 0.602\nvt  0.767 0.231 0.602\nvt  0.777 0.219 0.602\nvt  0.769 0.259 0.602\nvt  0.784 0.243 0.602\nvt  0.798 0.225 0.601\nvt  0.758 0.276 0.602\nvt  0.884 0.834 0.418\nvt  0.846 0.815 0.389\nvt  0.881 0.797 0.403\nvt  0.905 0.808 0.417\nvt  0.832 0.274 0.601\nvt  0.870 0.264 0.600\nvt  0.807 0.309 0.601\nvt  0.763 0.151 0.599\nvt  0.790 0.152 0.598\nvt  0.785 0.129 0.597\nvt  0.760 0.125 0.597\nvt  0.748 0.150 0.599\nvt  0.765 0.185 0.601\nvt  0.764 0.175 0.601\nvt  0.769 0.171 0.600\nvt  0.760 0.174 0.601\nvt  0.757 0.185 0.606\nvt  0.751 0.187 0.606\nvt  0.750 0.160 0.600\nvt  0.761 0.172 0.600\nvt  0.737 0.158 0.599\nvt  0.844 0.324 0.601\nvt  0.891 0.292 0.600\nvt  0.888 0.768 0.401\nvt  0.910 0.771 0.408\nvt  0.752 0.937 0.721\nvt  0.801 0.920 0.721\nvt  0.816 0.938 0.722\nvt  0.759 0.960 0.721\nvt  0.736 0.957 0.721\nvt  0.731 0.939 0.720\nvt  0.700 0.960 0.721\nvt  0.644 0.938 0.720\nvt  0.655 0.926 0.719\nvt  0.709 0.931 0.720\nvt  0.612 0.920 0.701\nvt  0.606 0.925 0.711\nvt  0.730 0.896 0.720\nvt  0.777 0.879 0.721\nvt  0.704 0.902 0.720\nvt  0.611 0.917 0.708\nvt  0.653 0.913 0.717\nvt  0.188 0.806 0.906\nvt  0.220 0.794 0.906\nvt  0.241 0.834 0.906\nvt  0.191 0.856 0.906\nvt  0.185 0.773 0.907\nvt  0.205 0.767 0.906\nvt  0.151 0.854 0.906\nvt  0.160 0.807 0.906\nvt  0.167 0.777 0.909\nvt  0.119 0.850 0.906\nvt  0.135 0.806 0.906\nvt  0.148 0.779 0.908\nvt  0.099 0.841 0.906\nvt  0.124 0.803 0.906\nvt  0.195 0.746 0.906\nvt  0.183 0.749 0.906\nvt  0.174 0.743 0.905\nvt  0.195 0.900 0.906\nvt  0.148 0.876 0.906\nvt  0.971 0.755 0.431\nvt  0.954 0.793 0.436\nvt  0.943 0.747 0.431\nvt  0.976 0.691 0.417\nvt  0.952 0.704 0.423\nvt  0.778 0.337 0.601\nvt  0.769 0.309 0.601\nvt  0.756 0.316 0.601\nvt  0.770 0.334 0.601\nvt  0.111 0.890 0.906\nvt  0.771 0.353 0.601\nvt  0.774 0.363 0.601\nvt  0.405 0.669 0.427\nvt  0.381 0.665 0.434\nvt  0.371 0.694 0.450\nvt  0.381 0.708 0.450\nvt  0.367 0.640 0.426\nvt  0.364 0.678 0.447\nvt  0.416 0.655 0.417\nvt  0.397 0.634 0.413\nvt  0.372 0.598 0.401\nvt  0.385 0.617 0.409\nvt  0.796 0.204 0.601\nvt  0.777 0.208 0.602\nvt  0.785 0.214 0.602\nvt  0.755 0.850 0.721\nvt  0.756 0.817 0.721\nvt  0.790 0.811 0.722\nvt  0.779 0.847 0.721\nvt  0.894 0.935 0.722\nvt  0.864 0.975 0.722\nvt  0.828 0.951 0.722\nvt  0.893 0.927 0.722\nvt  0.685 0.872 0.720\nvt  0.669 0.827 0.721\nvt  0.685 0.818 0.721\nvt  0.706 0.858 0.720\nvt  0.785 0.851 0.722\nvt  0.764 0.862 0.721\nvt  0.743 0.867 0.721\nvt  0.716 0.874 0.720\nvt  0.733 0.854 0.721\nvt  0.625 0.885 0.720\nvt  0.662 0.857 0.721\nvt  0.643 0.895 0.718\nvt  0.610 0.909 0.717\nvt  0.604 0.909 0.717\nvt  0.692 0.883 0.720\nvt  0.136 0.074 0.377\nvt  0.138 0.067 0.371\nvt  0.134 0.056 0.365\nvt  0.143 0.055 0.370\nvt  0.825 0.070 0.597\nvt  0.804 0.081 0.597\nvt  0.789 0.097 0.596\nvt  0.761 0.093 0.595\nvt  0.780 0.077 0.596\nvt  0.762 0.073 0.595\nvt  0.770 0.054 0.595\nvt  0.754 0.051 0.595\nvt  0.805 0.057 0.597\nvt  0.796 0.043 0.597\nvt  0.792 0.039 0.597\nvt  0.784 0.060 0.596\nvt  0.746 0.033 0.595\nvt  0.772 0.044 0.596\nvt  0.755 0.024 0.596\nvt  0.944 0.389 0.506\nvt  0.988 0.393 0.540\nvt  0.982 0.369 0.536\nvt  0.948 0.371 0.510\nvt  0.887 0.372 0.457\nvt  0.893 0.379 0.455\nvt  0.909 0.408 0.477\nvt  0.912 0.391 0.479\nvt  0.904 0.406 0.472\nvt  0.877 0.372 0.443\nvt  0.879 0.381 0.440\nvt  0.741 0.011 0.596\nvt  0.214 0.421 0.330\nvt  0.029 0.141 0.173\nvt  0.024 0.143 0.173\nvt  0.022 0.118 0.173\nvt  0.027 0.110 0.173\nvt  0.014 0.144 0.173\nvt  0.014 0.118 0.173\nvt  0.036 0.190 0.173\nvt  0.014 0.186 0.173\nvt  0.040 0.189 0.173\nvt  0.064 0.218 0.173\nvt  0.056 0.222 0.173\nvt  0.014 0.225 0.173\nvt  0.014 0.080 0.173\nvt  0.021 0.080 0.173\nvt  0.025 0.080 0.172\nvt  0.014 0.024 0.117\nvt  0.029 0.038 0.111\nvt  0.014 0.260 0.173\nvt  0.053 0.233 0.173\nvt  0.050 0.252 0.173\nvt  0.063 0.255 0.173\nvt  0.064 0.268 0.173\nvt  0.050 0.266 0.173\nvt  0.057 0.289 0.173\nvt  0.067 0.290 0.173\nvt  0.014 0.412 0.173\nvt  0.014 0.382 0.173\nvt  0.042 0.377 0.173\nvt  0.050 0.406 0.173\nvt  0.062 0.313 0.173\nvt  0.054 0.307 0.173\nvt  0.056 0.296 0.173\nvt  0.072 0.332 0.173\nvt  0.059 0.339 0.173\nvt  0.051 0.313 0.173\nvt  0.047 0.286 0.173\nvt  0.090 0.421 0.173\nvt  0.105 0.426 0.173\nvt  0.124 0.445 0.173\nvt  0.116 0.454 0.173\nvt  0.100 0.415 0.173\nvt  0.105 0.412 0.173\nvt  0.102 0.419 0.173\nvt  0.126 0.433 0.173\nvt  0.085 0.393 0.173\nvt  0.077 0.377 0.173\nvt  0.086 0.382 0.168\nvt  0.093 0.372 0.173\nvt  0.071 0.440 0.173\nvt  0.014 0.441 0.173\nvt  0.014 0.345 0.173\nvt  0.077 0.359 0.173\nvt  0.691 0.337 0.601\nvt  0.700 0.334 0.601\nvt  0.696 0.362 0.601\nvt  0.698 0.353 0.601\nvt  0.765 0.978 0.721\nvt  0.740 0.975 0.721\nvt  0.799 0.868 0.721\nvt  0.597 0.747 -0.465\nvt  0.611 0.783 -0.437\nvt  0.638 0.776 -0.437\nvt  0.621 0.733 -0.465\nvt  0.648 0.761 -0.440\nvt  0.644 0.754 -0.446\nvt  0.645 0.778 -0.437\nvt  0.579 0.752 -0.465\nvt  0.590 0.787 -0.440\nvt  0.542 0.754 -0.462\nvt  0.556 0.791 -0.451\nvt  0.643 0.715 -0.465\nvt  0.634 0.678 -0.468\nvt  0.606 0.693 -0.456\nvt  0.593 0.685 -0.461\nvt  0.571 0.695 -0.460\nvt  0.572 0.710 -0.457\nvt  0.563 0.668 -0.455\nvt  0.553 0.670 -0.459\nvt  0.561 0.686 -0.437\nvt  0.566 0.684 -0.426\nvt  0.554 0.695 -0.446\nvt  0.547 0.707 -0.450\nvt  0.541 0.682 -0.446\nvt  0.525 0.688 -0.442\nvt  0.576 0.668 -0.453\nvt  0.569 0.652 -0.505\nvt  0.556 0.654 -0.501\nvt  0.603 0.655 -0.496\nvt  0.595 0.649 -0.493\nvt  0.585 0.658 -0.494\nvt  0.586 0.664 -0.492\nvt  0.577 0.651 -0.498\nvt  0.586 0.642 -0.488\nvt  0.582 0.634 -0.511\nvt  0.570 0.634 -0.513\nvt  0.577 0.645 -0.494\nvt  0.557 0.631 -0.502\nvt  0.563 0.651 -0.516\nvt  0.533 0.670 -0.497\nvt  0.521 0.674 -0.487\nvt  0.588 0.624 -0.500\nvt  0.597 0.626 -0.482\nvt  0.609 0.620 -0.451\nvt  0.564 0.611 -0.444\nvt  0.454 0.857 -0.466\nvt  0.485 0.886 -0.467\nvt  0.497 0.846 -0.461\nvt  0.462 0.834 -0.465\nvt  0.525 0.846 -0.458\nvt  0.563 0.844 -0.459\nvt  0.518 0.777 -0.462\nvt  0.645 0.790 -0.437\nvt  0.636 0.805 -0.444\nvt  0.643 0.805 -0.440\nvt  0.640 0.813 -0.425\nvt  0.644 0.817 -0.430\nvt  0.650 0.809 -0.442\nvt  0.653 0.790 -0.438\nvt  0.657 0.776 -0.440\nvt  0.654 0.769 -0.436\nvt  0.467 0.802 -0.465\nvt  0.498 0.818 -0.462\nvt  0.499 0.775 -0.465\nvt  0.470 0.774 -0.467\nvt  0.651 0.753 -0.447\nvt  0.661 0.741 -0.451\nvt  0.517 0.713 -0.454\nvt  0.512 0.735 -0.456\nvt  0.544 0.728 -0.465\nvt  0.499 0.707 -0.479\nvt  0.386 0.562 -0.685\nvt  0.388 0.597 -0.685\nvt  0.411 0.596 -0.685\nvt  0.424 0.552 -0.685\nvt  0.431 0.768 -0.467\nvt  0.423 0.813 -0.467\nvt  0.441 0.742 -0.469\nvt  0.456 0.760 -0.468\nvt  0.460 0.745 -0.469\nvt  0.449 0.721 -0.469\nvt  0.408 0.746 -0.469\nvt  0.413 0.734 -0.469\nvt  0.667 0.706 -0.465\nvt  0.670 0.722 -0.461\nvt  0.430 0.709 -0.454\nvt  0.397 0.522 -0.685\nvt  0.395 0.491 -0.685\nvt  0.387 0.496 -0.685\nvt  0.389 0.523 -0.685\nvt  0.389 0.442 -0.685\nvt  0.367 0.448 -0.685\nvt  0.384 0.469 -0.685\nvt  0.409 0.461 -0.685\nvt  0.457 0.478 -0.685\nvt  0.468 0.464 -0.696\nvt  0.453 0.440 -0.697\nvt  0.437 0.450 -0.685\nvt  0.445 0.513 -0.685\nvt  0.477 0.499 -0.685\nvt  0.425 0.499 -0.685\nvt  0.495 0.484 -0.696\nvt  0.510 0.452 -0.642\nvt  0.497 0.445 -0.646\nvt  0.462 0.528 -0.685\nvt  0.423 0.527 -0.685\nvt  0.474 0.542 -0.685\nvt  0.445 0.562 -0.685\nvt  0.367 0.420 -0.685\nvt  0.334 0.432 -0.685\nvt  0.351 0.404 -0.685\nvt  0.323 0.418 -0.685\nvt  0.422 0.427 -0.685\nvt  0.395 0.403 -0.685\nvt  0.474 0.760 -0.468\nvt  0.493 0.756 -0.468\nvt  0.379 0.470 -0.685\nvt  0.448 0.419 -0.705\nvt  0.447 0.388 -0.709\nvt  0.480 0.420 -0.637\nvt  0.485 0.401 -0.627\nvt  0.478 0.587 -0.685\nvt  0.496 0.568 -0.685\nvt  0.486 0.600 -0.685\nvt  0.515 0.584 -0.685\nvt  0.395 0.801 -0.468\nvt  0.678 0.800 -0.452\nvt  0.688 0.779 -0.457\nvt  0.660 0.758 -0.446\nvt  0.706 0.767 -0.457\nvt  0.467 0.627 -0.685\nvt  0.487 0.631 -0.685\nvt  0.501 0.611 -0.685\nvt  0.538 0.562 -0.685\nvt  0.528 0.603 -0.685\nvt  0.550 0.583 -0.685\nvt  0.513 0.398 -0.667\nvt  0.496 0.414 -0.604\nvt  0.502 0.418 -0.600\nvt  0.523 0.406 -0.679\nvt  0.521 0.549 -0.685\nvt  0.508 0.511 -0.685\nvt  0.486 0.431 -0.620\nvt  0.506 0.432 -0.616\nvt  0.527 0.421 -0.676\nvt  0.545 0.559 -0.712\nvt  0.551 0.566 -0.701\nvt  0.583 0.550 -0.708\nvt  0.584 0.532 -0.709\nvt  0.612 0.550 -0.709\nvt  0.594 0.551 -0.709\nvt  0.589 0.564 -0.710\nvt  0.598 0.562 -0.709\nvt  0.598 0.537 -0.709\nvt  0.611 0.577 -0.710\nvt  0.617 0.570 -0.710\nvt  0.619 0.561 -0.709\nvt  0.610 0.570 -0.709\nvt  0.589 0.577 -0.701\nvt  0.629 0.566 -0.710\nvt  0.632 0.565 -0.709\nvt  0.632 0.555 -0.709\nvt  0.625 0.558 -0.709\nvt  0.620 0.536 -0.709\nvt  0.576 0.387 -0.709\nvt  0.574 0.413 -0.709\nvt  0.603 0.416 -0.709\nvt  0.605 0.396 -0.709\nvt  0.570 0.439 -0.708\nvt  0.609 0.439 -0.709\nvt  0.572 0.467 -0.708\nvt  0.620 0.466 -0.709\nvt  0.572 0.490 -0.708\nvt  0.623 0.493 -0.709\nvt  0.538 0.492 -0.708\nvt  0.531 0.463 -0.706\nvt  0.623 0.515 -0.709\nvt  0.555 0.509 -0.709\nvt  0.627 0.419 -0.709\nvt  0.647 0.429 -0.709\nvt  0.524 0.437 -0.666\nvt  0.521 0.356 -0.709\nvt  0.554 0.364 -0.708\nvt  0.661 0.511 -0.709\nvt  0.662 0.494 -0.709\nvt  0.680 0.507 -0.709\nvt  0.681 0.501 -0.709\nvt  0.752 0.685 -0.953\nvt  0.746 0.673 -0.953\nvt  0.731 0.679 -0.953\nvt  0.738 0.692 -0.953\nvt  0.742 0.665 -0.954\nvt  0.726 0.671 -0.953\nvt  0.737 0.654 -0.954\nvt  0.721 0.659 -0.954\nvt  0.733 0.642 -0.955\nvt  0.716 0.649 -0.955\nvt  0.720 0.620 -0.957\nvt  0.710 0.605 -0.958\nvt  0.705 0.612 -0.959\nvt  0.711 0.625 -0.957\nvt  0.703 0.601 -0.958\nvt  0.700 0.603 -0.961\nvt  0.699 0.629 -0.957\nvt  0.694 0.612 -0.958\nvt  0.695 0.604 -0.958\nvt  0.713 0.676 -0.954\nvt  0.698 0.655 -0.954\nvt  0.756 0.664 -0.953\nvt  0.749 0.652 -0.954\nvt  0.665 0.524 -0.709\nvt  0.681 0.514 -0.709\nvt  0.766 0.677 -0.953\nvt  0.694 0.494 -0.709\nvt  0.684 0.487 -0.709\nvt  0.717 0.692 -0.953\nvt  0.766 0.647 -0.954\nvt  0.748 0.630 -0.954\nvt  0.733 0.611 -0.955\nvt  0.722 0.614 -0.956\nvt  0.778 0.662 -0.953\nvt  0.695 0.631 -0.956\nvt  0.690 0.637 -0.955\nvt  0.674 0.640 -0.954\nvt  0.678 0.661 -0.954\nvt  0.762 0.619 -0.954\nvt  0.747 0.602 -0.954\nvt  0.733 0.598 -0.955\nvt  0.720 0.599 -0.956\nvt  0.677 0.627 -0.955\nvt  0.686 0.617 -0.956\nvt  0.711 0.598 -0.957\nvt  0.718 0.610 -0.957\nvt  0.688 0.610 -0.957\nvt  0.695 0.626 -0.957\nvt  0.696 0.597 -0.957\nvt  0.414 0.480 -0.685\nvt  0.360 0.450 -0.685\nvt  0.331 0.436 -0.685\nvt  0.652 0.454 -0.709\nvt  0.682 0.679 -0.954\nvt  0.698 0.676 -0.954\nvt  0.773 0.634 -0.954\nvt  0.679 0.699 -0.953\nvt  0.695 0.697 -0.953\nvt  0.788 0.651 -0.953\nvt  0.793 0.639 -0.953\nvt  0.861 0.723 -0.888\nvt  0.848 0.731 -0.892\nvt  0.863 0.747 -0.890\nvt  0.883 0.735 -0.890\nvt  0.855 0.720 -0.882\nvt  0.845 0.726 -0.890\nvt  0.848 0.713 -0.894\nvt  0.840 0.719 -0.901\nvt  0.844 0.708 -0.911\nvt  0.833 0.714 -0.922\nvt  0.826 0.685 -0.961\nvt  0.816 0.672 -1.002\nvt  0.810 0.676 -0.999\nvt  0.820 0.689 -0.959\nvt  0.813 0.691 -0.977\nvt  0.801 0.679 -1.017\nvt  0.831 0.733 -0.932\nvt  0.823 0.719 -0.947\nvt  0.855 0.694 -0.951\nvt  0.835 0.680 -0.979\nvt  0.864 0.716 -0.907\nvt  0.859 0.711 -0.910\nvt  0.869 0.703 -0.942\nvt  0.808 0.696 -0.991\nvt  0.794 0.706 -1.006\nvt  0.809 0.722 -0.968\nvt  0.862 0.685 -0.968\nvt  0.848 0.669 -1.006\nvt  0.825 0.666 -1.010\nvt  0.816 0.666 -1.013\nvt  0.824 0.676 -0.985\nvt  0.796 0.678 -1.013\nvt  0.795 0.684 -1.010\nvt  0.803 0.685 -1.003\nvt  0.817 0.738 -0.955\nvt  0.876 0.697 -0.955\nvt  0.668 0.471 -0.709\nvt  0.691 0.461 -0.709\nvt  0.672 0.442 -0.708\nvt  0.848 0.762 -0.935\nvt  0.629 0.397 -0.709\nvt  0.644 0.401 -0.709\nvt  0.741 0.427 -0.750\nvt  0.721 0.422 -0.704\nvt  0.718 0.446 -0.708\nvt  0.741 0.443 -0.728\nvt  0.746 0.415 -0.734\nvt  0.733 0.401 -0.694\nvt  0.702 0.418 -0.714\nvt  0.699 0.454 -0.709\nvt  0.711 0.392 -0.725\nvt  0.675 0.413 -0.707\nvt  0.679 0.396 -0.703\nvt  0.840 0.774 -0.966\nvt  0.817 0.772 -0.983\nvt  0.659 0.538 -0.709\nvt  0.648 0.573 -0.709\nvt  0.651 0.559 -0.709\nvt  0.693 0.558 -0.709\nvt  0.684 0.544 -0.709\nvt  0.668 0.560 -0.709\nvt  0.679 0.577 -0.709\nvt  0.686 0.533 -0.709\nvt  0.685 0.525 -0.709\nvt  0.913 0.704 -0.983\nvt  0.887 0.717 -0.934\nvt  0.628 0.574 -0.709\nvt  0.623 0.597 -0.709\nvt  0.610 0.598 -0.709\nvt  0.591 0.597 -0.711\nvt  0.711 0.753 -0.884\nvt  0.723 0.763 -0.883\nvt  0.736 0.760 -0.893\nvt  0.725 0.749 -0.889\nvt  0.747 0.754 -0.900\nvt  0.737 0.743 -0.895\nvt  0.752 0.751 -0.914\nvt  0.742 0.740 -0.909\nvt  0.788 0.725 -1.001\nvt  0.786 0.720 -1.007\nvt  0.769 0.729 -0.962\nvt  0.774 0.734 -0.957\nvt  0.780 0.738 -0.972\nvt  0.794 0.729 -1.014\nvt  0.747 0.772 -0.931\nvt  0.762 0.763 -0.952\nvt  0.762 0.715 -0.999\nvt  0.734 0.726 -0.947\nvt  0.724 0.741 -0.908\nvt  0.726 0.729 -0.939\nvt  0.785 0.751 -0.999\nvt  0.771 0.773 -0.970\nvt  0.790 0.765 -1.007\nvt  0.751 0.704 -1.007\nvt  0.734 0.713 -0.970\nvt  0.779 0.713 -1.005\nvt  0.773 0.720 -0.989\nvt  0.787 0.716 -1.012\nvt  0.787 0.741 -0.991\nvt  0.798 0.739 -1.005\nvt  0.799 0.731 -1.012\nvt  0.762 0.775 -0.961\nvt  0.726 0.715 -0.961\nvt  0.740 0.793 -0.968\nvt  0.757 0.794 -0.975\nvt  0.703 0.714 -0.975\nvt  0.700 0.733 -0.937\nvt  0.646 0.821 -0.443\nvt  0.659 0.833 -0.454\nvt  0.636 0.824 -0.446\nvt  0.628 0.839 -0.451\nvt  0.638 0.852 -0.457\nvt  0.630 0.817 -0.442\nvt  0.615 0.835 -0.450\nvt  0.203 0.940 -0.291\nvt  0.225 0.894 -0.291\nvt  0.264 0.917 -0.291\nvt  0.213 0.950 -0.291\nvt  0.238 0.881 -0.291\nvt  0.281 0.893 -0.291\nvt  0.255 0.859 -0.291\nvt  0.291 0.865 -0.291\nvt  0.261 0.832 -0.291\nvt  0.289 0.825 -0.291\nvt  0.236 0.767 -0.291\nvt  0.268 0.756 -0.291\nvt  0.203 0.715 -0.291\nvt  0.226 0.700 -0.291\nvt  0.165 0.659 -0.292\nvt  0.183 0.647 -0.292\nvt  0.126 0.574 -0.292\nvt  0.146 0.581 -0.292\nvt  0.116 0.525 -0.292\nvt  0.121 0.528 -0.292\nvt  0.314 0.767 -0.291\nvt  0.328 0.815 -0.291\nvt  0.249 0.684 -0.291\nvt  0.295 0.734 -0.291\nvt  0.201 0.637 -0.292\nvt  0.158 0.579 -0.292\nvt  0.123 0.522 -0.292\nvt  0.322 0.855 -0.291\nvt  0.363 0.821 -0.291\nvt  0.338 0.844 -0.290\nvt  0.340 0.851 -0.290\nvt  0.330 0.862 -0.290\nvt  0.330 0.878 -0.290\nvt  0.319 0.881 -0.290\nvt  0.325 0.888 -0.290\nvt  0.320 0.900 -0.291\nvt  0.342 0.894 -0.290\nvt  0.333 0.900 -0.290\nvt  0.353 0.802 -0.291\nvt  0.364 0.783 -0.291\nvt  0.368 0.783 -0.285\nvt  0.368 0.799 -0.290\nvt  0.340 0.792 -0.291\nvt  0.355 0.777 -0.291\nvt  0.369 0.773 -0.291\nvt  0.377 0.783 -0.291\nvt  0.374 0.796 -0.291\nvt  0.381 0.805 -0.291\nvt  0.368 0.782 -0.284\nvt  0.314 0.932 -0.291\nvt  0.364 0.837 -0.290\nvt  0.374 0.850 -0.290\nvt  0.349 0.852 -0.290\nvt  0.376 0.877 -0.290\nvt  0.380 0.880 -0.290\nvt  0.374 0.890 -0.290\nvt  0.370 0.877 -0.290\nvt  0.343 0.876 -0.290\nvt  0.373 0.840 -0.290\nvt  0.389 0.841 -0.290\nvt  0.385 0.850 -0.290\nvt  0.379 0.858 -0.290\nvt  0.385 0.871 -0.290\nvt  0.345 0.913 -0.290\nvt  0.398 0.846 -0.291\nvt  0.404 0.867 -0.291\nvt  0.385 0.891 -0.290\nvt  0.409 0.889 -0.291\nvt  0.411 0.901 -0.291\nvt  0.386 0.908 -0.290\nvt  0.262 0.675 -0.291\nvt  0.315 0.721 -0.291\nvt  0.211 0.632 -0.292\nvt  0.163 0.577 -0.292\nvt  0.335 0.781 -0.291\nvt  0.347 0.772 -0.291\nvt  0.372 0.918 -0.290\nvt  0.372 0.939 -0.290\nvt  0.335 0.938 -0.291\nvt  0.381 0.927 -0.292\nvt  0.385 0.932 -0.287\nvt  0.419 0.914 -0.291\nvt  0.392 0.922 -0.290\nvt  0.564 0.899 -0.417\nvt  0.556 0.895 -0.436\nvt  0.534 0.892 -0.435\nvt  0.540 0.908 -0.399\nvt  0.545 0.910 -0.381\nvt  0.535 0.915 -0.422\nvt  0.524 0.931 -0.385\nvt  0.533 0.931 -0.422\nvt  0.553 0.926 -0.441\nvt  0.601 0.873 -0.460\nvt  0.606 0.880 -0.452\nvt  0.612 0.875 -0.459\nvt  0.605 0.872 -0.459\nvt  0.379 0.374 0.257\nvt  0.395 0.331 0.257\nvt  0.417 0.331 0.257\nvt  0.397 0.365 0.257\nvt  0.357 0.348 0.257\nvt  0.369 0.339 0.257\nvt  0.432 0.356 0.257\nvt  0.416 0.362 0.257\nvt  0.118 0.199 0.365\nvt  0.098 0.201 0.360\nvt  0.133 0.232 0.365\nvt  0.138 0.210 0.372\nvt  0.390 0.287 0.257\nvt  0.374 0.298 0.257\nvt  0.379 0.242 0.257\nvt  0.399 0.237 0.257\nvt  0.364 0.236 0.257\nvt  0.375 0.199 0.257\nvt  0.392 0.203 0.257\nvt  0.393 0.185 0.257\nvt  0.379 0.181 0.257\nvt  0.519 0.123 0.194\nvt  0.531 0.162 0.263\nvt  0.498 0.157 0.248\nvt  0.504 0.133 0.211\nvt  0.438 0.941 -0.291\nvt  0.413 0.942 -0.291\nvt  0.384 0.962 -0.291\nvt  0.395 0.939 -0.294\nvt  0.412 0.962 -0.291\nvt  0.395 0.986 -0.291\nvt  0.376 0.973 -0.291\nvt  0.498 0.055 0.095\nvt  0.521 0.069 0.118\nvt  0.506 0.088 0.158\nvt  0.491 0.083 0.156\nvt  0.370 0.379 0.257\nvt  0.355 0.382 0.257\nvt  0.466 0.318 0.257\nvt  0.470 0.350 0.257\nvt  0.544 0.158 0.263\nvt  0.562 0.190 0.346\nvt  0.548 0.208 0.346\nvt  0.573 0.203 0.382\nvt  0.569 0.217 0.399\nvt  0.803 0.618 0.349\nvt  0.817 0.623 0.386\nvt  0.809 0.631 0.373\nvt  0.802 0.627 0.353\nvt  0.786 0.610 0.318\nvt  0.835 0.588 0.402\nvt  0.838 0.598 0.408\nvt  0.846 0.608 0.435\nvt  0.890 0.638 0.432\nvt  0.911 0.586 0.497\nvt  0.920 0.588 0.479\nvt  0.911 0.637 0.402\nvt  0.882 0.567 0.479\nvt  0.887 0.576 0.499\nvt  0.916 0.572 0.508\nvt  0.925 0.574 0.493\nvt  0.896 0.558 0.493\nvt  0.900 0.564 0.511\nvt  0.918 0.564 0.514\nvt  0.925 0.564 0.500\nvt  0.911 0.558 0.517\nvt  0.907 0.552 0.500\nvt  0.877 0.626 0.476\nvt  0.902 0.583 0.521\nvt  0.895 0.580 0.522\nvt  0.853 0.614 0.458\nvt  0.909 0.569 0.526\nvt  0.914 0.561 0.527\nvt  0.905 0.567 0.526\nvt  0.865 0.619 0.481\nvt  0.858 0.642 0.476\nvt  0.828 0.632 0.426\nvt  0.870 0.675 0.399\nvt  0.858 0.656 0.452\nvt  0.936 0.481 0.530\nvt  0.936 0.499 0.553\nvt  0.913 0.530 0.614\nvt  0.900 0.508 0.615\nvt  0.867 0.503 0.683\nvt  0.902 0.477 0.613\nvt  0.797 0.433 0.635\nvt  0.778 0.485 0.697\nvt  0.760 0.479 0.665\nvt  0.770 0.443 0.614\nvt  0.813 0.454 0.703\nvt  0.799 0.492 0.741\nvt  0.847 0.519 0.718\nvt  0.830 0.513 0.759\nvt  0.855 0.482 0.715\nvt  0.829 0.478 0.733\nvt  0.819 0.504 0.759\nvt  0.872 0.434 0.726\nvt  0.846 0.450 0.726\nvt  0.821 0.436 0.685\nvt  0.868 0.411 0.712\nvt  0.821 0.456 0.726\nvt  0.840 0.463 0.736\nvt  0.831 0.472 0.761\nvt  0.867 0.459 0.704\nvt  0.843 0.479 0.726\nvt  0.878 0.473 0.678\nvt  0.319 0.117 0.426\nvt  0.328 0.119 0.417\nvt  0.337 0.110 0.409\nvt  0.330 0.095 0.408\nvt  0.858 0.530 0.687\nvt  0.765 0.522 0.759\nvt  0.753 0.522 0.747\nvt  0.824 0.558 0.757\nvt  0.808 0.551 0.799\nvt  0.783 0.530 0.806\nvt  0.805 0.543 0.814\nvt  0.796 0.539 0.826\nvt  0.875 0.545 0.665\nvt  0.831 0.568 0.747\nvt  0.805 0.583 0.799\nvt  0.795 0.572 0.815\nvt  0.766 0.559 0.843\nvt  0.755 0.549 0.799\nvt  0.784 0.565 0.850\nvt  0.775 0.562 0.861\nvt  0.756 0.582 0.841\nvt  0.750 0.584 0.830\nvt  0.769 0.593 0.830\nvt  0.767 0.589 0.841\nvt  0.762 0.582 0.856\nvt  0.810 0.388 0.581\nvt  0.782 0.420 0.591\nvt  0.798 0.378 0.543\nvt  0.961 0.985 0.382\nvt  0.972 0.944 0.444\nvt  0.959 0.938 0.454\nvt  0.947 0.980 0.399\nvt  0.918 0.921 0.543\nvt  0.941 0.918 0.522\nvt  0.933 0.899 0.550\nvt  0.908 0.902 0.575\nvt  0.928 0.961 0.452\nvt  0.923 0.942 0.497\nvt  0.977 0.906 0.501\nvt  0.973 0.905 0.505\nvt  0.967 0.898 0.528\nvt  0.965 0.892 0.538\nvt  0.293 0.111 0.446\nvt  0.290 0.118 0.449\nvt  0.303 0.115 0.440\nvt  0.304 0.108 0.435\nvt  0.282 0.106 0.451\nvt  0.277 0.108 0.452\nvt  0.947 0.645 0.476\nvt  0.932 0.645 0.497\nvt  0.953 0.621 0.516\nvt  0.960 0.631 0.484\nvt  0.845 0.391 0.653\nvt  0.267 0.092 0.439\nvt  0.267 0.100 0.447\nvt  0.278 0.102 0.449\nvt  0.292 0.099 0.441\nvt  0.299 0.045 0.396\nvt  0.269 0.058 0.420\nvt  0.279 0.070 0.423\nvt  0.307 0.058 0.404\nvt  0.288 0.029 0.389\nvt  0.277 0.011 0.381\nvt  0.257 0.025 0.395\nvt  0.266 0.039 0.406\nvt  0.251 0.125 0.456\nvt  0.243 0.124 0.453\nvt  0.256 0.138 0.459\nvt  0.263 0.135 0.458\nvt  0.230 0.042 0.396\nvt  0.234 0.058 0.410\nvt  0.256 0.045 0.457\nvt  0.255 0.047 0.442\nvt  0.257 0.085 0.433\nvt  0.223 0.076 0.415\nvt  0.231 0.101 0.436\nvt  0.257 0.098 0.443\nvt  0.190 0.114 0.418\nvt  0.181 0.094 0.409\nvt  0.209 0.129 0.436\nvt  0.229 0.128 0.449\nvt  0.210 0.144 0.444\nvt  0.228 0.141 0.458\nvt  0.266 0.150 0.460\nvt  0.265 0.144 0.457\nvt  0.244 0.144 0.463\nvt  0.284 0.252 0.376\nvt  0.289 0.230 0.388\nvt  0.258 0.236 0.390\nvt  0.251 0.260 0.377\nvt  0.250 0.284 0.365\nvt  0.280 0.276 0.366\nvt  0.212 0.270 0.374\nvt  0.223 0.288 0.364\nvt  0.255 0.308 0.356\nvt  0.279 0.290 0.360\nvt  0.223 0.310 0.356\nvt  0.199 0.303 0.359\nvt  0.185 0.262 0.371\nvt  0.165 0.278 0.364\nvt  0.177 0.311 0.356\nvt  0.186 0.346 0.348\nvt  0.209 0.343 0.348\nvt  0.267 0.205 0.416\nvt  0.295 0.211 0.405\nvt  0.240 0.197 0.422\nvt  0.234 0.239 0.387\nvt  0.205 0.202 0.409\nvt  0.199 0.238 0.383\nvt  0.235 0.351 0.345\nvt  0.229 0.388 0.336\nvt  0.251 0.386 0.336\nvt  0.248 0.349 0.345\nvt  0.216 0.364 0.343\nvt  0.209 0.388 0.336\nvt  0.197 0.355 0.345\nvt  0.188 0.357 0.345\nvt  0.269 0.410 0.332\nvt  0.248 0.409 0.331\nvt  0.255 0.433 0.326\nvt  0.266 0.431 0.327\nvt  0.260 0.447 0.324\nvt  0.268 0.445 0.325\nvt  0.261 0.453 0.323\nvt  0.275 0.448 0.325\nvt  0.267 0.381 0.336\nvt  0.228 0.413 0.331\nvt  0.286 0.352 0.343\nvt  0.293 0.354 0.342\nvt  0.295 0.345 0.345\nvt  0.285 0.344 0.345\nvt  0.280 0.372 0.338\nvt  0.290 0.376 0.338\nvt  0.286 0.331 0.348\nvt  0.298 0.334 0.348\nvt  0.304 0.315 0.354\nvt  0.282 0.312 0.354\nvt  0.274 0.431 0.329\nvt  0.282 0.412 0.332\nvt  0.241 0.445 0.325\nvt  0.298 0.284 0.364\nvt  0.310 0.258 0.374\nvt  0.320 0.234 0.385\nvt  0.329 0.212 0.396\nvt  0.475 0.201 0.257\nvt  0.481 0.203 0.257\nvt  0.481 0.242 0.257\nvt  0.465 0.241 0.257\nvt  0.493 0.218 0.257\nvt  0.488 0.201 0.257\nvt  0.367 0.022 0.372\nvt  0.375 0.047 0.398\nvt  0.387 0.049 0.417\nvt  0.384 0.023 0.393\nvt  0.389 0.068 0.435\nvt  0.392 0.072 0.442\nvt  0.410 0.055 0.452\nvt  0.384 0.069 0.427\nvt  0.824 0.635 0.423\nvt  0.816 0.627 0.389\nvt  0.425 0.079 0.423\nvt  0.415 0.072 0.437\nvt  0.410 0.092 0.409\nvt  0.424 0.101 0.389\nvt  0.383 0.075 0.434\nvt  0.396 0.078 0.434\nvt  0.337 0.243 0.377\nvt  0.351 0.217 0.382\nvt  0.353 0.236 0.372\nvt  0.360 0.258 0.369\nvt  0.333 0.190 0.402\nvt  0.315 0.180 0.422\nvt  0.306 0.191 0.446\nvt  0.968 0.585 0.515\nvt  0.975 0.577 0.490\nvt  0.985 0.588 0.499\nvt  0.983 0.599 0.526\nvt  0.958 0.563 0.479\nvt  0.965 0.554 0.452\nvt  0.982 0.628 0.475\nvt  0.984 0.660 0.426\nvt  0.971 0.550 0.437\nvt  0.983 0.570 0.475\nvt  0.974 0.542 0.423\nvt  0.979 0.539 0.426\nvt  0.972 0.599 0.532\nvt  0.952 0.599 0.553\nvt  0.948 0.581 0.530\nvt  0.152 0.219 0.378\nvt  0.153 0.202 0.383\nvt  0.143 0.197 0.377\nvt  0.147 0.283 0.360\nvt  0.146 0.310 0.354\nvt  0.151 0.329 0.350\nvt  0.164 0.349 0.347\nvt  0.151 0.247 0.367\nvt  0.172 0.239 0.376\nvt  0.114 0.323 0.351\nvt  0.117 0.341 0.348\nvt  0.320 0.341 0.346\nvt  0.327 0.317 0.352\nvt  0.318 0.294 0.360\nvt  0.342 0.306 0.356\nvt  0.334 0.262 0.369\nvt  0.355 0.272 0.363\nvt  0.318 0.362 0.342\nvt  0.286 0.439 0.329\nvt  0.291 0.425 0.332\nvt  0.160 0.455 0.334\nvt  0.184 0.450 0.331\nvt  0.181 0.432 0.334\nvt  0.162 0.440 0.336\nvt  0.163 0.399 0.339\nvt  0.142 0.416 0.339\nvt  0.203 0.450 0.328\nvt  0.200 0.432 0.331\nvt  0.185 0.398 0.336\nvt  0.176 0.404 0.337\nvt  0.201 0.371 0.342\nvt  0.189 0.377 0.341\nvt  0.171 0.383 0.340\nvt  0.168 0.365 0.344\nvt  0.149 0.359 0.345\nvt  0.129 0.383 0.342\nvt  0.125 0.364 0.345\nvt  0.112 0.282 0.355\nvt  0.090 0.293 0.352\nvt  0.216 0.448 0.327\nvt  0.216 0.464 0.323\nvt  0.247 0.465 0.321\nvt  0.203 0.465 0.325\nvt  0.268 0.497 0.314\nvt  0.283 0.485 0.316\nvt  0.236 0.501 0.318\nvt  0.249 0.504 0.315\nvt  0.280 0.457 0.323\nvt  0.292 0.474 0.319\nvt  0.261 0.517 0.312\nvt  0.272 0.513 0.311\nvt  0.284 0.506 0.311\nvt  0.292 0.498 0.312\nvt  0.236 0.514 0.315\nvt  0.245 0.518 0.313\nvt  0.297 0.491 0.313\nvt  0.301 0.485 0.315\nvt  0.228 0.535 0.311\nvt  0.233 0.538 0.310\nvt  0.225 0.541 0.310\nvt  0.231 0.544 0.309\nvt  0.220 0.550 0.308\nvt  0.225 0.553 0.308\nvt  0.212 0.562 0.307\nvt  0.219 0.565 0.306\nvt  0.198 0.487 0.324\nvt  0.205 0.493 0.322\nvt  0.222 0.525 0.318\nvt  0.216 0.542 0.313\nvt  0.205 0.560 0.312\nvt  0.198 0.570 0.309\nvt  0.203 0.571 0.306\nvt  0.204 0.580 0.303\nvt  0.208 0.585 0.309\nvt  0.213 0.576 0.305\nvt  0.210 0.570 0.304\nvt  0.199 0.579 0.307\nvt  0.198 0.590 0.309\nvt  0.202 0.591 0.311\nvt  0.196 0.588 0.310\nvt  0.192 0.466 0.328\nvt  0.189 0.479 0.327\nvt  0.413 0.279 0.257\nvt  0.421 0.232 0.257\nvt  0.420 0.203 0.257\nvt  0.211 0.163 0.451\nvt  0.218 0.150 0.456\nvt  0.209 0.165 0.460\nvt  0.251 0.154 0.471\nvt  0.260 0.159 0.467\nvt  0.273 0.164 0.459\nvt  0.265 0.164 0.464\nvt  0.234 0.187 0.439\nvt  0.225 0.178 0.447\nvt  0.208 0.187 0.428\nvt  0.236 0.150 0.466\nvt  0.229 0.149 0.464\nvt  0.232 0.155 0.465\nvt  0.243 0.152 0.467\nvt  0.219 0.176 0.447\nvt  0.222 0.170 0.456\nvt  0.211 0.175 0.448\nvt  0.270 0.189 0.433\nvt  0.274 0.184 0.440\nvt  0.261 0.177 0.452\nvt  0.255 0.180 0.445\nvt  0.235 0.549 0.311\nvt  0.225 0.570 0.310\nvt  0.217 0.580 0.310\nvt  0.250 0.533 0.312\nvt  0.192 0.569 0.313\nvt  0.200 0.555 0.317\nvt  0.230 0.573 0.316\nvt  0.220 0.585 0.315\nvt  0.990 0.300 -0.059\nvt  0.979 0.302 -0.059\nvt  0.982 0.319 -0.059\nvt  0.991 0.318 -0.059\nvt  0.992 0.329 -0.059\nvt  0.984 0.330 -0.059\nvt  0.991 0.339 -0.060\nvt  0.988 0.340 -0.060\nvt  0.976 0.280 -0.059\nvt  0.988 0.278 -0.059\nvt  0.971 0.257 -0.059\nvt  0.986 0.256 -0.059\nvt  0.242 0.556 0.316\nvt  0.253 0.541 0.315\nvt  0.213 0.520 0.322\nvt  0.208 0.538 0.318\nvt  0.189 0.497 0.323\nvt  0.196 0.503 0.322\nvt  0.185 0.501 0.323\nvt  0.191 0.508 0.322\nvt  0.179 0.505 0.323\nvt  0.186 0.513 0.322\nvt  0.179 0.497 0.325\nvt  0.160 0.508 0.327\nvt  0.166 0.512 0.324\nvt  0.163 0.525 0.324\nvt  0.167 0.529 0.325\nvt  0.175 0.521 0.323\nvt  0.173 0.514 0.322\nvt  0.159 0.519 0.325\nvt  0.155 0.532 0.325\nvt  0.156 0.535 0.327\nvt  0.151 0.529 0.327\nvt  0.195 0.515 0.323\nvt  0.179 0.526 0.325\nvt  0.211 0.505 0.322\nvt  0.155 0.501 0.329\nvt  0.170 0.493 0.328\nvt  0.197 0.522 0.326\nvt  0.183 0.533 0.328\nvt  0.940 0.076 -0.059\nvt  0.939 0.088 -0.059\nvt  0.958 0.089 -0.059\nvt  0.959 0.078 -0.059\nvt  0.966 0.079 -0.060\nvt  0.965 0.089 -0.060\nvt  0.976 0.079 -0.060\nvt  0.972 0.092 -0.060\nvt  0.987 0.086 -0.063\nvt  0.986 0.093 -0.064\nvt  0.925 0.090 -0.059\nvt  0.922 0.076 -0.059\nvt  0.210 0.519 0.325\nvt  0.172 0.480 0.330\nvt  0.225 0.507 0.320\nvt  0.977 0.223 -0.059\nvt  0.989 0.207 -0.059\nvt  0.977 0.199 -0.059\nvt  0.960 0.205 -0.059\nvt  0.221 0.509 0.324\nvt  0.990 0.237 -0.059\nvt  0.270 0.543 0.307\nvt  0.277 0.540 0.307\nvt  0.273 0.551 0.305\nvt  0.280 0.549 0.305\nvt  0.275 0.562 0.304\nvt  0.283 0.557 0.304\nvt  0.280 0.576 0.302\nvt  0.287 0.574 0.301\nvt  0.256 0.532 0.312\nvt  0.266 0.557 0.308\nvt  0.275 0.578 0.305\nvt  0.276 0.591 0.304\nvt  0.281 0.589 0.297\nvt  0.289 0.595 0.286\nvt  0.296 0.596 0.297\nvt  0.292 0.585 0.297\nvt  0.285 0.583 0.295\nvt  0.284 0.599 0.297\nvt  0.293 0.605 0.292\nvt  0.297 0.604 0.300\nvt  0.288 0.606 0.299\nvt  0.287 0.549 0.307\nvt  0.295 0.570 0.306\nvt  0.298 0.585 0.303\nvt  0.285 0.520 0.310\nvt  0.268 0.579 0.312\nvt  0.272 0.596 0.309\nvt  0.302 0.568 0.312\nvt  0.304 0.586 0.309\nvt  0.955 0.307 -0.059\nvt  0.943 0.302 -0.059\nvt  0.938 0.322 -0.059\nvt  0.948 0.325 -0.059\nvt  0.945 0.335 -0.059\nvt  0.937 0.332 -0.059\nvt  0.939 0.343 -0.059\nvt  0.935 0.341 -0.059\nvt  0.949 0.279 -0.059\nvt  0.962 0.282 -0.059\nvt  0.953 0.248 -0.059\nvt  0.296 0.548 0.313\nvt  0.294 0.526 0.313\nvt  0.259 0.559 0.313\nvt  0.306 0.520 0.307\nvt  0.311 0.515 0.307\nvt  0.311 0.523 0.306\nvt  0.315 0.517 0.306\nvt  0.319 0.529 0.304\nvt  0.323 0.524 0.304\nvt  0.330 0.535 0.302\nvt  0.333 0.531 0.303\nvt  0.290 0.518 0.310\nvt  0.310 0.532 0.308\nvt  0.327 0.542 0.306\nvt  0.337 0.548 0.306\nvt  0.337 0.543 0.300\nvt  0.346 0.541 0.297\nvt  0.351 0.539 0.299\nvt  0.342 0.534 0.301\nvt  0.337 0.536 0.299\nvt  0.344 0.547 0.302\nvt  0.322 0.517 0.308\nvt  0.339 0.526 0.307\nvt  0.346 0.531 0.305\nvt  0.308 0.498 0.313\nvt  0.335 0.553 0.312\nvt  0.322 0.546 0.312\nvt  0.340 0.517 0.313\nvt  0.351 0.529 0.309\nvt  0.932 0.243 -0.059\nvt  0.923 0.240 -0.059\nvt  0.917 0.257 -0.059\nvt  0.927 0.260 -0.059\nvt  0.924 0.270 -0.059\nvt  0.914 0.267 -0.059\nvt  0.927 0.219 -0.059\nvt  0.939 0.224 -0.059\nvt  0.930 0.194 -0.059\nvt  0.950 0.203 -0.059\nvt  0.326 0.509 0.314\nvt  0.313 0.498 0.315\nvt  0.306 0.537 0.313\nvt  0.917 0.159 -0.059\nvt  0.953 0.158 -0.059\nvt  0.954 0.131 -0.059\nvt  0.918 0.137 -0.059\nvt  0.293 0.453 0.326\nvt  0.301 0.463 0.324\nvt  0.515 0.310 0.257\nvt  0.490 0.357 0.257\nvt  0.316 0.491 0.312\nvt  0.316 0.486 0.313\nvt  0.325 0.491 0.311\nvt  0.325 0.486 0.311\nvt  0.332 0.489 0.310\nvt  0.331 0.484 0.310\nvt  0.340 0.489 0.310\nvt  0.339 0.484 0.310\nvt  0.310 0.496 0.313\nvt  0.323 0.496 0.313\nvt  0.340 0.494 0.313\nvt  0.350 0.493 0.314\nvt  0.348 0.489 0.310\nvt  0.356 0.484 0.310\nvt  0.356 0.481 0.310\nvt  0.348 0.480 0.311\nvt  0.344 0.486 0.309\nvt  0.355 0.489 0.313\nvt  0.323 0.478 0.316\nvt  0.339 0.476 0.315\nvt  0.348 0.477 0.314\nvt  0.306 0.478 0.318\nvt  0.351 0.497 0.318\nvt  0.339 0.498 0.317\nvt  0.339 0.471 0.319\nvt  0.350 0.472 0.319\nvt  0.907 0.217 -0.059\nvt  0.898 0.211 -0.059\nvt  0.891 0.223 -0.059\nvt  0.897 0.228 -0.059\nvt  0.892 0.236 -0.059\nvt  0.885 0.233 -0.059\nvt  0.909 0.197 -0.059\nvt  0.920 0.203 -0.059\nvt  0.918 0.178 -0.059\nvt  0.324 0.472 0.320\nvt  0.310 0.470 0.322\nvt  0.323 0.500 0.316\nvt  0.215 0.062 0.397\nvt  0.176 0.085 0.401\nvt  0.153 0.089 0.396\nvt  0.142 0.089 0.391\nvt  0.145 0.098 0.397\nvt  0.162 0.098 0.403\nvt  0.137 0.117 0.393\nvt  0.108 0.087 0.373\nvt  0.147 0.068 0.378\nvt  0.141 0.078 0.384\nvt  0.171 0.074 0.392\nvt  0.166 0.059 0.379\nvt  0.953 0.836 0.434\nvt  0.934 0.863 0.427\nvt  0.986 0.844 0.428\nvt  0.972 0.813 0.434\nvt  0.075 0.646 0.962\nvt  0.101 0.665 0.963\nvt  0.090 0.585 0.962\nvt  0.074 0.608 0.962\nvt  0.100 0.713 0.964\nvt  0.079 0.677 0.963\nvt  0.089 0.720 0.963\nvt  0.096 0.746 0.962\nvt  0.101 0.745 0.969\nvt  0.063 0.684 0.962\nvt  0.058 0.658 0.962\nvt  0.079 0.725 0.963\nvt  0.091 0.752 0.963\nvt  0.053 0.625 0.962\nvt  0.164 0.685 0.962\nvt  0.147 0.671 0.962\nvt  0.142 0.688 0.962\nvt  0.150 0.699 0.962\nvt  0.104 0.747 0.962\nvt  0.108 0.750 0.963\nvt  0.117 0.733 0.963\nvt  0.110 0.728 0.964\nvt  0.125 0.721 0.963\nvt  0.116 0.710 0.963\nvt  0.125 0.672 0.963\nvt  0.133 0.639 0.962\nvt  0.134 0.738 0.962\nvt  0.160 0.712 0.962\nvt  0.105 0.715 0.963\nvt  0.114 0.667 0.963\nvt  0.161 0.043 0.599\nvt  0.186 0.055 0.382\nvt  0.176 0.031 0.599\nvt  0.884 0.834 0.418\nvt  0.905 0.808 0.417\nvt  0.881 0.797 0.403\nvt  0.846 0.815 0.389\nvt  0.888 0.768 0.401\nvt  0.910 0.771 0.408\nvt  0.752 0.937 0.721\nvt  0.759 0.960 0.721\nvt  0.816 0.938 0.722\nvt  0.801 0.920 0.721\nvt  0.736 0.957 0.721\nvt  0.731 0.939 0.720\nvt  0.700 0.960 0.721\nvt  0.709 0.931 0.720\nvt  0.655 0.926 0.719\nvt  0.644 0.938 0.720\nvt  0.612 0.920 0.701\nvt  0.606 0.925 0.711\nvt  0.777 0.879 0.721\nvt  0.730 0.896 0.720\nvt  0.704 0.902 0.720\nvt  0.653 0.913 0.717\nvt  0.611 0.917 0.708\nvt  0.188 0.806 0.906\nvt  0.191 0.856 0.906\nvt  0.241 0.834 0.906\nvt  0.220 0.794 0.906\nvt  0.185 0.773 0.907\nvt  0.205 0.767 0.906\nvt  0.151 0.854 0.906\nvt  0.160 0.807 0.906\nvt  0.167 0.777 0.909\nvt  0.119 0.850 0.906\nvt  0.135 0.806 0.906\nvt  0.148 0.779 0.908\nvt  0.124 0.803 0.906\nvt  0.099 0.841 0.906\nvt  0.195 0.746 0.906\nvt  0.183 0.749 0.906\nvt  0.174 0.743 0.905\nvt  0.195 0.900 0.906\nvt  0.148 0.876 0.906\nvt  0.971 0.755 0.431\nvt  0.943 0.747 0.431\nvt  0.954 0.793 0.436\nvt  0.976 0.691 0.417\nvt  0.952 0.704 0.423\nvt  0.111 0.890 0.906\nvt  0.755 0.850 0.721\nvt  0.779 0.847 0.721\nvt  0.790 0.811 0.722\nvt  0.756 0.817 0.721\nvt  0.894 0.935 0.722\nvt  0.828 0.951 0.722\nvt  0.864 0.975 0.722\nvt  0.904 0.978 0.721\nvt  0.685 0.872 0.720\nvt  0.685 0.818 0.721\nvt  0.669 0.827 0.721\nvt  0.662 0.857 0.721\nvt  0.764 0.862 0.721\nvt  0.785 0.851 0.722\nvt  0.743 0.867 0.721\nvt  0.733 0.854 0.721\nvt  0.706 0.858 0.720\nvt  0.716 0.874 0.720\nvt  0.625 0.885 0.720\nvt  0.643 0.895 0.718\nvt  0.610 0.909 0.717\nvt  0.604 0.909 0.717\nvt  0.692 0.883 0.720\nvt  0.136 0.074 0.377\nvt  0.138 0.067 0.371\nvt  0.134 0.056 0.365\nvt  0.143 0.055 0.370\nvt  0.944 0.389 0.506\nvt  0.948 0.371 0.510\nvt  0.982 0.369 0.536\nvt  0.988 0.393 0.540\nvt  0.893 0.379 0.455\nvt  0.887 0.372 0.457\nvt  0.909 0.408 0.477\nvt  0.904 0.406 0.472\nvt  0.912 0.391 0.479\nvt  0.877 0.372 0.443\nvt  0.879 0.381 0.440\nvt  0.214 0.421 0.330\nvt  0.765 0.978 0.721\nvt  0.740 0.975 0.721\nvt  0.799 0.868 0.721\nvt  0.619 0.182 0.599\nvt  0.733 0.144 0.598\nvt  0.723 0.176 0.596\nvt  0.712 0.174 0.600\nvt  0.563 0.337 0.616\nvt  0.589 0.348 0.604\nvt  0.562 0.075 0.607\nvt  0.613 0.056 0.591\nvt  0.637 0.035 0.604\nvt  0.687 0.032 0.597\nvt  0.734 0.006 0.596\nvt  0.281 0.943 0.494\nvt  0.351 0.673 0.445\nvt  0.350 0.730 0.468\nvt  0.351 0.694 0.455\nvt  0.593 0.846 -0.455\nvt  0.640 0.820 -0.420\nvt  0.573 0.682 -0.408\nvt  0.553 0.683 -0.421\nvt  0.583 0.651 -0.475\nvt  0.601 0.639 -0.491\nvt  0.531 0.626 -0.447\nvt  0.538 0.653 -0.511\nvt  0.529 0.660 -0.506\nvt  0.545 0.641 -0.514\nvt  0.616 0.646 -0.504\nvt  0.592 0.630 -0.504\nvt  0.648 0.640 -0.468\nvt  0.437 0.628 -0.685\nvt  0.420 0.613 -0.685\nvt  0.527 0.653 -0.492\nvt  0.510 0.640 -0.443\nvt  0.649 0.787 -0.420\nvt  0.654 0.764 -0.418\nvt  0.653 0.759 -0.433\nvt  0.501 0.744 -0.468\nvt  0.658 0.665 -0.468\nvt  0.438 0.697 -0.491\nvt  0.450 0.649 -0.685\nvt  0.474 0.655 -0.685\nvt  0.547 0.524 -0.709\nvt  0.528 0.525 -0.708\nvt  0.499 0.369 -0.697\nvt  0.568 0.575 -0.720\nvt  0.554 0.586 -0.723\nvt  0.564 0.596 -0.696\nvt  0.613 0.558 -0.709\nvt  0.698 0.510 -0.709\nvt  0.300 0.430 -0.685\nvt  0.683 0.473 -0.709\nvt  0.701 0.483 -0.709\nvt  0.714 0.492 -0.709\nvt  0.805 0.670 -1.024\nvt  0.836 0.665 -1.013\nvt  0.792 0.694 -1.013\nvt  0.741 0.458 -0.752\nvt  0.703 0.574 -0.710\nvt  0.795 0.722 -1.024\nvt  0.767 0.704 -1.015\nvt  0.798 0.753 -1.015\nvt  0.730 0.778 -0.915\nvt  0.729 0.554 -0.937\nvt  0.726 0.573 -0.831\nvt  0.710 0.560 -0.852\nvt  0.609 0.865 -0.458\nvt  0.617 0.861 -0.457\nvt  0.343 0.860 -0.290\nvt  0.342 0.888 -0.290\nvt  0.378 0.838 -0.290\nvt  0.371 0.864 -0.290\nvt  0.374 0.872 -0.291\nvt  0.379 0.866 -0.246\nvt  0.375 0.908 -0.290\nvt  0.371 0.896 -0.290\nvt  0.379 0.905 -0.290\nvt  0.492 0.904 -0.459\nvt  0.336 0.740 -0.291\nvt  0.333 0.746 -0.291\nvt  0.346 0.750 -0.291\nvt  0.342 0.756 -0.291\nvt  0.356 0.761 -0.291\nvt  0.118 0.520 -0.292\nvt  0.389 0.825 -0.291\nvt  0.387 0.925 -0.262\nvt  0.048 0.758 0.173\nvt  0.054 0.734 0.173\nvt  0.061 0.742 0.173\nvt  0.640 0.862 -0.460\nvt  0.059 0.979 0.173\nvt  0.117 0.988 0.173\nvt  0.061 0.959 0.173\nvt  0.576 0.888 -0.406\nvt  0.589 0.865 -0.461\nvt  0.584 0.882 -0.410\nvt  0.589 0.886 -0.402\nvt  0.585 0.893 -0.415\nvt  0.573 0.899 -0.388\nvt  0.560 0.906 -0.441\nvt  0.547 0.916 -0.399\nvt  0.540 0.913 -0.377\nvt  0.360 0.961 -0.290\nvt  0.373 0.951 -0.256\nvt  0.362 0.949 -0.295\nvt  0.519 0.920 -0.431\nvt  0.511 0.928 -0.430\nvt  0.374 0.966 -0.291\nvt  0.547 0.942 -0.405\nvt  0.526 0.940 -0.403\nvt  0.550 0.921 -0.418\nvt  0.580 0.910 -0.445\nvt  0.006 0.834 0.173\nvt  0.077 0.888 0.183\nvt  0.449 0.282 0.257\nvt  0.479 0.051 0.100\nvt  0.444 0.043 0.119\nvt  0.432 0.255 0.257\nvt  0.461 0.209 0.257\nvt  0.449 0.205 0.257\nvt  0.402 0.182 0.257\nvt  0.390 0.164 0.257\nvt  0.466 0.191 0.257\nvt  0.483 0.175 0.298\nvt  0.515 0.190 0.292\nvt  0.420 0.181 0.257\nvt  0.481 0.285 0.257\nvt  0.457 0.189 0.257\nvt  0.469 0.185 0.257\nvt  0.434 0.178 0.257\nvt  0.451 0.183 0.257\nvt  0.520 0.211 0.318\nvt  0.542 0.123 0.193\nvt  0.551 0.080 0.107\nvt  0.889 0.682 0.346\nvt  0.916 0.688 0.318\nvt  0.919 0.555 0.518\nvt  0.993 0.520 0.543\nvt  0.992 0.501 0.497\nvt  0.942 0.525 0.591\nvt  0.316 0.159 0.424\nvt  0.318 0.136 0.427\nvt  0.338 0.152 0.409\nvt  0.335 0.167 0.406\nvt  0.383 0.100 0.375\nvt  0.356 0.108 0.394\nvt  0.348 0.088 0.393\nvt  0.339 0.128 0.404\nvt  0.338 0.125 0.414\nvt  0.757 0.592 0.841\nvt  0.943 0.660 0.452\nvt  0.973 0.893 0.530\nvt  0.111 0.974 0.173\nvt  0.006 0.974 0.173\nvt  0.168 0.154 0.405\nvt  0.178 0.161 0.411\nvt  0.159 0.169 0.397\nvt  0.121 0.975 0.173\nvt  0.329 0.077 0.404\nvt  0.298 0.083 0.425\nvt  0.283 0.074 0.424\nvt  0.260 0.064 0.448\nvt  0.268 0.076 0.426\nvt  0.300 0.140 0.439\nvt  0.311 0.144 0.433\nvt  0.956 0.501 0.544\nvt  0.819 0.374 0.575\nvt  0.266 0.050 0.414\nvt  0.250 0.073 0.424\nvt  0.253 0.060 0.417\nvt  0.254 0.051 0.427\nvt  0.255 0.035 0.419\nvt  0.254 0.037 0.416\nvt  0.241 0.028 0.395\nvt  0.275 0.127 0.461\nvt  0.270 0.119 0.459\nvt  0.263 0.114 0.480\nvt  0.261 0.106 0.451\nvt  0.277 0.133 0.454\nvt  0.249 0.114 0.452\nvt  0.264 0.127 0.479\nvt  0.260 0.125 0.465\nvt  0.287 0.152 0.447\nvt  0.184 0.152 0.421\nvt  0.193 0.173 0.429\nvt  0.182 0.174 0.411\nvt  0.245 0.132 0.459\nvt  0.300 0.171 0.432\nvt  0.284 0.171 0.452\nvt  0.281 0.163 0.460\nvt  0.274 0.175 0.482\nvt  0.250 0.185 0.436\nvt  0.164 0.208 0.388\nvt  0.270 0.356 0.342\nvt  0.270 0.341 0.347\nvt  0.297 0.296 0.359\nvt  0.157 0.188 0.388\nvt  0.144 0.175 0.386\nvt  0.129 0.958 0.173\nvt  0.494 0.243 0.257\nvt  0.400 0.029 0.419\nvt  0.350 0.036 0.373\nvt  0.364 0.064 0.409\nvt  0.352 0.052 0.389\nvt  0.427 0.055 0.479\nvt  0.973 0.619 0.494\nvt  0.985 0.611 0.499\nvt  0.940 0.614 0.544\nvt  0.968 0.611 0.520\nvt  0.507 0.282 0.257\nvt  0.121 0.192 0.368\nvt  0.134 0.253 0.361\nvt  0.301 0.395 0.336\nvt  0.186 0.473 0.330\nvt  0.983 0.184 -0.059\nvt  0.964 0.180 -0.059\nvt  0.176 0.469 0.332\nvt  0.217 0.164 0.460\nvt  0.245 0.188 0.433\nvt  0.251 0.161 0.472\nvt  0.255 0.171 0.463\nvt  0.244 0.168 0.464\nvt  0.243 0.177 0.453\nvt  0.244 0.162 0.481\nvt  0.230 0.169 0.459\nvt  0.227 0.172 0.460\nvt  0.237 0.178 0.464\nvt  0.228 0.165 0.461\nvt  0.232 0.146 0.470\nvt  0.236 0.146 0.465\nvt  0.210 0.587 0.312\nvt  0.196 0.578 0.310\nvt  0.197 0.592 0.312\nvt  0.990 0.344 -0.060\nvt  0.176 0.535 0.328\nvt  0.170 0.531 0.327\nvt  0.157 0.518 0.327\nvt  0.152 0.509 0.329\nvt  0.152 0.534 0.327\nvt  0.989 0.090 -0.058\nvt  0.299 0.595 0.303\nvt  0.281 0.600 0.302\nvt  0.294 0.608 0.301\nvt  0.935 0.346 -0.059\nvt  0.358 0.551 0.309\nvt  0.914 0.284 -0.059\nvt  0.353 0.537 0.303\nvt  0.344 0.550 0.307\nvt  0.927 0.112 -0.059\nvt  0.365 0.486 0.317\nvt  0.883 0.245 -0.060\nvt  0.357 0.480 0.312\nvt  0.356 0.491 0.316\nvt  0.991 0.220 -0.059\nvt  0.220 0.056 0.399\nvt  0.841 0.831 0.393\nvt  0.829 0.813 0.379\nvt  0.858 0.858 0.410\nvt  0.468 0.690 0.962\nvt  0.483 0.681 0.962\nvt  0.478 0.704 0.962\nvt  0.174 0.698 0.962\nvt  0.112 0.757 0.963\nvt  0.109 0.595 0.962\nvt  0.123 0.601 0.962\nvt  0.101 0.755 0.963\nvt  0.745 0.176 0.596\nvt  0.756 0.173 0.600\nvt  0.905 0.338 0.601\nvt  0.878 0.898 0.722\nvt  0.855 0.884 0.722\nvt  0.820 0.876 0.722\nvt  0.218 0.872 0.906\nvt  0.183 0.732 0.906\nvt  0.086 0.812 0.906\nvt  0.122 0.781 0.906\nvt  0.146 0.755 0.906\nvt  0.164 0.738 0.906\nvt  0.146 0.923 0.906\nvt  0.125 0.908 0.906\nvt  0.917 0.743 0.428\nvt  0.180 0.930 0.906\nvt  0.879 0.349 0.601\nvt  0.953 0.683 0.417\nvt  0.955 0.673 0.413\nvt  0.716 0.822 0.721\nvt  0.811 0.978 0.722\nvt  0.904 0.978 0.721\nvt  0.604 0.916 0.715\nvt  0.904 0.074 0.599\nvt  0.853 0.056 0.598\nvt  0.829 0.035 0.598\nvt  0.779 0.031 0.597\nvt  0.493 0.680 0.946\nvt  0.940 0.431 0.494\nvt  0.055 0.249 0.173\nvt  0.062 0.225 0.173\nvt  0.068 0.234 0.173\nvt  0.067 0.471 0.173\nvt  0.068 0.450 0.173\nvt  0.124 0.480 0.173\nvt  0.014 0.325 0.173\nvt  0.085 0.380 0.183\nvt  0.119 0.465 0.173\nvt  0.014 0.465 0.173\nvt  0.129 0.467 0.173\nvt  0.136 0.449 0.173\nvt  0.593 0.846 -0.455\nvt  0.640 0.820 -0.420\nvt  0.573 0.682 -0.408\nvt  0.553 0.683 -0.421\nvt  0.583 0.651 -0.475\nvt  0.601 0.639 -0.491\nvt  0.531 0.626 -0.447\nvt  0.538 0.653 -0.511\nvt  0.529 0.660 -0.506\nvt  0.545 0.641 -0.514\nvt  0.616 0.646 -0.504\nvt  0.592 0.630 -0.504\nvt  0.648 0.640 -0.468\nvt  0.437 0.628 -0.685\nvt  0.420 0.613 -0.685\nvt  0.527 0.653 -0.492\nvt  0.510 0.640 -0.443\nvt  0.649 0.787 -0.420\nvt  0.654 0.764 -0.418\nvt  0.653 0.759 -0.433\nvt  0.501 0.744 -0.468\nvt  0.658 0.665 -0.468\nvt  0.438 0.697 -0.491\nvt  0.450 0.649 -0.685\nvt  0.474 0.655 -0.685\nvt  0.547 0.524 -0.709\nvt  0.528 0.525 -0.708\nvt  0.499 0.369 -0.697\nvt  0.568 0.575 -0.720\nvt  0.554 0.586 -0.723\nvt  0.564 0.596 -0.696\nvt  0.613 0.558 -0.709\nvt  0.698 0.510 -0.709\nvt  0.300 0.430 -0.685\nvt  0.683 0.473 -0.709\nvt  0.714 0.492 -0.709\nvt  0.701 0.483 -0.709\nvt  0.805 0.670 -1.024\nvt  0.836 0.665 -1.013\nvt  0.792 0.694 -1.013\nvt  0.741 0.458 -0.752\nvt  0.703 0.574 -0.710\nvt  0.795 0.722 -1.024\nvt  0.767 0.704 -1.015\nvt  0.798 0.753 -1.015\nvt  0.730 0.778 -0.915\nvt  0.729 0.554 -0.937\nvt  0.710 0.560 -0.852\nvt  0.726 0.573 -0.831\nvt  0.609 0.865 -0.458\nvt  0.617 0.861 -0.457\nvt  0.343 0.860 -0.290\nvt  0.342 0.888 -0.290\nvt  0.378 0.838 -0.290\nvt  0.371 0.864 -0.290\nvt  0.379 0.866 -0.246\nvt  0.374 0.872 -0.291\nvt  0.375 0.908 -0.290\nvt  0.371 0.896 -0.290\nvt  0.379 0.905 -0.290\nvt  0.492 0.904 -0.459\nvt  0.336 0.740 -0.291\nvt  0.333 0.746 -0.291\nvt  0.346 0.750 -0.291\nvt  0.342 0.756 -0.291\nvt  0.356 0.761 -0.291\nvt  0.118 0.520 -0.292\nvt  0.389 0.825 -0.291\nvt  0.387 0.925 -0.262\nvt  0.640 0.862 -0.460\nvt  0.576 0.888 -0.406\nvt  0.589 0.865 -0.461\nvt  0.584 0.882 -0.410\nvt  0.585 0.893 -0.415\nvt  0.589 0.886 -0.402\nvt  0.573 0.899 -0.388\nvt  0.560 0.906 -0.441\nvt  0.547 0.916 -0.399\nvt  0.540 0.913 -0.377\nvt  0.360 0.961 -0.290\nvt  0.362 0.949 -0.295\nvt  0.373 0.951 -0.256\nvt  0.519 0.920 -0.431\nvt  0.511 0.928 -0.430\nvt  0.374 0.966 -0.291\nvt  0.526 0.940 -0.403\nvt  0.547 0.942 -0.405\nvt  0.550 0.921 -0.418\nvt  0.580 0.910 -0.445\nvt  0.449 0.282 0.257\nvt  0.479 0.051 0.100\nvt  0.444 0.043 0.119\nvt  0.432 0.255 0.257\nvt  0.461 0.209 0.257\nvt  0.449 0.205 0.257\nvt  0.402 0.182 0.257\nvt  0.390 0.164 0.257\nvt  0.466 0.191 0.257\nvt  0.483 0.175 0.298\nvt  0.515 0.190 0.292\nvt  0.420 0.181 0.257\nvt  0.481 0.285 0.257\nvt  0.457 0.189 0.257\nvt  0.469 0.185 0.257\nvt  0.434 0.178 0.257\nvt  0.451 0.183 0.257\nvt  0.520 0.211 0.318\nvt  0.542 0.123 0.193\nvt  0.551 0.080 0.107\nvt  0.889 0.682 0.346\nvt  0.916 0.688 0.318\nvt  0.919 0.555 0.518\nvt  0.993 0.520 0.543\nvt  0.942 0.525 0.591\nvt  0.992 0.501 0.497\nvt  0.316 0.159 0.424\nvt  0.338 0.152 0.409\nvt  0.318 0.136 0.427\nvt  0.335 0.167 0.406\nvt  0.383 0.100 0.375\nvt  0.348 0.088 0.393\nvt  0.356 0.108 0.394\nvt  0.338 0.125 0.414\nvt  0.339 0.128 0.404\nvt  0.757 0.592 0.841\nvt  0.943 0.660 0.452\nvt  0.973 0.893 0.530\nvt  0.168 0.154 0.405\nvt  0.159 0.169 0.397\nvt  0.178 0.161 0.411\nvt  0.329 0.077 0.404\nvt  0.298 0.083 0.425\nvt  0.283 0.074 0.424\nvt  0.260 0.064 0.448\nvt  0.268 0.076 0.426\nvt  0.300 0.140 0.439\nvt  0.311 0.144 0.433\nvt  0.956 0.501 0.544\nvt  0.819 0.374 0.575\nvt  0.266 0.050 0.414\nvt  0.250 0.073 0.424\nvt  0.253 0.060 0.417\nvt  0.254 0.051 0.427\nvt  0.255 0.035 0.419\nvt  0.254 0.037 0.416\nvt  0.241 0.028 0.395\nvt  0.270 0.119 0.459\nvt  0.275 0.127 0.461\nvt  0.263 0.114 0.480\nvt  0.261 0.106 0.451\nvt  0.277 0.133 0.454\nvt  0.249 0.114 0.452\nvt  0.264 0.127 0.479\nvt  0.260 0.125 0.465\nvt  0.287 0.152 0.447\nvt  0.184 0.152 0.421\nvt  0.193 0.173 0.429\nvt  0.182 0.174 0.411\nvt  0.245 0.132 0.459\nvt  0.300 0.171 0.432\nvt  0.284 0.171 0.452\nvt  0.281 0.163 0.460\nvt  0.274 0.175 0.482\nvt  0.250 0.185 0.436\nvt  0.164 0.208 0.388\nvt  0.270 0.356 0.342\nvt  0.270 0.341 0.347\nvt  0.297 0.296 0.359\nvt  0.157 0.188 0.388\nvt  0.144 0.175 0.386\nvt  0.494 0.243 0.257\nvt  0.400 0.029 0.419\nvt  0.350 0.036 0.373\nvt  0.364 0.064 0.409\nvt  0.352 0.052 0.389\nvt  0.427 0.055 0.479\nvt  0.985 0.611 0.499\nvt  0.973 0.619 0.494\nvt  0.940 0.614 0.544\nvt  0.968 0.611 0.520\nvt  0.507 0.282 0.257\nvt  0.121 0.192 0.368\nvt  0.134 0.253 0.361\nvt  0.301 0.395 0.336\nvt  0.186 0.473 0.330\nvt  0.983 0.184 -0.059\nvt  0.964 0.180 -0.059\nvt  0.176 0.469 0.332\nvt  0.217 0.164 0.460\nvt  0.245 0.188 0.433\nvt  0.251 0.161 0.472\nvt  0.244 0.168 0.464\nvt  0.255 0.171 0.463\nvt  0.243 0.177 0.453\nvt  0.244 0.162 0.481\nvt  0.230 0.169 0.459\nvt  0.227 0.172 0.460\nvt  0.237 0.178 0.464\nvt  0.228 0.165 0.461\nvt  0.236 0.146 0.465\nvt  0.232 0.146 0.470\nvt  0.210 0.587 0.312\nvt  0.196 0.578 0.310\nvt  0.197 0.592 0.312\nvt  0.990 0.344 -0.060\nvt  0.176 0.535 0.328\nvt  0.170 0.531 0.327\nvt  0.157 0.518 0.327\nvt  0.152 0.509 0.329\nvt  0.152 0.534 0.327\nvt  0.989 0.090 -0.058\nvt  0.299 0.595 0.303\nvt  0.281 0.600 0.302\nvt  0.294 0.608 0.301\nvt  0.935 0.346 -0.059\nvt  0.358 0.551 0.309\nvt  0.914 0.284 -0.059\nvt  0.353 0.537 0.303\nvt  0.344 0.550 0.307\nvt  0.927 0.112 -0.059\nvt  0.365 0.486 0.317\nvt  0.883 0.245 -0.060\nvt  0.357 0.480 0.312\nvt  0.356 0.491 0.316\nvt  0.991 0.220 -0.059\nvt  0.220 0.056 0.399\nvt  0.841 0.831 0.393\nvt  0.829 0.813 0.379\nvt  0.858 0.858 0.410\nvt  0.468 0.690 0.962\nvt  0.478 0.704 0.962\nvt  0.483 0.681 0.962\nvt  0.174 0.698 0.962\nvt  0.112 0.757 0.963\nvt  0.109 0.595 0.962\nvt  0.123 0.601 0.962\nvt  0.101 0.755 0.963\nvt  0.878 0.898 0.722\nvt  0.893 0.927 0.722\nvt  0.855 0.884 0.722\nvt  0.820 0.876 0.722\nvt  0.218 0.872 0.906\nvt  0.183 0.732 0.906\nvt  0.086 0.812 0.906\nvt  0.122 0.781 0.906\nvt  0.146 0.755 0.906\nvt  0.164 0.738 0.906\nvt  0.125 0.908 0.906\nvt  0.146 0.923 0.906\nvt  0.917 0.743 0.428\nvt  0.180 0.930 0.906\nvt  0.955 0.673 0.413\nvt  0.953 0.683 0.417\nvt  0.716 0.822 0.721\nvt  0.811 0.978 0.722\nvt  0.604 0.916 0.715\nvt  0.493 0.680 0.946\nvt  0.940 0.431 0.494\n# 3263 texture vertices\n\nvn  0.760 -0.649 0.033\nvn  0.982 -0.127 0.139\nvn  0.978 -0.195 -0.079\nvn  0.740 -0.425 0.521\nvn  0.924 -0.223 0.310\nvn  0.963 -0.145 0.228\nvn  0.830 -0.154 0.537\nvn  0.718 -0.501 0.483\nvn  0.563 0.011 0.826\nvn  0.487 -0.038 0.872\nvn  0.220 0.118 0.968\nvn  0.355 0.055 0.933\nvn  0.347 -0.199 0.916\nvn  0.941 -0.019 -0.339\nvn  0.968 -0.027 -0.251\nvn  0.990 0.074 -0.116\nvn  0.973 -0.011 0.231\nvn  0.926 -0.053 0.374\nvn  0.783 0.176 0.596\nvn  0.798 0.109 0.592\nvn  0.718 -0.257 0.646\nvn  0.410 0.238 0.881\nvn  0.418 0.124 0.900\nvn  0.561 0.192 0.805\nvn  0.677 0.407 0.614\nvn  0.572 0.121 0.811\nvn  0.479 0.413 0.775\nvn  0.056 0.253 0.966\nvn  0.070 -0.036 0.997\nvn  0.233 -0.432 0.871\nvn  0.207 -0.259 0.943\nvn  0.476 -0.109 0.873\nvn  0.118 0.100 0.988\nvn  -0.115 0.133 0.984\nvn  0.094 -0.325 0.941\nvn  0.667 -0.504 0.549\nvn  -0.310 0.255 0.916\nvn  0.287 0.104 0.952\nvn  0.810 -0.225 0.542\nvn  -0.172 0.397 0.901\nvn  0.458 0.123 0.881\nvn  0.654 -0.051 0.754\nvn  -0.188 0.392 0.901\nvn  -0.268 0.311 0.912\nvn  0.293 0.239 0.926\nvn  0.401 0.117 0.909\nvn  0.055 0.424 0.904\nvn  0.475 0.141 0.868\nvn  0.114 -0.170 0.979\nvn  0.619 -0.352 0.702\nvn  -0.300 -0.035 0.953\nvn  -0.006 -0.019 1.000\nvn  0.321 -0.104 0.941\nvn  0.152 -0.317 0.936\nvn  0.191 -0.631 0.752\nvn  0.365 0.080 0.928\nvn  -0.037 0.280 0.959\nvn  -0.101 0.072 0.992\nvn  -0.160 -0.184 0.970\nvn  -0.349 -0.486 0.801\nvn  0.338 0.508 0.792\nvn  0.374 0.621 0.689\nvn  0.317 0.920 0.232\nvn  0.761 0.631 0.151\nvn  -0.054 0.443 0.895\nvn  0.639 -0.190 0.746\nvn  0.371 -0.106 0.922\nvn  0.557 -0.288 -0.779\nvn  0.964 -0.251 0.091\nvn  0.984 0.034 0.176\nvn  0.737 -0.570 -0.364\nvn  0.936 -0.122 0.329\nvn  0.653 -0.556 0.514\nvn  0.242 -0.799 0.551\nvn  0.866 -0.263 0.426\nvn  0.465 -0.602 0.650\nvn  0.179 -0.803 0.569\nvn  0.685 -0.704 -0.187\nvn  0.599 -0.614 0.513\nvn  0.123 -0.776 0.619\nvn  0.918 -0.375 0.126\nvn  0.731 0.062 -0.680\nvn  0.606 -0.592 -0.532\nvn  0.946 0.121 -0.301\nvn  0.772 -0.611 -0.177\nvn  0.816 0.071 -0.574\nvn  0.848 -0.483 0.218\nvn  0.195 -0.811 0.552\nvn  0.920 -0.189 -0.343\nvn  0.349 -0.682 -0.643\nvn  0.503 -0.320 -0.803\nvn  0.565 -0.384 -0.730\nvn  0.046 0.040 -0.998\nvn  0.510 -0.351 -0.785\nvn  0.217 -0.525 -0.823\nvn  0.282 -0.947 0.151\nvn  0.888 0.390 -0.245\nvn  0.814 0.524 -0.250\nvn  0.108 -0.109 -0.988\nvn  0.010 0.148 -0.989\nvn  -0.110 0.152 0.982\nvn  -0.177 0.366 0.913\nvn  0.533 0.387 0.753\nvn  0.510 0.578 0.637\nvn  -0.246 0.841 -0.482\nvn  -0.275 0.958 -0.084\nvn  -0.116 0.904 0.411\nvn  0.000 0.451 0.893\nvn  -0.165 0.231 0.959\nvn  -0.256 0.654 0.712\nvn  0.118 0.737 0.665\nvn  -0.106 0.203 0.973\nvn  0.327 0.060 0.943\nvn  -0.164 0.318 0.934\nvn  0.185 0.107 0.977\nvn  0.090 0.361 0.928\nvn  -0.552 0.308 0.775\nvn  -0.638 0.446 0.627\nvn  -0.838 0.216 0.501\nvn  -0.297 0.215 0.930\nvn  -0.491 0.350 0.797\nvn  -0.663 0.301 0.686\nvn  -0.077 0.082 0.994\nvn  0.116 0.881 0.459\nvn  -0.078 -0.036 0.996\nvn  0.206 -0.039 0.978\nvn  0.321 0.056 0.946\nvn  0.741 -0.240 0.627\nvn  0.726 -0.196 0.659\nvn  0.508 0.244 0.826\nvn  0.647 -0.292 0.704\nvn  -0.246 0.582 0.775\nvn  0.011 0.107 0.994\nvn  0.395 -0.145 0.907\nvn  -0.752 -0.300 0.588\nvn  0.451 -0.532 0.717\nvn  -0.320 0.482 0.816\nvn  -0.806 0.309 0.505\nvn  -0.602 -0.614 0.511\nvn  -0.551 -0.627 0.550\nvn  -0.519 0.642 0.565\nvn  -0.268 0.165 0.949\nvn  -0.936 0.107 0.336\nvn  -0.718 0.204 0.666\nvn  -0.927 -0.040 0.372\nvn  -0.885 0.378 0.273\nvn  -0.697 0.219 0.683\nvn  -0.861 0.186 -0.473\nvn  0.873 -0.079 0.481\nvn  0.033 0.557 0.830\nvn  -0.744 0.039 0.667\nvn  0.566 -0.760 0.320\nvn  -0.417 -0.808 0.417\nvn  -0.107 -0.049 0.993\nvn  0.257 -0.940 0.223\nvn  0.621 -0.556 0.553\nvn  -0.148 -0.639 0.755\nvn  -0.188 -0.217 0.958\nvn  0.190 -0.931 0.311\nvn  -0.191 -0.951 0.245\nvn  0.205 -0.974 0.092\nvn  -0.971 -0.112 0.213\nvn  -0.572 0.320 0.755\nvn  -0.677 -0.534 0.505\nvn  0.810 -0.250 0.530\nvn  0.266 -0.124 0.956\nvn  0.449 -0.856 0.258\nvn  0.592 -0.786 0.179\nvn  0.892 0.192 0.410\nvn  0.855 -0.512 0.083\nvn  -0.566 -0.817 0.110\nvn  -0.412 -0.131 -0.901\nvn  -0.850 -0.420 -0.319\nvn  -0.923 0.376 0.080\nvn  -0.865 -0.486 0.124\nvn  -0.829 -0.508 0.234\nvn  -0.503 -0.859 0.096\nvn  -0.771 0.070 0.633\nvn  0.343 0.015 0.939\nvn  0.313 0.538 0.783\nvn  0.597 -0.000 0.802\nvn  0.652 0.430 0.624\nvn  0.910 0.206 0.360\nvn  0.522 0.064 0.850\nvn  0.735 0.360 0.574\nvn  0.175 -0.315 -0.933\nvn  -0.543 -0.057 -0.838\nvn  -0.966 0.219 0.138\nvn  -0.865 0.038 -0.500\nvn  0.003 -0.667 -0.745\nvn  -0.486 -0.352 -0.800\nvn  0.341 0.722 0.602\nvn  0.832 -0.177 0.525\nvn  0.224 0.046 0.974\nvn  0.587 -0.278 0.760\nvn  0.445 0.026 0.895\nvn  0.665 -0.173 0.727\nvn  -0.970 0.221 -0.106\nvn  -0.909 0.022 0.415\nvn  -0.987 -0.069 0.143\nvn  0.002 -0.351 -0.936\nvn  0.357 0.418 -0.835\nvn  0.793 -0.448 -0.412\nvn  -0.004 -0.977 -0.215\nvn  0.771 -0.436 -0.464\nvn  0.940 -0.341 0.024\nvn  0.941 -0.335 0.042\nvn  0.884 -0.266 0.386\nvn  0.929 -0.369 0.002\nvn  0.934 -0.201 -0.296\nvn  -0.588 0.783 -0.204\nvn  0.444 0.862 -0.246\nvn  0.779 0.616 -0.119\nvn  -0.552 0.731 -0.402\nvn  0.294 0.889 -0.350\nvn  -0.363 0.925 -0.115\nvn  0.399 0.914 -0.075\nvn  0.077 0.975 -0.206\nvn  -0.815 0.405 -0.414\nvn  -0.975 0.106 -0.196\nvn  -0.980 0.197 -0.038\nvn  -0.950 0.303 0.070\nvn  -0.941 -0.332 -0.065\nvn  -0.964 0.105 -0.243\nvn  -0.943 -0.322 0.084\nvn  -0.756 -0.651 0.069\nvn  -0.089 -0.996 0.024\nvn  0.520 -0.852 0.051\nvn  0.846 -0.530 -0.065\nvn  0.735 -0.677 -0.013\nvn  0.994 -0.085 -0.072\nvn  0.833 0.445 -0.329\nvn  -0.370 0.633 -0.680\nvn  0.492 -0.420 -0.762\nvn  0.884 0.116 -0.452\nvn  0.883 0.434 -0.178\nvn  0.966 -0.241 -0.096\nvn  -0.732 -0.679 0.061\nvn  -0.121 -0.992 0.037\nvn  0.899 -0.393 -0.193\nvn  -0.787 -0.558 0.263\nvn  0.208 -0.962 0.177\nvn  -0.367 -0.312 0.876\nvn  0.047 -0.811 0.583\nvn  0.459 -0.888 -0.012\nvn  0.758 -0.604 0.245\nvn  0.550 -0.835 -0.017\nvn  0.937 0.051 -0.345\nvn  0.518 -0.182 -0.836\nvn  0.689 0.645 -0.332\nvn  -0.514 -0.024 -0.857\nvn  -0.835 0.062 -0.546\nvn  -0.038 -0.139 -0.990\nvn  -0.077 -0.689 0.721\nvn  -0.897 -0.200 0.394\nvn  -0.991 0.118 0.062\nvn  -0.522 0.406 -0.750\nvn  -0.906 0.385 -0.173\nvn  0.439 0.453 -0.776\nvn  -0.576 0.766 -0.285\nvn  -0.044 0.405 -0.913\nvn  0.031 0.903 -0.428\nvn  0.716 -0.013 0.698\nvn  0.996 -0.061 -0.065\nvn  0.896 -0.016 0.443\nvn  0.980 -0.031 -0.199\nvn  0.504 -0.347 -0.791\nvn  0.556 -0.472 -0.684\nvn  0.193 -0.411 -0.891\nvn  0.397 -0.602 -0.693\nvn  0.783 -0.440 -0.439\nvn  0.936 -0.327 0.128\nvn  0.753 0.055 0.655\nvn  0.897 -0.093 0.432\nvn  0.745 0.018 0.667\nvn  0.852 -0.431 -0.298\nvn  0.630 -0.425 -0.651\nvn  0.611 -0.778 -0.143\nvn  0.756 -0.431 0.493\nvn  0.785 -0.384 -0.486\nvn  0.763 -0.644 0.060\nvn  0.860 -0.182 0.477\nvn  0.945 0.022 -0.327\nvn  0.449 -0.556 -0.699\nvn  0.688 -0.538 -0.487\nvn  -0.366 -0.169 -0.915\nvn  -0.877 0.016 -0.480\nvn  -0.905 0.113 -0.410\nvn  -0.958 0.144 0.247\nvn  -0.943 0.275 0.185\nvn  -0.512 0.707 0.488\nvn  -0.606 0.130 0.785\nvn  -0.376 0.533 0.758\nvn  -0.936 0.352 -0.018\nvn  -0.334 0.028 -0.942\nvn  -0.421 -0.347 -0.838\nvn  0.324 0.427 0.844\nvn  0.640 0.169 0.750\nvn  0.183 0.776 0.603\nvn  -0.497 0.815 0.298\nvn  0.380 0.844 0.378\nvn  -0.504 0.861 -0.065\nvn  0.504 0.844 0.185\nvn  -0.598 0.801 0.032\nvn  0.561 0.758 0.334\nvn  -0.669 0.539 0.511\nvn  0.498 0.419 0.759\nvn  -0.662 0.643 0.385\nvn  -0.891 0.399 0.214\nvn  0.614 0.444 0.652\nvn  -0.890 -0.435 -0.134\nvn  0.791 -0.441 0.423\nvn  0.009 -0.994 -0.113\nvn  -0.217 0.780 0.587\nvn  0.509 0.521 0.685\nvn  -0.324 0.399 0.858\nvn  -0.346 -0.233 0.909\nvn  0.619 -0.066 0.783\nvn  0.915 0.183 0.360\nvn  0.460 0.516 0.723\nvn  0.286 0.849 0.444\nvn  -0.939 0.172 0.298\nvn  -0.965 0.107 -0.241\nvn  0.900 0.264 0.347\nvn  0.935 -0.249 0.253\nvn  0.605 -0.668 0.433\nvn  -0.889 -0.174 -0.424\nvn  0.152 -0.899 -0.411\nvn  -0.058 -0.939 -0.340\nvn  -0.028 -0.995 -0.094\nvn  -0.298 -0.926 0.234\nvn  -0.991 -0.046 0.125\nvn  -0.832 -0.493 -0.254\nvn  0.835 -0.269 0.480\nvn  0.328 -0.722 -0.610\nvn  -0.893 -0.390 -0.226\nvn  0.460 0.887 -0.039\nvn  0.078 0.995 0.056\nvn  -0.651 0.755 -0.075\nvn  0.764 0.642 0.067\nvn  0.991 0.038 -0.130\nvn  -0.966 -0.017 -0.259\nvn  -0.572 0.759 -0.312\nvn  -0.572 0.609 0.550\nvn  0.776 -0.536 0.332\nvn  -0.963 -0.241 0.117\nvn  -0.763 -0.553 -0.335\nvn  0.147 -0.987 -0.065\nvn  0.905 -0.313 0.290\nvn  0.344 -0.760 0.551\nvn  -0.572 -0.715 0.403\nvn  0.051 -0.946 0.320\nvn  -0.149 0.697 -0.701\nvn  0.250 0.824 0.508\nvn  -0.252 0.683 -0.685\nvn  0.191 0.900 0.391\nvn  -0.665 0.554 -0.501\nvn  -0.264 0.738 0.621\nvn  -0.669 0.495 -0.554\nvn  -0.350 0.701 0.621\nvn  -0.778 0.625 0.069\nvn  -0.238 0.563 0.791\nvn  -0.954 0.169 0.248\nvn  0.126 -0.137 0.983\nvn  -0.815 0.214 -0.538\nvn  -0.298 -0.733 -0.611\nvn  -0.310 -0.870 0.383\nvn  -0.490 -0.312 -0.814\nvn  -0.192 -0.244 -0.951\nvn  -0.431 -0.335 -0.838\nvn  0.316 -0.157 0.936\nvn  0.275 0.315 0.908\nvn  0.247 0.297 0.922\nvn  0.433 -0.193 0.880\nvn  0.467 -0.867 -0.174\nvn  0.375 -0.864 -0.335\nvn  0.395 -0.909 0.134\nvn  0.109 -0.993 0.037\nvn  0.247 -0.024 0.969\nvn  -0.249 -0.611 -0.752\nvn  0.603 -0.779 0.172\nvn  -0.084 -0.987 0.138\nvn  0.342 -0.262 0.902\nvn  -0.101 -0.283 0.954\nvn  -0.729 0.234 -0.644\nvn  -0.650 -0.419 -0.634\nvn  -0.590 -0.581 -0.561\nvn  0.529 -0.373 -0.762\nvn  0.366 -0.623 -0.691\nvn  0.097 -0.989 -0.115\nvn  0.601 -0.647 -0.469\nvn  0.096 -0.766 -0.636\nvn  0.094 -0.764 -0.638\nvn  -0.512 -0.618 -0.596\nvn  -0.241 -0.958 0.153\nvn  0.634 -0.472 -0.613\nvn  0.771 0.624 0.127\nvn  0.964 0.097 -0.247\nvn  0.877 0.335 -0.344\nvn  0.928 0.183 -0.324\nvn  0.347 0.926 -0.151\nvn  0.530 -0.233 -0.816\nvn  -0.355 0.751 0.558\nvn  -0.319 0.921 0.225\nvn  0.559 0.762 -0.329\nvn  0.825 0.563 -0.042\nvn  -0.242 0.821 0.518\nvn  0.882 0.441 0.163\nvn  -0.203 0.593 0.779\nvn  0.596 0.400 0.696\nvn  -0.344 0.341 0.875\nvn  0.495 -0.080 0.865\nvn  -0.734 -0.251 0.631\nvn  -0.072 -0.969 0.238\nvn  0.999 -0.017 0.039\nvn  0.583 -0.718 -0.381\nvn  0.907 -0.117 -0.405\nvn  0.720 -0.256 -0.645\nvn  -0.833 -0.373 0.409\nvn  -0.953 -0.155 0.258\nvn  -0.724 0.305 0.619\nvn  -0.828 -0.272 0.490\nvn  -0.393 -0.655 -0.645\nvn  0.692 -0.566 -0.447\nvn  -0.372 -0.583 -0.722\nvn  -0.417 -0.893 -0.167\nvn  -0.177 -0.981 -0.080\nvn  -0.697 -0.162 0.699\nvn  0.764 -0.636 -0.106\nvn  -0.728 -0.566 -0.386\nvn  -0.055 -0.990 -0.126\nvn  0.259 -0.224 0.940\nvn  0.889 -0.457 -0.016\nvn  0.317 -0.925 0.211\nvn  0.213 -0.782 0.586\nvn  -0.597 -0.363 0.715\nvn  -0.548 -0.587 0.596\nvn  0.131 -0.281 0.951\nvn  0.280 -0.763 0.582\nvn  -0.390 -0.091 0.916\nvn  -0.376 -0.088 0.922\nvn  0.644 0.508 0.572\nvn  -0.161 -0.046 0.986\nvn  0.088 0.021 0.996\nvn  0.175 0.322 0.931\nvn  -0.345 0.638 0.689\nvn  -0.281 0.186 0.942\nvn  -0.470 0.090 0.878\nvn  -0.356 0.779 0.515\nvn  -0.926 0.227 -0.302\nvn  -0.486 -0.847 0.215\nvn  0.252 -0.921 0.298\nvn  0.191 -0.935 0.299\nvn  -0.584 -0.352 0.732\nvn  0.352 -0.788 0.505\nvn  -0.468 -0.350 0.812\nvn  0.374 -0.779 0.503\nvn  -0.268 -0.322 0.908\nvn  0.592 -0.795 0.132\nvn  0.177 -0.424 0.888\nvn  0.487 -0.836 -0.253\nvn  0.533 -0.606 0.591\nvn  0.091 -0.779 -0.620\nvn  0.755 -0.595 0.275\nvn  -0.395 -0.809 -0.435\nvn  0.720 -0.637 0.276\nvn  -0.528 -0.849 0.025\nvn  -0.860 0.099 0.501\nvn  -0.663 0.370 0.651\nvn  -0.277 0.351 0.894\nvn  0.298 0.229 0.927\nvn  0.785 0.116 0.609\nvn  0.258 0.429 0.866\nvn  -0.823 -0.146 0.549\nvn  -0.973 -0.163 0.163\nvn  -0.855 -0.225 0.467\nvn  -0.728 -0.586 -0.356\nvn  -0.732 0.455 -0.508\nvn  -0.791 -0.318 0.523\nvn  -0.901 -0.020 0.434\nvn  -0.927 0.369 -0.065\nvn  -0.773 0.127 0.622\nvn  -0.668 -0.301 0.680\nvn  -0.896 -0.042 0.443\nvn  -0.591 0.643 -0.487\nvn  -0.928 0.155 0.340\nvn  -0.938 0.179 0.297\nvn  -0.523 0.852 0.037\nvn  -0.632 -0.728 -0.267\nvn  -0.772 0.032 -0.634\nvn  -0.938 0.287 0.194\nvn  -0.932 0.181 -0.314\nvn  -0.575 -0.150 -0.804\nvn  -0.625 -0.005 -0.781\nvn  -0.360 0.754 -0.549\nvn  0.041 0.839 -0.543\nvn  0.009 0.137 -0.991\nvn  -0.970 0.242 0.009\nvn  -0.945 0.028 0.326\nvn  -0.679 0.521 -0.518\nvn  -0.898 0.423 0.117\nvn  -0.770 0.206 0.604\nvn  -0.823 -0.359 -0.441\nvn  -0.876 -0.468 0.115\nvn  -0.987 -0.040 -0.158\nvn  -0.830 0.491 0.265\nvn  -0.905 0.423 -0.033\nvn  -0.658 0.583 0.476\nvn  -0.476 0.831 -0.287\nvn  0.061 0.536 -0.842\nvn  -0.164 -0.537 -0.828\nvn  -0.606 0.332 -0.722\nvn  -0.463 0.467 -0.753\nvn  -0.487 0.250 -0.837\nvn  -0.926 -0.366 0.093\nvn  -0.891 0.157 0.426\nvn  -0.978 -0.204 -0.049\nvn  -0.646 0.764 -0.003\nvn  -0.809 0.260 0.527\nvn  -0.110 0.709 -0.696\nvn  -0.362 0.687 -0.630\nvn  -0.465 0.466 -0.753\nvn  -0.667 0.669 -0.327\nvn  -0.624 0.763 0.169\nvn  -0.335 0.803 0.493\nvn  0.158 0.771 0.617\nvn  -0.937 0.091 -0.339\nvn  -0.870 0.151 0.470\nvn  -0.752 0.322 -0.576\nvn  -0.398 0.785 -0.475\nvn  -0.862 0.422 0.280\nvn  -0.677 0.511 -0.529\nvn  -0.587 0.808 0.054\nvn  -0.714 0.182 -0.676\nvn  -0.279 -0.419 0.864\nvn  -0.535 0.193 -0.823\nvn  -0.124 0.702 -0.702\nvn  -0.898 -0.392 -0.200\nvn  -0.902 -0.422 -0.092\nvn  -0.783 0.125 0.609\nvn  -0.932 -0.332 -0.143\nvn  -0.157 0.491 -0.857\nvn  -0.862 -0.475 -0.175\nvn  -0.783 0.535 -0.318\nvn  -0.092 0.492 -0.866\nvn  -0.457 0.435 -0.776\nvn  -0.435 0.721 -0.539\nvn  -0.324 0.559 0.763\nvn  -0.084 0.215 0.973\nvn  0.322 0.189 0.927\nvn  0.207 0.288 0.935\nvn  -0.156 0.026 0.987\nvn  -0.386 0.535 0.751\nvn  -0.778 0.382 0.499\nvn  -0.577 0.233 0.783\nvn  -0.547 0.619 0.564\nvn  -0.804 0.576 0.147\nvn  -0.305 0.193 0.933\nvn  -0.278 -0.353 0.893\nvn  -0.440 -0.005 0.898\nvn  0.529 -0.209 0.823\nvn  0.470 0.195 0.861\nvn  -0.833 0.016 0.554\nvn  -0.333 0.767 0.549\nvn  -0.828 0.096 0.552\nvn  -0.740 0.646 -0.186\nvn  -0.388 0.558 0.734\nvn  -0.956 -0.071 0.283\nvn  -0.800 0.516 -0.307\nvn  -0.486 0.849 0.209\nvn  -0.966 -0.248 -0.066\nvn  -0.738 0.279 0.614\nvn  -0.912 -0.361 -0.194\nvn  -0.990 -0.124 -0.070\nvn  -0.914 -0.394 -0.096\nvn  -0.993 -0.044 0.111\nvn  -0.479 0.873 -0.090\nvn  -0.716 0.692 -0.088\nvn  -0.607 0.789 -0.090\nvn  0.043 0.981 -0.190\nvn  -0.674 0.640 -0.369\nvn  -0.207 0.792 0.575\nvn  -0.556 0.688 -0.465\nvn  0.315 0.928 -0.199\nvn  0.250 0.916 0.314\nvn  0.139 0.958 0.251\nvn  -0.208 0.919 0.336\nvn  -0.654 0.425 0.626\nvn  -0.613 -0.170 0.772\nvn  -0.527 0.307 0.792\nvn  -0.137 0.481 0.866\nvn  0.409 0.165 0.897\nvn  -0.257 0.531 0.808\nvn  0.160 0.262 0.952\nvn  0.524 -0.219 0.823\nvn  -0.308 -0.357 0.881\nvn  -0.318 0.700 0.639\nvn  -0.085 0.547 0.833\nvn  -0.526 0.126 0.841\nvn  -0.676 0.248 0.694\nvn  0.106 -0.341 0.934\nvn  0.500 -0.047 0.865\nvn  -0.055 -0.486 0.872\nvn  -0.507 0.290 0.812\nvn  -0.418 -0.012 0.908\nvn  -0.364 -0.279 0.888\nvn  -0.737 0.671 0.083\nvn  -0.859 -0.033 0.511\nvn  -0.683 -0.477 0.553\nvn  -0.798 -0.478 -0.369\nvn  -0.914 -0.404 0.038\nvn  0.076 -0.801 0.593\nvn  -0.801 -0.517 0.301\nvn  -0.603 -0.654 -0.456\nvn  -0.873 -0.475 -0.109\nvn  -0.646 0.577 -0.500\nvn  -0.612 -0.425 -0.667\nvn  -0.436 -0.705 -0.559\nvn  -0.950 -0.284 -0.128\nvn  -0.207 -0.385 -0.899\nvn  -0.868 -0.496 -0.014\nvn  -0.449 0.200 -0.871\nvn  -0.486 -0.172 -0.857\nvn  -0.027 0.994 0.102\nvn  -0.382 0.470 -0.796\nvn  0.142 0.980 0.136\nvn  0.166 0.919 -0.357\nvn  -0.382 0.790 -0.479\nvn  0.168 -0.286 0.943\nvn  0.195 -0.414 0.889\nvn  -0.199 -0.251 0.947\nvn  -0.225 -0.814 0.536\nvn  -0.046 -0.638 0.769\nvn  -0.408 -0.156 0.900\nvn  -0.374 -0.630 0.681\nvn  0.225 -0.034 0.974\nvn  -0.476 0.250 0.843\nvn  -0.419 -0.308 0.854\nvn  -0.414 -0.753 -0.512\nvn  -0.506 -0.280 -0.816\nvn  -0.823 -0.488 -0.291\nvn  -0.919 -0.259 -0.296\nvn  -0.284 -0.218 -0.934\nvn  -0.118 -0.531 -0.839\nvn  -0.566 0.180 -0.805\nvn  -0.498 -0.314 -0.809\nvn  -0.505 -0.382 -0.774\nvn  -0.313 -0.522 -0.794\nvn  -0.430 -0.692 -0.579\nvn  -0.758 0.519 0.396\nvn  -0.480 -0.086 -0.873\nvn  -0.931 -0.259 -0.256\nvn  -0.315 -0.812 -0.491\nvn  -0.686 -0.683 0.253\nvn  -0.727 -0.169 0.666\nvn  -0.309 -0.926 -0.215\nvn  0.194 -0.040 -0.980\nvn  -0.519 -0.222 0.825\nvn  -0.627 0.167 -0.761\nvn  0.526 0.137 -0.839\nvn  -0.913 0.044 0.405\nvn  -0.300 -0.952 -0.063\nvn  0.357 -0.040 -0.933\nvn  -0.609 -0.173 0.774\nvn  -0.235 -0.897 -0.375\nvn  -0.465 0.438 0.770\nvn  0.227 0.864 -0.450\nvn  -0.152 0.816 0.557\nvn  -0.155 0.978 -0.137\nvn  0.185 0.939 -0.292\nvn  -0.347 0.788 0.509\nvn  0.320 0.845 -0.429\nvn  0.281 -0.005 -0.960\nvn  -0.026 0.918 0.395\nvn  -0.861 -0.151 -0.486\nvn  -0.409 -0.471 -0.782\nvn  0.009 0.269 -0.963\nvn  -0.526 0.135 -0.840\nvn  -0.712 -0.692 0.122\nvn  -0.370 -0.688 -0.625\nvn  -0.095 -0.158 -0.983\nvn  -0.853 -0.148 -0.501\nvn  -0.463 -0.051 0.885\nvn  -0.500 -0.756 -0.422\nvn  -0.083 -0.093 -0.992\nvn  -0.332 -0.158 0.930\nvn  0.303 0.720 -0.624\nvn  -0.099 0.722 -0.684\nvn  0.024 0.703 0.711\nvn  0.415 0.907 0.075\nvn  -0.439 0.898 0.024\nvn  -0.497 0.486 -0.719\nvn  -0.576 0.788 -0.217\nvn  -0.001 0.829 -0.559\nvn  -0.315 0.885 -0.342\nvn  0.105 0.507 -0.856\nvn  0.150 0.989 0.004\nvn  -0.458 0.889 -0.004\nvn  -0.134 0.368 -0.920\nvn  -0.521 0.391 -0.759\nvn  0.312 0.859 0.406\nvn  -0.518 0.750 -0.411\nvn  0.096 0.854 0.511\nvn  -0.225 0.843 0.488\nvn  -0.851 0.522 0.064\nvn  -0.293 0.503 0.813\nvn  -0.449 0.878 -0.169\nvn  -0.261 0.866 -0.426\nvn  -0.767 0.641 0.036\nvn  -0.572 -0.652 0.497\nvn  0.161 0.583 0.796\nvn  -0.600 -0.735 -0.314\nvn  -0.122 -0.149 -0.981\nvn  -0.462 -0.186 0.867\nvn  0.381 0.659 -0.649\nvn  -0.665 -0.612 0.427\nvn  -0.039 0.457 0.889\nvn  -0.327 -0.517 -0.791\nvn  0.146 0.988 -0.040\nvn  -0.522 -0.606 0.600\nvn  -0.221 0.474 0.853\nvn  0.393 0.902 0.176\nvn  0.189 0.527 -0.829\nvn  -0.448 -0.891 -0.080\nvn  -0.529 0.046 0.848\nvn  -0.296 0.921 -0.252\nvn  -0.151 0.008 -0.989\nvn  -0.967 0.003 -0.256\nvn  -0.714 0.242 -0.657\nvn  -0.826 -0.233 -0.514\nvn  -0.341 -0.771 -0.538\nvn  -0.876 -0.476 -0.081\nvn  -0.195 0.967 -0.166\nvn  -0.894 0.393 0.216\nvn  -0.502 0.426 -0.753\nvn  -0.415 -0.584 -0.698\nvn  -0.880 -0.367 -0.302\nvn  -0.182 0.969 -0.168\nvn  -0.906 0.417 0.080\nvn  0.529 -0.135 0.838\nvn  0.388 -0.162 0.907\nvn  0.333 -0.409 0.850\nvn  0.333 -0.215 0.918\nvn  0.365 -0.255 0.896\nvn  0.525 -0.231 0.819\nvn  -0.032 -0.064 0.997\nvn  -0.052 0.368 0.928\nvn  -0.177 -0.213 0.961\nvn  0.128 0.981 -0.149\nvn  -0.365 0.847 0.386\nvn  -0.374 0.794 -0.478\nvn  -0.659 0.593 -0.463\nvn  -0.369 0.814 -0.449\nvn  -0.382 0.769 -0.512\nvn  -0.500 0.797 -0.339\nvn  -0.273 0.868 -0.414\nvn  -0.892 0.397 -0.215\nvn  -0.404 0.856 -0.324\nvn  -0.722 0.610 -0.325\nvn  -0.523 0.764 0.378\nvn  -0.747 0.652 -0.130\nvn  -0.530 0.848 0.002\nvn  -0.558 0.739 0.378\nvn  -0.464 0.840 0.281\nvn  -0.583 0.744 -0.325\nvn  -0.336 0.315 -0.888\nvn  -0.648 -0.101 -0.755\nvn  -0.876 0.135 0.462\nvn  -0.855 0.322 -0.406\nvn  -0.166 -0.540 -0.825\nvn  -0.244 -0.596 -0.765\nvn  -0.102 -0.059 -0.993\nvn  -0.633 0.771 0.067\nvn  -0.381 0.542 0.749\nvn  -0.842 0.445 0.305\nvn  -0.488 0.871 0.060\nvn  -0.341 0.788 -0.513\nvn  -0.186 0.396 0.899\nvn  -0.748 0.154 -0.646\nvn  -0.239 0.149 -0.959\nvn  -0.470 0.880 -0.066\nvn  -0.182 0.890 -0.417\nvn  -0.242 0.894 -0.378\nvn  -0.013 0.483 -0.876\nvn  -0.795 0.592 -0.133\nvn  -0.967 -0.099 -0.233\nvn  -0.545 0.819 0.178\nvn  -0.235 -0.111 0.966\nvn  -0.541 0.822 -0.180\nvn  -0.616 0.704 0.353\nvn  -0.803 0.227 0.551\nvn  -0.777 0.623 -0.093\nvn  -0.600 0.354 0.718\nvn  -0.703 0.355 0.616\nvn  -0.710 0.597 -0.375\nvn  -0.649 0.269 0.712\nvn  -0.105 0.350 0.931\nvn  0.158 0.806 0.570\nvn  -0.578 0.471 0.666\nvn  -0.438 0.545 0.715\nvn  -0.667 0.534 0.520\nvn  -0.761 0.119 -0.637\nvn  -0.801 0.531 -0.275\nvn  0.052 -0.869 -0.491\nvn  0.023 0.716 0.698\nvn  -0.598 0.132 0.791\nvn  -0.574 0.153 0.804\nvn  -0.042 0.524 0.851\nvn  -0.597 0.098 0.796\nvn  -0.117 0.442 0.889\nvn  -0.013 0.584 0.812\nvn  0.298 0.498 0.815\nvn  0.265 0.334 0.904\nvn  0.009 0.950 0.313\nvn  0.175 0.757 0.630\nvn  -0.452 0.816 0.360\nvn  -0.413 0.084 0.907\nvn  0.100 0.680 0.727\nvn  -0.305 0.267 0.914\nvn  -0.540 0.575 0.615\nvn  -0.436 0.765 0.474\nvn  -0.688 0.274 0.671\nvn  -0.405 0.913 0.045\nvn  -0.749 0.643 -0.162\nvn  -0.967 -0.096 -0.234\nvn  -0.820 0.572 0.016\nvn  -0.672 0.325 -0.666\nvn  -0.604 0.460 -0.650\nvn  -0.609 0.502 0.614\nvn  -0.649 0.358 0.672\nvn  -0.891 0.451 -0.057\nvn  -0.239 0.864 -0.443\nvn  -0.820 0.316 -0.477\nvn  -0.457 0.855 -0.247\nvn  -0.768 0.630 0.119\nvn  -0.786 0.460 -0.413\nvn  -0.605 0.791 -0.085\nvn  -0.870 0.490 0.059\nvn  -0.961 0.022 -0.276\nvn  -0.979 -0.013 -0.205\nvn  -0.932 0.354 0.080\nvn  -0.485 0.716 0.502\nvn  -0.753 0.576 0.318\nvn  -0.670 0.713 0.205\nvn  0.079 0.489 0.869\nvn  0.344 0.130 0.930\nvn  -0.783 0.620 0.047\nvn  -0.889 0.100 -0.446\nvn  -0.561 0.753 0.345\nvn  -0.838 0.506 -0.202\nvn  -0.464 0.857 0.224\nvn  -0.053 0.693 0.719\nvn  0.760 -0.051 0.648\nvn  0.620 0.033 0.784\nvn  -0.756 0.584 -0.296\nvn  0.506 0.860 -0.069\nvn  -0.282 0.950 -0.133\nvn  -0.968 0.140 -0.206\nvn  -0.963 -0.112 -0.244\nvn  -0.871 -0.156 -0.467\nvn  -0.704 -0.499 -0.504\nvn  -0.279 0.642 0.715\nvn  -0.876 0.474 -0.089\nvn  -0.240 0.880 0.409\nvn  -0.293 0.897 0.331\nvn  0.349 0.032 0.937\nvn  0.416 0.656 0.629\nvn  -0.807 0.578 0.121\nvn  0.669 0.635 0.386\nvn  0.763 0.337 0.551\nvn  0.370 0.022 0.929\nvn  0.866 0.500 0.025\nvn  0.342 0.846 0.409\nvn  -0.846 0.150 -0.511\nvn  -0.309 0.919 0.244\nvn  -0.992 -0.128 -0.022\nvn  -0.867 0.499 0.006\nvn  -0.980 -0.118 0.159\nvn  -0.878 0.450 0.161\nvn  -0.831 0.520 0.198\nvn  -0.975 -0.136 0.178\nvn  -0.992 0.073 0.100\nvn  -0.840 0.536 0.082\nvn  -0.223 0.973 0.066\nvn  -0.962 -0.249 0.109\nvn  -0.840 -0.244 -0.484\nvn  -0.929 -0.255 -0.267\nvn  -0.489 -0.722 -0.490\nvn  -0.635 -0.735 0.237\nvn  -0.562 -0.763 -0.320\nvn  -0.628 -0.775 -0.074\nvn  -0.912 -0.238 -0.335\nvn  -0.787 -0.615 0.050\nvn  -0.643 -0.695 0.323\nvn  -0.466 -0.743 -0.480\nvn  -0.761 -0.219 -0.611\nvn  -0.282 -0.956 -0.087\nvn  -0.954 -0.280 0.106\nvn  0.768 -0.622 0.152\nvn  -0.996 -0.037 -0.081\nvn  0.369 -0.873 -0.318\nvn  -0.635 -0.671 -0.382\nvn  -0.997 -0.017 0.078\nvn  -0.201 -0.493 -0.846\nvn  0.028 -0.113 -0.993\nvn  0.192 -0.222 -0.956\nvn  -0.539 -0.213 -0.815\nvn  -0.916 0.312 -0.251\nvn  -0.275 -0.079 -0.958\nvn  -0.359 0.854 -0.376\nvn  0.222 0.460 -0.859\nvn  -0.995 -0.069 0.075\nvn  -0.694 -0.536 -0.481\nvn  0.166 -0.786 0.595\nvn  -0.992 -0.046 0.121\nvn  0.219 -0.922 -0.318\nvn  -0.711 -0.700 0.058\nvn  -0.636 -0.711 -0.300\nvn  -0.991 -0.047 -0.124\nvn  -0.495 -0.156 -0.855\nvn  -0.075 -0.446 -0.892\nvn  -0.077 0.401 -0.913\nvn  -0.348 -0.842 -0.413\nvn  -0.299 0.954 0.008\nvn  -0.086 0.405 -0.910\nvn  -0.766 -0.560 -0.315\nvn  -0.792 -0.486 -0.370\nvn  -0.180 -0.857 -0.482\nvn  0.885 -0.350 0.308\nvn  0.047 -0.871 0.489\nvn  0.572 -0.143 0.808\nvn  0.826 0.106 0.553\nvn  0.830 -0.349 0.435\nvn  0.789 -0.498 0.360\nvn  0.820 -0.428 0.379\nvn  0.193 -0.639 0.745\nvn  0.707 -0.504 0.495\nvn  0.226 -0.968 -0.113\nvn  -0.279 -0.862 -0.424\nvn  -0.013 -0.991 0.137\nvn  0.036 -0.985 -0.167\nvn  -0.130 -0.932 0.338\nvn  -0.162 -0.935 0.314\nvn  0.631 -0.713 0.306\nvn  0.430 -0.839 0.333\nvn  -0.146 0.982 0.120\nvn  0.947 0.268 0.179\nvn  0.988 0.145 0.053\nvn  0.558 0.807 0.194\nvn  0.943 0.323 0.076\nvn  0.913 -0.374 0.161\nvn  0.860 -0.317 0.400\nvn  0.764 -0.576 0.292\nvn  0.499 -0.864 0.063\nvn  0.565 -0.818 0.111\nvn  0.970 -0.190 0.149\nvn  -0.188 0.884 0.428\nvn  0.641 0.739 0.211\nvn  0.968 0.095 -0.233\nvn  -0.716 0.639 0.280\nvn  -0.429 0.755 0.495\nvn  -0.134 0.856 0.498\nvn  0.371 0.804 0.465\nvn  -0.925 0.283 -0.254\nvn  -0.342 0.820 0.459\nvn  0.389 0.835 0.389\nvn  -0.577 0.817 -0.010\nvn  0.207 0.953 0.222\nvn  -0.626 0.779 0.016\nvn  0.302 0.927 0.224\nvn  -0.586 0.729 0.354\nvn  0.269 0.804 0.530\nvn  -0.710 0.557 0.431\nvn  -0.838 0.361 0.410\nvn  0.643 0.454 0.616\nvn  -0.140 0.654 0.743\nvn  0.263 0.741 0.618\nvn  0.731 0.035 0.681\nvn  0.739 0.225 -0.635\nvn  0.957 0.021 0.288\nvn  0.926 0.264 0.270\nvn  0.978 -0.115 0.176\nvn  0.950 0.191 0.249\nvn  -0.961 -0.146 0.234\nvn  0.826 0.142 0.545\nvn  -0.226 0.528 0.818\nvn  -0.168 0.044 0.985\nvn  0.427 -0.230 -0.874\nvn  -0.005 -0.815 -0.579\nvn  -0.104 -0.928 -0.358\nvn  0.028 -0.783 -0.621\nvn  0.438 -0.758 -0.484\nvn  -0.942 0.064 0.329\nvn  -0.975 -0.181 0.127\nvn  -0.900 -0.342 -0.272\nvn  -0.765 -0.610 0.207\nvn  -0.290 0.917 -0.275\nvn  -0.611 0.783 0.111\nvn  -0.694 0.530 0.487\nvn  -0.581 0.813 -0.031\nvn  -0.502 0.852 0.150\nvn  -0.755 0.633 -0.170\nvn  -0.418 0.875 0.245\nvn  -0.222 0.905 -0.363\nvn  -0.323 0.642 0.696\nvn  -0.262 0.955 0.141\nvn  -0.075 0.930 0.359\nvn  -0.209 0.958 0.195\nvn  -0.654 0.751 -0.090\nvn  -0.672 0.701 -0.240\nvn  -0.354 0.929 0.110\nvn  -0.844 0.516 0.145\nvn  -0.279 0.942 0.187\nvn  -0.332 0.915 -0.228\nvn  -0.738 0.552 0.388\nvn  -0.678 0.423 0.601\nvn  -0.234 0.841 0.487\nvn  -0.755 0.605 0.250\nvn  -0.743 0.669 -0.016\nvn  -0.524 0.765 -0.374\nvn  -0.424 0.840 -0.339\nvn  -0.417 0.834 0.361\nvn  -0.575 0.809 0.123\nvn  -0.700 0.671 -0.245\nvn  -0.978 -0.153 -0.142\nvn  -0.979 -0.205 -0.017\nvn  -0.876 0.031 0.482\nvn  -0.982 0.170 -0.085\nvn  0.575 -0.772 -0.271\nvn  0.754 -0.582 -0.305\nvn  -0.368 -0.779 -0.508\nvn  -0.364 -0.856 -0.366\nvn  0.735 -0.678 0.008\nvn  -0.495 -0.842 -0.214\nvn  0.925 -0.375 0.059\nvn  -0.570 -0.759 -0.314\nvn  0.784 -0.620 -0.018\nvn  0.681 -0.723 0.113\nvn  -0.517 -0.842 -0.158\nvn  0.123 -0.920 0.372\nvn  0.887 0.255 -0.385\nvn  0.829 0.419 0.370\nvn  0.871 0.190 0.454\nvn  0.960 0.118 -0.255\nvn  0.702 0.411 0.582\nvn  0.877 0.298 -0.377\nvn  0.598 0.682 0.421\nvn  0.757 0.516 -0.400\nvn  0.590 0.781 -0.206\nvn  0.429 0.773 0.467\nvn  0.559 0.449 -0.697\nvn  0.186 -0.322 -0.928\nvn  0.045 -0.207 -0.977\nvn  0.094 -0.516 -0.851\nvn  0.724 0.690 0.017\nvn  0.372 0.420 0.828\nvn  0.618 0.186 -0.764\nvn  0.939 0.293 0.181\nvn  -0.026 -0.547 0.837\nvn  0.144 -0.743 -0.654\nvn  0.116 0.013 0.993\nvn  -0.061 0.116 0.991\nvn  -0.485 -0.857 -0.175\nvn  -0.469 -0.604 0.645\nvn  0.113 -0.993 -0.019\nvn  -0.023 -0.773 0.634\nvn  0.209 -0.793 -0.572\nvn  -0.015 -0.442 0.897\nvn  -0.612 -0.551 0.567\nvn  -0.665 -0.589 -0.459\nvn  0.059 -0.891 0.450\nvn  0.654 -0.755 0.051\nvn  0.893 0.120 0.435\nvn  0.046 -0.922 -0.385\nvn  0.645 -0.727 0.235\nvn  0.144 -0.981 -0.127\nvn  -0.280 0.675 0.683\nvn  -0.612 0.565 0.554\nvn  -0.804 0.488 0.341\nvn  0.091 0.685 0.723\nvn  -0.867 0.216 0.450\nvn  0.044 0.425 0.904\nvn  -0.824 -0.108 0.557\nvn  0.070 0.083 0.994\nvn  -0.843 -0.146 0.518\nvn  -0.061 0.020 0.998\nvn  -0.406 -0.266 0.875\nvn  -0.909 -0.384 0.164\nvn  0.443 -0.096 0.891\nvn  0.048 0.166 0.985\nvn  0.788 0.200 0.583\nvn  0.675 0.151 0.722\nvn  0.937 0.058 0.344\nvn  -0.303 -0.630 0.715\nvn  -0.762 -0.553 -0.337\nvn  0.766 -0.259 0.589\nvn  0.100 -0.980 0.172\nvn  -0.122 -0.060 -0.991\nvn  0.979 0.155 -0.132\nvn  -0.956 -0.145 -0.255\nvn  -0.889 -0.179 -0.421\nvn  -0.786 -0.317 -0.531\nvn  -0.899 -0.051 0.434\nvn  0.859 -0.066 -0.508\nvn  0.956 0.205 -0.211\nvn  0.008 0.026 -1.000\nvn  0.048 -0.202 -0.978\nvn  0.952 -0.091 -0.291\nvn  -0.015 -0.196 -0.981\nvn  -0.253 -0.479 -0.841\nvn  0.932 -0.288 -0.221\nvn  0.458 -0.888 0.035\nvn  0.592 -0.482 -0.647\nvn  -0.622 0.463 0.632\nvn  -0.822 0.392 0.414\nvn  -0.904 0.246 0.350\nvn  -0.054 0.455 0.889\nvn  -0.932 -0.041 0.360\nvn  -0.139 0.207 0.968\nvn  -0.717 -0.568 0.404\nvn  0.015 -0.354 0.935\nvn  -0.575 -0.750 0.326\nvn  0.247 -0.488 0.837\nvn  -0.070 -0.832 0.551\nvn  -0.609 -0.793 -0.006\nvn  0.561 -0.321 0.763\nvn  -0.193 0.040 0.980\nvn  0.677 0.078 0.732\nvn  0.788 0.202 0.581\nvn  0.863 0.257 0.434\nvn  0.007 -0.915 0.403\nvn  -0.535 -0.731 -0.424\nvn  0.795 -0.291 0.532\nvn  0.585 -0.308 -0.750\nvn  -0.907 -0.295 -0.300\nvn  -0.798 -0.283 -0.532\nvn  -0.729 -0.360 -0.582\nvn  -0.964 -0.264 -0.027\nvn  0.643 0.634 -0.430\nvn  0.681 0.698 -0.224\nvn  -0.142 0.495 -0.857\nvn  -0.188 0.288 -0.939\nvn  0.858 0.450 -0.247\nvn  -0.282 0.048 -0.958\nvn  -0.200 -0.266 -0.943\nvn  0.992 0.005 -0.123\nvn  0.339 -0.881 -0.329\nvn  0.412 -0.886 -0.213\nvn  -0.504 -0.544 -0.670\nvn  -0.418 -0.546 -0.726\nvn  -0.359 -0.847 -0.393\nvn  -0.925 0.134 -0.356\nvn  -0.810 0.330 0.485\nvn  -0.932 0.351 0.094\nvn  -0.917 0.325 0.233\nvn  -0.286 0.268 0.920\nvn  -0.934 -0.169 0.315\nvn  -0.223 -0.093 0.970\nvn  -0.876 -0.482 -0.007\nvn  -0.302 -0.508 0.807\nvn  -0.634 -0.757 -0.157\nvn  -0.085 -0.770 0.633\nvn  -0.078 -0.996 0.048\nvn  -0.399 -0.617 -0.678\nvn  0.402 -0.690 0.602\nvn  -0.091 -0.267 0.959\nvn  0.420 -0.047 0.906\nvn  0.494 -0.143 0.858\nvn  0.611 -0.030 0.791\nvn  0.231 -0.943 -0.239\nvn  -0.221 -0.377 -0.899\nvn  0.665 -0.409 0.625\nvn  0.840 0.271 -0.470\nvn  -0.791 -0.011 -0.612\nvn  -0.581 -0.062 -0.811\nvn  -0.372 0.073 -0.925\nvn  -0.819 -0.039 -0.573\nvn  0.504 0.662 0.554\nvn  0.767 0.543 0.343\nvn  0.149 0.782 -0.605\nvn  0.112 0.904 -0.413\nvn  0.693 0.564 0.450\nvn  -0.068 0.424 -0.903\nvn  0.224 -0.097 -0.970\nvn  0.883 -0.317 0.345\nvn  -0.141 -0.617 -0.774\nvn  -0.415 -0.828 -0.377\nvn  -0.420 -0.354 0.835\nvn  -0.266 0.155 0.951\nvn  0.210 0.575 0.790\nvn  0.502 0.103 0.859\nvn  0.362 0.532 0.765\nvn  -0.468 -0.654 -0.594\nvn  -0.438 -0.861 0.257\nvn  0.317 0.301 0.899\nvn  -0.011 0.362 0.932\nvn  -0.734 -0.461 -0.500\nvn  -0.363 -0.866 -0.345\nvn  -0.950 -0.156 -0.272\nvn  0.437 0.768 -0.468\nvn  -0.660 0.501 0.560\nvn  -0.992 -0.074 -0.103\nvn  -0.996 -0.083 0.024\nvn  -0.983 -0.010 -0.184\nvn  -0.956 0.119 -0.270\nvn  -0.762 0.404 0.506\nvn  -0.953 -0.185 -0.239\nvn  -0.794 0.524 0.307\nvn  -0.895 -0.233 -0.381\nvn  -0.348 -0.450 -0.823\nvn  -0.212 -0.264 -0.941\nvn  0.018 -0.306 -0.952\nvn  0.117 -0.065 -0.991\nvn  0.924 -0.014 -0.383\nvn  0.916 0.065 -0.397\nvn  0.491 0.704 -0.513\nvn  0.794 0.405 -0.453\nvn  -0.045 0.991 0.126\nvn  0.493 0.828 0.268\nvn  0.420 0.896 0.142\nvn  0.893 0.414 0.179\nvn  0.781 0.497 0.378\nvn  0.587 -0.233 -0.775\nvn  -0.203 0.860 0.468\nvn  0.190 0.722 0.665\nvn  -0.086 0.719 0.690\nvn  -0.390 0.532 -0.752\nvn  -0.519 -0.418 -0.745\nvn  -0.257 -0.964 -0.073\nvn  -0.689 -0.568 -0.451\nvn  -0.695 -0.688 -0.210\nvn  -0.497 -0.339 0.799\nvn  -0.696 -0.701 0.155\nvn  -0.676 -0.188 0.712\nvn  -0.439 -0.195 0.877\nvn  -0.581 -0.375 0.723\nvn  -0.760 -0.649 -0.025\nvn  -0.719 -0.544 -0.433\nvn  -0.729 0.042 0.684\nvn  -0.531 -0.641 0.554\nvn  -0.588 -0.069 0.806\nvn  -0.864 -0.067 0.499\nvn  -0.798 -0.460 0.389\nvn  -0.524 -0.290 0.801\nvn  -0.811 -0.535 0.236\nvn  -0.521 -0.606 0.601\nvn  -0.627 -0.631 0.458\nvn  -0.683 -0.703 0.200\nvn  -0.439 -0.787 0.433\nvn  -0.375 -0.817 0.438\nvn  -0.298 -0.397 0.868\nvn  -0.377 -0.065 0.924\nvn  -0.533 -0.169 0.829\nvn  -0.794 -0.381 0.473\nvn  -0.148 0.250 0.957\nvn  -0.138 0.216 0.967\nvn  -0.619 -0.288 0.730\nvn  -0.007 -0.217 0.976\nvn  -0.153 -0.371 0.916\nvn  -0.319 0.137 0.938\nvn  -0.173 -0.112 0.979\nvn  -0.051 -0.075 0.996\nvn  -0.300 -0.084 0.950\nvn  -0.447 -0.392 0.804\nvn  -0.048 -0.087 0.995\nvn  -0.338 -0.813 0.475\nvn  -0.023 -0.362 0.932\nvn  -0.610 -0.662 0.436\nvn  -0.014 0.346 0.938\nvn  -0.422 -0.114 0.899\nvn  -0.609 -0.439 0.660\nvn  -0.179 0.377 0.908\nvn  -0.554 -0.205 0.807\nvn  -0.054 0.377 0.925\nvn  -0.904 0.033 -0.426\nvn  -0.899 0.432 -0.071\nvn  -0.524 -0.007 0.852\nvn  -0.176 -0.181 0.968\nvn  -0.188 0.036 0.982\nvn  0.075 -0.594 0.801\nvn  -0.218 -0.188 0.958\nvn  -0.068 -0.524 0.849\nvn  -0.331 -0.304 0.893\nvn  -0.073 -0.388 0.919\nvn  -0.131 -0.286 0.949\nvn  -0.468 -0.176 0.866\nvn  0.102 -0.104 0.989\nvn  0.449 -0.241 0.860\nvn  -0.092 0.074 0.993\nvn  0.093 -0.660 0.745\nvn  -0.114 -0.011 0.993\nvn  -0.805 0.575 0.148\nvn  -0.842 0.455 0.289\nvn  -0.381 -0.103 -0.919\nvn  -0.934 0.167 0.317\nvn  -0.107 -0.902 -0.417\nvn  -0.778 -0.212 0.592\nvn  0.063 -0.994 0.088\nvn  -0.590 -0.212 0.779\nvn  0.025 -0.104 0.994\nvn  -0.114 -0.969 0.217\nvn  -0.407 -0.064 0.911\nvn  -0.272 -0.114 0.955\nvn  -0.540 -0.178 0.823\nvn  0.012 0.452 0.892\nvn  -0.746 0.276 0.606\nvn  0.654 0.683 0.324\nvn  0.212 0.928 0.305\nvn  0.165 -0.687 -0.707\nvn  -0.767 -0.463 0.444\nvn  -0.823 -0.291 0.488\nvn  0.486 -0.781 -0.392\nvn  -0.734 -0.389 0.557\nvn  -0.482 -0.809 -0.337\nvn  -0.199 0.798 0.569\nvn  -0.419 0.850 0.319\nvn  -0.631 0.773 -0.067\nvn  -0.453 0.379 -0.807\nvn  0.278 0.862 -0.423\nvn  0.055 0.995 -0.078\nvn  0.457 0.238 -0.857\nvn  0.206 0.606 -0.768\nvn  0.602 -0.712 -0.363\nvn  -0.811 -0.274 0.517\nvn  -0.692 0.203 0.692\nvn  0.486 0.844 -0.226\nvn  0.191 0.904 0.383\nvn  0.007 0.698 0.716\nvn  -0.374 0.316 0.872\nvn  -0.996 0.091 0.019\nvn  -0.292 0.956 -0.021\nvn  -0.313 0.883 0.351\nvn  0.003 0.659 0.752\nvn  -0.279 0.382 0.881\nvn  -0.398 0.325 0.858\nvn  0.214 0.751 0.625\nvn  -0.564 0.750 0.344\nvn  -0.660 0.456 0.596\nvn  -0.843 -0.281 -0.459\nvn  -0.909 -0.092 -0.407\nvn  -0.789 -0.068 0.611\nvn  -0.852 0.114 0.512\nvn  -0.518 -0.545 0.660\nvn  -0.369 -0.335 0.867\nvn  0.462 -0.585 -0.667\nvn  0.734 -0.677 0.056\nvn  -0.049 -0.573 -0.818\nvn  0.816 -0.403 -0.414\nvn  0.390 -0.494 -0.777\nvn  0.777 -0.413 -0.476\nvn  0.725 -0.245 -0.643\nvn  0.208 -0.969 0.130\nvn  0.672 -0.229 -0.704\nvn  0.058 0.853 0.519\nvn  0.916 -0.274 0.293\nvn  0.445 -0.063 0.893\nvn  0.223 -0.971 0.082\nvn  -0.263 -0.619 -0.740\nvn  -0.693 -0.714 -0.104\nvn  -0.847 -0.529 0.039\nvn  -0.100 -0.897 -0.431\nvn  -0.829 -0.550 0.104\nvn  -0.805 -0.549 0.226\nvn  -0.271 -0.851 0.449\nvn  -0.114 -0.814 0.569\nvn  -0.604 -0.735 0.308\nvn  -0.111 -0.989 -0.101\nvn  -0.639 -0.293 -0.711\nvn  -0.215 -0.838 -0.502\nvn  -0.498 -0.864 0.072\nvn  -0.783 -0.405 -0.471\nvn  -0.231 -0.861 0.453\nvn  -0.472 -0.871 0.134\nvn  -0.221 -0.961 -0.166\nvn  -0.655 -0.288 -0.698\nvn  -0.047 -0.428 -0.902\nvn  -0.541 -0.441 -0.716\nvn  -0.621 -0.609 -0.494\nvn  0.577 0.806 0.132\nvn  0.588 0.804 0.092\nvn  0.588 -0.246 0.771\nvn  0.743 -0.174 0.646\nvn  0.903 -0.254 0.347\nvn  0.256 -0.796 0.549\nvn  0.346 0.168 0.923\nvn  0.468 -0.041 0.883\nvn  0.570 0.233 0.788\nvn  0.431 0.129 0.893\nvn  0.121 -0.979 0.164\nvn  0.699 -0.710 0.092\nvn  0.085 -0.982 0.169\nvn  0.083 -0.987 0.138\nvn  0.055 -0.984 -0.169\nvn  0.438 0.296 0.849\nvn  0.779 0.186 0.599\nvn  0.912 0.409 0.023\nvn  0.329 0.590 0.738\nvn  0.433 0.340 0.835\nvn  0.914 0.405 0.031\nvn  0.977 0.213 0.009\nvn  0.870 -0.105 -0.482\nvn  0.965 -0.031 0.260\nvn  0.915 0.343 0.212\nvn  0.978 -0.142 -0.154\nvn  0.840 0.488 0.236\nvn  0.593 0.442 0.673\nvn  0.795 -0.235 0.559\nvn  0.602 0.525 0.601\nvn  0.676 0.328 0.659\nvn  0.779 -0.407 0.478\nvn  0.653 -0.265 0.709\nvn  0.707 -0.205 0.677\nvn  0.870 -0.491 0.050\nvn  0.690 0.722 -0.052\nvn  0.770 -0.098 0.630\nvn  0.866 0.469 0.171\nvn  0.994 -0.098 0.043\nvn  0.876 -0.451 0.168\nvn  0.919 -0.380 -0.110\nvn  0.944 0.310 -0.112\nvn  0.827 -0.092 0.554\nvn  0.872 -0.489 -0.013\nvn  0.973 0.201 0.111\nvn  0.934 0.103 0.342\nvn  0.962 0.269 0.049\nvn  0.960 -0.212 -0.185\nvn  0.996 0.089 -0.019\nvn  0.970 -0.212 0.117\nvn  0.917 -0.333 0.219\nvn  0.789 -0.347 0.507\nvn  0.968 0.147 0.202\nvn  0.987 0.035 0.154\nvn  0.949 0.179 0.260\nvn  -0.466 0.559 0.685\nvn  -0.708 0.420 0.569\nvn  -0.876 0.301 -0.377\nvn  -0.864 -0.276 -0.421\nvn  -0.669 -0.732 0.126\nvn  0.416 -0.566 0.712\nvn  0.969 0.124 0.212\nvn  0.775 0.607 -0.177\nvn  0.705 -0.345 0.619\nvn  0.916 -0.400 0.036\nvn  0.856 -0.107 -0.506\nvn  0.993 0.066 -0.102\nvn  0.479 0.656 -0.583\nvn  0.413 -0.041 0.910\nvn  0.048 -0.245 0.968\nvn  0.405 0.076 0.911\nvn  0.148 -0.245 0.958\nvn  0.292 0.082 0.953\nvn  0.736 0.218 0.641\nvn  0.697 0.428 0.575\nvn  0.888 0.333 0.317\nvn  0.582 0.159 0.798\nvn  0.593 0.315 0.741\nvn  0.689 0.375 0.620\nvn  0.305 -0.046 0.951\nvn  -0.172 0.914 0.367\nvn  0.026 -0.071 0.997\nvn  0.122 -0.325 0.938\nvn  0.051 -0.132 0.990\nvn  -0.393 -0.478 0.785\nvn  -0.386 -0.514 0.766\nvn  -0.234 0.062 0.970\nvn  -0.274 -0.489 0.828\nvn  0.342 0.588 0.733\nvn  0.298 0.049 0.953\nvn  -0.010 -0.292 0.956\nvn  0.948 -0.137 0.287\nvn  -0.044 -0.666 0.744\nvn  0.459 0.498 0.736\nvn  0.833 0.478 0.277\nvn  0.858 -0.467 0.215\nvn  0.831 -0.492 0.260\nvn  0.504 0.726 0.468\nvn  0.528 0.180 0.830\nvn  0.944 0.327 0.050\nvn  0.827 0.340 0.447\nvn  0.981 0.179 0.071\nvn  0.855 0.508 0.101\nvn  0.844 0.247 0.476\nvn  0.538 0.571 -0.619\nvn  -0.609 -0.338 0.718\nvn  0.125 0.473 0.872\nvn  0.892 0.182 0.414\nvn  -0.232 -0.900 0.369\nvn  0.700 -0.698 0.152\nvn  0.445 -0.079 0.892\nvn  0.061 -0.984 0.168\nvn  -0.233 -0.726 0.647\nvn  0.533 -0.626 0.569\nvn  0.546 -0.221 0.808\nvn  0.162 -0.960 0.228\nvn  0.477 -0.878 0.045\nvn  0.111 -0.974 0.197\nvn  0.987 0.127 -0.098\nvn  0.706 0.411 0.576\nvn  0.903 -0.377 0.204\nvn  -0.488 -0.488 0.724\nvn  0.101 -0.247 0.964\nvn  -0.125 -0.953 0.275\nvn  -0.255 -0.912 0.321\nvn  -0.698 -0.105 0.708\nvn  -0.626 -0.702 0.339\nvn  0.700 -0.662 -0.269\nvn  0.182 0.169 -0.969\nvn  0.696 -0.284 -0.660\nvn  0.796 0.605 -0.005\nvn  0.966 -0.233 -0.114\nvn  0.955 -0.278 -0.100\nvn  0.747 -0.664 -0.030\nvn  0.904 0.215 0.370\nvn  -0.211 -0.271 0.939\nvn  -0.445 0.386 0.808\nvn  -0.351 -0.500 0.792\nvn  -0.633 -0.011 0.774\nvn  -0.949 0.132 0.285\nvn  -0.474 -0.177 0.862\nvn  -0.537 -0.128 0.834\nvn  -0.443 -0.053 -0.895\nvn  0.137 0.388 -0.911\nvn  0.899 0.438 0.017\nvn  0.826 0.267 -0.497\nvn  0.189 -0.679 -0.709\nvn  0.729 -0.212 -0.651\nvn  -0.337 0.429 0.838\nvn  -0.564 -0.582 0.587\nvn  0.107 -0.317 0.942\nvn  -0.180 -0.649 0.739\nvn  -0.079 -0.358 0.930\nvn  -0.317 -0.550 0.773\nvn  0.800 0.460 -0.385\nvn  0.971 0.211 0.114\nvn  0.963 0.192 -0.189\nvn  -0.369 -0.086 -0.925\nvn  -0.687 0.327 -0.650\nvn  -0.842 -0.453 -0.292\nvn  -0.818 -0.538 -0.203\nvn  -0.817 -0.551 0.169\nvn  -0.777 -0.567 0.273\nvn  -0.623 -0.600 0.501\nvn  -0.760 -0.590 0.273\nvn  -0.907 -0.422 0.006\nvn  0.287 0.840 -0.460\nvn  -0.722 0.671 -0.167\nvn  -0.930 0.360 0.077\nvn  0.198 0.786 -0.585\nvn  -0.612 0.743 -0.271\nvn  0.050 0.963 -0.266\nvn  -0.630 0.777 0.014\nvn  -0.403 0.869 -0.287\nvn  0.486 0.560 -0.671\nvn  0.808 0.308 -0.503\nvn  0.840 0.398 -0.368\nvn  0.806 0.537 -0.250\nvn  0.931 -0.070 -0.359\nvn  0.785 0.305 -0.539\nvn  0.983 -0.064 -0.174\nvn  0.920 -0.379 -0.098\nvn  0.421 -0.901 0.106\nvn  -0.194 -0.929 0.315\nvn  -0.633 -0.727 0.267\nvn  -0.486 -0.828 0.279\nvn  -0.906 -0.342 0.248\nvn  -0.981 0.184 -0.063\nvn  -0.084 0.671 -0.737\nvn  -0.726 -0.375 -0.577\nvn  -0.984 -0.082 -0.158\nvn  -0.979 0.178 0.098\nvn  -0.850 -0.476 0.226\nvn  0.884 -0.431 -0.182\nvn  0.400 -0.916 -0.009\nvn  -0.768 -0.630 0.119\nvn  0.931 -0.361 -0.061\nvn  -0.174 -0.960 0.218\nvn  -0.491 -0.715 0.498\nvn  -0.269 -0.945 0.186\nvn  -0.966 -0.257 -0.034\nvn  -0.646 -0.453 -0.614\nvn  -0.910 0.386 -0.148\nvn  0.273 -0.085 -0.958\nvn  0.615 0.150 -0.774\nvn  -0.169 -0.327 -0.930\nvn  0.454 -0.524 0.721\nvn  0.988 0.132 0.081\nvn  0.895 0.354 -0.270\nvn  0.167 0.390 -0.906\nvn  0.680 0.559 -0.474\nvn  -0.738 0.184 -0.649\nvn  0.244 0.826 -0.509\nvn  -0.310 0.242 -0.919\nvn  -0.390 0.788 -0.477\nvn  -0.408 0.037 0.912\nvn  -0.923 -0.304 0.236\nvn  -0.694 -0.047 0.718\nvn  -0.939 -0.335 0.074\nvn  -0.508 -0.692 -0.513\nvn  -0.617 -0.709 -0.340\nvn  -0.287 -0.659 -0.696\nvn  -0.487 -0.761 -0.428\nvn  -0.733 -0.679 -0.034\nvn  -0.699 -0.454 0.552\nvn  -0.400 0.038 0.916\nvn  -0.630 -0.156 0.761\nvn  -0.381 0.058 0.923\nvn  -0.794 -0.595 0.126\nvn  -0.757 -0.587 -0.288\nvn  -0.459 -0.877 0.144\nvn  -0.346 -0.499 0.795\nvn  -0.854 -0.516 -0.063\nvn  -0.537 -0.739 0.406\nvn  -0.513 -0.287 0.809\nvn  -0.980 -0.136 0.147\nvn  -0.565 -0.728 -0.388\nvn  -0.608 -0.787 -0.107\nvn  0.148 -0.309 -0.939\nvn  0.682 0.098 -0.724\nvn  0.638 0.177 -0.749\nvn  0.908 0.411 -0.080\nvn  0.853 0.477 -0.214\nvn  0.591 0.779 0.209\nvn  0.715 0.442 0.541\nvn  0.543 0.647 0.535\nvn  0.652 0.553 -0.519\nvn  -0.038 -0.069 -0.997\nvn  -0.001 -0.321 -0.947\nvn  -0.013 0.428 0.904\nvn  -0.272 0.154 0.950\nvn  0.064 0.745 0.665\nvn  0.521 0.853 0.028\nvn  -0.299 0.859 0.415\nvn  0.380 0.889 -0.257\nvn  -0.502 0.842 0.197\nvn  0.564 0.817 -0.119\nvn  -0.478 0.762 0.436\nvn  0.792 0.494 0.359\nvn  -0.271 0.412 0.870\nvn  0.756 0.580 0.302\nvn  0.946 0.324 0.005\nvn  -0.399 0.421 0.815\nvn  0.787 -0.467 -0.402\nvn  -0.681 -0.437 0.588\nvn  -0.112 -0.977 -0.179\nvn  0.416 0.712 0.565\nvn  -0.385 0.428 0.818\nvn  0.568 0.303 0.765\nvn  0.556 -0.332 0.762\nvn  -0.456 -0.095 0.885\nvn  -0.870 -0.010 0.494\nvn  -0.095 0.609 0.788\nvn  -0.117 0.770 0.627\nvn  0.951 0.285 -0.119\nvn  0.873 0.269 -0.407\nvn  -0.848 0.073 0.525\nvn  -0.912 -0.301 0.280\nvn  -0.624 -0.610 0.488\nvn  0.896 -0.054 -0.440\nvn  -0.002 -0.866 -0.500\nvn  -0.092 -0.940 -0.330\nvn  -0.072 -0.983 -0.169\nvn  0.268 -0.957 0.108\nvn  0.989 -0.123 -0.086\nvn  0.765 -0.536 -0.358\nvn  -0.696 -0.268 0.666\nvn  -0.530 -0.646 -0.550\nvn  0.770 -0.413 -0.486\nvn  -0.726 0.687 -0.030\nvn  -0.323 0.940 -0.109\nvn  0.412 0.830 -0.377\nvn  -0.891 0.391 0.232\nvn  -0.959 -0.215 0.183\nvn  0.684 0.139 -0.716\nvn  0.317 0.788 -0.527\nvn  0.685 0.676 0.273\nvn  -0.698 -0.522 0.491\nvn  0.940 -0.300 -0.162\nvn  0.829 -0.265 -0.492\nvn  0.140 -0.983 -0.117\nvn  -0.715 -0.558 0.420\nvn  0.109 -0.795 0.596\nvn  0.817 -0.577 0.015\nvn  0.262 -0.937 0.231\nvn  0.106 0.711 -0.695\nvn  -0.052 0.858 0.510\nvn  0.239 0.689 -0.684\nvn  -0.046 0.905 0.422\nvn  0.611 0.538 -0.581\nvn  0.367 0.735 0.570\nvn  0.586 0.503 -0.635\nvn  0.412 0.725 0.552\nvn  0.750 0.657 -0.070\nvn  0.319 0.607 0.728\nvn  0.972 0.219 0.087\nvn  0.037 -0.106 0.994\nvn  0.714 0.224 -0.663\nvn  0.233 -0.743 -0.628\nvn  0.409 -0.841 0.355\nvn  0.321 -0.303 -0.897\nvn  0.109 -0.270 -0.957\nvn  0.321 -0.356 -0.878\nvn  -0.207 -0.114 0.972\nvn  -0.169 0.266 0.949\nvn  -0.026 0.243 0.970\nvn  -0.397 -0.183 0.899\nvn  -0.471 -0.880 -0.055\nvn  -0.463 -0.858 -0.222\nvn  -0.325 -0.919 0.223\nvn  -0.058 -0.994 0.088\nvn  -0.092 0.002 0.996\nvn  0.157 -0.627 -0.763\nvn  -0.529 -0.797 0.290\nvn  0.140 -0.988 -0.070\nvn  -0.192 -0.377 0.906\nvn  0.518 -0.277 0.809\nvn  0.346 0.214 -0.913\nvn  0.231 -0.299 -0.926\nvn  0.310 -0.509 -0.803\nvn  -0.766 -0.495 -0.411\nvn  -0.585 -0.689 -0.428\nvn  -0.005 -0.993 -0.114\nvn  -0.670 -0.731 -0.133\nvn  -0.328 -0.769 -0.548\nvn  -0.319 -0.771 -0.551\nvn  0.180 -0.571 -0.801\nvn  0.378 -0.923 -0.065\nvn  -0.796 -0.558 -0.236\nvn  -0.636 0.485 0.600\nvn  -0.956 -0.051 0.288\nvn  -0.925 0.273 0.264\nvn  -0.972 0.039 0.230\nvn  -0.413 0.876 0.250\nvn  -0.754 -0.442 -0.487\nvn  0.563 0.751 0.345\nvn  0.458 0.870 0.183\nvn  -0.648 0.750 0.133\nvn  -0.705 0.589 0.396\nvn  0.533 0.774 0.341\nvn  -0.662 0.547 0.513\nvn  0.617 0.605 0.503\nvn  -0.142 0.575 0.805\nvn  0.757 0.384 0.529\nvn  -0.011 0.114 0.993\nvn  0.925 -0.288 0.248\nvn  0.099 -0.929 0.357\nvn  -0.852 0.152 0.502\nvn  -0.753 -0.653 0.083\nvn  -0.982 -0.118 0.148\nvn  -0.944 -0.255 -0.211\nvn  0.895 -0.444 0.048\nvn  0.938 -0.241 -0.250\nvn  0.959 0.257 0.118\nvn  0.941 -0.330 -0.080\nvn  0.006 -0.787 -0.617\nvn  -0.862 -0.505 0.044\nvn  -0.059 -0.697 -0.715\nvn  0.205 -0.964 -0.168\nvn  0.029 -0.999 0.046\nvn  0.933 -0.187 0.307\nvn  -0.771 -0.510 0.381\nvn  0.395 -0.725 -0.565\nvn  -0.070 -0.986 -0.150\nvn  0.393 -0.253 0.884\nvn  -0.721 -0.559 0.410\nvn  -0.026 -0.960 0.280\nvn  0.257 -0.844 0.470\nvn  -0.742 0.471 0.477\nvn  0.402 0.685 0.608\nvn  0.407 0.415 0.814\nvn  0.736 0.551 0.393\nvn  0.620 0.767 0.164\nvn  0.467 -0.213 -0.858\nvn  0.860 -0.422 -0.286\nvn  0.807 -0.531 -0.259\nvn  0.552 -0.343 -0.760\nvn  0.087 -0.188 -0.978\nvn  -0.504 0.019 -0.864\nvn  -0.899 0.184 -0.398\nvn  -0.902 0.335 0.274\nvn  0.677 -0.120 -0.726\nvn  -0.042 0.264 -0.964\nvn  -0.458 0.526 -0.717\nvn  -0.653 0.682 -0.330\nvn  -0.561 0.813 0.157\nvn  0.750 -0.276 -0.601\nvn  0.439 -0.264 -0.859\nvn  0.717 -0.321 -0.619\nvn  -0.157 -0.570 -0.806\nvn  -0.102 0.462 -0.881\nvn  0.786 -0.358 -0.504\nvn  0.751 -0.081 -0.655\nvn  0.383 0.336 -0.861\nvn  0.890 0.065 -0.451\nvn  0.890 -0.353 -0.290\nvn  0.807 -0.022 -0.590\nvn  -0.116 0.674 -0.729\nvn  0.721 0.127 -0.681\nvn  0.541 -0.092 -0.836\nvn  0.319 0.748 -0.582\nvn  -0.324 -0.780 -0.536\nvn  -0.286 0.012 -0.958\nvn  0.374 -0.068 -0.925\nvn  -0.200 0.006 -0.980\nvn  -0.339 0.919 -0.201\nvn  -0.891 0.321 -0.320\nvn  0.314 0.090 -0.945\nvn  0.630 -0.161 -0.760\nvn  -0.079 0.497 -0.864\nvn  0.536 0.300 -0.789\nvn  0.905 0.134 -0.405\nvn  -0.101 -0.380 -0.920\nvn  0.461 -0.518 -0.720\nvn  0.191 -0.114 -0.975\nvn  0.651 0.412 -0.638\nvn  0.415 0.422 -0.806\nvn  0.746 0.547 -0.380\nvn  -0.077 0.837 -0.541\nvn  -0.732 0.580 -0.359\nvn  -0.696 -0.462 -0.549\nvn  -0.333 0.327 -0.884\nvn  -0.535 0.309 -0.787\nvn  0.573 -0.178 -0.800\nvn  0.608 0.411 -0.679\nvn  0.590 0.030 -0.807\nvn  -0.176 0.887 -0.427\nvn  0.825 0.255 -0.505\nvn  -0.533 0.689 -0.492\nvn  -0.561 0.084 -0.823\nvn  0.292 0.016 -0.956\nvn  -0.605 0.346 -0.717\nvn  0.367 0.130 -0.921\nvn  0.094 0.467 -0.879\nvn  -0.531 0.731 -0.429\nvn  0.642 0.040 -0.765\nvn  0.442 0.194 -0.875\nvn  0.602 0.536 -0.593\nvn  0.474 0.218 -0.853\nvn  -0.633 0.479 -0.608\nvn  0.241 0.126 -0.962\nvn  -0.486 0.596 -0.639\nvn  -0.950 0.195 -0.245\nvn  0.992 -0.072 -0.104\nvn  0.677 0.736 -0.020\nvn  0.961 0.143 -0.237\nvn  0.119 0.376 -0.919\nvn  0.829 0.548 -0.110\nvn  0.816 0.064 -0.575\nvn  0.246 0.228 -0.942\nvn  0.462 0.846 -0.268\nvn  0.887 0.019 -0.462\nvn  0.866 0.383 -0.322\nvn  0.458 -0.515 -0.725\nvn  0.684 0.213 -0.698\nvn  0.484 0.021 -0.875\nvn  0.556 0.369 -0.745\nvn  -0.236 0.834 -0.499\nvn  0.450 0.753 -0.479\nvn  -0.349 0.819 -0.455\nvn  -0.293 0.956 -0.014\nvn  0.241 0.647 -0.723\nvn  0.447 0.893 -0.051\nvn  -0.345 0.442 -0.828\nvn  -0.447 0.894 0.020\nvn  0.044 0.980 0.196\nvn  0.043 0.987 0.154\nvn  0.400 0.915 0.056\nvn  0.794 0.531 0.296\nvn  0.856 0.238 0.458\nvn  0.835 0.451 0.317\nvn  0.467 0.705 0.534\nvn  0.958 0.271 0.088\nvn  0.995 -0.004 0.099\nvn  0.905 -0.401 -0.140\nvn  0.635 0.641 -0.431\nvn  0.887 -0.074 -0.457\nvn  0.800 -0.469 -0.374\nvn  0.166 -0.549 -0.819\nvn  0.483 -0.407 -0.775\nvn  0.878 -0.219 -0.426\nvn  0.706 -0.453 -0.544\nvn  -0.067 -0.633 -0.772\nvn  0.305 -0.406 -0.862\nvn  -0.309 0.541 -0.782\nvn  -0.151 -0.420 -0.895\nvn  -0.298 -0.737 -0.607\nvn  0.297 -0.259 -0.919\nvn  -0.699 -0.466 -0.543\nvn  0.431 -0.420 -0.799\nvn  -0.614 0.162 -0.772\nvn  0.113 0.993 -0.025\nvn  -0.090 0.966 0.241\nvn  -0.412 0.906 0.096\nvn  -0.091 0.802 -0.590\nvn  -0.259 -0.776 -0.576\nvn  -0.438 -0.339 -0.833\nvn  0.096 -0.522 -0.847\nvn  0.217 -0.274 -0.937\nvn  -0.712 -0.242 -0.659\nvn  -0.726 -0.485 -0.487\nvn  -0.497 0.132 -0.857\nvn  -0.543 -0.538 -0.645\nvn  0.601 0.583 -0.546\nvn  -0.558 -0.059 -0.828\nvn  0.215 -0.267 -0.939\nvn  -0.283 -0.716 -0.638\nvn  0.543 -0.603 -0.585\nvn  0.914 -0.143 -0.379\nvn  0.091 -0.820 -0.565\nvn  -0.940 -0.142 -0.311\nvn  0.992 -0.075 -0.097\nvn  -0.422 0.195 -0.885\nvn  -0.994 -0.065 0.083\nvn  0.749 0.271 -0.604\nvn  0.258 -0.852 -0.456\nvn  -0.973 -0.185 -0.137\nvn  0.980 0.047 -0.192\nvn  -0.054 -0.867 -0.496\nvn  0.902 0.430 -0.026\nvn  -0.634 0.761 0.139\nvn  0.457 0.840 0.294\nvn  -0.241 0.967 -0.081\nvn  -0.511 0.845 0.161\nvn  0.460 0.886 0.059\nvn  -0.614 0.759 0.217\nvn  -0.977 0.002 -0.214\nvn  0.311 0.900 0.307\nvn  -0.026 -0.067 -0.997\nvn  -0.572 -0.451 -0.685\nvn  -0.876 0.262 -0.404\nvn  -0.548 0.212 -0.809\nvn  0.550 -0.536 -0.640\nvn  -0.244 -0.674 -0.697\nvn  -0.788 -0.252 -0.562\nvn  0.246 0.298 -0.922\nvn  0.991 0.134 0.028\nvn  -0.000 -0.690 -0.724\nvn  -0.815 -0.192 -0.547\nvn  0.993 0.026 0.117\nvn  -0.821 0.568 0.059\nvn  -0.697 0.641 -0.321\nvn  0.463 0.762 0.452\nvn  -0.293 0.810 0.509\nvn  0.040 0.963 -0.267\nvn  -0.060 0.861 -0.504\nvn  -0.627 0.764 -0.152\nvn  -0.895 0.375 -0.242\nvn  -0.259 0.926 0.274\nvn  0.025 0.955 -0.297\nvn  -0.819 0.276 -0.503\nvn  0.050 0.823 0.565\nvn  -0.282 0.783 -0.554\nvn  0.256 0.866 0.431\nvn  0.384 0.913 0.137\nvn  -0.077 0.865 -0.496\nvn  0.810 0.556 0.184\nvn  -0.105 0.921 -0.376\nvn  -0.404 0.849 -0.341\nvn  0.241 0.782 -0.574\nvn  0.815 -0.465 -0.346\nvn  0.511 0.630 0.585\nvn  0.134 -0.636 -0.760\nvn  -0.776 -0.238 -0.583\nvn  1.000 0.012 -0.021\nvn  -0.865 0.490 0.109\nvn  0.787 -0.416 -0.456\nvn  0.707 0.558 0.435\nvn  -0.448 -0.533 -0.718\nvn  -0.292 0.929 0.227\nvn  0.874 -0.417 -0.248\nvn  0.752 0.605 0.261\nvn  -0.195 0.823 0.534\nvn  -0.912 0.377 -0.160\nvn  0.300 -0.789 -0.535\nvn  0.967 0.248 -0.061\nvn  -0.270 0.925 -0.268\nvn  -0.801 -0.080 -0.593\nvn  0.202 0.161 -0.966\nvn  -0.307 0.273 -0.912\nvn  -0.114 -0.164 -0.980\nvn  0.313 -0.473 -0.824\nvn  0.546 0.482 -0.686\nvn  0.143 -0.305 -0.942\nvn  0.421 0.511 -0.750\nvn  0.590 0.776 0.224\nvn  -0.333 0.926 0.176\nvn  0.352 0.935 -0.048\nvn  -0.211 0.654 -0.727\nvn  -0.354 0.822 -0.445\nvn  -0.213 0.835 -0.508\nvn  0.132 0.546 -0.827\nvn  -0.259 0.880 -0.399\nvn  -0.074 0.707 -0.703\nvn  0.417 0.892 -0.176\nvn  0.087 0.772 -0.629\nvn  0.027 0.933 -0.359\nvn  0.495 0.839 -0.228\nvn  0.430 0.770 -0.472\nvn  -0.205 0.802 -0.561\nvn  -0.704 0.262 -0.660\nvn  -0.260 -0.116 -0.959\nvn  0.785 0.297 -0.544\nvn  -0.026 0.384 -0.923\nvn  -0.624 -0.481 -0.616\nvn  -0.451 -0.607 -0.654\nvn  -0.817 -0.160 -0.555\nvn  0.208 0.878 -0.431\nvn  0.584 0.810 0.048\nvn  0.559 0.622 -0.548\nvn  -0.086 0.886 -0.456\nvn  0.818 0.449 -0.359\nvn  0.329 0.471 -0.818\nvn  -0.217 0.651 -0.727\nvn  0.164 0.975 -0.152\nvn  -0.370 0.879 -0.302\nvn  -0.158 0.480 -0.863\nvn  0.939 0.206 -0.275\nvn  0.821 0.475 -0.317\nvn  0.064 0.560 -0.826\nvn  0.644 0.675 -0.358\nvn  -0.071 0.884 -0.461\nvn  0.407 0.872 -0.271\nvn  0.761 0.607 -0.229\nvn  0.088 0.789 -0.608\nvn  0.784 0.614 0.096\nvn  0.694 0.691 -0.202\nvn  -0.151 0.685 -0.713\nvn  0.837 0.508 -0.204\nvn  0.785 0.491 0.378\nvn  0.232 0.893 0.385\nvn  0.758 0.651 0.038\nvn  0.586 0.794 0.163\nvn  0.478 0.862 -0.169\nvn  0.575 0.406 -0.710\nvn  0.502 0.858 -0.107\nvn  0.347 -0.372 -0.861\nvn  0.846 0.333 -0.417\nvn  0.897 0.192 -0.397\nvn  0.976 0.213 -0.044\nvn  0.557 0.657 0.509\nvn  0.936 0.254 -0.244\nvn  0.839 0.542 0.038\nvn  0.741 0.562 0.368\nvn  0.066 0.864 0.499\nvn  0.236 0.860 0.453\nvn  0.477 0.879 -0.018\nvn  0.906 0.298 0.300\nvn  0.933 0.205 0.295\nvn  0.767 0.559 0.313\nvn  0.507 0.798 0.326\nvn  0.432 0.900 -0.054\nvn  0.614 0.785 -0.084\nvn  -0.355 0.926 -0.127\nvn  0.380 0.840 -0.387\nvn  0.352 0.333 -0.875\nvn  -0.144 0.908 -0.393\nvn  -0.870 0.417 -0.263\nvn  -0.224 0.639 -0.736\nvn  0.570 0.816 -0.097\nvn  0.338 0.941 0.032\nvn  -0.152 0.863 -0.481\nvn  -0.004 0.988 0.155\nvn  -0.242 0.672 -0.700\nvn  -0.053 0.897 -0.439\nvn  0.463 0.781 -0.419\nvn  0.155 0.767 -0.622\nvn  0.034 0.975 0.221\nvn  0.644 0.206 -0.737\nvn  0.313 0.140 -0.939\nvn  0.287 0.261 -0.922\nvn  0.676 0.170 -0.717\nvn  0.931 0.127 -0.343\nvn  0.893 0.096 -0.440\nvn  0.858 0.449 -0.249\nvn  0.928 -0.340 0.151\nvn  0.618 -0.670 0.412\nvn  0.568 0.425 -0.705\nvn  -0.187 0.460 -0.868\nvn  0.833 0.328 -0.445\nvn  0.335 0.553 -0.763\nvn  0.822 0.487 -0.294\nvn  0.996 0.029 0.078\nvn  0.343 -0.516 0.785\nvn  0.553 -0.572 0.606\nvn  -0.002 0.705 -0.709\nvn  0.733 0.578 0.359\nvn  0.466 0.829 -0.308\nvn  -0.397 0.288 -0.871\nvn  -0.157 0.183 -0.971\nvn  -0.345 0.275 -0.897\nvn  -0.799 0.140 -0.585\nvn  0.955 -0.291 0.051\nvn  0.625 0.537 -0.566\nvn  0.990 0.136 0.046\nvn  0.941 0.328 0.083\nvn  0.932 -0.169 0.319\nvn  0.145 0.355 -0.923\nvn  0.830 0.153 0.536\nvn  0.847 0.094 0.523\nvn  0.791 -0.564 0.237\nvn  0.663 0.255 0.704\nvn  0.931 0.227 0.286\nvn  -0.507 0.477 -0.718\nvn  0.598 0.540 -0.592\nvn  -0.450 -0.025 -0.893\nvn  0.010 0.355 -0.935\nvn  -0.233 -0.283 -0.930\nvn  0.082 0.177 -0.981\nvn  0.155 0.080 -0.985\nvn  -0.359 -0.187 -0.914\nvn  -0.261 -0.007 -0.965\nvn  0.083 0.363 -0.928\nvn  0.584 0.671 -0.457\nvn  -0.450 -0.248 -0.858\nvn  -0.798 0.171 -0.578\nvn  -0.693 0.008 -0.721\nvn  -0.830 -0.113 -0.547\nvn  -0.551 -0.691 -0.467\nvn  -0.914 -0.329 -0.235\nvn  -0.782 -0.506 -0.363\nvn  -0.661 -0.153 -0.735\nvn  -0.674 -0.447 -0.588\nvn  -0.534 -0.666 -0.521\nvn  -0.956 -0.272 -0.113\nvn  -0.791 0.168 -0.588\nvn  0.848 0.071 -0.526\nvn  0.609 -0.175 -0.773\nvn  0.526 0.057 0.849\nvn  0.624 0.051 -0.780\nvn  -0.240 -0.238 -0.941\nvn  -0.053 -0.603 -0.796\nvn  0.556 0.042 -0.830\nvn  -0.561 -0.403 -0.723\nvn  -0.880 -0.141 -0.454\nvn  -0.926 -0.222 -0.305\nvn  -0.489 -0.166 -0.856\nvn  0.200 0.391 -0.898\nvn  -0.734 -0.069 -0.676\nvn  -0.185 0.884 -0.429\nvn  -0.883 0.450 -0.132\nvn  0.098 -0.235 -0.967\nvn  -0.388 0.206 -0.898\nvn  -0.607 0.148 -0.781\nvn  0.100 0.181 -0.978\nvn  -0.637 -0.154 -0.755\nvn  0.510 -0.467 -0.722\nvn  0.114 -0.555 -0.824\nvn  0.396 0.112 -0.911\nvn  -0.515 -0.112 -0.850\nvn  -0.710 -0.440 -0.550\nvn  -0.853 0.293 -0.431\nvn  -0.138 -0.733 -0.666\nvn  -0.005 0.955 -0.297\nvn  -0.841 0.325 -0.433\nvn  -0.604 -0.088 -0.792\nvn  -0.310 -0.012 -0.951\nvn  -0.803 -0.169 -0.572\nvn  0.940 -0.281 -0.195\nvn  0.876 -0.482 -0.015\nvn  0.715 -0.697 0.047\nvn  0.948 -0.075 0.310\nvn  0.295 -0.623 0.724\nvn  -0.372 -0.656 0.657\nvn  -0.294 -0.549 0.783\nvn  0.853 -0.472 -0.225\nvn  0.592 -0.721 0.360\nvn  -0.845 -0.400 0.355\nvn  -0.979 -0.182 -0.096\nvn  -0.547 -0.813 0.200\nvn  -0.696 -0.637 0.330\nvn  -0.461 -0.885 0.058\nvn  -0.465 -0.885 -0.000\nvn  0.004 -0.759 0.652\nvn  -0.145 -0.842 0.520\nvn  0.660 0.632 -0.406\nvn  0.657 0.056 0.752\nvn  0.481 0.032 0.876\nvn  0.807 0.528 0.265\nvn  0.603 0.155 0.782\nvn  0.216 -0.391 0.895\nvn  0.391 -0.546 0.741\nvn  -0.328 -0.682 0.653\nvn  -0.724 -0.434 0.536\nvn  -0.260 -0.677 0.688\nvn  0.341 -0.236 0.910\nvn  0.700 0.350 -0.622\nvn  0.692 0.666 0.280\nvn  0.063 0.406 0.912\nvn  0.486 0.042 -0.873\nvn  0.742 0.141 -0.656\nvn  0.829 0.357 -0.430\nvn  0.817 0.576 0.008\nvn  -0.143 -0.155 -0.978\nvn  0.761 0.266 -0.591\nvn  0.739 0.673 0.040\nvn  0.389 0.340 -0.856\nvn  0.659 0.731 -0.175\nvn  0.399 0.272 -0.876\nvn  0.659 0.748 -0.083\nvn  0.660 0.110 -0.743\nvn  0.866 0.500 0.011\nvn  0.632 -0.110 -0.767\nvn  0.509 -0.306 -0.805\nvn  0.779 0.374 0.503\nvn  0.964 0.099 -0.245\nvn  0.910 0.411 0.048\nvn  0.780 0.054 0.624\nvn  -0.448 0.780 0.437\nvn  0.295 0.362 0.884\nvn  0.389 0.530 0.754\nvn  0.126 0.297 0.946\nvn  0.338 0.484 0.807\nvn  0.103 -0.670 -0.735\nvn  0.569 0.257 0.781\nvn  0.965 -0.070 -0.252\nvn  0.874 -0.484 0.037\nvn  -0.880 0.356 0.314\nvn  -0.888 -0.308 0.341\nvn  -0.736 -0.608 0.298\nvn  -0.912 -0.276 0.302\nvn  -0.692 -0.229 0.684\nvn  0.824 -0.055 -0.563\nvn  0.624 -0.216 -0.751\nvn  0.176 -0.408 -0.896\nvn  0.612 -0.596 -0.520\nvn  -0.165 0.922 0.351\nvn  0.328 0.943 -0.057\nvn  0.835 0.538 -0.117\nvn  0.232 0.972 -0.047\nvn  0.492 0.870 0.024\nvn  0.401 0.850 -0.341\nvn  0.822 0.562 0.097\nvn  -0.196 0.950 0.244\nvn  0.711 0.692 0.123\nvn  0.220 0.904 0.366\nvn  -0.087 0.836 0.541\nvn  0.045 0.980 0.193\nvn  -0.233 0.918 0.320\nvn  -0.113 0.926 0.361\nvn  0.325 0.944 -0.052\nvn  0.647 0.661 -0.380\nvn  0.801 0.578 0.157\nvn  0.206 0.970 0.127\nvn  0.456 0.847 0.272\nvn  0.475 0.876 0.081\nvn  0.292 0.852 0.434\nvn  -0.060 0.985 0.164\nvn  0.671 0.711 -0.211\nvn  0.223 0.969 -0.104\nvn  0.134 0.982 -0.130\nvn  0.251 0.889 0.383\nvn  0.800 0.599 0.043\nvn  0.397 0.836 -0.378\nvn  -0.225 -0.521 -0.823\nvn  -0.144 -0.611 -0.778\nvn  0.377 -0.591 -0.713\nvn  -0.006 -0.321 -0.947\nvn  -0.599 -0.193 0.777\nvn  -0.533 0.055 0.845\nvn  -0.837 -0.538 -0.095\nvn  -0.750 -0.660 -0.033\nvn  -0.303 -0.172 0.937\nvn  -0.613 -0.780 -0.122\nvn  -0.103 0.127 0.987\nvn  -0.664 -0.707 -0.243\nvn  -0.307 -0.088 0.948\nvn  -0.227 -0.282 0.932\nvn  -0.556 -0.821 -0.132\nvn  -0.123 -0.806 0.578\nvn  -0.245 0.912 0.329\nvn  0.641 0.671 0.372\nvn  0.688 0.591 0.421\nvn  -0.157 0.905 0.396\nvn  0.773 0.525 0.357\nvn  -0.143 0.884 0.445\nvn  0.758 0.456 0.467\nvn  -0.245 0.782 0.572\nvn  0.127 0.788 0.602\nvn  0.792 0.429 0.435\nvn  -0.506 0.717 0.479\nvn  -0.986 0.146 0.085\nvn  -0.936 0.345 0.065\nvn  -0.995 -0.067 0.074\nvn  0.303 0.657 0.690\nvn  0.913 0.015 0.408\nvn  -0.621 0.554 0.554\nvn  0.271 0.297 0.915\nvn  0.492 -0.865 0.099\nvn  -0.926 -0.340 0.165\nvn  0.956 -0.229 0.184\nvn  0.938 -0.346 0.017\nvn  -0.539 -0.739 -0.403\nvn  0.317 -0.883 -0.345\nvn  -0.481 -0.854 0.197\nvn  0.212 -0.972 0.096\nvn  -0.878 -0.414 0.242\nvn  0.587 -0.803 0.102\nvn  0.348 -0.925 -0.153\nvn  -0.769 -0.552 -0.324\nvn  0.063 -0.821 0.567\nvn  -0.319 -0.605 0.729\nvn  0.523 0.308 0.795\nvn  -0.758 -0.512 0.403\nvn  -0.076 -0.407 0.910\nvn  -0.534 -0.658 0.531\nvn  0.886 0.085 -0.457\nvn  0.702 -0.091 -0.707\nvn  0.449 -0.108 -0.887\nvn  0.958 0.261 -0.117\nvn  0.408 -0.328 -0.852\nvn  0.998 0.029 -0.048\nvn  0.421 -0.536 -0.732\nvn  0.980 -0.193 0.056\nvn  0.390 -0.477 -0.787\nvn  0.973 -0.208 -0.097\nvn  0.782 -0.488 -0.388\nvn  0.022 -0.601 -0.799\nvn  0.914 -0.128 0.384\nvn  0.946 -0.316 0.070\nvn  0.663 0.255 0.704\nvn  0.790 0.177 0.586\nvn  0.443 0.219 0.870\nvn  0.597 -0.778 -0.198\nvn  -0.481 -0.655 -0.583\nvn  0.629 -0.163 0.760\nvn  0.058 -0.947 0.317\nvn  -0.998 0.060 -0.032\nvn  -0.008 0.388 0.921\nvn  -0.393 -0.383 -0.836\nvn  -0.553 -0.310 -0.774\nvn  -0.647 -0.403 -0.647\nvn  0.276 -0.627 -0.729\nvn  -0.420 0.207 0.884\nvn  -0.095 0.495 0.864\nvn  -0.969 0.244 0.050\nvn  -0.986 -0.037 0.165\nvn  -0.199 0.169 0.965\nvn  -0.993 -0.049 0.104\nvn  -0.984 -0.168 -0.054\nvn  -0.263 0.199 0.944\nvn  -0.340 -0.507 0.792\nvn  -0.636 -0.237 0.734\nvn  0.711 -0.217 -0.669\nvn  0.480 -0.268 -0.835\nvn  0.340 -0.309 -0.888\nvn  0.992 -0.035 -0.125\nvn  0.228 -0.448 -0.864\nvn  0.970 -0.195 -0.143\nvn  0.198 -0.781 -0.592\nvn  0.834 -0.542 0.104\nvn  0.161 -0.877 -0.452\nvn  0.772 -0.566 0.289\nvn  0.419 -0.907 0.037\nvn  -0.168 -0.868 -0.467\nvn  0.753 -0.339 0.563\nvn  0.864 -0.499 -0.064\nvn  0.740 0.070 0.669\nvn  0.665 0.227 0.711\nvn  0.534 0.321 0.782\nvn  0.273 -0.953 0.134\nvn  -0.562 -0.733 -0.384\nvn  0.551 -0.241 0.799\nvn  -0.734 -0.106 0.671\nvn  -0.486 -0.404 -0.775\nvn  -0.629 -0.324 -0.707\nvn  -0.683 -0.377 -0.625\nvn  -0.224 -0.624 -0.749\nvn  -0.289 0.777 0.559\nvn  -0.060 0.817 0.574\nvn  -0.798 0.574 -0.185\nvn  -0.905 0.387 -0.177\nvn  -0.115 0.604 0.789\nvn  -0.963 0.145 -0.228\nvn  -0.993 0.102 -0.060\nvn  -0.100 0.400 0.911\nvn  -0.669 -0.372 0.643\nvn  -0.565 -0.396 0.724\nvn  -0.917 -0.290 -0.274\nvn  -0.884 -0.401 -0.238\nvn  -0.915 -0.401 -0.039\nvn  -0.367 -0.027 -0.930\nvn  0.511 -0.346 -0.787\nvn  0.199 -0.245 -0.949\nvn  0.265 -0.295 -0.918\nvn  0.909 -0.343 -0.236\nvn  0.079 -0.705 -0.705\nvn  0.768 -0.640 -0.027\nvn  -0.348 -0.761 -0.548\nvn  0.407 -0.910 0.081\nvn  -0.563 -0.785 -0.259\nvn  0.176 -0.922 0.346\nvn  -0.414 -0.843 0.342\nvn  -0.906 -0.366 -0.212\nvn  0.269 -0.645 0.716\nvn  0.711 -0.694 0.117\nvn  0.810 -0.274 0.518\nvn  0.731 -0.273 0.626\nvn  0.740 -0.110 0.663\nvn  -0.602 -0.587 0.541\nvn  -0.986 -0.031 -0.165\nvn  0.433 -0.333 0.838\nvn  -0.264 0.740 0.619\nvn  -0.631 -0.103 -0.769\nvn  -0.796 0.087 -0.599\nvn  -0.821 0.297 -0.488\nvn  -0.521 -0.286 -0.804\nvn  0.827 0.498 0.263\nvn  0.635 0.609 0.475\nvn  -0.089 0.947 -0.308\nvn  0.028 0.955 -0.295\nvn  0.690 0.547 0.473\nvn  -0.643 0.694 -0.325\nvn  -0.830 0.546 0.112\nvn  0.276 0.006 0.961\nvn  -0.952 -0.304 0.013\nvn  -0.672 -0.707 0.219\nvn  0.934 -0.149 0.326\nvn  0.985 0.017 0.174\nvn  0.500 0.578 0.645\nvn  0.398 0.039 0.917\nvn  0.334 0.517 0.788\nvn  0.955 -0.164 -0.249\nvn  0.835 -0.550 -0.015\nvn  0.605 0.237 0.760\nvn  0.803 0.445 0.397\nvn  0.924 0.019 -0.383\nvn  0.850 -0.455 -0.265\nvn  0.890 0.361 -0.278\nvn  -0.728 0.410 -0.549\nvn  0.274 0.757 0.593\nvn  0.860 0.509 0.047\nvn  0.862 0.482 0.159\nvn  0.850 0.525 -0.047\nvn  0.755 0.639 -0.147\nvn  0.343 0.737 0.583\nvn  0.923 0.356 -0.144\nvn  0.318 0.865 0.388\nvn  0.910 0.323 -0.259\nvn  0.621 -0.057 -0.782\nvn  0.448 -0.053 -0.893\nvn  0.269 -0.243 -0.932\nvn  0.066 -0.081 -0.995\nvn  -0.700 -0.507 -0.503\nvn  -0.732 -0.441 -0.520\nvn  -0.728 0.332 -0.599\nvn  -0.818 -0.092 -0.568\nvn  -0.531 0.842 0.093\nvn  -0.897 0.406 0.176\nvn  -0.795 0.585 0.163\nvn  -0.987 -0.082 0.140\nvn  -0.959 -0.031 0.283\nvn  -0.250 -0.479 -0.841\nvn  -0.296 0.827 0.478\nvn  -0.487 0.543 0.684\nvn  -0.401 0.614 0.680\nvn  0.116 0.696 -0.709\nvn  0.718 0.651 -0.246\nvn  0.504 0.863 0.034\nvn  0.395 0.836 0.382\nvn  0.511 0.205 -0.835\nvn  0.628 0.647 0.433\nvn  0.680 -0.658 -0.324\nvn  0.674 0.234 0.701\nvn  0.519 -0.843 0.144\nvn  0.473 0.201 0.858\nvn  -0.097 -0.142 0.985\nvn  0.570 -0.772 0.280\nvn  0.213 0.139 0.967\nvn  0.157 0.019 0.987\nvn  -0.383 0.331 0.862\nvn  -0.961 0.187 0.203\nvn  -0.734 0.638 0.235\nvn  0.345 -0.632 -0.694\nvn  0.827 0.027 0.561\nvn  0.766 0.196 0.612\nvn  0.093 -0.902 -0.421\nvn  0.742 0.065 0.667\nvn  0.892 -0.386 -0.235\nvn  -0.356 0.741 0.569\nvn  -0.187 0.922 0.339\nvn  0.093 0.996 -0.012\nvn  0.268 0.600 -0.753\nvn  -0.671 0.566 -0.478\nvn  -0.450 0.881 -0.144\nvn  -0.411 -0.020 -0.911\nvn  -0.403 0.419 -0.814\nvn  -0.046 -0.910 -0.412\nvn  0.747 0.204 0.633\nvn  -0.864 0.404 -0.301\nvn  -0.809 0.495 0.318\nvn  -0.495 0.535 0.685\nvn  0.097 -0.760 -0.642\nvn  -0.223 -0.975 -0.004\nvn  0.591 -0.333 -0.735\nvn  -0.383 -0.783 -0.491\nvn  0.043 -0.563 -0.825\nvn  -0.343 -0.752 -0.563\nvn  -0.372 -0.581 -0.724\nvn  0.354 -0.925 0.141\nvn  -0.325 -0.537 -0.779\nvn  -0.594 0.652 0.470\nvn  -0.636 -0.751 0.178\nvn  0.656 -0.582 -0.480\nvn  -0.110 -0.595 -0.796\nvn  -0.006 -0.206 -0.979\nvn  -0.033 -0.090 -0.995\nvn  0.951 0.194 -0.239\nvn  0.525 -0.349 -0.776\nvn  0.273 -0.239 -0.932\nvn  0.244 0.667 -0.704\nvn  0.804 0.501 0.320\nvn  0.816 0.492 0.303\nvn  0.600 0.754 -0.267\nvn  0.922 0.331 -0.202\nvn  0.951 -0.170 0.258\nvn  -0.121 -0.731 0.672\nvn  -0.882 -0.470 0.025\nvn  -0.937 0.051 -0.344\nvn  -0.464 -0.711 0.529\nvn  -0.495 -0.865 -0.077\n# 2519 vertex normals\n\ng objDiablo3\ns 1\nf 6/1/6 5/2/5 8/3/8\nf 6/1/6 8/3/8 7/4/7\nf 12/5/12 11/6/11 10/7/10\nf 12/5/12 10/7/10 9/8/9\nf 15/9/15 14/10/14 1/11/1\nf 15/9/15 1/11/1 2/12/2\nf 16/13/16 15/9/15 2/12/2\nf 16/13/16 2/12/2 17/14/17\nf 25/15/25 24/16/24 23/17/23\nf 25/15/25 23/17/23 22/18/22\nf 5/2/5 10/7/10 13/19/13\nf 5/2/5 13/19/13 8/3/8\nf 9/8/9 10/7/10 5/2/5\nf 9/8/9 5/2/5 4/20/4\nf 13/19/13 24/16/24 7/4/7\nf 13/19/13 7/4/7 8/3/8\nf 11/6/11 23/17/23 24/16/24\nf 11/6/11 24/16/24 13/19/13\nf 20/21/20 27/22/27 25/15/25\nf 20/21/20 25/15/25 22/18/22\nf 29/23/29 28/24/28 27/22/27\nf 29/23/29 27/22/27 20/21/20\nf 30/25/30 27/22/27 28/24/28\nf 30/25/30 28/24/28 31/26/31\nf 31/26/31 28/24/28 1255/27/1255\nf 31/26/31 1255/27/1255 1265/28/1265\nf 1256/29/1256 1255/27/1255 28/24/28\nf 1256/29/1256 28/24/28 29/23/29\nf 33/30/33 32/31/32 1258/32/1258\nf 33/30/33 1258/32/1258 1262/33/1262\nf 1258/32/1258 32/31/32 31/26/31\nf 1258/32/1258 31/26/31 1265/28/1265\nf 34/34/34 1256/29/1256 29/23/29\nf 34/34/34 29/23/29 35/35/35\nf 35/35/35 29/23/29 20/21/20\nf 35/35/35 20/21/20 36/36/36\nf 37/37/37 34/34/34 35/35/35\nf 37/37/37 35/35/35 38/38/38\nf 35/35/35 36/36/36 39/39/39\nf 35/35/35 39/39/39 38/38/38\nf 40/40/40 37/37/37 38/38/38\nf 40/40/40 38/38/38 41/41/41\nf 41/41/41 38/38/38 39/39/39\nf 41/41/41 39/39/39 42/42/42\nf 43/43/43 37/37/37 40/40/40\nf 43/43/43 40/40/40 44/44/44\nf 45/45/45 12/5/12 9/8/9\nf 45/45/45 9/8/9 46/46/46\nf 41/41/41 42/42/42 12/5/12\nf 41/41/41 12/5/12 45/45/45\nf 47/47/47 44/44/44 40/40/40\nf 47/47/47 40/40/40 45/45/45\nf 48/48/48 50/49/50 18/50/18\nf 48/48/48 18/50/18 19/51/19\nf 52/52/52 1280/53/1280 50/49/50\nf 52/52/52 50/49/50 48/48/48\nf 53/54/53 25/15/25 27/22/27\nf 53/54/53 27/22/27 30/25/30\nf 54/55/54 26/56/26 25/15/25\nf 54/55/54 25/15/25 53/54/53\nf 59/57/59 54/55/54 53/54/53\nf 59/57/59 53/54/53 60/58/60\nf 30/25/30 55/59/55 60/58/60\nf 30/25/30 60/58/60 53/54/53\nf 48/48/48 49/60/49 57/61/57\nf 48/48/48 57/61/57 52/52/52\nf 52/52/52 57/61/57 33/30/33\nf 52/52/52 33/30/33 51/62/51\nf 61/63/61 45/45/45 46/46/46\nf 61/63/61 46/46/46 62/64/62\nf 109/65/109 44/44/44 65/66/65\nf 109/65/109 65/66/65 108/67/108\nf 67/68/67 42/42/42 66/69/66\nf 67/68/67 66/69/66 21/70/21\nf 69/71/69 16/13/16 17/14/17\nf 69/71/69 17/14/17 70/72/70\nf 17/14/17 6/1/6 18/50/18\nf 17/14/17 18/50/18 72/73/72\nf 72/73/72 18/50/18 50/49/50\nf 72/73/72 50/49/50 73/74/73\nf 73/74/73 50/49/50 1280/53/1280\nf 73/74/73 1280/53/1280 74/75/74\nf 75/76/75 72/73/72 73/74/73\nf 75/76/75 73/74/73 76/77/76\nf 76/77/76 73/74/73 74/75/74\nf 76/77/76 74/75/74 77/78/77\nf 75/76/75 76/77/76 79/79/79\nf 75/76/75 79/79/79 78/80/78\nf 84/81/84 81/82/81 83/83/83\nf 84/81/84 83/83/83 82/84/82\nf 85/85/85 79/79/79 87/86/87\nf 85/85/85 87/86/87 86/87/86\nf 79/79/79 80/88/80 88/89/88\nf 79/79/79 88/89/88 87/86/87\nf 85/85/85 83/83/83 81/82/81\nf 85/85/85 81/82/81 78/80/78\nf 92/90/92 91/91/91 90/92/90\nf 92/90/92 90/92/90 68/93/68\nf 92/90/92 86/94/86 93/95/93\nf 92/90/92 93/95/93 91/91/91\nf 82/96/82 83/97/83 94/98/94\nf 82/96/82 94/98/94 92/90/92\nf 86/94/86 89/99/89 95/100/95\nf 86/94/86 95/100/95 93/95/93\nf 96/101/96 89/102/89 87/86/87\nf 96/101/96 87/86/87 88/89/88\nf 100/103/100 99/104/99 98/105/98\nf 100/103/100 98/105/98 97/106/97\nf 97/106/97 98/105/98 104/107/104\nf 97/106/97 104/107/104 103/108/103\nf 97/106/97 107/109/107 106/110/106\nf 97/106/97 106/110/106 100/103/100\nf 101/111/101 109/112/109 108/113/108\nf 101/111/101 108/113/108 103/108/103\nf 103/108/103 111/114/111 107/109/107\nf 103/108/103 107/109/107 97/106/97\nf 112/115/112 113/116/113 115/117/115\nf 112/115/112 115/117/115 114/118/114\nf 194/119/194 126/120/126 115/117/115\nf 194/119/194 115/117/115 196/121/196\nf 117/122/117 112/115/112 114/118/114\nf 117/122/117 114/118/114 118/123/118\nf 146/124/146 117/122/117 118/123/118\nf 146/124/146 118/123/118 174/125/174\nf 113/116/113 127/126/127 128/127/128\nf 113/116/113 128/127/128 129/128/129\nf 127/126/127 120/129/120 132/130/132\nf 127/126/127 132/130/132 130/131/130\nf 139/132/139 138/133/138 137/134/137\nf 139/132/139 137/134/137 140/135/140\nf 120/129/120 144/136/144 141/137/141\nf 120/129/120 141/137/141 132/130/132\nf 143/138/143 141/137/141 144/136/144\nf 143/138/143 144/136/144 145/139/145\nf 139/132/139 135/140/135 157/141/157\nf 139/132/139 157/141/157 136/142/136\nf 131/143/131 134/144/134 150/145/150\nf 131/143/131 150/145/150 149/146/149\nf 134/144/134 157/141/157 151/147/151\nf 134/144/134 151/147/151 150/145/150\nf 152/148/152 153/149/153 159/150/159\nf 152/148/152 159/150/159 155/151/155\nf 157/141/157 158/152/158 160/153/160\nf 157/141/157 160/153/160 159/150/159\nf 143/138/143 145/139/145 162/154/162\nf 143/138/143 162/154/162 178/155/178\nf 153/149/153 151/147/151 157/141/157\nf 153/149/153 157/141/157 159/150/159\nf 167/156/167 161/157/161 168/158/168\nf 167/156/167 168/158/168 169/159/169\nf 171/160/171 190/161/190 191/162/191\nf 171/160/171 191/162/191 173/163/173\nf 189/164/189 148/165/148 174/125/174\nf 189/164/189 174/125/174 188/166/188\nf 116/167/116 179/168/179 123/169/123\nf 116/167/116 123/169/123 115/117/115\nf 125/170/125 179/168/179 184/171/184\nf 125/170/125 184/171/184 183/172/183\nf 179/168/179 116/167/116 182/173/182\nf 179/168/179 182/173/182 184/171/184\nf 181/174/181 126/120/126 194/119/194\nf 181/174/181 194/119/194 185/175/185\nf 186/176/186 201/177/201 187/178/187\nf 186/176/186 187/178/187 172/179/172\nf 172/179/172 191/162/191 190/161/190\nf 172/179/172 190/161/190 186/176/186\nf 129/128/129 208/180/208 197/181/197\nf 129/128/129 197/181/197 196/121/196\nf 199/182/199 147/183/147 146/124/146\nf 199/182/199 146/124/146 198/184/198\nf 200/185/200 162/154/162 145/139/145\nf 200/185/200 145/139/145 199/182/199\nf 200/186/200 225/187/225 175/188/175\nf 200/186/200 175/188/175 162/189/162\nf 186/176/186 190/161/190 204/190/204\nf 186/176/186 204/190/204 203/191/203\nf 205/192/205 210/193/210 235/194/235\nf 205/192/205 235/194/235 234/195/234\nf 206/196/206 207/197/207 205/192/205\nf 206/196/206 205/192/205 203/191/203\nf 207/198/207 206/199/206 208/180/208\nf 207/198/207 208/180/208 129/128/129\nf 205/192/205 207/197/207 209/200/209\nf 205/192/205 209/200/209 210/193/210\nf 339/201/339 219/202/219 233/203/233\nf 339/201/339 233/203/233 338/204/338\nf 213/205/213 212/206/212 337/207/337\nf 213/205/213 337/207/337 340/208/340\nf 214/209/214 215/210/215 217/211/217\nf 214/209/214 217/211/217 216/212/216\nf 224/213/224 211/214/211 214/209/214\nf 224/213/224 214/209/214 220/215/220\nf 214/209/214 216/212/216 222/216/222\nf 214/209/214 222/216/222 220/215/220\nf 216/212/216 260/217/260 258/218/258\nf 216/212/216 258/218/258 222/216/222\nf 225/187/225 221/219/221 224/213/224\nf 225/187/225 224/213/224 223/220/223\nf 238/221/238 226/222/226 225/187/225\nf 238/221/238 225/187/225 223/220/223\nf 231/223/231 213/205/213 340/208/340\nf 231/223/231 340/208/340 341/224/341\nf 230/225/230 231/223/231 341/224/341\nf 230/225/230 341/224/341 229/226/229\nf 232/227/232 213/205/213 231/223/231\nf 232/227/232 231/223/231 240/228/240\nf 212/206/212 213/205/213 232/227/232\nf 212/206/212 232/227/232 215/210/215\nf 202/229/202 233/230/233 187/178/187\nf 202/229/202 187/178/187 201/177/201\nf 202/231/202 337/207/337 338/204/338\nf 202/231/202 338/204/338 233/203/233\nf 202/229/202 201/177/201 234/195/234\nf 202/229/202 234/195/234 235/194/235\nf 232/227/232 240/228/240 237/232/237\nf 232/227/232 237/232/237 236/233/236\nf 236/233/236 237/232/237 248/234/248\nf 236/233/236 248/234/248 250/235/250\nf 215/210/215 232/227/232 236/233/236\nf 215/210/215 236/233/236 217/211/217\nf 227/236/227 226/222/226 238/221/238\nf 227/236/227 238/221/238 239/237/239\nf 245/238/245 227/236/227 239/237/239\nf 245/238/245 239/237/239 247/239/247\nf 242/240/242 206/196/206 203/191/203\nf 242/240/242 203/191/203 204/190/204\nf 243/241/243 181/174/181 193/242/193\nf 243/241/243 193/242/193 244/243/244\nf 208/180/208 242/244/242 244/243/244\nf 208/180/208 244/243/244 193/242/193\nf 228/245/228 245/238/245 230/246/230\nf 228/245/228 230/246/230 229/247/229\nf 246/248/246 237/249/237 240/250/240\nf 246/248/246 240/250/240 247/239/247\nf 249/251/249 253/252/253 261/253/261\nf 249/251/249 261/253/261 259/254/259\nf 254/255/254 246/248/246 247/239/247\nf 254/255/254 247/239/247 239/237/239\nf 238/221/238 255/256/255 254/255/254\nf 238/221/238 254/255/254 239/237/239\nf 255/256/255 238/221/238 223/220/223\nf 255/256/255 223/220/223 220/215/220\nf 261/253/261 262/257/262 250/235/250\nf 261/253/261 250/235/250 259/254/259\nf 257/258/257 260/217/260 262/257/262\nf 257/258/257 262/257/262 261/253/261\nf 251/259/251 257/258/257 261/253/261\nf 251/259/251 261/253/261 253/252/253\nf 264/260/264 263/261/263 265/262/265\nf 264/260/264 265/262/265 266/263/266\nf 273/264/273 283/265/283 271/266/271\nf 273/264/273 271/266/271 274/267/274\nf 274/267/274 265/262/265 263/261/263\nf 274/267/274 263/261/263 275/268/275\nf 270/269/270 284/270/284 276/271/276\nf 270/269/270 276/271/276 277/272/277\nf 268/273/268 271/266/271 283/265/283\nf 268/273/268 283/265/283 284/270/284\nf 278/274/278 279/275/279 282/276/282\nf 278/274/278 282/276/282 281/277/281\nf 279/275/279 273/264/273 298/278/298\nf 279/275/279 298/278/298 282/276/282\nf 273/264/273 274/267/274 275/268/275\nf 273/264/273 275/268/275 298/278/298\nf 269/279/269 402/280/402 295/281/295\nf 269/279/269 295/281/295 286/282/286\nf 286/282/286 295/281/295 288/283/288\nf 286/282/286 288/283/288 287/284/287\nf 287/284/287 288/283/288 290/285/290\nf 287/284/287 290/285/290 289/286/289\nf 292/287/292 289/286/289 290/285/290\nf 292/287/292 290/285/290 293/288/293\nf 255/289/255 256/290/256 289/286/289\nf 255/289/255 289/286/289 292/287/292\nf 263/261/263 254/291/254 297/292/297\nf 263/261/263 297/292/297 298/278/298\nf 292/287/292 293/288/293 297/292/297\nf 292/287/292 297/292/297 254/291/254\nf 296/293/296 387/294/387 288/283/288\nf 296/293/296 288/283/288 295/281/295\nf 286/282/286 251/259/251 253/252/253\nf 286/282/286 253/252/253 269/279/269\nf 287/284/287 289/286/289 256/290/256\nf 287/284/287 256/290/256 252/295/252\nf 251/259/251 286/282/286 287/284/287\nf 251/259/251 287/284/287 252/295/252\nf 266/296/266 267/297/267 253/252/253\nf 266/296/266 253/252/253 249/251/249\nf 293/288/293 291/298/291 299/299/299\nf 293/288/293 299/299/299 297/292/297\nf 299/299/299 291/298/291 300/300/300\nf 299/299/299 300/300/300 301/301/301\nf 301/302/301 300/303/300 302/304/302\nf 301/302/301 302/304/302 303/305/303\nf 303/305/303 302/304/302 304/306/304\nf 303/305/303 304/306/304 305/307/305\nf 305/307/305 304/306/304 306/308/306\nf 305/307/305 306/308/306 307/309/307\nf 306/308/306 308/310/308 315/311/315\nf 306/308/306 315/311/315 307/309/307\nf 310/312/310 314/313/314 316/314/316\nf 310/312/310 316/314/316 334/315/334\nf 316/314/316 317/316/317 312/317/312\nf 316/314/316 312/317/312 334/315/334\nf 309/318/309 336/319/336 316/314/316\nf 309/318/309 316/314/316 314/313/314\nf 336/319/336 311/320/311 317/316/317\nf 336/319/336 317/316/317 316/314/316\nf 323/321/323 327/322/327 308/310/308\nf 323/321/323 308/310/308 306/308/306\nf 305/307/305 319/323/319 324/324/324\nf 305/307/305 324/324/324 303/305/303\nf 299/299/299 301/301/301 320/325/320\nf 299/299/299 320/325/320 321/326/321\nf 303/305/303 324/324/324 320/327/320\nf 303/305/303 320/327/320 301/302/301\nf 300/300/300 291/298/291 344/328/344\nf 300/300/300 344/328/344 322/329/322\nf 302/304/302 300/303/300 322/330/322\nf 302/304/302 322/330/322 323/321/323\nf 319/323/319 315/311/315 325/331/325\nf 319/323/319 325/331/325 349/332/349\nf 325/331/325 315/311/315 318/333/318\nf 325/331/325 318/333/318 326/334/326\nf 320/327/320 324/324/324 349/332/349\nf 320/327/320 349/332/349 432/335/432\nf 332/336/332 308/310/308 327/322/327\nf 332/336/332 327/322/327 333/337/333\nf 333/337/333 327/322/327 328/338/328\nf 333/337/333 328/338/328 329/339/329\nf 325/331/325 326/334/326 329/340/329\nf 325/331/325 329/340/329 328/341/328\nf 326/334/326 318/333/318 330/342/330\nf 326/334/326 330/342/330 331/343/331\nf 331/344/331 330/345/330 332/336/332\nf 331/344/331 332/336/332 333/337/333\nf 330/342/330 345/346/345 334/315/334\nf 330/342/330 334/315/334 335/347/335\nf 336/319/336 346/348/346 330/345/330\nf 336/319/336 330/345/330 335/349/335\nf 312/317/312 313/350/313 335/347/335\nf 312/317/312 335/347/335 334/315/334\nf 335/349/335 313/350/313 311/320/311\nf 335/349/335 311/320/311 336/319/336\nf 337/207/337 212/206/212 218/351/218\nf 337/207/337 218/351/218 338/204/338\nf 338/204/338 218/351/218 211/214/211\nf 338/204/338 211/214/211 339/201/339\nf 202/231/202 235/352/235 340/208/340\nf 202/231/202 340/208/340 337/207/337\nf 235/352/235 210/353/210 341/224/341\nf 235/352/235 341/224/341 340/208/340\nf 342/354/342 290/285/290 288/283/288\nf 342/354/342 288/283/288 387/294/387\nf 328/338/328 327/322/327 347/355/347\nf 328/338/328 347/355/347 348/356/348\nf 325/331/325 328/341/328 348/357/348\nf 325/331/325 348/357/348 349/332/349\nf 348/356/348 347/355/347 351/358/351\nf 348/356/348 351/358/351 352/359/352\nf 349/332/349 348/357/348 352/360/352\nf 349/332/349 352/360/352 350/361/350\nf 347/355/347 323/321/323 322/330/322\nf 347/355/347 322/330/322 351/358/351\nf 354/362/354 344/363/344 343/364/343\nf 354/362/354 343/364/343 353/365/353\nf 354/362/354 353/365/353 355/366/355\nf 354/362/354 355/366/355 356/367/356\nf 356/367/356 355/366/355 357/368/357\nf 356/367/356 357/368/357 358/369/358\nf 357/368/357 359/370/359 360/371/360\nf 357/368/357 360/371/360 358/369/358\nf 362/372/362 361/373/361 363/374/363\nf 362/372/362 363/374/363 364/375/364\nf 365/376/365 366/377/366 363/374/363\nf 365/376/365 363/374/363 361/373/361\nf 368/378/368 369/379/369 359/370/359\nf 368/378/368 359/370/359 357/368/357\nf 362/372/362 371/380/371 374/381/374\nf 362/372/362 374/381/374 360/371/360\nf 356/367/356 372/382/372 373/383/373\nf 356/367/356 373/383/373 354/362/354\nf 372/382/372 360/371/360 374/381/374\nf 372/382/372 374/381/374 383/384/383\nf 370/385/370 369/379/369 376/386/376\nf 370/385/370 376/386/376 375/387/375\nf 374/381/374 371/380/371 375/388/375\nf 374/381/374 375/388/375 376/389/376\nf 377/390/377 379/391/379 364/375/364\nf 377/390/377 364/375/364 381/392/381\nf 366/377/366 380/393/380 377/394/377\nf 366/377/366 377/394/377 381/395/381\nf 376/386/376 369/379/369 368/378/368\nf 376/386/376 368/378/368 382/396/382\nf 374/381/374 376/389/376 382/397/382\nf 374/381/374 382/397/382 383/384/383\nf 294/398/294 342/354/342 386/399/386\nf 294/398/294 386/399/386 385/400/385\nf 353/365/353 343/364/343 385/401/385\nf 353/365/353 385/401/385 368/378/368\nf 296/293/296 295/281/295 402/280/402\nf 296/293/296 402/280/402 388/402/388\nf 387/294/387 296/293/296 388/402/388\nf 387/294/387 388/402/388 389/403/389\nf 352/404/352 351/405/351 395/406/395\nf 352/404/352 395/406/395 390/407/390\nf 350/408/350 352/404/352 390/407/390\nf 350/408/350 390/407/390 434/409/434\nf 390/407/390 395/406/395 394/410/394\nf 390/407/390 394/410/394 392/411/392\nf 434/409/434 390/407/390 392/411/392\nf 434/409/434 392/411/392 391/412/391\nf 392/411/392 394/410/394 386/399/386\nf 392/411/392 386/399/386 393/413/393\nf 391/412/391 392/411/392 393/413/393\nf 391/412/391 393/413/393 396/414/396\nf 359/370/359 369/379/369 370/385/370\nf 359/370/359 370/385/370 365/376/365\nf 394/415/394 395/416/395 382/396/382\nf 394/415/394 382/396/382 368/378/368\nf 297/292/297 321/326/321 397/417/397\nf 297/292/297 397/417/397 298/278/298\nf 281/277/281 282/276/282 398/418/398\nf 281/277/281 398/418/398 396/419/396\nf 433/420/433 391/421/391 400/422/400\nf 433/420/433 400/422/400 399/423/399\nf 396/419/396 398/418/398 400/422/400\nf 396/419/396 400/422/400 391/421/391\nf 298/278/298 397/417/397 398/418/398\nf 298/278/298 398/418/398 282/276/282\nf 321/326/321 403/424/403 401/425/401\nf 321/326/321 401/425/401 397/417/397\nf 395/426/395 384/427/384 383/384/383\nf 395/426/395 383/384/383 382/397/382\nf 280/428/280 281/277/281 396/419/396\nf 280/428/280 396/419/396 389/429/389\nf 280/428/280 389/429/389 388/430/388\nf 280/428/280 388/430/388 277/272/277\nf 402/431/402 270/269/270 277/272/277\nf 402/431/402 277/272/277 388/430/388\nf 403/432/403 404/433/404 405/434/405\nf 403/432/403 405/434/405 401/435/401\nf 404/433/404 407/436/407 406/437/406\nf 404/433/404 406/437/406 405/434/405\nf 406/437/406 407/436/407 409/438/409\nf 406/437/406 409/438/409 408/439/408\nf 412/440/412 410/441/410 411/442/411\nf 412/440/412 411/442/411 413/443/413\nf 415/444/415 410/441/410 412/440/412\nf 415/444/415 412/440/412 416/445/416\nf 417/446/417 406/437/406 408/439/408\nf 417/446/417 408/439/408 418/447/418\nf 411/442/411 409/438/409 420/448/420\nf 411/442/411 420/448/420 419/449/419\nf 421/450/421 422/451/422 420/448/420\nf 421/450/421 420/448/420 409/438/409\nf 424/452/424 423/453/423 425/454/425\nf 424/452/424 425/454/425 418/447/418\nf 420/448/420 425/455/425 423/456/423\nf 420/448/420 423/456/423 419/449/419\nf 426/457/426 430/458/430 413/443/413\nf 426/457/426 413/443/413 428/459/428\nf 416/445/416 430/460/430 426/461/426\nf 416/445/416 426/461/426 429/462/429\nf 425/454/425 431/463/431 417/446/417\nf 425/454/425 417/446/417 418/447/418\nf 420/448/420 422/451/422 431/464/431\nf 420/448/420 431/464/431 425/455/425\nf 408/439/408 415/444/415 424/452/424\nf 408/439/408 424/452/424 418/447/418\nf 431/463/431 435/465/435 433/466/433\nf 431/463/431 433/466/433 417/446/417\nf 435/467/435 431/464/431 422/451/422\nf 435/467/435 422/451/422 432/468/432\nf 243/469/243 244/470/244 437/471/437\nf 243/469/243 437/471/437 436/472/436\nf 436/472/436 437/471/437 439/473/439\nf 436/472/436 439/473/439 438/474/438\nf 436/472/436 438/474/438 444/475/444\nf 436/472/436 444/475/444 440/476/440\nf 436/472/436 440/476/440 441/477/441\nf 436/472/436 441/477/441 243/469/243\nf 184/171/184 243/241/243 441/478/441\nf 184/171/184 441/478/441 442/479/442\nf 441/477/441 440/476/440 443/480/443\nf 441/477/441 443/480/443 558/481/558\nf 443/480/443 440/476/440 444/475/444\nf 443/480/443 444/475/444 445/482/445\nf 441/478/441 558/483/558 447/484/447\nf 441/478/441 447/484/447 446/485/446\nf 446/485/446 447/484/447 122/486/122\nf 446/485/446 122/486/122 121/487/121\nf 439/473/439 437/471/437 451/488/451\nf 439/473/439 451/488/451 1389/489/1389\nf 451/488/451 437/471/437 244/470/244\nf 451/488/451 244/470/244 242/490/242\nf 1389/489/1389 451/488/451 204/491/204\nf 1389/489/1389 204/491/204 1392/492/1392\nf 1392/493/1392 204/494/204 171/495/171\nf 1392/493/1392 171/495/171 452/496/452\nf 452/496/452 171/495/171 483/497/483\nf 452/496/452 483/497/483 453/498/453\nf 453/498/453 483/497/483 454/499/454\nf 453/498/453 454/499/454 455/500/455\nf 455/500/455 454/499/454 456/501/456\nf 455/500/455 456/501/456 457/502/457\nf 457/502/457 456/501/456 458/503/458\nf 457/502/457 458/503/458 459/504/459\nf 459/504/459 458/503/458 460/505/460\nf 459/504/459 460/505/460 461/506/461\nf 461/506/461 460/505/460 462/507/462\nf 461/506/461 462/507/462 463/508/463\nf 463/508/463 462/507/462 464/509/464\nf 463/508/463 464/509/464 465/510/465\nf 465/510/465 464/509/464 466/511/466\nf 465/510/465 466/511/466 467/512/467\nf 458/503/458 456/501/456 468/513/468\nf 458/503/458 468/513/468 528/514/528\nf 460/505/460 458/503/458 469/515/469\nf 460/505/460 469/515/469 470/516/470\nf 462/507/462 460/505/460 470/516/470\nf 462/507/462 470/516/470 471/517/471\nf 464/509/464 462/507/462 471/517/471\nf 464/509/464 471/517/471 472/518/472\nf 466/511/466 464/509/464 472/518/472\nf 466/511/466 472/518/472 473/519/473\nf 468/513/468 456/501/456 454/499/454\nf 468/513/468 454/499/454 474/520/474\nf 468/513/468 474/520/474 475/521/475\nf 468/513/468 475/521/475 498/522/498\nf 475/521/475 474/520/474 476/523/476\nf 475/521/475 476/523/476 477/524/477\nf 476/523/476 474/520/474 479/525/479\nf 476/523/476 479/525/479 480/526/480\nf 482/527/482 479/525/479 483/497/483\nf 482/527/482 483/497/483 484/528/484\nf 482/527/482 484/528/484 486/529/486\nf 482/527/482 486/529/486 519/530/519\nf 487/531/487 488/532/488 490/533/490\nf 487/531/487 490/533/490 489/534/489\nf 487/531/487 489/534/489 492/535/492\nf 487/531/487 492/535/492 491/536/491\nf 492/535/492 489/534/489 493/537/493\nf 492/535/492 493/537/493 494/538/494\nf 488/532/488 498/522/498 495/539/495\nf 488/532/488 495/539/495 496/540/496\nf 490/533/490 488/532/488 496/540/496\nf 490/533/490 496/540/496 497/541/497\nf 171/495/171 173/542/173 484/528/484\nf 171/495/171 484/528/484 483/497/483\nf 479/525/479 474/520/474 454/499/454\nf 479/525/479 454/499/454 483/497/483\nf 489/534/489 490/533/490 497/541/497\nf 489/534/489 497/541/497 493/537/493\nf 499/543/499 475/521/475 505/544/505\nf 499/543/499 505/544/505 503/545/503\nf 507/546/507 502/547/502 508/548/508\nf 507/546/507 508/548/508 509/549/509\nf 481/550/481 519/530/519 508/548/508\nf 481/550/481 508/548/508 502/547/502\nf 503/545/503 514/551/514 537/552/537\nf 503/545/503 537/552/537 501/553/501\nf 511/554/511 510/555/510 514/551/514\nf 511/554/511 514/551/514 503/545/503\nf 515/556/515 486/529/486 484/528/484\nf 515/556/515 484/528/484 173/542/173\nf 513/557/513 514/551/514 510/555/510\nf 513/557/513 510/555/510 521/558/521\nf 520/559/520 542/560/542 546/561/546\nf 520/559/520 546/561/546 522/562/522\nf 470/516/470 469/515/469 523/563/523\nf 470/516/470 523/563/523 524/564/524\nf 471/517/471 470/516/470 524/564/524\nf 471/517/471 524/564/524 525/565/525\nf 472/518/472 471/517/471 525/565/525\nf 472/518/472 525/565/525 526/566/526\nf 531/567/531 491/536/491 492/535/492\nf 531/567/531 492/535/492 533/568/533\nf 541/569/541 515/556/515 538/570/538\nf 541/569/541 538/570/538 539/571/539\nf 539/571/539 540/572/540 543/573/543\nf 539/571/539 543/573/543 541/569/541\nf 542/560/542 545/574/545 547/575/547\nf 542/560/542 547/575/547 546/561/546\nf 550/576/550 551/577/551 552/578/552\nf 550/576/550 552/578/552 445/482/445\nf 551/577/551 549/579/549 555/580/555\nf 551/577/551 555/580/555 557/581/557\nf 548/582/548 600/583/600 555/580/555\nf 548/582/548 555/580/555 549/579/549\nf 450/584/450 568/585/568 189/164/189\nf 450/584/450 189/164/189 188/166/188\nf 568/585/568 572/586/572 573/587/573\nf 568/585/568 573/587/573 571/588/571\nf 569/589/569 578/590/578 586/591/586\nf 569/589/569 586/591/586 577/592/577\nf 448/593/448 564/594/564 591/595/591\nf 448/593/448 591/595/591 590/596/590\nf 561/597/561 743/598/743 744/599/744\nf 561/597/561 744/599/744 595/600/595\nf 600/583/600 593/601/593 598/602/598\nf 600/583/600 598/602/598 599/603/599\nf 559/604/559 599/603/599 594/605/594\nf 559/604/559 594/605/594 601/606/601\nf 594/605/594 598/602/598 593/601/593\nf 594/605/594 593/601/593 592/607/592\nf 555/608/555 600/609/600 605/610/605\nf 555/608/555 605/610/605 604/611/604\nf 604/611/604 590/612/590 591/613/591\nf 604/611/604 591/613/591 555/608/555\nf 605/610/605 600/609/600 599/614/599\nf 605/610/605 599/614/599 559/615/559\nf 635/616/635 930/617/930 936/618/936\nf 635/616/635 936/618/936 603/619/603\nf 993/620/993 994/621/994 610/622/610\nf 993/620/993 610/622/610 607/623/607\nf 610/622/610 995/624/995 618/625/618\nf 610/622/610 618/625/618 617/626/617\nf 619/627/619 620/628/620 618/625/618\nf 619/627/619 618/625/618 995/624/995\nf 648/629/648 618/630/618 620/631/620\nf 648/629/648 620/631/620 643/632/643\nf 547/575/547 545/574/545 627/633/627\nf 547/575/547 627/633/627 625/634/625\nf 624/635/624 628/636/628 627/633/627\nf 624/635/624 627/633/627 626/637/626\nf 581/638/581 628/636/628 624/635/624\nf 581/638/581 624/635/624 580/639/580\nf 581/640/581 610/641/610 617/642/617\nf 581/640/581 617/642/617 628/643/628\nf 555/608/555 591/613/591 556/644/556\nf 555/608/555 556/644/556 557/645/557\nf 630/646/630 629/647/629 631/648/631\nf 630/646/630 631/648/631 632/649/632\nf 560/650/560 630/646/630 634/651/634\nf 560/650/560 634/651/634 635/652/635\nf 632/649/632 631/648/631 633/653/633\nf 632/649/632 633/653/633 634/651/634\nf 603/654/603 638/655/638 637/656/637\nf 603/654/603 637/656/637 636/657/636\nf 559/615/559 638/658/638 606/659/606\nf 559/615/559 606/659/606 605/610/605\nf 643/632/643 644/660/644 647/661/647\nf 643/632/643 647/661/647 646/662/646\nf 647/661/647 644/660/644 676/663/676\nf 647/661/647 676/663/676 649/664/649\nf 641/665/641 640/666/640 651/667/651\nf 641/665/641 651/667/651 652/668/652\nf 639/669/639 641/665/641 654/670/654\nf 639/669/639 654/670/654 653/671/653\nf 641/665/641 652/668/652 655/672/655\nf 641/665/641 655/672/655 654/670/654\nf 673/673/673 653/674/653 656/675/656\nf 673/673/673 656/675/656 657/676/657\nf 654/670/654 655/672/655 658/677/658\nf 654/670/654 658/677/658 656/678/656\nf 656/675/656 662/679/662 663/680/663\nf 656/675/656 663/680/663 657/676/657\nf 656/678/656 658/677/658 664/681/664\nf 656/678/656 664/681/664 662/682/662\nf 662/679/662 665/683/665 660/684/660\nf 662/679/662 660/684/660 663/680/663\nf 661/685/661 665/686/665 662/682/662\nf 661/685/661 662/682/662 664/681/664\nf 673/673/673 657/676/657 667/687/667\nf 673/673/673 667/687/667 672/688/672\nf 658/677/658 655/672/655 666/689/666\nf 658/677/658 666/689/666 668/690/668\nf 663/680/663 660/684/660 669/691/669\nf 663/680/663 669/691/669 670/692/670\nf 664/681/664 658/677/658 668/690/668\nf 664/681/664 668/690/668 671/693/671\nf 657/676/657 663/680/663 670/692/670\nf 657/676/657 670/692/670 667/687/667\nf 661/685/661 664/681/664 671/693/671\nf 661/685/661 671/693/671 669/691/669\nf 671/693/671 668/690/668 667/687/667\nf 671/693/671 667/687/667 670/692/670\nf 668/690/668 674/694/674 672/688/672\nf 668/690/668 672/688/672 667/687/667\nf 674/694/674 666/689/666 675/695/675\nf 674/694/674 675/695/675 677/696/677\nf 675/695/675 666/689/666 655/672/655\nf 675/695/675 655/672/655 652/668/652\nf 673/673/673 672/688/672 678/697/678\nf 673/673/673 678/697/678 676/698/676\nf 915/699/915 679/700/679 680/701/680\nf 915/699/915 680/701/680 767/702/767\nf 915/699/915 682/703/682 683/704/683\nf 915/699/915 683/704/683 679/700/679\nf 681/705/681 680/706/680 684/707/684\nf 681/705/681 684/707/684 685/708/685\nf 681/705/681 685/708/685 687/709/687\nf 681/705/681 687/709/687 699/710/699\nf 686/711/686 683/704/683 689/712/689\nf 686/711/686 689/712/689 711/713/711\nf 687/709/687 690/714/690 698/715/698\nf 687/709/687 698/715/698 699/710/699\nf 693/716/693 694/717/694 696/718/696\nf 693/716/693 696/718/696 697/719/697\nf 688/720/688 701/721/701 697/719/697\nf 688/720/688 697/719/697 696/718/696\nf 691/722/691 688/720/688 699/710/699\nf 691/722/691 699/710/699 698/715/698\nf 697/719/697 701/721/701 703/723/703\nf 697/719/697 703/723/703 704/724/704\nf 706/725/706 689/712/689 683/704/683\nf 706/725/706 683/704/683 682/703/682\nf 707/726/707 708/727/708 749/728/749\nf 707/726/707 749/728/749 750/729/750\nf 679/700/679 683/704/683 686/711/686\nf 679/700/679 686/711/686 710/730/710\nf 685/708/685 684/707/684 712/731/712\nf 685/708/685 712/731/712 713/732/713\nf 710/730/710 686/711/686 714/733/714\nf 710/730/710 714/733/714 716/734/716\nf 715/735/715 687/709/687 685/708/685\nf 715/735/715 685/708/685 713/732/713\nf 711/713/711 690/714/690 722/736/722\nf 711/713/711 722/736/722 717/737/717\nf 690/714/690 687/709/687 715/735/715\nf 690/714/690 715/735/715 722/736/722\nf 684/738/684 710/730/710 716/734/716\nf 684/738/684 716/734/716 712/739/712\nf 686/711/686 711/713/711 717/737/717\nf 686/711/686 717/737/717 714/733/714\nf 712/739/712 716/734/716 720/740/720\nf 712/739/712 720/740/720 718/741/718\nf 715/735/715 713/732/713 718/742/718\nf 715/735/715 718/742/718 723/743/723\nf 714/733/714 717/737/717 721/744/721\nf 714/733/714 721/744/721 720/740/720\nf 721/744/721 717/737/717 722/736/722\nf 721/744/721 722/736/722 719/745/719\nf 723/743/723 719/745/719 722/736/722\nf 723/743/723 722/736/722 715/735/715\nf 718/742/718 724/746/724 727/747/727\nf 718/742/718 727/747/727 723/743/723\nf 720/740/720 721/744/721 725/748/725\nf 720/740/720 725/748/725 724/749/724\nf 721/744/721 719/745/719 726/750/726\nf 721/744/721 726/750/726 725/748/725\nf 723/743/723 727/747/727 726/750/726\nf 723/743/723 726/750/726 719/745/719\nf 772/751/772 729/752/729 771/753/771\nf 772/751/772 771/753/771 681/705/681\nf 649/754/649 676/755/676 732/756/732\nf 649/754/649 732/756/732 731/757/731\nf 729/758/729 700/759/700 733/760/733\nf 729/758/729 733/760/733 734/761/734\nf 678/762/678 730/763/730 734/761/734\nf 678/762/678 734/761/734 732/756/732\nf 732/756/732 737/764/737 736/765/736\nf 732/756/732 736/765/736 731/757/731\nf 734/761/734 733/760/733 738/766/738\nf 734/761/734 738/766/738 739/767/739\nf 734/761/734 739/767/739 737/764/737\nf 734/761/734 737/764/737 732/756/732\nf 743/598/743 561/597/561 740/768/740\nf 743/598/743 740/768/740 742/769/742\nf 743/598/743 603/654/603 636/657/636\nf 743/598/743 636/657/636 744/599/744\nf 744/599/744 596/770/596 601/606/601\nf 744/599/744 601/606/601 745/771/745\nf 757/772/757 752/773/752 759/774/759\nf 757/772/757 759/774/759 761/775/761\nf 760/776/760 757/772/757 761/775/761\nf 760/776/760 761/775/761 762/777/762\nf 677/778/677 921/779/921 922/780/922\nf 677/778/677 922/780/922 730/781/730\nf 681/705/681 696/718/696 692/782/692\nf 681/705/681 692/782/692 772/751/772\nf 763/783/763 758/784/758 773/785/773\nf 763/783/763 773/785/773 775/786/775\nf 760/776/760 762/777/762 773/785/773\nf 760/776/760 773/785/773 758/784/758\nf 777/787/777 754/788/754 787/789/787\nf 777/787/777 787/789/787 776/790/776\nf 756/791/756 782/792/782 784/793/784\nf 756/791/756 784/793/784 783/794/783\nf 791/795/791 794/796/794 801/797/801\nf 791/795/791 801/797/801 800/798/800\nf 786/799/786 781/800/781 779/801/779\nf 786/799/786 779/801/779 806/802/806\nf 774/803/774 799/804/799 810/805/810\nf 774/803/774 810/805/810 809/806/809\nf 811/807/811 807/808/807 809/806/809\nf 811/807/811 809/806/809 810/805/810\nf 808/809/808 811/807/811 810/805/810\nf 808/809/808 810/805/810 819/810/819\nf 814/811/814 808/809/808 819/810/819\nf 814/811/814 819/810/819 820/812/820\nf 830/813/830 822/814/822 801/797/801\nf 830/813/830 801/797/801 829/815/829\nf 839/816/839 838/817/838 841/818/841\nf 839/816/839 841/818/841 840/819/840\nf 838/817/838 839/816/839 848/820/848\nf 838/817/838 848/820/848 847/821/847\nf 842/822/842 838/817/838 847/821/847\nf 842/822/842 847/821/847 849/823/849\nf 847/821/847 848/820/848 859/824/859\nf 847/821/847 859/824/859 850/825/850\nf 849/823/849 847/821/847 850/825/850\nf 849/823/849 850/825/850 851/826/851\nf 852/827/852 845/828/845 842/822/842\nf 852/827/852 842/822/842 849/823/849\nf 845/828/845 852/827/852 854/829/854\nf 845/828/845 854/829/854 853/830/853\nf 852/827/852 873/831/873 871/832/871\nf 852/827/852 871/832/871 854/829/854\nf 863/833/863 825/834/825 840/819/840\nf 863/833/863 840/819/840 841/818/841\nf 863/833/863 841/818/841 843/835/843\nf 863/833/863 843/835/843 844/836/844\nf 843/835/843 862/837/862 864/838/864\nf 843/835/843 864/838/864 844/836/844\nf 857/839/857 855/840/855 883/841/883\nf 857/839/857 883/841/883 884/842/884\nf 856/843/856 857/839/857 884/842/884\nf 856/843/856 884/842/884 1380/844/1380\nf 869/845/869 870/846/870 871/832/871\nf 869/845/869 871/832/871 873/831/873\nf 851/826/851 850/825/850 855/840/855\nf 851/826/851 855/840/855 857/839/857\nf 881/847/881 876/848/876 877/849/877\nf 881/847/881 877/849/877 868/850/868\nf 877/849/877 876/848/876 878/851/878\nf 877/849/877 878/851/878 879/852/879\nf 879/852/879 878/851/878 892/853/892\nf 879/852/879 892/853/892 880/854/880\nf 881/847/881 868/850/868 883/841/883\nf 881/847/881 883/841/883 882/855/882\nf 868/850/868 946/856/946 884/842/884\nf 868/850/868 884/842/884 883/841/883\nf 887/857/887 886/858/886 890/859/890\nf 887/857/887 890/859/890 891/860/891\nf 885/861/885 887/857/887 891/860/891\nf 885/861/885 891/860/891 889/862/889\nf 896/863/896 860/864/860 888/865/888\nf 896/863/896 888/865/888 895/866/895\nf 878/851/878 876/848/876 893/867/893\nf 878/851/878 893/867/893 892/853/892\nf 876/848/876 881/847/881 894/868/894\nf 876/848/876 894/868/894 893/867/893\nf 881/847/881 885/861/885 889/862/889\nf 881/847/881 889/862/889 894/868/894\nf 875/869/875 877/849/877 879/852/879\nf 875/869/875 879/852/879 880/854/880\nf 895/866/895 890/859/890 886/858/886\nf 895/866/895 886/858/886 896/863/896\nf 861/870/861 848/820/848 839/816/839\nf 861/870/861 839/816/839 927/871/927\nf 825/834/825 914/872/914 913/873/913\nf 825/834/825 913/873/913 840/819/840\nf 520/559/520 522/562/522 521/558/521\nf 520/559/520 521/558/521 510/555/510\nf 615/874/615 613/875/613 897/876/897\nf 615/874/615 897/876/897 898/877/898\nf 901/878/901 900/879/900 898/877/898\nf 901/878/901 898/877/898 897/876/897\nf 615/880/615 898/881/898 903/882/903\nf 615/880/615 903/882/903 902/883/902\nf 903/882/903 919/884/919 910/885/910\nf 903/882/903 910/885/910 908/886/908\nf 902/883/902 903/882/903 908/886/908\nf 902/883/902 908/886/908 907/887/907\nf 675/695/675 652/668/652 904/888/904\nf 675/695/675 904/888/904 905/889/905\nf 905/890/905 904/891/904 906/892/906\nf 905/890/905 906/892/906 909/893/909\nf 910/885/910 911/894/911 907/887/907\nf 910/885/910 907/887/907 908/886/908\nf 910/885/910 919/884/919 909/893/909\nf 910/885/910 909/893/909 911/895/911\nf 913/873/913 914/872/914 915/896/915\nf 913/873/913 915/896/915 916/897/916\nf 912/898/912 900/899/900 916/897/916\nf 912/898/912 916/897/916 915/896/915\nf 914/872/914 828/900/828 827/901/827\nf 914/872/914 827/901/827 682/902/682\nf 768/903/768 769/904/769 918/905/918\nf 768/903/768 918/905/918 917/906/917\nf 912/907/912 768/903/768 917/906/917\nf 912/907/912 917/906/917 919/908/919\nf 921/779/921 677/778/677 675/909/675\nf 921/779/921 675/909/675 923/910/923\nf 905/911/905 909/912/909 923/913/923\nf 905/911/905 923/913/923 675/914/675\nf 919/908/919 917/906/917 923/913/923\nf 919/908/919 923/913/923 909/912/909\nf 768/903/768 915/915/915 767/916/767\nf 768/903/768 767/916/767 924/917/924\nf 930/617/930 633/918/633 932/919/932\nf 930/617/930 932/919/932 931/920/931\nf 853/830/853 854/829/854 934/921/934\nf 853/830/853 934/921/934 935/922/935\nf 854/829/854 871/832/871 933/923/933\nf 854/829/854 933/923/933 953/924/953\nf 930/617/930 931/920/931 937/925/937\nf 930/617/930 937/925/937 936/618/936\nf 853/830/853 937/925/937 846/926/846\nf 853/830/853 846/926/846 845/828/845\nf 953/924/953 938/927/938 954/928/954\nf 953/924/953 954/928/954 934/921/934\nf 941/929/941 895/866/895 888/865/888\nf 941/929/941 888/865/888 938/930/938\nf 939/931/939 954/932/954 938/930/938\nf 939/931/939 938/930/938 888/865/888\nf 861/870/861 927/871/927 928/933/928\nf 861/870/861 928/933/928 939/931/939\nf 939/931/939 928/933/928 901/934/901\nf 939/931/939 901/934/901 954/932/954\nf 890/859/890 895/866/895 941/929/941\nf 890/859/890 941/929/941 940/935/940\nf 892/853/892 893/867/893 942/936/942\nf 892/853/892 942/936/942 1151/937/1151\nf 1151/938/1151 942/939/942 944/940/944\nf 1151/938/1151 944/940/944 992/941/992\nf 942/939/942 943/942/943 945/943/945\nf 942/939/942 945/943/945 944/940/944\nf 944/940/944 948/944/948 959/945/959\nf 944/940/944 959/945/959 992/941/992\nf 948/944/948 944/940/944 952/946/952\nf 948/944/948 952/946/952 947/947/947\nf 947/947/947 950/948/950 872/949/872\nf 947/947/947 872/949/872 1380/844/1380\nf 951/950/951 950/948/950 947/947/947\nf 951/950/951 947/947/947 952/946/952\nf 945/943/945 955/951/955 956/952/956\nf 945/943/945 956/952/956 951/950/951\nf 870/846/870 869/845/869 872/949/872\nf 870/846/870 872/949/872 950/948/950\nf 951/950/951 956/952/956 870/846/870\nf 951/950/951 870/846/870 950/948/950\nf 940/953/940 941/954/941 955/951/955\nf 940/953/940 955/951/955 945/943/945\nf 955/951/955 941/954/941 938/927/938\nf 955/951/955 938/927/938 953/924/953\nf 954/928/954 901/955/901 899/956/899\nf 954/928/954 899/956/899 934/921/934\nf 949/957/949 875/869/875 957/958/957\nf 949/957/949 957/958/957 958/959/958\nf 949/957/949 958/959/958 979/960/979\nf 949/957/949 979/960/979 959/945/959\nf 961/961/961 957/958/957 880/854/880\nf 961/961/961 880/854/880 960/962/960\nf 963/963/963 958/959/958 957/958/957\nf 963/963/963 957/958/957 962/964/962\nf 1152/965/1152 964/966/964 960/962/960\nf 1152/965/1152 960/962/960 880/854/880\nf 1077/967/1077 962/964/962 961/961/961\nf 1077/967/1077 961/961/961 1078/968/1078\nf 961/961/961 960/962/960 1115/969/1115\nf 961/961/961 1115/969/1115 1114/970/1114\nf 963/963/963 962/964/962 965/971/965\nf 963/963/963 965/971/965 966/972/966\nf 960/962/960 964/966/964 1154/973/1154\nf 960/962/960 1154/973/1154 1153/974/1153\nf 966/972/966 965/971/965 967/975/967\nf 966/972/966 967/975/967 968/976/968\nf 968/976/968 967/975/967 969/977/969\nf 968/976/968 969/977/969 970/978/970\nf 970/978/970 969/977/969 971/979/971\nf 970/978/970 971/979/971 972/980/972\nf 972/980/972 971/979/971 973/981/973\nf 972/980/972 973/981/973 977/982/977\nf 958/959/958 1042/983/1042 1041/984/1041\nf 958/959/958 1041/984/1041 979/960/979\nf 966/972/966 968/976/968 981/985/981\nf 966/972/966 981/985/981 980/986/980\nf 972/980/972 977/982/977 983/987/983\nf 972/980/972 983/987/983 981/985/981\nf 983/987/983 977/982/977 975/988/975\nf 983/987/983 975/988/975 982/989/982\nf 986/990/986 976/991/976 974/992/974\nf 986/990/986 974/992/974 984/993/984\nf 975/988/975 976/991/976 986/990/986\nf 975/988/975 986/990/986 985/994/985\nf 987/995/987 986/990/986 984/993/984\nf 987/995/987 984/993/984 1036/996/1036\nf 985/994/985 986/990/986 987/995/987\nf 985/994/985 987/995/987 1035/997/1035\nf 979/960/979 1041/984/1041 1052/998/1052\nf 979/960/979 1052/998/1052 988/999/988\nf 992/941/992 959/945/959 979/960/979\nf 992/941/992 979/960/979 988/999/988\nf 608/1000/608 611/1001/611 994/621/994\nf 608/1000/608 994/621/994 993/620/993\nf 995/624/995 994/621/994 611/1001/611\nf 995/624/995 611/1001/611 642/1002/642\nf 1000/1003/1000 816/1004/816 814/811/814\nf 1000/1003/1000 814/811/814 997/1005/997\nf 830/813/830 1010/1006/1010 1009/1007/1009\nf 830/813/830 1009/1007/1009 822/814/822\nf 837/1008/837 832/1009/832 1010/1006/1010\nf 837/1008/837 1010/1006/1010 830/813/830\nf 1003/1010/1003 844/836/844 865/1011/865\nf 1003/1010/1003 865/1011/865 1013/1012/1013\nf 1016/1013/1016 1007/1014/1007 1022/1015/1022\nf 1016/1013/1016 1022/1015/1022 1015/1016/1015\nf 865/1011/865 999/1017/999 1019/1018/1019\nf 865/1011/865 1019/1018/1019 1023/1019/1023\nf 824/1020/824 1012/1021/1012 835/1022/835\nf 824/1020/824 835/1022/835 836/1023/836\nf 1028/1024/1028 1025/1025/1025 973/981/973\nf 1028/1024/1028 973/981/973 971/979/971\nf 1025/1025/1025 1026/1026/1026 974/992/974\nf 1025/1025/1025 974/992/974 973/981/973\nf 1027/1027/1027 1028/1024/1028 967/975/967\nf 1027/1027/1027 967/975/967 965/971/965\nf 1029/1028/1029 1030/1029/1030 983/987/983\nf 1029/1028/1029 983/987/983 982/989/982\nf 1031/1030/1031 1032/1031/1032 1026/1026/1026\nf 1031/1030/1031 1026/1026/1026 1025/1025/1025\nf 1030/1032/1030 1029/1033/1029 1032/1034/1032\nf 1030/1032/1030 1032/1034/1032 1031/1035/1031\nf 1033/1036/1033 1034/1037/1034 1032/1034/1032\nf 1033/1036/1033 1032/1034/1032 1029/1033/1029\nf 1035/1038/1035 1036/1039/1036 1034/1037/1034\nf 1035/1038/1035 1034/1037/1034 1033/1036/1033\nf 1039/1040/1039 1037/1041/1037 1030/1032/1030\nf 1039/1040/1039 1030/1032/1030 1031/1035/1031\nf 1112/1042/1112 1038/1043/1038 1037/1041/1037\nf 1112/1042/1112 1037/1041/1037 1039/1040/1039\nf 1028/1024/1028 1039/1044/1039 1031/1030/1031\nf 1028/1024/1028 1031/1030/1031 1025/1025/1025\nf 1027/1027/1027 1112/1045/1112 1039/1044/1039\nf 1027/1027/1027 1039/1044/1039 1028/1024/1028\nf 1038/1046/1038 980/986/980 981/985/981\nf 1038/1046/1038 981/985/981 1037/1047/1037\nf 1041/984/1041 1042/983/1042 1043/1048/1043\nf 1041/984/1041 1043/1048/1043 1044/1049/1044\nf 1044/1049/1044 1043/1048/1043 1045/1050/1045\nf 1044/1049/1044 1045/1050/1045 1046/1051/1046\nf 1046/1051/1046 1045/1050/1045 1047/1052/1047\nf 1046/1051/1046 1047/1052/1047 1048/1053/1048\nf 1041/984/1041 1044/1049/1044 1053/1054/1053\nf 1041/984/1041 1053/1054/1053 1052/998/1052\nf 1053/1054/1053 1048/1053/1048 1051/1055/1051\nf 1053/1054/1053 1051/1055/1051 1054/1056/1054\nf 1055/1057/1055 1049/1058/1049 1050/1059/1050\nf 1055/1057/1055 1050/1059/1050 1056/1060/1056\nf 1051/1055/1051 1049/1058/1049 1055/1057/1055\nf 1051/1055/1051 1055/1057/1055 1057/1061/1057\nf 1058/1062/1058 1055/1057/1055 1056/1060/1056\nf 1058/1062/1058 1056/1060/1056 1059/1063/1059\nf 1057/1061/1057 1055/1057/1055 1058/1062/1058\nf 1057/1061/1057 1058/1062/1058 1060/1064/1060\nf 1061/1065/1061 1062/1066/1062 1050/1059/1050\nf 1061/1065/1061 1050/1059/1050 1047/1052/1047\nf 978/1067/978 1061/1065/1061 1043/1048/1043\nf 978/1067/978 1043/1048/1043 1042/983/1042\nf 1063/1068/1063 1070/1069/1070 1053/1054/1053\nf 1063/1068/1063 1053/1054/1053 1054/1056/1054\nf 1069/1070/1069 1064/1071/1064 1062/1066/1062\nf 1069/1070/1069 1062/1066/1062 1061/1065/1061\nf 1070/1072/1070 1063/1073/1063 1064/1074/1064\nf 1070/1072/1070 1064/1074/1064 1069/1075/1069\nf 1065/1076/1065 1066/1077/1066 1064/1074/1064\nf 1065/1076/1065 1064/1074/1064 1063/1073/1063\nf 1067/1078/1067 1068/1079/1068 1066/1077/1066\nf 1067/1078/1067 1066/1077/1066 1065/1076/1065\nf 1060/1080/1060 1059/1081/1059 1068/1079/1068\nf 1060/1080/1060 1068/1079/1068 1067/1078/1067\nf 1071/1082/1071 1187/1083/1187 1070/1072/1070\nf 1071/1082/1071 1070/1072/1070 1069/1075/1069\nf 1061/1065/1061 978/1067/978 1071/1084/1071\nf 1061/1065/1061 1071/1084/1071 1069/1070/1069\nf 1187/1085/1187 1052/998/1052 1053/1054/1053\nf 1187/1085/1187 1053/1054/1053 1070/1069/1070\nf 1073/1086/1073 963/963/963 966/972/966\nf 1073/1086/1073 966/972/966 980/986/980\nf 1076/1087/1076 1074/1088/1074 990/1089/990\nf 1076/1087/1076 990/1089/990 1187/1090/1187\nf 1073/1086/1073 980/986/980 1038/1046/1038\nf 1073/1086/1073 1038/1046/1038 1075/1091/1075\nf 1075/1092/1075 1038/1043/1038 1112/1042/1112\nf 1075/1092/1075 1112/1042/1112 1076/1087/1076\nf 981/985/981 983/987/983 1030/1029/1030\nf 981/985/981 1030/1029/1030 1037/1047/1037\nf 1077/967/1077 1078/968/1078 1079/1093/1079\nf 1077/967/1077 1079/1093/1079 1080/1094/1080\nf 1080/1094/1080 1079/1093/1079 1081/1095/1081\nf 1080/1094/1080 1081/1095/1081 1082/1096/1082\nf 1082/1096/1082 1081/1095/1081 1083/1097/1083\nf 1082/1096/1082 1083/1097/1083 1084/1098/1084\nf 1084/1098/1084 1083/1097/1083 1085/1099/1085\nf 1084/1098/1084 1085/1099/1085 1086/1100/1086\nf 1077/967/1077 1080/1094/1080 1091/1101/1091\nf 1077/967/1077 1091/1101/1091 1090/1102/1090\nf 1084/1098/1084 1086/1100/1086 1092/1103/1092\nf 1084/1098/1084 1092/1103/1092 1091/1101/1091\nf 1092/1103/1092 1086/1100/1086 1089/1104/1089\nf 1092/1103/1092 1089/1104/1089 1093/1105/1093\nf 1094/1106/1094 1087/1107/1087 1088/1108/1088\nf 1094/1106/1094 1088/1108/1088 1095/1109/1095\nf 1089/1104/1089 1087/1107/1087 1094/1106/1094\nf 1089/1104/1089 1094/1106/1094 1096/1110/1096\nf 1097/1111/1097 1094/1106/1094 1095/1109/1095\nf 1097/1111/1097 1095/1109/1095 1098/1112/1098\nf 1096/1110/1096 1094/1106/1094 1097/1111/1097\nf 1096/1110/1096 1097/1111/1097 1099/1113/1099\nf 1100/1114/1100 1101/1115/1101 1085/1099/1085\nf 1100/1114/1100 1085/1099/1085 1083/1097/1083\nf 1101/1115/1101 1102/1116/1102 1088/1108/1088\nf 1101/1115/1101 1088/1108/1088 1085/1099/1085\nf 1103/1117/1103 1100/1114/1100 1079/1093/1079\nf 1103/1117/1103 1079/1093/1079 1078/968/1078\nf 1093/1105/1093 1104/1118/1104 1105/1119/1105\nf 1093/1105/1093 1105/1119/1105 1092/1103/1092\nf 1106/1120/1106 1107/1121/1107 1102/1116/1102\nf 1106/1120/1106 1102/1116/1102 1101/1115/1101\nf 1105/1122/1105 1104/1123/1104 1107/1124/1107\nf 1105/1122/1105 1107/1124/1107 1106/1125/1106\nf 1108/1126/1108 1109/1127/1109 1107/1124/1107\nf 1108/1126/1108 1107/1124/1107 1104/1123/1104\nf 1099/1128/1099 1098/1129/1098 1109/1127/1109\nf 1099/1128/1099 1109/1127/1109 1108/1126/1108\nf 1110/1130/1110 1111/1131/1111 1105/1122/1105\nf 1110/1130/1110 1105/1122/1105 1106/1125/1106\nf 1148/1132/1148 1112/1042/1112 1111/1131/1111\nf 1148/1132/1148 1111/1131/1111 1110/1130/1110\nf 1100/1114/1100 1110/1133/1110 1106/1120/1106\nf 1100/1114/1100 1106/1120/1106 1101/1115/1101\nf 1103/1117/1103 1148/1134/1148 1110/1133/1110\nf 1103/1117/1103 1110/1133/1110 1100/1114/1100\nf 1112/1045/1112 1090/1102/1090 1091/1101/1091\nf 1112/1045/1112 1091/1101/1091 1111/1135/1111\nf 1091/1101/1091 1092/1103/1092 1105/1119/1105\nf 1091/1101/1091 1105/1119/1105 1111/1135/1111\nf 1077/967/1077 1090/1102/1090 1027/1027/1027\nf 1077/967/1077 1027/1027/1027 965/971/965\nf 1114/970/1114 1115/969/1115 1116/1136/1116\nf 1114/970/1114 1116/1136/1116 1117/1137/1117\nf 1117/1137/1117 1116/1136/1116 1118/1138/1118\nf 1117/1137/1117 1118/1138/1118 1119/1139/1119\nf 1119/1139/1119 1118/1138/1118 1120/1140/1120\nf 1119/1139/1119 1120/1140/1120 1121/1141/1121\nf 1121/1141/1121 1120/1140/1120 1122/1142/1122\nf 1121/1141/1121 1122/1142/1122 1123/1143/1123\nf 1114/970/1114 1117/1137/1117 1128/1144/1128\nf 1114/970/1114 1128/1144/1128 1127/1145/1127\nf 1121/1141/1121 1123/1143/1123 1129/1146/1129\nf 1121/1141/1121 1129/1146/1129 1128/1144/1128\nf 1129/1146/1129 1123/1143/1123 1126/1147/1126\nf 1129/1146/1129 1126/1147/1126 1130/1148/1130\nf 1131/1149/1131 1124/1150/1124 1125/1151/1125\nf 1131/1149/1131 1125/1151/1125 1132/1152/1132\nf 1126/1147/1126 1124/1150/1124 1131/1149/1131\nf 1126/1147/1126 1131/1149/1131 1133/1153/1133\nf 1135/1154/1135 1136/1155/1136 1122/1142/1122\nf 1135/1154/1135 1122/1142/1122 1120/1140/1120\nf 1136/1155/1136 1137/1156/1137 1125/1151/1125\nf 1136/1155/1136 1125/1151/1125 1122/1142/1122\nf 1138/1157/1138 1135/1154/1135 1116/1136/1116\nf 1138/1157/1138 1116/1136/1116 1115/969/1115\nf 1139/1158/1139 1140/1159/1140 1129/1146/1129\nf 1139/1158/1139 1129/1146/1129 1130/1148/1130\nf 1141/1160/1141 1142/1161/1142 1137/1156/1137\nf 1141/1160/1141 1137/1156/1137 1136/1155/1136\nf 1140/1162/1140 1139/1163/1139 1142/1164/1142\nf 1140/1162/1140 1142/1164/1142 1141/1165/1141\nf 1143/1166/1143 1144/1167/1144 1142/1164/1142\nf 1143/1166/1143 1142/1164/1142 1139/1163/1139\nf 1145/1168/1145 1146/1169/1146 1140/1162/1140\nf 1145/1168/1145 1140/1162/1140 1141/1165/1141\nf 1147/1170/1147 1148/1171/1148 1146/1169/1146\nf 1147/1170/1147 1146/1169/1146 1145/1168/1145\nf 1135/1154/1135 1145/1172/1145 1141/1160/1141\nf 1135/1154/1135 1141/1160/1141 1136/1155/1136\nf 1138/1157/1138 1147/1173/1147 1145/1172/1145\nf 1138/1157/1138 1145/1172/1145 1135/1154/1135\nf 1148/1134/1148 1127/1145/1127 1128/1144/1128\nf 1148/1134/1148 1128/1144/1128 1146/1174/1146\nf 1128/1144/1128 1129/1146/1129 1140/1159/1140\nf 1128/1144/1128 1140/1159/1140 1146/1174/1146\nf 1103/1117/1103 1078/968/1078 1114/970/1114\nf 1103/1117/1103 1114/970/1114 1127/1145/1127\nf 1148/1132/1148 1074/1088/1074 1076/1087/1076\nf 1148/1132/1148 1076/1087/1076 1112/1042/1112\nf 1150/1175/1150 1149/1176/1149 989/1177/989\nf 1150/1175/1150 989/1177/989 1074/1178/1074\nf 1149/1179/1149 1152/965/1152 892/853/892\nf 1149/1179/1149 892/853/892 1151/937/1151\nf 964/966/964 1152/965/1152 1149/1179/1149\nf 964/966/964 1149/1179/1149 1150/1180/1150\nf 606/659/606 638/658/638 603/1181/603\nf 606/659/606 603/1181/603 936/1182/936\nf 1153/974/1153 1154/973/1154 1155/1183/1155\nf 1153/974/1153 1155/1183/1155 1156/1184/1156\nf 1156/1184/1156 1155/1183/1155 1157/1185/1157\nf 1156/1184/1156 1157/1185/1157 1158/1186/1158\nf 1158/1186/1158 1157/1185/1157 1159/1187/1159\nf 1158/1186/1158 1159/1187/1159 1160/1188/1160\nf 1160/1188/1160 1159/1187/1159 1161/1189/1161\nf 1160/1188/1160 1161/1189/1161 1162/1190/1162\nf 1153/974/1153 1156/1184/1156 1167/1191/1167\nf 1153/974/1153 1167/1191/1167 1166/1192/1166\nf 1160/1188/1160 1162/1190/1162 1168/1193/1168\nf 1160/1188/1160 1168/1193/1168 1167/1191/1167\nf 1168/1193/1168 1162/1190/1162 1165/1194/1165\nf 1168/1193/1168 1165/1194/1165 1169/1195/1169\nf 1170/1196/1170 1163/1197/1163 1164/1198/1164\nf 1170/1196/1170 1164/1198/1164 1171/1199/1171\nf 1165/1194/1165 1163/1197/1163 1170/1196/1170\nf 1165/1194/1165 1170/1196/1170 1172/1200/1172\nf 1174/1201/1174 1175/1202/1175 1161/1189/1161\nf 1174/1201/1174 1161/1189/1161 1159/1187/1159\nf 1175/1202/1175 1176/1203/1176 1164/1198/1164\nf 1175/1202/1175 1164/1198/1164 1161/1189/1161\nf 1177/1204/1177 1174/1201/1174 1155/1183/1155\nf 1177/1204/1177 1155/1183/1155 1154/973/1154\nf 1178/1205/1178 1179/1206/1179 1168/1193/1168\nf 1178/1205/1178 1168/1193/1168 1169/1195/1169\nf 1180/1207/1180 1181/1208/1181 1176/1203/1176\nf 1180/1207/1180 1176/1203/1176 1175/1202/1175\nf 1179/1209/1179 1178/1210/1178 1181/1211/1181\nf 1179/1209/1179 1181/1211/1181 1180/1212/1180\nf 1182/1213/1182 1183/1214/1183 1181/1211/1181\nf 1182/1213/1182 1181/1211/1181 1178/1210/1178\nf 1184/1215/1184 1185/1216/1185 1179/1209/1179\nf 1184/1215/1184 1179/1209/1179 1180/1212/1180\nf 1186/1217/1186 1147/1170/1147 1185/1216/1185\nf 1186/1217/1186 1185/1216/1185 1184/1215/1184\nf 1174/1201/1174 1184/1218/1184 1180/1207/1180\nf 1174/1201/1174 1180/1207/1180 1175/1202/1175\nf 1177/1204/1177 1186/1219/1186 1184/1218/1184\nf 1177/1204/1177 1184/1218/1184 1174/1201/1174\nf 1147/1173/1147 1166/1192/1166 1167/1191/1167\nf 1147/1173/1147 1167/1191/1167 1185/1220/1185\nf 1167/1191/1167 1168/1193/1168 1179/1206/1179\nf 1167/1191/1167 1179/1206/1179 1185/1220/1185\nf 1138/1157/1138 1115/969/1115 1153/974/1153\nf 1138/1157/1138 1153/974/1153 1166/1192/1166\nf 1074/1178/1074 1148/1171/1148 1147/1170/1147\nf 1074/1178/1074 1147/1170/1147 1186/1217/1186\nf 1177/1204/1177 964/966/964 1150/1180/1150\nf 1177/1204/1177 1150/1180/1150 1186/1219/1186\nf 963/963/963 1073/1086/1073 978/1067/978\nf 963/963/963 978/1067/978 1042/983/1042\nf 1075/1091/1075 1071/1084/1071 978/1067/978\nf 1075/1091/1075 978/1067/978 1073/1086/1073\nf 807/808/807 1189/1221/1189 1197/1222/1197\nf 807/808/807 1197/1222/1197 809/806/809\nf 1195/1223/1195 1196/1224/1196 1190/1225/1190\nf 1195/1223/1195 1190/1225/1190 1192/1226/1192\nf 812/1227/812 562/1228/562 1192/1226/1192\nf 812/1227/812 1192/1226/1192 1190/1225/1190\nf 1194/1229/1194 1193/1230/1193 1188/1231/1188\nf 1194/1229/1194 1188/1231/1188 1191/1232/1191\nf 1195/1223/1195 1191/1232/1191 1188/1231/1188\nf 1195/1223/1195 1188/1231/1188 1189/1221/1189\nf 1196/1224/1196 1195/1223/1195 1189/1221/1189\nf 1196/1224/1196 1189/1221/1189 807/808/807\nf 1200/1233/1200 1331/1234/1331 783/1235/783\nf 1200/1233/1200 783/1235/783 784/1236/784\nf 1202/1237/1202 1203/1238/1203 1204/1239/1204\nf 1202/1237/1202 1204/1239/1204 1201/1240/1201\nf 1206/1241/1206 1207/1242/1207 1205/1243/1205\nf 1206/1241/1206 1205/1243/1205 1201/1240/1201\nf 1206/1241/1206 1208/1244/1208 1209/1245/1209\nf 1206/1241/1206 1209/1245/1209 1207/1242/1207\nf 1211/1246/1211 1210/1247/1210 1202/1237/1202\nf 1211/1246/1211 1202/1237/1202 1205/1243/1205\nf 1212/1248/1212 1211/1246/1211 1205/1243/1205\nf 1212/1248/1212 1205/1243/1205 1207/1242/1207\nf 1209/1245/1209 1213/1249/1213 1212/1248/1212\nf 1209/1245/1209 1212/1248/1212 1207/1242/1207\nf 1202/1237/1202 1210/1247/1210 786/1250/786\nf 1202/1237/1202 786/1250/786 1203/1238/1203\nf 784/1251/784 1223/1252/1223 1214/1253/1214\nf 784/1251/784 1214/1253/1214 1200/1254/1200\nf 1218/1255/1218 1219/1256/1219 1217/1257/1217\nf 1218/1255/1218 1217/1257/1217 1216/1258/1216\nf 1219/1256/1219 1222/1259/1222 1215/1260/1215\nf 1219/1256/1219 1215/1260/1215 1217/1257/1217\nf 1222/1259/1222 1221/1261/1221 1214/1253/1214\nf 1222/1259/1222 1214/1253/1214 1215/1260/1215\nf 1221/1261/1221 1220/1262/1220 1200/1254/1200\nf 1221/1261/1221 1200/1254/1200 1214/1253/1214\nf 1215/1260/1215 1223/1252/1223 1211/1263/1211\nf 1215/1260/1215 1211/1263/1211 1212/1264/1212\nf 1206/1241/1206 1201/1240/1201 1225/1265/1225\nf 1206/1241/1206 1225/1265/1225 1226/1266/1226\nf 1206/1241/1206 1226/1266/1226 1218/1255/1218\nf 1206/1241/1206 1218/1255/1218 1208/1244/1208\nf 1228/1267/1228 1229/1268/1229 1198/1269/1198\nf 1228/1267/1228 1198/1269/1198 1193/1230/1193\nf 1233/1270/1233 1250/1271/1250 1248/1272/1248\nf 1233/1270/1233 1248/1272/1248 1231/1273/1231\nf 1235/1274/1235 1236/1275/1236 1232/1276/1232\nf 1235/1274/1235 1232/1276/1232 1252/1277/1252\nf 1230/1278/1230 1237/1279/1237 1229/1280/1229\nf 1230/1278/1230 1229/1280/1229 1228/1281/1228\nf 1238/1282/1238 1362/1283/1362 1237/1279/1237\nf 1238/1282/1238 1237/1279/1237 1230/1278/1230\nf 1242/1284/1242 1241/1285/1241 1253/1286/1253\nf 1242/1284/1242 1253/1286/1253 1234/1287/1234\nf 1248/1272/1248 1250/1271/1250 1251/1288/1251\nf 1248/1272/1248 1251/1288/1251 1232/1276/1232\nf 1236/1275/1236 1249/1289/1249 1248/1272/1248\nf 1236/1275/1236 1248/1272/1248 1232/1276/1232\nf 1251/1288/1251 1250/1271/1250 1247/1290/1247\nf 1251/1288/1251 1247/1290/1247 1234/1287/1234\nf 1252/1277/1252 1251/1288/1251 1234/1287/1234\nf 1252/1277/1252 1234/1287/1234 1253/1286/1253\nf 1254/1291/1254 1241/1285/1241 1242/1284/1242\nf 1254/1291/1254 1242/1284/1242 1239/1292/1239\nf 1261/1293/1261 1254/1291/1254 1239/1292/1239\nf 1261/1293/1261 1239/1292/1239 1260/1294/1260\nf 1282/1295/1282 1259/1296/1259 1260/1294/1260\nf 1282/1295/1282 1260/1294/1260 1239/1292/1239\nf 1259/1296/1259 1265/28/1265 1255/27/1255\nf 1259/1296/1259 1255/27/1255 1260/1294/1260\nf 1256/29/1256 1261/1293/1261 1260/1294/1260\nf 1256/29/1256 1260/1294/1260 1255/27/1255\nf 1263/1297/1263 1262/33/1262 1258/32/1258\nf 1263/1297/1263 1258/32/1258 1264/1298/1264\nf 1258/32/1258 1265/28/1265 1259/1296/1259\nf 1258/32/1258 1259/1296/1259 1264/1298/1264\nf 34/34/34 1267/1299/1267 1261/1293/1261\nf 34/34/34 1261/1293/1261 1256/29/1256\nf 1267/1299/1267 1266/1300/1266 1254/1291/1254\nf 1267/1299/1267 1254/1291/1254 1261/1293/1261\nf 1269/1301/1269 1270/1302/1270 1267/1299/1267\nf 1269/1301/1269 1267/1299/1267 34/34/34\nf 1267/1299/1267 1270/1302/1270 1268/1303/1268\nf 1267/1299/1267 1268/1303/1268 1266/1300/1266\nf 1272/1304/1272 1273/1305/1273 1270/1302/1270\nf 1272/1304/1272 1270/1302/1270 1269/1301/1269\nf 1273/1305/1273 1271/1306/1271 1268/1303/1268\nf 1273/1305/1273 1268/1303/1268 1270/1302/1270\nf 43/43/43 1274/1307/1274 1272/1304/1272\nf 43/43/43 1272/1304/1272 1269/1301/1269\nf 1203/1308/1203 1275/1309/1275 1276/1310/1276\nf 1203/1308/1203 1276/1310/1276 1204/1311/1204\nf 1277/1312/1277 1304/1313/1304 1236/1275/1236\nf 1277/1312/1277 1236/1275/1236 1235/1274/1235\nf 1273/1305/1273 1277/1312/1277 1235/1274/1235\nf 1273/1305/1273 1235/1274/1235 1271/1306/1271\nf 1329/1314/1329 1277/1312/1277 1272/1304/1272\nf 1329/1314/1329 1272/1304/1272 1274/1307/1274\nf 1244/1315/1244 1243/1316/1243 1245/1317/1245\nf 1244/1315/1244 1245/1317/1245 1246/1318/1246\nf 1278/1319/1278 1244/1315/1244 1246/1318/1246\nf 1278/1319/1278 1246/1318/1246 1280/53/1280\nf 1283/1320/1283 1282/1295/1282 1239/1292/1239\nf 1283/1320/1283 1239/1292/1239 1242/1284/1242\nf 1284/1321/1284 1283/1320/1283 1242/1284/1242\nf 1284/1321/1284 1242/1284/1242 1257/1322/1257\nf 1287/1323/1287 1288/1324/1288 1283/1320/1283\nf 1287/1323/1287 1283/1320/1283 1284/1321/1284\nf 1282/1295/1282 1283/1320/1283 1288/1324/1288\nf 1282/1295/1282 1288/1324/1288 1290/1325/1290\nf 1244/1315/1244 1278/1319/1278 1279/1326/1279\nf 1244/1315/1244 1279/1326/1279 1285/1327/1285\nf 1278/1319/1278 1291/1328/1291 1263/1297/1263\nf 1278/1319/1278 1263/1297/1263 1279/1326/1279\nf 1325/1329/1325 1306/1330/1306 1304/1313/1304\nf 1325/1329/1325 1304/1313/1304 1277/1312/1277\nf 1292/1331/1292 1330/1332/1330 1204/1311/1204\nf 1292/1331/1292 1204/1311/1204 1276/1310/1276\nf 1295/1333/1295 1293/1334/1293 1436/1335/1436\nf 1295/1333/1295 1436/1335/1436 1437/1336/1437\nf 1438/1337/1438 1297/1338/1297 1295/1333/1295\nf 1438/1337/1438 1295/1333/1295 1437/1336/1437\nf 1298/1339/1298 1301/1340/1301 1302/1341/1302\nf 1298/1339/1298 1302/1341/1302 1299/1342/1299\nf 1300/1343/1300 1302/1341/1302 1301/1340/1301\nf 1300/1343/1300 1301/1340/1301 1352/1344/1352\nf 1295/1333/1295 1305/1345/1305 1303/1346/1303\nf 1295/1333/1295 1303/1346/1303 1293/1334/1293\nf 1299/1342/1299 1354/1347/1354 1305/1345/1305\nf 1299/1342/1299 1305/1345/1305 1297/1338/1297\nf 1300/1343/1300 1307/1348/1307 1308/1349/1308\nf 1300/1343/1300 1308/1349/1308 1302/1341/1302\nf 1302/1341/1302 1308/1349/1308 1354/1347/1354\nf 1302/1341/1302 1354/1347/1354 1299/1342/1299\nf 1310/1350/1310 1309/1351/1309 1204/1352/1204\nf 1310/1350/1310 1204/1352/1204 1311/1353/1311\nf 1313/1354/1313 1312/1355/1312 1309/1351/1309\nf 1313/1354/1313 1309/1351/1309 1310/1350/1310\nf 1315/1356/1315 1316/1357/1316 1310/1350/1310\nf 1315/1356/1315 1310/1350/1310 1311/1353/1311\nf 1316/1357/1316 1317/1358/1317 1313/1354/1313\nf 1316/1357/1316 1313/1354/1313 1310/1350/1310\nf 1326/1359/1326 1319/1360/1319 1316/1357/1316\nf 1326/1359/1326 1316/1357/1316 1315/1356/1315\nf 1316/1357/1316 1319/1360/1319 1322/1361/1322\nf 1316/1357/1316 1322/1361/1322 1317/1358/1317\nf 1326/1359/1326 1320/1362/1320 1321/1363/1321\nf 1326/1359/1326 1321/1363/1321 1319/1360/1319\nf 1323/1364/1323 1312/1355/1312 1313/1354/1313\nf 1323/1364/1323 1313/1354/1313 1324/1365/1324\nf 1317/1358/1317 1318/1366/1318 1324/1365/1324\nf 1317/1358/1317 1324/1365/1324 1313/1354/1313\nf 1325/1367/1325 1328/1368/1328 1315/1356/1315\nf 1325/1367/1325 1315/1356/1315 1311/1353/1311\nf 1332/1369/1332 1331/1234/1331 1220/1370/1220\nf 1332/1369/1332 1220/1370/1220 1224/1371/1224\nf 106/1372/106 1332/1369/1332 1224/1371/1224\nf 106/1372/106 1224/1371/1224 1327/1373/1327\nf 1333/1374/1333 1334/1375/1334 1335/1376/1335\nf 1333/1374/1333 1335/1376/1335 1338/1377/1338\nf 109/65/109 1334/1375/1334 1274/1307/1274\nf 109/65/109 1274/1307/1274 43/43/43\nf 1315/1356/1315 1328/1368/1328 1327/1378/1327\nf 1315/1356/1315 1327/1378/1327 1326/1359/1326\nf 1333/1374/1333 1338/1377/1338 1337/1379/1337\nf 1333/1374/1333 1337/1379/1337 1336/1380/1336\nf 100/1381/100 1339/1382/1339 1340/1383/1340\nf 100/1381/100 1340/1383/1340 99/1384/99\nf 1339/1382/1339 1341/1385/1341 1342/1386/1342\nf 1339/1382/1339 1342/1386/1342 1340/1383/1340\nf 1339/1382/1339 100/1381/100 106/1387/106\nf 1339/1382/1339 106/1387/106 1337/1388/1337\nf 101/111/101 1341/1385/1341 1335/1389/1335\nf 101/111/101 1335/1389/1335 109/112/109\nf 1341/1385/1341 1339/1382/1339 1337/1388/1337\nf 1341/1385/1341 1337/1388/1337 1338/1390/1338\nf 1344/1391/1344 1240/1392/1240 1343/1393/1343\nf 1344/1391/1344 1343/1393/1343 1271/1306/1271\nf 1346/1394/1346 1345/1395/1345 1198/1396/1198\nf 1346/1394/1346 1198/1396/1198 1229/1397/1229\nf 1197/1398/1197 1345/1399/1345 1294/1400/1294\nf 1197/1398/1197 1294/1400/1294 1275/1401/1275\nf 1350/1402/1350 1296/1403/1296 1347/1404/1347\nf 1350/1402/1350 1347/1404/1347 1348/1405/1348\nf 1346/1394/1346 1229/1397/1229 1249/1406/1249\nf 1346/1394/1346 1249/1406/1249 1439/1407/1439\nf 1442/1408/1442 1440/1409/1440 1348/1405/1348\nf 1442/1408/1442 1348/1405/1348 1443/1410/1443\nf 1301/1411/1301 1298/1412/1298 1350/1402/1350\nf 1301/1411/1301 1350/1402/1350 1351/1413/1351\nf 1353/1414/1353 1352/1415/1352 1301/1411/1301\nf 1353/1414/1353 1301/1411/1301 1351/1413/1351\nf 1351/1413/1351 1308/1349/1308 1307/1348/1307\nf 1351/1413/1351 1307/1348/1307 1353/1414/1353\nf 1441/1416/1441 1308/1349/1308 1351/1413/1351\nf 1441/1416/1441 1351/1413/1351 1350/1402/1350\nf 1440/1409/1440 1441/1416/1441 1350/1402/1350\nf 1440/1409/1440 1350/1402/1350 1348/1405/1348\nf 1356/1417/1356 1357/1418/1357 1194/1229/1194\nf 1356/1417/1356 1194/1229/1194 1191/1232/1191\nf 90/1419/90 1358/1420/1358 1194/1229/1194\nf 90/1419/90 1194/1229/1194 1357/1418/1357\nf 1359/1421/1359 1360/1422/1360 1362/1283/1362\nf 1359/1421/1359 1362/1283/1362 1238/1282/1238\nf 1362/1283/1362 1363/1423/1363 1245/1317/1245\nf 1362/1283/1362 1245/1317/1245 1233/1270/1233\nf 1363/1423/1363 1364/1424/1364 1246/1318/1246\nf 1363/1423/1363 1246/1318/1246 1245/1317/1245\nf 1364/1424/1364 74/75/74 1280/53/1280\nf 1364/1424/1364 1280/53/1280 1246/1318/1246\nf 1366/1425/1366 1365/1426/1365 1364/1424/1364\nf 1366/1425/1366 1364/1424/1364 1363/1423/1363\nf 1365/1426/1365 77/78/77 74/75/74\nf 1365/1426/1365 74/75/74 1364/1424/1364\nf 1366/1425/1366 1367/1427/1367 1372/1428/1372\nf 1366/1425/1366 1372/1428/1372 1365/1426/1365\nf 1371/1429/1371 1368/1430/1368 1369/1431/1369\nf 1371/1429/1371 1369/1431/1369 1370/1432/1370\nf 1373/1433/1373 1372/1428/1372 1374/1434/1374\nf 1373/1433/1373 1374/1434/1374 1375/1435/1375\nf 1372/1428/1372 1373/1433/1373 88/89/88\nf 1372/1428/1372 88/89/88 80/88/80\nf 1374/1434/1374 1367/1427/1367 1370/1432/1370\nf 1374/1434/1374 1370/1432/1370 1369/1431/1369\nf 1376/1436/1376 1358/1437/1358 90/1438/90\nf 1376/1436/1376 90/1438/90 91/1439/91\nf 1376/1436/1376 91/1439/91 93/1440/93\nf 1376/1436/1376 93/1440/93 1375/1441/1375\nf 1368/1442/1368 1376/1436/1376 1377/1443/1377\nf 1368/1442/1368 1377/1443/1377 1369/1444/1369\nf 95/1445/95 1378/1446/1378 1375/1441/1375\nf 95/1445/95 1375/1441/1375 93/1440/93\nf 1373/1433/1373 1378/1447/1378 96/101/96\nf 1373/1433/1373 96/101/96 88/89/88\nf 948/944/948 1379/1448/1379 949/957/949\nf 948/944/948 949/957/949 959/945/959\nf 947/947/947 1380/844/1380 1379/1448/1379\nf 947/947/947 1379/1448/1379 948/944/948\nf 1381/1449/1381 1382/1450/1382 1383/1451/1383\nf 1381/1449/1381 1383/1451/1383 1384/1452/1384\nf 1382/1450/1382 438/1453/438 439/1454/439\nf 1382/1450/1382 439/1454/439 1383/1451/1383\nf 1382/1450/1382 1385/1455/1385 444/1456/444\nf 1382/1450/1382 444/1456/444 438/1453/438\nf 1382/1450/1382 1381/1449/1381 1386/1457/1386\nf 1382/1450/1382 1386/1457/1386 1385/1455/1385\nf 1386/1457/1386 1387/1458/1387 1388/1459/1388\nf 1386/1457/1386 1388/1459/1388 1385/1455/1385\nf 1388/1459/1388 445/1460/445 444/1456/444\nf 1388/1459/1388 444/1456/444 1385/1455/1385\nf 439/1454/439 1389/1461/1389 1390/1462/1390\nf 439/1454/439 1390/1462/1390 1383/1451/1383\nf 1390/1462/1390 1391/1463/1391 1384/1452/1384\nf 1390/1462/1390 1384/1452/1384 1383/1451/1383\nf 1389/1461/1389 1392/1464/1392 1393/1465/1393\nf 1389/1461/1389 1393/1465/1393 1390/1462/1390\nf 550/1466/550 445/1460/445 1398/1467/1398\nf 550/1466/550 1398/1467/1398 1397/1468/1397\nf 1397/1468/1397 1401/1469/1401 1402/1470/1402\nf 1397/1468/1397 1402/1470/1402 1395/1471/1395\nf 1396/1472/1396 1395/1471/1395 1402/1470/1402\nf 1396/1472/1396 1402/1470/1402 1404/1473/1404\nf 561/1474/561 595/1475/595 1411/1476/1411\nf 561/1474/561 1411/1476/1411 1412/1477/1412\nf 1404/1473/1404 1417/1478/1417 1416/1479/1416\nf 1404/1473/1404 1416/1479/1416 1405/1480/1405\nf 1418/1481/1418 1410/1482/1410 1409/1483/1409\nf 1418/1481/1418 1409/1483/1409 1417/1478/1417\nf 1409/1483/1409 1394/1484/1394 1405/1480/1405\nf 1409/1483/1409 1405/1480/1405 1416/1479/1416\nf 1421/1485/1421 1422/1486/1422 1423/1487/1423\nf 1421/1485/1421 1423/1487/1423 1424/1488/1424\nf 1425/1489/1425 1426/1490/1426 1427/1491/1427\nf 1425/1489/1425 1427/1491/1427 1421/1485/1421\nf 1422/1486/1422 1427/1491/1427 1428/1492/1428\nf 1422/1486/1422 1428/1492/1428 1423/1487/1423\nf 1429/1493/1429 1415/1494/1415 1420/1495/1420\nf 1429/1493/1429 1420/1495/1420 1419/1496/1419\nf 1412/1477/1412 1430/1497/1430 740/1498/740\nf 1412/1477/1412 740/1498/740 561/1474/561\nf 1412/1477/1412 1411/1476/1411 1415/1494/1415\nf 1412/1477/1412 1415/1494/1415 1429/1493/1429\nf 1411/1476/1411 745/1499/745 1410/1482/1410\nf 1411/1476/1411 1410/1482/1410 1413/1500/1413\nf 1434/1501/1434 111/1502/111 108/67/108\nf 1434/1501/1434 108/67/108 65/66/65\nf 1434/1501/1434 1435/1503/1435 107/1504/107\nf 1434/1501/1434 107/1504/107 111/1502/111\nf 1437/1336/1437 1436/1335/1436 1294/1400/1294\nf 1437/1336/1437 1294/1400/1294 1347/1505/1347\nf 1296/1506/1296 1438/1337/1438 1437/1336/1437\nf 1296/1506/1296 1437/1336/1437 1347/1505/1347\nf 1303/1346/1303 1439/1407/1439 1249/1406/1249\nf 1303/1346/1303 1249/1406/1249 1304/1507/1304\nf 1354/1347/1354 1441/1416/1441 1440/1409/1440\nf 1354/1347/1354 1440/1409/1440 1305/1345/1305\nf 1447/1508/1447 1449/1509/1449 1450/1510/1450\nf 1447/1508/1447 1450/1510/1450 1448/1511/1448\nf 1529/1512/1529 1531/1513/1531 1450/1510/1450\nf 1529/1512/1529 1450/1510/1450 1461/1514/1461\nf 1452/1515/1452 1453/1516/1453 1449/1509/1449\nf 1452/1515/1452 1449/1509/1449 1447/1508/1447\nf 1481/1517/1481 1509/1518/1509 1453/1516/1453\nf 1481/1517/1481 1453/1516/1453 1452/1515/1452\nf 1448/1511/1448 1464/1519/1464 1463/1520/1463\nf 1448/1511/1448 1463/1520/1463 1462/1521/1462\nf 1462/1521/1462 1465/1522/1465 1467/1523/1467\nf 1462/1521/1462 1467/1523/1467 1455/1524/1455\nf 1474/1525/1474 1475/1526/1475 1472/1527/1472\nf 1474/1525/1474 1472/1527/1472 1473/1528/1473\nf 1455/1524/1455 1467/1523/1467 1476/1529/1476\nf 1455/1524/1455 1476/1529/1476 1479/1530/1479\nf 1478/1531/1478 1480/1532/1480 1479/1530/1479\nf 1478/1531/1478 1479/1530/1479 1476/1529/1476\nf 1474/1525/1474 1471/1533/1471 1492/1534/1492\nf 1474/1525/1474 1492/1534/1492 1470/1535/1470\nf 1466/1536/1466 1484/1537/1484 1485/1538/1485\nf 1466/1536/1466 1485/1538/1485 1469/1539/1469\nf 1469/1539/1469 1485/1538/1485 1486/1540/1486\nf 1469/1539/1469 1486/1540/1486 1492/1534/1492\nf 1487/1541/1487 1490/1542/1490 1494/1543/1494\nf 1487/1541/1487 1494/1543/1494 1488/1544/1488\nf 1492/1534/1492 1494/1543/1494 1495/1545/1495\nf 1492/1534/1492 1495/1545/1495 1493/1546/1493\nf 1478/1531/1478 1513/1547/1513 1497/1548/1497\nf 1478/1531/1478 1497/1548/1497 1480/1532/1480\nf 1488/1544/1488 1494/1543/1494 1492/1534/1492\nf 1488/1544/1488 1492/1534/1492 1486/1540/1486\nf 1502/1549/1502 1504/1550/1504 1503/1551/1503\nf 1502/1549/1502 1503/1551/1503 1496/1552/1496\nf 1506/1553/1506 1508/1554/1508 1526/1555/1526\nf 1506/1553/1506 1526/1555/1526 1525/1556/1525\nf 1524/1557/1524 1523/1558/1523 1509/1518/1509\nf 1524/1557/1524 1509/1518/1509 1483/1559/1483\nf 1451/1560/1451 1450/1510/1450 1458/1561/1458\nf 1451/1560/1451 1458/1561/1458 1514/1562/1514\nf 1460/1563/1460 1518/1564/1518 1519/1565/1519\nf 1460/1563/1460 1519/1565/1519 1514/1562/1514\nf 1514/1562/1514 1519/1565/1519 1517/1566/1517\nf 1514/1562/1514 1517/1566/1517 1451/1560/1451\nf 1516/1567/1516 1520/1568/1520 1529/1512/1529\nf 1516/1567/1516 1529/1512/1529 1461/1514/1461\nf 1521/1569/1521 1507/1570/1507 1522/1571/1522\nf 1521/1569/1521 1522/1571/1522 1536/1572/1536\nf 1507/1570/1507 1521/1569/1521 1525/1556/1525\nf 1507/1570/1507 1525/1556/1525 1526/1555/1526\nf 1464/1519/1464 1531/1513/1531 1532/1573/1532\nf 1464/1519/1464 1532/1573/1532 1542/1574/1542\nf 1534/1575/1534 1533/1576/1533 1481/1517/1481\nf 1534/1575/1534 1481/1517/1481 1482/1577/1482\nf 1535/1578/1535 1534/1575/1534 1480/1532/1480\nf 1535/1578/1535 1480/1532/1480 1497/1548/1497\nf 1535/1579/1535 1497/1580/1497 1510/1581/1510\nf 1535/1579/1535 1510/1581/1510 1559/1582/1559\nf 1521/1569/1521 1538/1583/1538 1393/1584/1393\nf 1521/1569/1521 1393/1584/1393 1525/1556/1525\nf 1539/1585/1539 1568/1586/1568 1569/1587/1569\nf 1539/1585/1539 1569/1587/1569 1544/1588/1544\nf 1540/1589/1540 1538/1583/1538 1539/1585/1539\nf 1540/1589/1540 1539/1585/1539 1541/1590/1541\nf 1541/1591/1541 1464/1519/1464 1542/1574/1542\nf 1541/1591/1541 1542/1574/1542 1540/1592/1540\nf 1539/1585/1539 1544/1588/1544 1543/1593/1543\nf 1539/1585/1539 1543/1593/1543 1541/1590/1541\nf 1670/1594/1670 1669/1595/1669 1567/1596/1567\nf 1670/1594/1670 1567/1596/1567 1553/1597/1553\nf 1547/1598/1547 1671/1599/1671 1668/1600/1668\nf 1547/1598/1547 1668/1600/1668 1546/1601/1546\nf 1548/1602/1548 1550/1603/1550 1551/1604/1551\nf 1548/1602/1548 1551/1604/1551 1549/1605/1549\nf 1558/1606/1558 1554/1607/1554 1548/1602/1548\nf 1558/1606/1558 1548/1602/1548 1545/1608/1545\nf 1548/1602/1548 1554/1607/1554 1556/1609/1556\nf 1548/1602/1548 1556/1609/1556 1550/1603/1550\nf 1550/1603/1550 1556/1609/1556 1589/1610/1589\nf 1550/1603/1550 1589/1610/1589 1591/1611/1591\nf 1559/1582/1559 1557/1612/1557 1558/1606/1558\nf 1559/1582/1559 1558/1606/1558 1555/1613/1555\nf 1572/1614/1572 1557/1612/1557 1559/1582/1559\nf 1572/1614/1572 1559/1582/1559 1560/1615/1560\nf 1565/1616/1565 1672/1617/1672 1671/1599/1671\nf 1565/1616/1565 1671/1599/1671 1547/1598/1547\nf 1564/1618/1564 1563/1619/1563 1672/1617/1672\nf 1564/1618/1564 1672/1617/1672 1565/1616/1565\nf 1566/1620/1566 1574/1621/1574 1565/1616/1565\nf 1566/1620/1566 1565/1616/1565 1547/1598/1547\nf 1546/1601/1546 1549/1605/1549 1566/1620/1566\nf 1546/1601/1546 1566/1620/1566 1547/1598/1547\nf 1537/1622/1537 1536/1572/1536 1522/1571/1522\nf 1537/1622/1537 1522/1571/1522 1567/1623/1567\nf 1537/1624/1537 1567/1596/1567 1669/1595/1669\nf 1537/1624/1537 1669/1595/1669 1668/1600/1668\nf 1537/1622/1537 1569/1587/1569 1568/1586/1568\nf 1537/1622/1537 1568/1586/1568 1536/1572/1536\nf 1566/1620/1566 1570/1625/1570 1571/1626/1571\nf 1566/1620/1566 1571/1626/1571 1574/1621/1574\nf 1570/1625/1570 1581/1627/1581 1579/1628/1579\nf 1570/1625/1570 1579/1628/1579 1571/1626/1571\nf 1549/1605/1549 1551/1604/1551 1570/1625/1570\nf 1549/1605/1549 1570/1625/1570 1566/1620/1566\nf 1561/1629/1561 1573/1630/1573 1572/1614/1572\nf 1561/1629/1561 1572/1614/1572 1560/1615/1560\nf 1576/1631/1576 1578/1632/1578 1573/1630/1573\nf 1576/1631/1576 1573/1630/1573 1561/1629/1561\nf 1391/1633/1391 1393/1584/1393 1538/1583/1538\nf 1391/1633/1391 1538/1583/1538 1540/1589/1540\nf 1381/1634/1381 1384/1635/1384 1528/1636/1528\nf 1381/1634/1381 1528/1636/1528 1516/1567/1516\nf 1542/1574/1542 1528/1636/1528 1384/1635/1384\nf 1542/1574/1542 1384/1635/1384 1391/1637/1391\nf 1562/1638/1562 1563/1639/1563 1564/1640/1564\nf 1562/1638/1562 1564/1640/1564 1576/1631/1576\nf 1577/1641/1577 1578/1632/1578 1574/1642/1574\nf 1577/1641/1577 1574/1642/1574 1571/1643/1571\nf 1580/1644/1580 1590/1645/1590 1592/1646/1592\nf 1580/1644/1580 1592/1646/1592 1584/1647/1584\nf 1585/1648/1585 1573/1630/1573 1578/1632/1578\nf 1585/1648/1585 1578/1632/1578 1577/1641/1577\nf 1572/1614/1572 1573/1630/1573 1585/1648/1585\nf 1572/1614/1572 1585/1648/1585 1586/1649/1586\nf 1586/1649/1586 1554/1607/1554 1557/1612/1557\nf 1586/1649/1586 1557/1612/1557 1572/1614/1572\nf 1592/1646/1592 1590/1645/1590 1581/1627/1581\nf 1592/1646/1592 1581/1627/1581 1593/1650/1593\nf 1588/1651/1588 1592/1646/1592 1593/1650/1593\nf 1588/1651/1588 1593/1650/1593 1591/1611/1591\nf 1582/1652/1582 1584/1647/1584 1592/1646/1592\nf 1582/1652/1582 1592/1646/1592 1588/1651/1588\nf 1595/1653/1595 1597/1654/1597 1596/1655/1596\nf 1595/1653/1595 1596/1655/1596 1594/1656/1594\nf 1604/1657/1604 1605/1658/1605 1602/1659/1602\nf 1604/1657/1604 1602/1659/1602 1614/1660/1614\nf 1605/1658/1605 1606/1661/1606 1594/1656/1594\nf 1605/1658/1605 1594/1656/1594 1596/1655/1596\nf 1601/1662/1601 1608/1663/1608 1607/1664/1607\nf 1601/1662/1601 1607/1664/1607 1615/1665/1615\nf 1599/1666/1599 1615/1665/1615 1614/1660/1614\nf 1599/1666/1599 1614/1660/1614 1602/1659/1602\nf 1609/1667/1609 1612/1668/1612 1613/1669/1613\nf 1609/1667/1609 1613/1669/1613 1610/1670/1610\nf 1610/1670/1610 1613/1669/1613 1629/1671/1629\nf 1610/1670/1610 1629/1671/1629 1604/1657/1604\nf 1604/1657/1604 1629/1671/1629 1606/1661/1606\nf 1604/1657/1604 1606/1661/1606 1605/1658/1605\nf 1600/1672/1600 1617/1673/1617 1626/1674/1626\nf 1600/1672/1600 1626/1674/1626 1733/1675/1733\nf 1617/1673/1617 1618/1676/1618 1619/1677/1619\nf 1617/1673/1617 1619/1677/1619 1626/1674/1626\nf 1618/1676/1618 1620/1678/1620 1621/1679/1621\nf 1618/1676/1618 1621/1679/1621 1619/1677/1619\nf 1623/1680/1623 1624/1681/1624 1621/1679/1621\nf 1623/1680/1623 1621/1679/1621 1620/1678/1620\nf 1586/1682/1586 1623/1680/1623 1620/1678/1620\nf 1586/1682/1586 1620/1678/1620 1587/1683/1587\nf 1594/1656/1594 1629/1671/1629 1628/1684/1628\nf 1594/1656/1594 1628/1684/1628 1585/1685/1585\nf 1623/1680/1623 1585/1685/1585 1628/1684/1628\nf 1623/1680/1623 1628/1684/1628 1624/1681/1624\nf 1627/1686/1627 1626/1674/1626 1619/1677/1619\nf 1627/1686/1627 1619/1677/1619 1718/1687/1718\nf 1617/1673/1617 1600/1672/1600 1584/1647/1584\nf 1617/1673/1617 1584/1647/1584 1582/1652/1582\nf 1618/1676/1618 1583/1688/1583 1587/1683/1587\nf 1618/1676/1618 1587/1683/1587 1620/1678/1620\nf 1582/1652/1582 1583/1688/1583 1618/1676/1618\nf 1582/1652/1582 1618/1676/1618 1617/1673/1617\nf 1597/1689/1597 1580/1644/1580 1584/1647/1584\nf 1597/1689/1597 1584/1647/1584 1598/1690/1598\nf 1624/1681/1624 1628/1684/1628 1630/1691/1630\nf 1624/1681/1624 1630/1691/1630 1622/1692/1622\nf 1630/1691/1630 1632/1693/1632 1631/1694/1631\nf 1630/1691/1630 1631/1694/1631 1622/1692/1622\nf 1632/1695/1632 1634/1696/1634 1633/1697/1633\nf 1632/1695/1632 1633/1697/1633 1631/1698/1631\nf 1634/1696/1634 1636/1699/1636 1635/1700/1635\nf 1634/1696/1634 1635/1700/1635 1633/1697/1633\nf 1636/1699/1636 1638/1701/1638 1637/1702/1637\nf 1636/1699/1636 1637/1702/1637 1635/1700/1635\nf 1637/1702/1637 1638/1701/1638 1646/1703/1646\nf 1637/1702/1637 1646/1703/1646 1639/1704/1639\nf 1641/1705/1641 1665/1706/1665 1647/1707/1647\nf 1641/1705/1641 1647/1707/1647 1645/1708/1645\nf 1647/1707/1647 1665/1706/1665 1643/1709/1643\nf 1647/1707/1647 1643/1709/1643 1648/1710/1648\nf 1640/1711/1640 1645/1708/1645 1647/1707/1647\nf 1640/1711/1640 1647/1707/1647 1667/1712/1667\nf 1667/1712/1667 1647/1707/1647 1648/1710/1648\nf 1667/1712/1667 1648/1710/1648 1642/1713/1642\nf 1654/1714/1654 1637/1702/1637 1639/1704/1639\nf 1654/1714/1654 1639/1704/1639 1658/1715/1658\nf 1636/1699/1636 1634/1696/1634 1655/1716/1655\nf 1636/1699/1636 1655/1716/1655 1650/1717/1650\nf 1630/1691/1630 1652/1718/1652 1651/1719/1651\nf 1630/1691/1630 1651/1719/1651 1632/1693/1632\nf 1634/1696/1634 1632/1695/1632 1651/1720/1651\nf 1634/1696/1634 1651/1720/1651 1655/1716/1655\nf 1631/1694/1631 1653/1721/1653 1675/1722/1675\nf 1631/1694/1631 1675/1722/1675 1622/1692/1622\nf 1633/1697/1633 1654/1714/1654 1653/1723/1653\nf 1633/1697/1633 1653/1723/1653 1631/1698/1631\nf 1650/1717/1650 1680/1724/1680 1656/1725/1656\nf 1650/1717/1650 1656/1725/1656 1646/1703/1646\nf 1656/1725/1656 1657/1726/1657 1649/1727/1649\nf 1656/1725/1656 1649/1727/1649 1646/1703/1646\nf 1651/1720/1651 1763/1728/1763 1680/1724/1680\nf 1651/1720/1651 1680/1724/1680 1655/1716/1655\nf 1663/1729/1663 1664/1730/1664 1658/1715/1658\nf 1663/1729/1663 1658/1715/1658 1639/1704/1639\nf 1664/1730/1664 1660/1731/1660 1659/1732/1659\nf 1664/1730/1664 1659/1732/1659 1658/1715/1658\nf 1656/1725/1656 1659/1733/1659 1660/1734/1660\nf 1656/1725/1656 1660/1734/1660 1657/1726/1657\nf 1657/1726/1657 1662/1735/1662 1661/1736/1661\nf 1657/1726/1657 1661/1736/1661 1649/1727/1649\nf 1662/1737/1662 1664/1730/1664 1663/1729/1663\nf 1662/1737/1662 1663/1729/1663 1661/1738/1661\nf 1661/1736/1661 1666/1739/1666 1665/1706/1665\nf 1661/1736/1661 1665/1706/1665 1676/1740/1676\nf 1667/1712/1667 1666/1741/1666 1661/1738/1661\nf 1667/1712/1667 1661/1738/1661 1677/1742/1677\nf 1643/1709/1643 1665/1706/1665 1666/1739/1666\nf 1643/1709/1643 1666/1739/1666 1644/1743/1644\nf 1666/1741/1666 1667/1712/1667 1642/1713/1642\nf 1666/1741/1666 1642/1713/1642 1644/1743/1644\nf 1668/1600/1668 1669/1595/1669 1552/1744/1552\nf 1668/1600/1668 1552/1744/1552 1546/1601/1546\nf 1669/1595/1669 1670/1594/1670 1545/1608/1545\nf 1669/1595/1669 1545/1608/1545 1552/1744/1552\nf 1537/1624/1537 1668/1600/1668 1671/1599/1671\nf 1537/1624/1537 1671/1599/1671 1569/1745/1569\nf 1569/1745/1569 1671/1599/1671 1672/1617/1672\nf 1569/1745/1569 1672/1617/1672 1544/1746/1544\nf 1673/1747/1673 1718/1687/1718 1619/1677/1619\nf 1673/1747/1673 1619/1677/1619 1621/1679/1621\nf 1659/1732/1659 1679/1748/1679 1678/1749/1678\nf 1659/1732/1659 1678/1749/1678 1658/1715/1658\nf 1656/1725/1656 1680/1724/1680 1679/1750/1679\nf 1656/1725/1656 1679/1750/1679 1659/1733/1659\nf 1679/1748/1679 1683/1751/1683 1682/1752/1682\nf 1679/1748/1679 1682/1752/1682 1678/1749/1678\nf 1680/1724/1680 1681/1753/1681 1683/1754/1683\nf 1680/1724/1680 1683/1754/1683 1679/1750/1679\nf 1678/1749/1678 1682/1752/1682 1653/1723/1653\nf 1678/1749/1678 1653/1723/1653 1654/1714/1654\nf 1685/1755/1685 1684/1756/1684 1674/1757/1674\nf 1685/1755/1685 1674/1757/1674 1675/1758/1675\nf 1685/1755/1685 1687/1759/1687 1686/1760/1686\nf 1685/1755/1685 1686/1760/1686 1684/1756/1684\nf 1687/1759/1687 1689/1761/1689 1688/1762/1688\nf 1687/1759/1687 1688/1762/1688 1686/1760/1686\nf 1688/1762/1688 1689/1761/1689 1691/1763/1691\nf 1688/1762/1688 1691/1763/1691 1690/1764/1690\nf 1693/1765/1693 1695/1766/1695 1694/1767/1694\nf 1693/1765/1693 1694/1767/1694 1692/1768/1692\nf 1696/1769/1696 1692/1768/1692 1694/1767/1694\nf 1696/1769/1696 1694/1767/1694 1697/1770/1697\nf 1699/1771/1699 1688/1762/1688 1690/1764/1690\nf 1699/1771/1699 1690/1764/1690 1700/1772/1700\nf 1693/1765/1693 1691/1763/1691 1705/1773/1705\nf 1693/1765/1693 1705/1773/1705 1702/1774/1702\nf 1687/1759/1687 1685/1755/1685 1704/1775/1704\nf 1687/1759/1687 1704/1775/1704 1703/1776/1703\nf 1703/1776/1703 1714/1777/1714 1705/1773/1705\nf 1703/1776/1703 1705/1773/1705 1691/1763/1691\nf 1701/1778/1701 1706/1779/1706 1707/1780/1707\nf 1701/1778/1701 1707/1780/1707 1700/1772/1700\nf 1705/1773/1705 1707/1781/1707 1706/1782/1706\nf 1705/1773/1705 1706/1782/1706 1702/1774/1702\nf 1708/1783/1708 1712/1784/1712 1695/1766/1695\nf 1708/1783/1708 1695/1766/1695 1710/1785/1710\nf 1697/1770/1697 1712/1786/1712 1708/1787/1708\nf 1697/1770/1697 1708/1787/1708 1711/1788/1711\nf 1707/1780/1707 1713/1789/1713 1699/1771/1699\nf 1707/1780/1707 1699/1771/1699 1700/1772/1700\nf 1705/1773/1705 1714/1777/1714 1713/1790/1713\nf 1705/1773/1705 1713/1790/1713 1707/1781/1707\nf 1625/1791/1625 1716/1792/1716 1717/1793/1717\nf 1625/1791/1625 1717/1793/1717 1673/1747/1673\nf 1684/1756/1684 1699/1771/1699 1716/1794/1716\nf 1684/1756/1684 1716/1794/1716 1674/1757/1674\nf 1627/1686/1627 1719/1795/1719 1733/1675/1733\nf 1627/1686/1627 1733/1675/1733 1626/1674/1626\nf 1718/1687/1718 1720/1796/1720 1719/1795/1719\nf 1718/1687/1718 1719/1795/1719 1627/1686/1627\nf 1683/1797/1683 1721/1798/1721 1726/1799/1726\nf 1683/1797/1683 1726/1799/1726 1682/1800/1682\nf 1681/1801/1681 1765/1802/1765 1721/1798/1721\nf 1681/1801/1681 1721/1798/1721 1683/1797/1683\nf 1721/1798/1721 1723/1803/1723 1725/1804/1725\nf 1721/1798/1721 1725/1804/1725 1726/1799/1726\nf 1765/1802/1765 1722/1805/1722 1723/1803/1723\nf 1765/1802/1765 1723/1803/1723 1721/1798/1721\nf 1723/1803/1723 1724/1806/1724 1717/1793/1717\nf 1723/1803/1723 1717/1793/1717 1725/1804/1725\nf 1722/1805/1722 1727/1807/1727 1724/1806/1724\nf 1722/1805/1722 1724/1806/1724 1723/1803/1723\nf 1690/1764/1690 1696/1769/1696 1701/1778/1701\nf 1690/1764/1690 1701/1778/1701 1700/1772/1700\nf 1725/1808/1725 1699/1771/1699 1713/1789/1713\nf 1725/1808/1725 1713/1789/1713 1726/1809/1726\nf 1628/1684/1628 1629/1671/1629 1728/1810/1728\nf 1628/1684/1628 1728/1810/1728 1652/1718/1652\nf 1612/1668/1612 1727/1811/1727 1729/1812/1729\nf 1612/1668/1612 1729/1812/1729 1613/1669/1613\nf 1764/1813/1764 1730/1814/1730 1731/1815/1731\nf 1764/1813/1764 1731/1815/1731 1722/1816/1722\nf 1727/1811/1727 1722/1816/1722 1731/1815/1731\nf 1727/1811/1727 1731/1815/1731 1729/1812/1729\nf 1629/1671/1629 1613/1669/1613 1729/1812/1729\nf 1629/1671/1629 1729/1812/1729 1728/1810/1728\nf 1652/1718/1652 1728/1810/1728 1732/1817/1732\nf 1652/1718/1652 1732/1817/1732 1734/1818/1734\nf 1726/1819/1726 1713/1790/1713 1714/1777/1714\nf 1726/1819/1726 1714/1777/1714 1715/1820/1715\nf 1611/1821/1611 1720/1822/1720 1727/1811/1727\nf 1611/1821/1611 1727/1811/1727 1612/1668/1612\nf 1611/1821/1611 1608/1663/1608 1719/1823/1719\nf 1611/1821/1611 1719/1823/1719 1720/1822/1720\nf 1733/1824/1733 1719/1823/1719 1608/1663/1608\nf 1733/1824/1733 1608/1663/1608 1601/1662/1601\nf 1734/1825/1734 1732/1826/1732 1736/1827/1736\nf 1734/1825/1734 1736/1827/1736 1735/1828/1735\nf 1735/1828/1735 1736/1827/1736 1737/1829/1737\nf 1735/1828/1735 1737/1829/1737 1738/1830/1738\nf 1737/1829/1737 1739/1831/1739 1740/1832/1740\nf 1737/1829/1737 1740/1832/1740 1738/1830/1738\nf 1743/1833/1743 1744/1834/1744 1742/1835/1742\nf 1743/1833/1743 1742/1835/1742 1741/1836/1741\nf 1746/1837/1746 1747/1838/1747 1743/1833/1743\nf 1746/1837/1746 1743/1833/1743 1741/1836/1741\nf 1748/1839/1748 1749/1840/1749 1739/1831/1739\nf 1748/1839/1748 1739/1831/1739 1737/1829/1737\nf 1742/1835/1742 1750/1841/1750 1751/1842/1751\nf 1742/1835/1742 1751/1842/1751 1740/1832/1740\nf 1752/1843/1752 1740/1832/1740 1751/1842/1751\nf 1752/1843/1752 1751/1842/1751 1753/1844/1753\nf 1755/1845/1755 1749/1840/1749 1756/1846/1756\nf 1755/1845/1755 1756/1846/1756 1754/1847/1754\nf 1751/1842/1751 1750/1841/1750 1754/1848/1754\nf 1751/1842/1751 1754/1848/1754 1756/1849/1756\nf 1757/1850/1757 1759/1851/1759 1744/1834/1744\nf 1757/1850/1757 1744/1834/1744 1761/1852/1761\nf 1747/1838/1747 1760/1853/1760 1757/1854/1757\nf 1747/1838/1747 1757/1854/1757 1761/1855/1761\nf 1756/1846/1756 1749/1840/1749 1748/1839/1748\nf 1756/1846/1756 1748/1839/1748 1762/1856/1762\nf 1751/1842/1751 1756/1849/1756 1762/1857/1762\nf 1751/1842/1751 1762/1857/1762 1753/1844/1753\nf 1739/1831/1739 1749/1840/1749 1755/1845/1755\nf 1739/1831/1739 1755/1845/1755 1746/1837/1746\nf 1762/1856/1762 1748/1839/1748 1764/1858/1764\nf 1762/1856/1762 1764/1858/1764 1766/1859/1766\nf 1766/1860/1766 1763/1861/1763 1753/1844/1753\nf 1766/1860/1766 1753/1844/1753 1762/1857/1762\nf 1519/1565/1519 1767/1862/1767 1386/1863/1386\nf 1519/1565/1519 1386/1863/1386 1381/1634/1381\nf 1386/1863/1386 1768/1864/1768 1769/1865/1769\nf 1386/1863/1386 1769/1865/1769 1387/1866/1387\nf 1768/1864/1768 1456/1867/1456 1457/1868/1457\nf 1768/1864/1768 1457/1868/1457 1769/1865/1769\nf 1392/1869/1392 452/1870/452 1506/1871/1506\nf 1392/1869/1392 1506/1871/1506 1393/1872/1393\nf 452/1870/452 453/1873/453 1794/1874/1794\nf 452/1870/452 1794/1874/1794 1506/1871/1506\nf 453/1873/453 455/1875/455 1773/1876/1773\nf 453/1873/453 1773/1876/1773 1794/1874/1794\nf 455/1875/455 457/1877/457 1774/1878/1774\nf 455/1875/455 1774/1878/1774 1773/1876/1773\nf 457/1877/457 459/1879/459 1775/1880/1775\nf 457/1877/457 1775/1880/1775 1774/1878/1774\nf 459/1879/459 461/1881/461 1776/1882/1776\nf 459/1879/459 1776/1882/1776 1775/1880/1775\nf 461/1881/461 463/1883/463 1777/1884/1777\nf 461/1881/461 1777/1884/1777 1776/1882/1776\nf 463/1883/463 465/1885/465 1778/1886/1778\nf 463/1883/463 1778/1886/1778 1777/1884/1777\nf 465/1885/465 467/1887/467 1779/1888/1779\nf 465/1885/465 1779/1888/1779 1778/1886/1778\nf 1775/1880/1775 1829/1889/1829 1780/1890/1780\nf 1775/1880/1775 1780/1890/1780 1774/1878/1774\nf 1776/1882/1776 1782/1891/1782 1781/1892/1781\nf 1776/1882/1776 1781/1892/1781 1775/1880/1775\nf 1777/1884/1777 1783/1893/1783 1782/1891/1782\nf 1777/1884/1777 1782/1891/1782 1776/1882/1776\nf 1778/1886/1778 1784/1894/1784 1783/1893/1783\nf 1778/1886/1778 1783/1893/1783 1777/1884/1777\nf 1779/1888/1779 473/1895/473 1784/1894/1784\nf 1779/1888/1779 1784/1894/1784 1778/1886/1778\nf 1780/1890/1780 1785/1896/1785 1773/1876/1773\nf 1780/1890/1780 1773/1876/1773 1774/1878/1774\nf 1780/1890/1780 1806/1897/1806 1786/1898/1786\nf 1780/1890/1780 1786/1898/1786 1785/1896/1785\nf 1786/1898/1786 1788/1899/1788 1787/1900/1787\nf 1786/1898/1786 1787/1900/1787 1785/1896/1785\nf 1787/1900/1787 1791/1901/1791 1790/1902/1790\nf 1787/1900/1787 1790/1902/1790 1785/1896/1785\nf 1793/1903/1793 1795/1904/1795 1794/1874/1794\nf 1793/1903/1793 1794/1874/1794 1790/1902/1790\nf 1793/1903/1793 1826/1905/1826 1797/1906/1797\nf 1793/1903/1793 1797/1906/1797 1795/1904/1795\nf 1798/1907/1798 1800/1908/1800 1801/1909/1801\nf 1798/1907/1798 1801/1909/1801 1799/1910/1799\nf 1798/1907/1798 1802/1911/1802 1803/1912/1803\nf 1798/1907/1798 1803/1912/1803 1800/1908/1800\nf 1803/1912/1803 494/1913/494 493/1914/493\nf 1803/1912/1803 493/1914/493 1800/1908/1800\nf 1799/1910/1799 1804/1915/1804 495/1916/495\nf 1799/1910/1799 495/1916/495 1806/1897/1806\nf 1801/1909/1801 1805/1917/1805 1804/1915/1804\nf 1801/1909/1801 1804/1915/1804 1799/1910/1799\nf 1506/1871/1506 1794/1874/1794 1795/1904/1795\nf 1506/1871/1506 1795/1904/1795 1508/1918/1508\nf 1790/1902/1790 1794/1874/1794 1773/1876/1773\nf 1790/1902/1790 1773/1876/1773 1785/1896/1785\nf 1800/1908/1800 493/1914/493 1805/1917/1805\nf 1800/1908/1800 1805/1917/1805 1801/1909/1801\nf 1807/1919/1807 1811/1920/1811 1813/1921/1813\nf 1807/1919/1807 1813/1921/1813 1786/1898/1786\nf 1815/1922/1815 1817/1923/1817 1816/1924/1816\nf 1815/1922/1815 1816/1924/1816 1810/1925/1810\nf 1792/1926/1792 1810/1925/1810 1816/1924/1816\nf 1792/1926/1792 1816/1924/1816 1826/1905/1826\nf 1811/1920/1811 1809/1927/1809 1833/1928/1833\nf 1811/1920/1811 1833/1928/1833 1821/1929/1821\nf 1819/1930/1819 1811/1920/1811 1821/1929/1821\nf 1819/1930/1819 1821/1929/1821 1818/1931/1818\nf 1822/1932/1822 1508/1918/1508 1795/1904/1795\nf 1822/1932/1822 1795/1904/1795 1797/1906/1797\nf 513/1933/513 521/1934/521 1818/1931/1818\nf 513/1933/513 1818/1931/1818 1821/1929/1821\nf 1827/1935/1827 522/1936/522 546/1937/546\nf 1827/1935/1827 546/1937/546 1838/1938/1838\nf 1782/1891/1782 524/1939/524 523/1940/523\nf 1782/1891/1782 523/1940/523 1781/1892/1781\nf 1783/1893/1783 525/1941/525 524/1939/524\nf 1783/1893/1783 524/1939/524 1782/1891/1782\nf 1784/1894/1784 526/1942/526 525/1941/525\nf 1784/1894/1784 525/1941/525 1783/1893/1783\nf 1831/1943/1831 1832/1944/1832 1803/1912/1803\nf 1831/1943/1831 1803/1912/1803 1802/1911/1802\nf 1837/1945/1837 1835/1946/1835 1834/1947/1834\nf 1837/1945/1837 1834/1947/1834 1822/1932/1822\nf 1835/1946/1835 1837/1945/1837 1839/1948/1839\nf 1835/1946/1835 1839/1948/1839 1836/1949/1836\nf 1838/1938/1838 546/1937/546 547/1950/547\nf 1838/1938/1838 547/1950/547 1841/1951/1841\nf 1772/1952/1772 1523/1558/1523 1524/1557/1524\nf 1772/1952/1772 1524/1557/1524 1847/1953/1847\nf 1847/1953/1847 1850/1954/1850 1852/1955/1852\nf 1847/1953/1847 1852/1955/1852 1851/1956/1851\nf 1848/1957/1848 1856/1958/1856 1865/1959/1865\nf 1848/1957/1848 1865/1959/1865 1857/1960/1857\nf 1770/1961/1770 1869/1962/1869 1870/1963/1870\nf 1770/1961/1770 1870/1963/1870 1843/1964/1843\nf 1402/1965/1402 1871/1966/1871 1872/1967/1872\nf 1402/1965/1402 1872/1967/1872 1404/1968/1404\nf 1871/1966/1871 1402/1965/1402 1870/1969/1870\nf 1871/1966/1871 1870/1969/1870 1869/1970/1869\nf 1872/1967/1872 1418/1971/1418 1417/1972/1417\nf 1872/1967/1872 1417/1972/1417 1404/1968/1404\nf 1426/1973/1426 1429/1974/1429 2164/1975/2164\nf 1426/1973/1426 2164/1975/2164 2158/1976/2158\nf 2221/1977/2221 1874/1978/1874 1877/1979/1877\nf 2221/1977/2221 1877/1979/1877 2222/1980/2222\nf 1877/1979/1877 1884/1981/1884 1885/1982/1885\nf 1877/1979/1877 1885/1982/1885 2223/1983/2223\nf 1886/1984/1886 2223/1983/2223 1885/1982/1885\nf 1886/1984/1886 1885/1982/1885 1887/1985/1887\nf 1901/1986/1901 1898/1987/1898 1887/1988/1887\nf 1901/1986/1901 1887/1988/1887 1885/1989/1885\nf 547/1950/547 625/1990/625 1892/1991/1892\nf 547/1950/547 1892/1991/1892 1841/1951/1841\nf 1890/1992/1890 1891/1993/1891 1892/1991/1892\nf 1890/1992/1890 1892/1991/1892 1893/1994/1893\nf 1860/1995/1860 1859/1996/1859 1890/1992/1890\nf 1860/1995/1860 1890/1992/1890 1893/1994/1893\nf 1860/1997/1860 1893/1998/1893 1884/1999/1884\nf 1860/1997/1860 1884/1999/1884 1877/2000/1877\nf 1402/1965/1402 1401/2001/1401 1403/2002/1403\nf 1402/1965/1402 1403/2002/1403 1870/1969/1870\nf 1418/1971/1418 1872/1967/1872 1873/2003/1873\nf 1418/1971/1418 1873/2003/1873 1419/2004/1419\nf 1898/1987/1898 646/2005/646 647/2006/647\nf 1898/1987/1898 647/2006/647 1899/2007/1899\nf 647/2006/647 649/2008/649 1928/2009/1928\nf 647/2006/647 1928/2009/1928 1899/2007/1899\nf 1896/2010/1896 1904/2011/1904 1903/2012/1903\nf 1896/2010/1896 1903/2012/1903 1895/2013/1895\nf 1894/2014/1894 1905/2015/1905 1906/2016/1906\nf 1894/2014/1894 1906/2016/1906 1896/2010/1896\nf 1896/2010/1896 1906/2016/1906 1907/2017/1907\nf 1896/2010/1896 1907/2017/1907 1904/2011/1904\nf 1925/2018/1925 1909/2019/1909 1908/2020/1908\nf 1925/2018/1925 1908/2020/1908 1905/2021/1905\nf 1906/2016/1906 1908/2022/1908 1910/2023/1910\nf 1906/2016/1906 1910/2023/1910 1907/2017/1907\nf 1908/2020/1908 1909/2019/1909 1915/2024/1915\nf 1908/2020/1908 1915/2024/1915 1914/2025/1914\nf 1908/2022/1908 1914/2026/1914 1916/2027/1916\nf 1908/2022/1908 1916/2027/1916 1910/2023/1910\nf 1914/2025/1914 1915/2024/1915 1912/2028/1912\nf 1914/2025/1914 1912/2028/1912 1917/2029/1917\nf 1913/2030/1913 1916/2027/1916 1914/2026/1914\nf 1913/2030/1913 1914/2026/1914 1917/2031/1917\nf 1925/2018/1925 1924/2032/1924 1919/2033/1919\nf 1925/2018/1925 1919/2033/1919 1909/2019/1909\nf 1910/2023/1910 1920/2034/1920 1918/2035/1918\nf 1910/2023/1910 1918/2035/1918 1907/2017/1907\nf 1915/2024/1915 1922/2036/1922 1921/2037/1921\nf 1915/2024/1915 1921/2037/1921 1912/2028/1912\nf 1916/2027/1916 1923/2038/1923 1920/2034/1920\nf 1916/2027/1916 1920/2034/1920 1910/2023/1910\nf 1909/2019/1909 1919/2033/1919 1922/2036/1922\nf 1909/2019/1909 1922/2036/1922 1915/2024/1915\nf 1913/2030/1913 1921/2037/1921 1923/2038/1923\nf 1913/2030/1913 1923/2038/1923 1916/2027/1916\nf 1923/2038/1923 1922/2036/1922 1919/2033/1919\nf 1923/2038/1923 1919/2033/1919 1920/2034/1920\nf 1920/2034/1920 1919/2033/1919 1924/2032/1924\nf 1920/2034/1920 1924/2032/1924 1926/2039/1926\nf 1926/2039/1926 1929/2040/1929 1927/2041/1927\nf 1926/2039/1926 1927/2041/1927 1918/2035/1918\nf 1927/2041/1927 1904/2011/1904 1907/2017/1907\nf 1927/2041/1927 1907/2017/1907 1918/2035/1918\nf 1925/2018/1925 1928/2042/1928 1930/2043/1930\nf 1925/2018/1925 1930/2043/1930 1924/2032/1924\nf 2143/2044/2143 2000/2045/2000 1932/2046/1932\nf 2143/2044/2143 1932/2046/1932 1931/2047/1931\nf 2143/2044/2143 1931/2047/1931 1935/2048/1935\nf 2143/2044/2143 1935/2048/1935 1934/2049/1934\nf 1933/2050/1933 1937/2051/1937 1936/2052/1936\nf 1933/2050/1933 1936/2052/1936 1932/2053/1932\nf 1933/2050/1933 1949/2054/1949 1939/2055/1939\nf 1933/2050/1933 1939/2055/1939 1937/2051/1937\nf 1938/2056/1938 1960/2057/1960 1941/2058/1941\nf 1938/2056/1938 1941/2058/1941 1935/2048/1935\nf 1939/2055/1939 1949/2054/1949 1948/2059/1948\nf 1939/2055/1939 1948/2059/1948 1942/2060/1942\nf 1944/2061/1944 1947/2062/1947 1946/2063/1946\nf 1944/2061/1944 1946/2063/1946 1945/2064/1945\nf 1940/2065/1940 1946/2063/1946 1947/2062/1947\nf 1940/2065/1940 1947/2062/1947 1950/2066/1950\nf 1943/2067/1943 1948/2059/1948 1949/2054/1949\nf 1943/2067/1943 1949/2054/1949 1940/2065/1940\nf 1947/2062/1947 1953/2068/1953 1952/2069/1952\nf 1947/2062/1947 1952/2069/1952 1950/2066/1950\nf 1955/2070/1955 1934/2049/1934 1935/2048/1935\nf 1955/2070/1955 1935/2048/1935 1941/2058/1941\nf 1956/2071/1956 1986/2072/1986 1985/2073/1985\nf 1956/2071/1956 1985/2073/1985 1957/2074/1957\nf 1931/2047/1931 1959/2075/1959 1938/2056/1938\nf 1931/2047/1931 1938/2056/1938 1935/2048/1935\nf 1937/2051/1937 1962/2076/1962 1961/2077/1961\nf 1937/2051/1937 1961/2077/1961 1936/2052/1936\nf 1959/2075/1959 1965/2078/1965 1963/2079/1963\nf 1959/2075/1959 1963/2079/1963 1938/2056/1938\nf 1964/2080/1964 1962/2076/1962 1937/2051/1937\nf 1964/2080/1964 1937/2051/1937 1939/2055/1939\nf 1960/2057/1960 1966/2081/1966 1971/2082/1971\nf 1960/2057/1960 1971/2082/1971 1942/2060/1942\nf 1942/2060/1942 1971/2082/1971 1964/2080/1964\nf 1942/2060/1942 1964/2080/1964 1939/2055/1939\nf 1936/2083/1936 1961/2084/1961 1965/2078/1965\nf 1936/2083/1936 1965/2078/1965 1959/2075/1959\nf 1938/2056/1938 1963/2079/1963 1966/2081/1966\nf 1938/2056/1938 1966/2081/1966 1960/2057/1960\nf 1961/2084/1961 1967/2085/1967 1969/2086/1969\nf 1961/2084/1961 1969/2086/1969 1965/2078/1965\nf 1964/2080/1964 1972/2087/1972 1967/2088/1967\nf 1964/2080/1964 1967/2088/1967 1962/2076/1962\nf 1963/2079/1963 1969/2086/1969 1970/2089/1970\nf 1963/2079/1963 1970/2089/1970 1966/2081/1966\nf 1970/2089/1970 1968/2090/1968 1971/2082/1971\nf 1970/2089/1970 1971/2082/1971 1966/2081/1966\nf 1972/2087/1972 1964/2080/1964 1971/2082/1971\nf 1972/2087/1972 1971/2082/1971 1968/2090/1968\nf 1967/2088/1967 1972/2087/1972 1976/2091/1976\nf 1967/2088/1967 1976/2091/1976 1973/2092/1973\nf 1969/2086/1969 1973/2093/1973 1974/2094/1974\nf 1969/2086/1969 1974/2094/1974 1970/2089/1970\nf 1970/2089/1970 1974/2094/1974 1975/2095/1975\nf 1970/2089/1970 1975/2095/1975 1968/2090/1968\nf 1972/2087/1972 1968/2090/1968 1975/2095/1975\nf 1972/2087/1972 1975/2095/1975 1976/2091/1976\nf 2005/2096/2005 1933/2050/1933 2004/2097/2004\nf 2005/2096/2005 2004/2097/2004 1978/2098/1978\nf 649/2099/649 731/2100/731 1980/2101/1980\nf 649/2099/649 1980/2101/1980 1928/2102/1928\nf 1978/2103/1978 1981/2104/1981 733/2105/733\nf 1978/2103/1978 733/2105/733 700/2106/700\nf 1930/2107/1930 1980/2101/1980 1981/2104/1981\nf 1930/2107/1930 1981/2104/1981 1979/2108/1979\nf 1980/2101/1980 731/2100/731 736/2109/736\nf 1980/2101/1980 736/2109/736 1982/2110/1982\nf 1981/2104/1981 1983/2111/1983 738/2112/738\nf 1981/2104/1981 738/2112/738 733/2105/733\nf 1981/2104/1981 1980/2101/1980 1982/2110/1982\nf 1981/2104/1981 1982/2110/1982 1983/2111/1983\nf 1990/2113/1990 1994/2114/1994 1992/2115/1992\nf 1990/2113/1990 1992/2115/1992 1987/2116/1987\nf 1993/2117/1993 1995/2118/1995 1994/2114/1994\nf 1993/2117/1993 1994/2114/1994 1990/2113/1990\nf 1929/2119/1929 1979/2120/1979 2150/2121/2150\nf 1929/2119/1929 2150/2121/2150 2149/2122/2149\nf 1933/2050/1933 2005/2096/2005 692/2123/692\nf 1933/2050/1933 692/2123/692 1946/2063/1946\nf 1996/2124/1996 2008/2125/2008 2006/2126/2006\nf 1996/2124/1996 2006/2126/2006 1991/2127/1991\nf 1993/2117/1993 1991/2127/1991 2006/2126/2006\nf 1993/2117/1993 2006/2126/2006 1995/2118/1995\nf 777/2128/777 2009/2129/2009 2018/2130/2018\nf 777/2128/777 2018/2130/2018 754/2131/754\nf 756/2132/756 783/2133/783 2015/2134/2015\nf 756/2132/756 2015/2134/2015 2014/2135/2014\nf 2022/2136/2022 2031/2137/2031 2032/2138/2032\nf 2022/2136/2022 2032/2138/2032 2025/2139/2025\nf 2017/2140/2017 2037/2141/2037 2011/2142/2011\nf 2017/2140/2017 2011/2142/2011 2013/2143/2013\nf 2007/2144/2007 2040/2145/2040 2041/2146/2041\nf 2007/2144/2007 2041/2146/2041 2030/2147/2030\nf 2042/2148/2042 2041/2146/2041 2040/2145/2040\nf 2042/2148/2042 2040/2145/2040 2038/2149/2038\nf 2039/2150/2039 2048/2151/2048 2041/2146/2041\nf 2039/2150/2039 2041/2146/2041 2042/2148/2042\nf 2043/2152/2043 2049/2153/2049 2048/2151/2048\nf 2043/2152/2043 2048/2151/2048 2039/2150/2039\nf 2059/2154/2059 2058/2155/2058 2032/2138/2032\nf 2059/2154/2059 2032/2138/2032 2051/2156/2051\nf 2068/2157/2068 2069/2158/2069 2070/2159/2070\nf 2068/2157/2068 2070/2159/2070 2067/2160/2067\nf 2067/2160/2067 2076/2161/2076 2077/2162/2077\nf 2067/2160/2067 2077/2162/2077 2068/2157/2068\nf 2071/2163/2071 2078/2164/2078 2076/2161/2076\nf 2071/2163/2071 2076/2161/2076 2067/2160/2067\nf 2076/2161/2076 2079/2165/2079 2088/2166/2088\nf 2076/2161/2076 2088/2166/2088 2077/2162/2077\nf 2078/2164/2078 2080/2167/2080 2079/2165/2079\nf 2078/2164/2078 2079/2165/2079 2076/2161/2076\nf 2081/2168/2081 2078/2164/2078 2071/2163/2071\nf 2081/2168/2081 2071/2163/2071 2074/2169/2074\nf 2074/2169/2074 2082/2170/2082 2083/2171/2083\nf 2074/2169/2074 2083/2171/2083 2081/2168/2081\nf 2081/2168/2081 2083/2171/2083 2099/2172/2099\nf 2081/2168/2081 2099/2172/2099 2101/2173/2101\nf 2092/2174/2092 2070/2159/2070 2069/2158/2069\nf 2092/2174/2092 2069/2158/2069 2054/2175/2054\nf 2092/2174/2092 2073/2176/2073 2072/2177/2072\nf 2092/2174/2092 2072/2177/2072 2070/2159/2070\nf 2072/2177/2072 2073/2176/2073 2093/2178/2093\nf 2072/2177/2072 2093/2178/2093 2091/2179/2091\nf 2086/2180/2086 2112/2181/2112 2111/2182/2111\nf 2086/2180/2086 2111/2182/2111 2084/2183/2084\nf 2085/2184/2085 2511/2185/2511 2112/2181/2112\nf 2085/2184/2085 2112/2181/2112 2086/2180/2086\nf 2097/2186/2097 2101/2173/2101 2099/2172/2099\nf 2097/2186/2097 2099/2172/2099 2098/2187/2098\nf 2080/2167/2080 2086/2180/2086 2084/2183/2084\nf 2080/2167/2080 2084/2183/2084 2079/2165/2079\nf 2109/2188/2109 2096/2189/2096 2105/2190/2105\nf 2109/2188/2109 2105/2190/2105 2104/2191/2104\nf 2105/2190/2105 2107/2192/2107 2106/2193/2106\nf 2105/2190/2105 2106/2193/2106 2104/2191/2104\nf 2107/2192/2107 2108/2194/2108 2120/2195/2120\nf 2107/2192/2107 2120/2195/2120 2106/2193/2106\nf 2109/2188/2109 2110/2196/2110 2111/2182/2111\nf 2109/2188/2109 2111/2182/2111 2096/2189/2096\nf 2096/2189/2096 2111/2182/2111 2112/2181/2112\nf 2096/2189/2096 2112/2181/2112 2174/2197/2174\nf 2115/2198/2115 2119/2199/2119 2118/2200/2118\nf 2115/2198/2115 2118/2200/2118 2114/2201/2114\nf 2113/2202/2113 2117/2203/2117 2119/2199/2119\nf 2113/2202/2113 2119/2199/2119 2115/2198/2115\nf 2124/2204/2124 2123/2205/2123 2116/2206/2116\nf 2124/2204/2124 2116/2206/2116 2089/2207/2089\nf 2106/2193/2106 2120/2195/2120 2121/2208/2121\nf 2106/2193/2106 2121/2208/2121 2104/2191/2104\nf 2104/2191/2104 2121/2208/2121 2122/2209/2122\nf 2104/2191/2104 2122/2209/2122 2109/2188/2109\nf 2109/2188/2109 2122/2209/2122 2117/2203/2117\nf 2109/2188/2109 2117/2203/2117 2113/2202/2113\nf 2103/2210/2103 2108/2194/2108 2107/2192/2107\nf 2103/2210/2103 2107/2192/2107 2105/2190/2105\nf 2123/2205/2123 2124/2204/2124 2114/2201/2114\nf 2123/2205/2123 2114/2201/2114 2118/2200/2118\nf 2090/2211/2090 2155/2212/2155 2068/2157/2068\nf 2090/2211/2090 2068/2157/2068 2077/2162/2077\nf 2054/2175/2054 2069/2158/2069 2141/2213/2141\nf 2054/2175/2054 2141/2213/2141 2142/2214/2142\nf 1827/1935/1827 1818/1931/1818 521/1934/521\nf 1827/1935/1827 521/1934/521 522/1936/522\nf 1882/2215/1882 2126/2216/2126 2125/2217/2125\nf 1882/2215/1882 2125/2217/2125 1880/2218/1880\nf 2129/2219/2129 2125/2217/2125 2126/2216/2126\nf 2129/2219/2129 2126/2216/2126 2128/2220/2128\nf 1882/2221/1882 2130/2222/2130 2131/2223/2131\nf 1882/2221/1882 2131/2223/2131 2126/2224/2126\nf 2131/2223/2131 2136/2225/2136 2138/2226/2138\nf 2131/2223/2131 2138/2226/2138 2147/2227/2147\nf 2130/2222/2130 2135/2228/2135 2136/2225/2136\nf 2130/2222/2130 2136/2225/2136 2131/2223/2131\nf 1927/2041/1927 2133/2229/2133 2132/2230/2132\nf 1927/2041/1927 2132/2230/2132 1904/2011/1904\nf 2133/2231/2133 2137/2232/2137 2134/2233/2134\nf 2133/2231/2133 2134/2233/2134 2132/2234/2132\nf 2138/2226/2138 2136/2225/2136 2135/2228/2135\nf 2138/2226/2138 2135/2228/2135 2139/2235/2139\nf 2138/2226/2138 2139/2236/2139 2137/2232/2137\nf 2138/2226/2138 2137/2232/2137 2147/2227/2147\nf 2141/2213/2141 2144/2237/2144 2143/2238/2143\nf 2141/2213/2141 2143/2238/2143 2142/2214/2142\nf 2140/2239/2140 2143/2238/2143 2144/2237/2144\nf 2140/2239/2140 2144/2237/2144 2128/2240/2128\nf 2142/2214/2142 1934/2241/1934 2056/2242/2056\nf 2142/2214/2142 2056/2242/2056 2057/2243/2057\nf 2001/2244/2001 2145/2245/2145 2146/2246/2146\nf 2001/2244/2001 2146/2246/2146 2002/2247/2002\nf 2140/2248/2140 2147/2249/2147 2145/2245/2145\nf 2140/2248/2140 2145/2245/2145 2001/2244/2001\nf 2149/2122/2149 2151/2250/2151 1927/2251/1927\nf 2149/2122/2149 1927/2251/1927 1929/2119/1929\nf 2147/2249/2147 2137/2252/2137 2151/2253/2151\nf 2147/2249/2147 2151/2253/2151 2145/2245/2145\nf 2133/2254/2133 1927/2255/1927 2151/2253/2151\nf 2133/2254/2133 2151/2253/2151 2137/2252/2137\nf 2001/2244/2001 2152/2256/2152 2000/2257/2000\nf 2001/2244/2001 2000/2257/2000 2143/2258/2143\nf 2158/1976/2158 2159/2259/2159 2160/2260/2160\nf 2158/1976/2158 2160/2260/2160 1428/2261/1428\nf 2082/2170/2082 2163/2262/2163 2162/2263/2162\nf 2082/2170/2082 2162/2263/2162 2083/2171/2083\nf 2083/2171/2083 2181/2264/2181 2161/2265/2161\nf 2083/2171/2083 2161/2265/2161 2099/2172/2099\nf 2158/1976/2158 2164/1975/2164 2165/2266/2165\nf 2158/1976/2158 2165/2266/2165 2159/2259/2159\nf 2082/2170/2082 2074/2169/2074 2075/2267/2075\nf 2082/2170/2082 2075/2267/2075 2165/2266/2165\nf 2181/2264/2181 2162/2263/2162 2182/2268/2182\nf 2181/2264/2181 2182/2268/2182 2166/2269/2166\nf 2169/2270/2169 2166/2271/2166 2116/2206/2116\nf 2169/2270/2169 2116/2206/2116 2123/2205/2123\nf 2167/2272/2167 2116/2206/2116 2166/2271/2166\nf 2167/2272/2167 2166/2271/2166 2182/2273/2182\nf 2090/2211/2090 2167/2272/2167 2156/2274/2156\nf 2090/2211/2090 2156/2274/2156 2155/2212/2155\nf 2167/2272/2167 2182/2273/2182 2129/2275/2129\nf 2167/2272/2167 2129/2275/2129 2156/2274/2156\nf 2118/2200/2118 2168/2276/2168 2169/2270/2169\nf 2118/2200/2118 2169/2270/2169 2123/2205/2123\nf 2120/2195/2120 2379/2277/2379 2170/2278/2170\nf 2120/2195/2120 2170/2278/2170 2121/2208/2121\nf 2379/2279/2379 2220/2280/2220 2172/2281/2172\nf 2379/2279/2379 2172/2281/2172 2170/2282/2170\nf 2170/2282/2170 2172/2281/2172 2173/2283/2173\nf 2170/2282/2170 2173/2283/2173 2171/2284/2171\nf 2172/2281/2172 2220/2280/2220 2187/2285/2187\nf 2172/2281/2172 2187/2285/2187 2176/2286/2176\nf 2176/2286/2176 2175/2287/2175 2180/2288/2180\nf 2176/2286/2176 2180/2288/2180 2172/2281/2172\nf 2175/2287/2175 2511/2185/2511 2100/2289/2100\nf 2175/2287/2175 2100/2289/2100 2178/2290/2178\nf 2179/2291/2179 2180/2288/2180 2175/2287/2175\nf 2179/2291/2179 2175/2287/2175 2178/2290/2178\nf 2173/2283/2173 2179/2291/2179 2184/2292/2184\nf 2173/2283/2173 2184/2292/2184 2183/2293/2183\nf 2098/2187/2098 2178/2290/2178 2100/2289/2100\nf 2098/2187/2098 2100/2289/2100 2097/2186/2097\nf 2179/2291/2179 2178/2290/2178 2098/2187/2098\nf 2179/2291/2179 2098/2187/2098 2184/2292/2184\nf 2168/2294/2168 2173/2283/2173 2183/2293/2183\nf 2168/2294/2168 2183/2293/2183 2169/2295/2169\nf 2183/2293/2183 2181/2264/2181 2166/2269/2166\nf 2183/2293/2183 2166/2269/2166 2169/2295/2169\nf 2182/2268/2182 2162/2263/2162 2127/2296/2127\nf 2182/2268/2182 2127/2296/2127 2129/2297/2129\nf 2177/2298/2177 2186/2299/2186 2185/2300/2185\nf 2177/2298/2177 2185/2300/2185 2103/2210/2103\nf 2177/2298/2177 2187/2285/2187 2207/2301/2207\nf 2177/2298/2177 2207/2301/2207 2186/2299/2186\nf 2189/2302/2189 2188/2303/2188 2108/2194/2108\nf 2189/2302/2189 2108/2194/2108 2185/2300/2185\nf 2191/2304/2191 2190/2305/2190 2185/2300/2185\nf 2191/2304/2191 2185/2300/2185 2186/2299/2186\nf 2380/2306/2380 2108/2194/2108 2188/2303/2188\nf 2380/2306/2380 2188/2303/2188 2192/2307/2192\nf 2305/2308/2305 2306/2309/2306 2189/2302/2189\nf 2305/2308/2305 2189/2302/2189 2190/2305/2190\nf 2189/2302/2189 2342/2310/2342 2343/2311/2343\nf 2189/2302/2189 2343/2311/2343 2188/2303/2188\nf 2191/2304/2191 2194/2312/2194 2193/2313/2193\nf 2191/2304/2191 2193/2313/2193 2190/2305/2190\nf 2188/2303/2188 2381/2314/2381 2382/2315/2382\nf 2188/2303/2188 2382/2315/2382 2192/2307/2192\nf 2194/2312/2194 2196/2316/2196 2195/2317/2195\nf 2194/2312/2194 2195/2317/2195 2193/2313/2193\nf 2196/2316/2196 2198/2318/2198 2197/2319/2197\nf 2196/2316/2196 2197/2319/2197 2195/2317/2195\nf 2198/2318/2198 2200/2320/2200 2199/2321/2199\nf 2198/2318/2198 2199/2321/2199 2197/2319/2197\nf 2200/2320/2200 2205/2322/2205 2201/2323/2201\nf 2200/2320/2200 2201/2323/2201 2199/2321/2199\nf 2186/2299/2186 2207/2301/2207 2269/2324/2269\nf 2186/2299/2186 2269/2324/2269 2270/2325/2270\nf 2194/2312/2194 2208/2326/2208 2209/2327/2209\nf 2194/2312/2194 2209/2327/2209 2196/2316/2196\nf 2200/2320/2200 2209/2327/2209 2211/2328/2211\nf 2200/2320/2200 2211/2328/2211 2205/2322/2205\nf 2211/2328/2211 2210/2329/2210 2203/2330/2203\nf 2211/2328/2211 2203/2330/2203 2205/2322/2205\nf 2214/2331/2214 2212/2332/2212 2202/2333/2202\nf 2214/2331/2214 2202/2333/2202 2204/2334/2204\nf 2203/2330/2203 2213/2335/2213 2214/2331/2214\nf 2203/2330/2203 2214/2331/2214 2204/2334/2204\nf 2215/2336/2215 2264/2337/2264 2212/2332/2212\nf 2215/2336/2215 2212/2332/2212 2214/2331/2214\nf 2213/2335/2213 2263/2338/2263 2215/2336/2215\nf 2213/2335/2213 2215/2336/2215 2214/2331/2214\nf 2207/2301/2207 2216/2339/2216 2280/2340/2280\nf 2207/2301/2207 2280/2340/2280 2269/2324/2269\nf 2220/2280/2220 2216/2339/2216 2207/2301/2207\nf 2220/2280/2220 2207/2301/2207 2187/2285/2187\nf 1875/2341/1875 2221/1977/2221 2222/1980/2222\nf 1875/2341/1875 2222/1980/2222 1878/2342/1878\nf 2223/1983/2223 1897/2343/1897 1878/2342/1878\nf 2223/1983/2223 1878/2342/1878 2222/1980/2222\nf 2228/2344/2228 2225/2345/2225 2043/2152/2043\nf 2228/2344/2228 2043/2152/2043 2045/2346/2045\nf 2059/2154/2059 2051/2156/2051 2237/2347/2237\nf 2059/2154/2059 2237/2347/2237 2238/2348/2238\nf 2066/2349/2066 2059/2154/2059 2238/2348/2238\nf 2066/2349/2066 2238/2348/2238 2061/2350/2061\nf 2231/2351/2231 2241/2352/2241 2094/2353/2094\nf 2231/2351/2231 2094/2353/2094 2073/2176/2073\nf 2244/2354/2244 2243/2355/2243 2250/2356/2250\nf 2244/2354/2244 2250/2356/2250 2235/2357/2235\nf 2094/2353/2094 2251/2358/2251 2247/2359/2247\nf 2094/2353/2094 2247/2359/2247 2227/2360/2227\nf 2053/2361/2053 2065/2362/2065 2064/2363/2064\nf 2053/2361/2053 2064/2363/2064 2240/2364/2240\nf 2256/2365/2256 2199/2321/2199 2201/2323/2201\nf 2256/2365/2256 2201/2323/2201 2253/2366/2253\nf 2253/2366/2253 2201/2323/2201 2202/2333/2202\nf 2253/2366/2253 2202/2333/2202 2254/2367/2254\nf 2255/2368/2255 2193/2313/2193 2195/2317/2195\nf 2255/2368/2255 2195/2317/2195 2256/2365/2256\nf 2257/2369/2257 2210/2329/2210 2211/2328/2211\nf 2257/2369/2257 2211/2328/2211 2258/2370/2258\nf 2259/2371/2259 2253/2366/2253 2254/2367/2254\nf 2259/2371/2259 2254/2367/2254 2260/2372/2260\nf 2258/2373/2258 2259/2374/2259 2260/2375/2260\nf 2258/2373/2258 2260/2375/2260 2257/2376/2257\nf 2261/2377/2261 2257/2376/2257 2260/2375/2260\nf 2261/2377/2261 2260/2375/2260 2262/2378/2262\nf 2263/2379/2263 2261/2377/2261 2262/2378/2262\nf 2263/2379/2263 2262/2378/2262 2264/2380/2264\nf 2267/2381/2267 2259/2374/2259 2258/2373/2258\nf 2267/2381/2267 2258/2373/2258 2265/2382/2265\nf 2340/2383/2340 2267/2381/2267 2265/2382/2265\nf 2340/2383/2340 2265/2382/2265 2266/2384/2266\nf 2256/2365/2256 2253/2366/2253 2259/2371/2259\nf 2256/2365/2256 2259/2371/2259 2267/2385/2267\nf 2255/2368/2255 2256/2365/2256 2267/2385/2267\nf 2255/2368/2255 2267/2385/2267 2340/2386/2340\nf 2266/2387/2266 2265/2388/2265 2209/2327/2209\nf 2266/2387/2266 2209/2327/2209 2208/2326/2208\nf 2269/2324/2269 2272/2389/2272 2271/2390/2271\nf 2269/2324/2269 2271/2390/2271 2270/2325/2270\nf 2272/2389/2272 2274/2391/2274 2273/2392/2273\nf 2272/2389/2272 2273/2392/2273 2271/2390/2271\nf 2274/2391/2274 2276/2393/2276 2275/2394/2275\nf 2274/2391/2274 2275/2394/2275 2273/2392/2273\nf 2269/2324/2269 2280/2340/2280 2281/2395/2281\nf 2269/2324/2269 2281/2395/2281 2272/2389/2272\nf 2281/2395/2281 2282/2396/2282 2279/2397/2279\nf 2281/2395/2281 2279/2397/2279 2276/2393/2276\nf 2283/2398/2283 2284/2399/2284 2278/2400/2278\nf 2283/2398/2283 2278/2400/2278 2277/2401/2277\nf 2279/2397/2279 2285/2402/2285 2283/2398/2283\nf 2279/2397/2279 2283/2398/2283 2277/2401/2277\nf 2286/2403/2286 2287/2404/2287 2284/2399/2284\nf 2286/2403/2286 2284/2399/2284 2283/2398/2283\nf 2285/2402/2285 2288/2405/2288 2286/2403/2286\nf 2285/2402/2285 2286/2403/2286 2283/2398/2283\nf 2289/2406/2289 2275/2394/2275 2278/2400/2278\nf 2289/2406/2289 2278/2400/2278 2290/2407/2290\nf 2206/2408/2206 2270/2325/2270 2271/2390/2271\nf 2206/2408/2206 2271/2390/2271 2289/2406/2289\nf 2291/2409/2291 2282/2396/2282 2281/2395/2281\nf 2291/2409/2291 2281/2395/2281 2298/2410/2298\nf 2297/2411/2297 2289/2406/2289 2290/2407/2290\nf 2297/2411/2297 2290/2407/2290 2292/2412/2292\nf 2298/2413/2298 2297/2414/2297 2292/2415/2292\nf 2298/2413/2298 2292/2415/2292 2291/2416/2291\nf 2293/2417/2293 2291/2416/2291 2292/2415/2292\nf 2293/2417/2293 2292/2415/2292 2294/2418/2294\nf 2295/2419/2295 2293/2417/2293 2294/2418/2294\nf 2295/2419/2295 2294/2418/2294 2296/2420/2296\nf 2288/2421/2288 2295/2419/2295 2296/2420/2296\nf 2288/2421/2288 2296/2420/2296 2287/2422/2287\nf 2299/2423/2299 2297/2414/2297 2298/2413/2298\nf 2299/2423/2299 2298/2413/2298 2415/2424/2415\nf 2289/2406/2289 2297/2411/2297 2299/2425/2299\nf 2289/2406/2289 2299/2425/2299 2206/2408/2206\nf 2415/2426/2415 2298/2410/2298 2281/2395/2281\nf 2415/2426/2415 2281/2395/2281 2280/2340/2280\nf 2301/2427/2301 2208/2326/2208 2194/2312/2194\nf 2301/2427/2301 2194/2312/2194 2191/2304/2191\nf 2304/2428/2304 2415/2429/2415 2218/2430/2218\nf 2304/2428/2304 2218/2430/2218 2302/2431/2302\nf 2301/2427/2301 2303/2432/2303 2266/2387/2266\nf 2301/2427/2301 2266/2387/2266 2208/2326/2208\nf 2303/2433/2303 2304/2428/2304 2340/2383/2340\nf 2303/2433/2303 2340/2383/2340 2266/2384/2266\nf 2209/2327/2209 2265/2388/2265 2258/2370/2258\nf 2209/2327/2209 2258/2370/2258 2211/2328/2211\nf 2305/2308/2305 2308/2434/2308 2307/2435/2307\nf 2305/2308/2305 2307/2435/2307 2306/2309/2306\nf 2308/2434/2308 2310/2436/2310 2309/2437/2309\nf 2308/2434/2308 2309/2437/2309 2307/2435/2307\nf 2310/2436/2310 2312/2438/2312 2311/2439/2311\nf 2310/2436/2310 2311/2439/2311 2309/2437/2309\nf 2312/2438/2312 2314/2440/2314 2313/2441/2313\nf 2312/2438/2312 2313/2441/2313 2311/2439/2311\nf 2305/2308/2305 2318/2442/2318 2319/2443/2319\nf 2305/2308/2305 2319/2443/2319 2308/2434/2308\nf 2312/2438/2312 2319/2443/2319 2320/2444/2320\nf 2312/2438/2312 2320/2444/2320 2314/2440/2314\nf 2320/2444/2320 2321/2445/2321 2317/2446/2317\nf 2320/2444/2320 2317/2446/2317 2314/2440/2314\nf 2322/2447/2322 2323/2448/2323 2316/2449/2316\nf 2322/2447/2322 2316/2449/2316 2315/2450/2315\nf 2317/2446/2317 2324/2451/2324 2322/2447/2322\nf 2317/2446/2317 2322/2447/2322 2315/2450/2315\nf 2325/2452/2325 2326/2453/2326 2323/2448/2323\nf 2325/2452/2325 2323/2448/2323 2322/2447/2322\nf 2324/2451/2324 2327/2454/2327 2325/2452/2325\nf 2324/2451/2324 2325/2452/2325 2322/2447/2322\nf 2328/2455/2328 2311/2439/2311 2313/2441/2313\nf 2328/2455/2328 2313/2441/2313 2329/2456/2329\nf 2329/2456/2329 2313/2441/2313 2316/2449/2316\nf 2329/2456/2329 2316/2449/2316 2330/2457/2330\nf 2331/2458/2331 2306/2309/2306 2307/2435/2307\nf 2331/2458/2331 2307/2435/2307 2328/2455/2328\nf 2321/2445/2321 2320/2444/2320 2333/2459/2333\nf 2321/2445/2321 2333/2459/2333 2332/2460/2332\nf 2334/2461/2334 2329/2456/2329 2330/2457/2330\nf 2334/2461/2334 2330/2457/2330 2335/2462/2335\nf 2333/2463/2333 2334/2464/2334 2335/2465/2335\nf 2333/2463/2333 2335/2465/2335 2332/2466/2332\nf 2336/2467/2336 2332/2466/2332 2335/2465/2335\nf 2336/2467/2336 2335/2465/2335 2337/2468/2337\nf 2327/2469/2327 2336/2467/2336 2337/2468/2337\nf 2327/2469/2327 2337/2468/2337 2326/2470/2326\nf 2338/2471/2338 2334/2464/2334 2333/2463/2333\nf 2338/2471/2338 2333/2463/2333 2339/2472/2339\nf 2376/2473/2376 2338/2471/2338 2339/2472/2339\nf 2376/2473/2376 2339/2472/2339 2340/2383/2340\nf 2328/2455/2328 2329/2456/2329 2334/2461/2334\nf 2328/2455/2328 2334/2461/2334 2338/2474/2338\nf 2331/2458/2331 2328/2455/2328 2338/2474/2338\nf 2331/2458/2331 2338/2474/2338 2376/2475/2376\nf 2340/2386/2340 2339/2476/2339 2319/2443/2319\nf 2340/2386/2340 2319/2443/2319 2318/2442/2318\nf 2319/2443/2319 2339/2476/2339 2333/2459/2333\nf 2319/2443/2319 2333/2459/2333 2320/2444/2320\nf 2305/2308/2305 2193/2313/2193 2255/2368/2255\nf 2305/2308/2305 2255/2368/2255 2318/2442/2318\nf 2342/2310/2342 2345/2477/2345 2344/2478/2344\nf 2342/2310/2342 2344/2478/2344 2343/2311/2343\nf 2345/2477/2345 2347/2479/2347 2346/2480/2346\nf 2345/2477/2345 2346/2480/2346 2344/2478/2344\nf 2347/2479/2347 2349/2481/2349 2348/2482/2348\nf 2347/2479/2347 2348/2482/2348 2346/2480/2346\nf 2349/2481/2349 2351/2483/2351 2350/2484/2350\nf 2349/2481/2349 2350/2484/2350 2348/2482/2348\nf 2342/2310/2342 2355/2485/2355 2356/2486/2356\nf 2342/2310/2342 2356/2486/2356 2345/2477/2345\nf 2349/2481/2349 2356/2486/2356 2357/2487/2357\nf 2349/2481/2349 2357/2487/2357 2351/2483/2351\nf 2357/2487/2357 2358/2488/2358 2354/2489/2354\nf 2357/2487/2357 2354/2489/2354 2351/2483/2351\nf 2359/2490/2359 2360/2491/2360 2353/2492/2353\nf 2359/2490/2359 2353/2492/2353 2352/2493/2352\nf 2354/2489/2354 2361/2494/2361 2359/2490/2359\nf 2354/2489/2354 2359/2490/2359 2352/2493/2352\nf 2363/2495/2363 2348/2482/2348 2350/2484/2350\nf 2363/2495/2363 2350/2484/2350 2364/2496/2364\nf 2364/2496/2364 2350/2484/2350 2353/2492/2353\nf 2364/2496/2364 2353/2492/2353 2365/2497/2365\nf 2366/2498/2366 2343/2311/2343 2344/2478/2344\nf 2366/2498/2366 2344/2478/2344 2363/2495/2363\nf 2367/2499/2367 2358/2488/2358 2357/2487/2357\nf 2367/2499/2367 2357/2487/2357 2368/2500/2368\nf 2369/2501/2369 2364/2496/2364 2365/2497/2365\nf 2369/2501/2369 2365/2497/2365 2370/2502/2370\nf 2368/2503/2368 2369/2504/2369 2370/2505/2370\nf 2368/2503/2368 2370/2505/2370 2367/2506/2367\nf 2371/2507/2371 2367/2506/2367 2370/2505/2370\nf 2371/2507/2371 2370/2505/2370 2372/2508/2372\nf 2373/2509/2373 2369/2504/2369 2368/2503/2368\nf 2373/2509/2373 2368/2503/2368 2374/2510/2374\nf 2375/2511/2375 2373/2509/2373 2374/2510/2374\nf 2375/2511/2375 2374/2510/2374 2376/2512/2376\nf 2363/2495/2363 2364/2496/2364 2369/2501/2369\nf 2363/2495/2363 2369/2501/2369 2373/2513/2373\nf 2366/2498/2366 2363/2495/2363 2373/2513/2373\nf 2366/2498/2366 2373/2513/2373 2375/2514/2375\nf 2376/2475/2376 2374/2515/2374 2356/2486/2356\nf 2376/2475/2376 2356/2486/2356 2355/2485/2355\nf 2356/2486/2356 2374/2515/2374 2368/2500/2368\nf 2356/2486/2356 2368/2500/2368 2357/2487/2357\nf 2331/2458/2331 2355/2485/2355 2342/2310/2342\nf 2331/2458/2331 2342/2310/2342 2306/2309/2306\nf 2376/2473/2376 2340/2383/2340 2304/2428/2304\nf 2376/2473/2376 2304/2428/2304 2302/2431/2302\nf 2378/2516/2378 2302/2517/2302 2217/2518/2217\nf 2378/2516/2378 2217/2518/2217 2377/2519/2377\nf 2377/2520/2377 2379/2277/2379 2120/2195/2120\nf 2377/2520/2377 2120/2195/2120 2380/2306/2380\nf 2192/2307/2192 2378/2521/2378 2377/2520/2377\nf 2192/2307/2192 2377/2520/2377 2380/2306/2380\nf 1873/2003/1873 2164/2522/2164 1429/2523/1429\nf 1873/2003/1873 1429/2523/1429 1419/2004/1419\nf 2381/2314/2381 2384/2524/2384 2383/2525/2383\nf 2381/2314/2381 2383/2525/2383 2382/2315/2382\nf 2384/2524/2384 2386/2526/2386 2385/2527/2385\nf 2384/2524/2384 2385/2527/2385 2383/2525/2383\nf 2386/2526/2386 2388/2528/2388 2387/2529/2387\nf 2386/2526/2386 2387/2529/2387 2385/2527/2385\nf 2388/2528/2388 2390/2530/2390 2389/2531/2389\nf 2388/2528/2388 2389/2531/2389 2387/2529/2387\nf 2381/2314/2381 2394/2532/2394 2395/2533/2395\nf 2381/2314/2381 2395/2533/2395 2384/2524/2384\nf 2388/2528/2388 2395/2533/2395 2396/2534/2396\nf 2388/2528/2388 2396/2534/2396 2390/2530/2390\nf 2396/2534/2396 2397/2535/2397 2393/2536/2393\nf 2396/2534/2396 2393/2536/2393 2390/2530/2390\nf 2398/2537/2398 2399/2538/2399 2392/2539/2392\nf 2398/2537/2398 2392/2539/2392 2391/2540/2391\nf 2393/2536/2393 2400/2541/2400 2398/2537/2398\nf 2393/2536/2393 2398/2537/2398 2391/2540/2391\nf 2402/2542/2402 2387/2529/2387 2389/2531/2389\nf 2402/2542/2402 2389/2531/2389 2403/2543/2403\nf 2403/2543/2403 2389/2531/2389 2392/2539/2392\nf 2403/2543/2403 2392/2539/2392 2404/2544/2404\nf 2405/2545/2405 2382/2315/2382 2383/2525/2383\nf 2405/2545/2405 2383/2525/2383 2402/2542/2402\nf 2406/2546/2406 2397/2535/2397 2396/2534/2396\nf 2406/2546/2406 2396/2534/2396 2407/2547/2407\nf 2408/2548/2408 2403/2543/2403 2404/2544/2404\nf 2408/2548/2408 2404/2544/2404 2409/2549/2409\nf 2407/2550/2407 2408/2551/2408 2409/2552/2409\nf 2407/2550/2407 2409/2552/2409 2406/2553/2406\nf 2410/2554/2410 2406/2553/2406 2409/2552/2409\nf 2410/2554/2410 2409/2552/2409 2411/2555/2411\nf 2412/2556/2412 2408/2551/2408 2407/2550/2407\nf 2412/2556/2412 2407/2550/2407 2413/2557/2413\nf 2414/2558/2414 2412/2556/2412 2413/2557/2413\nf 2414/2558/2414 2413/2557/2413 2375/2511/2375\nf 2402/2542/2402 2403/2543/2403 2408/2548/2408\nf 2402/2542/2402 2408/2548/2408 2412/2559/2412\nf 2405/2545/2405 2402/2542/2402 2412/2559/2412\nf 2405/2545/2405 2412/2559/2412 2414/2560/2414\nf 2375/2514/2375 2413/2561/2413 2395/2533/2395\nf 2375/2514/2375 2395/2533/2395 2394/2532/2394\nf 2395/2533/2395 2413/2561/2413 2407/2547/2407\nf 2395/2533/2395 2407/2547/2407 2396/2534/2396\nf 2366/2498/2366 2394/2532/2394 2381/2314/2381\nf 2366/2498/2366 2381/2314/2381 2343/2311/2343\nf 2302/2517/2302 2414/2558/2414 2375/2511/2375\nf 2302/2517/2302 2375/2511/2375 2376/2512/2376\nf 2405/2545/2405 2414/2560/2414 2378/2521/2378\nf 2405/2545/2405 2378/2521/2378 2192/2307/2192\nf 2191/2304/2191 2270/2325/2270 2206/2408/2206\nf 2191/2304/2191 2206/2408/2206 2301/2427/2301\nf 2303/2432/2303 2301/2427/2301 2206/2408/2206\nf 2303/2432/2303 2206/2408/2206 2299/2425/2299\nf 2038/2149/2038 2040/2145/2040 2425/2562/2425\nf 2038/2149/2038 2425/2562/2425 2417/2563/2417\nf 2423/2564/2423 2420/2565/2420 2418/2566/2418\nf 2423/2564/2423 2418/2566/2418 2424/2567/2424\nf 1406/2568/1406 2418/2566/2418 2420/2565/2420\nf 1406/2568/1406 2420/2565/2420 562/2569/562\nf 2422/2570/2422 2419/2571/2419 2416/2572/2416\nf 2422/2570/2422 2416/2572/2416 2421/2573/2421\nf 2423/2564/2423 2417/2563/2417 2416/2572/2416\nf 2423/2564/2423 2416/2572/2416 2419/2571/2419\nf 2424/2567/2424 2038/2149/2038 2417/2563/2417\nf 2424/2567/2424 2417/2563/2417 2423/2564/2423\nf 2428/2574/2428 2015/2575/2015 783/2576/783\nf 2428/2574/2428 783/2576/783 1331/2577/1331\nf 2430/2578/2430 2429/2579/2429 2432/2580/2432\nf 2430/2578/2430 2432/2580/2432 2431/2581/2431\nf 2434/2582/2434 2429/2579/2429 2433/2583/2433\nf 2434/2582/2434 2433/2583/2433 2435/2584/2435\nf 2434/2582/2434 2435/2584/2435 2437/2585/2437\nf 2434/2582/2434 2437/2585/2437 2436/2586/2436\nf 2439/2587/2439 2433/2583/2433 2430/2578/2430\nf 2439/2587/2439 2430/2578/2430 2438/2588/2438\nf 2440/2589/2440 2435/2584/2435 2433/2583/2433\nf 2440/2589/2440 2433/2583/2433 2439/2587/2439\nf 2437/2585/2437 2435/2584/2435 2440/2589/2440\nf 2437/2585/2437 2440/2589/2440 2441/2590/2441\nf 2430/2578/2430 2431/2581/2431 2017/2591/2017\nf 2430/2578/2430 2017/2591/2017 2438/2588/2438\nf 2015/2592/2015 2428/2593/2428 2442/2594/2442\nf 2015/2592/2015 2442/2594/2442 2451/2595/2451\nf 2446/2596/2446 2444/2597/2444 2445/2598/2445\nf 2446/2596/2446 2445/2598/2445 2447/2599/2447\nf 2447/2599/2447 2445/2598/2445 2443/2600/2443\nf 2447/2599/2447 2443/2600/2443 2450/2601/2450\nf 2450/2601/2450 2443/2600/2443 2442/2594/2442\nf 2450/2601/2450 2442/2594/2442 2449/2602/2449\nf 2449/2602/2449 2442/2594/2442 2428/2593/2428\nf 2449/2602/2449 2428/2593/2428 2448/2603/2448\nf 2443/2600/2443 2440/2604/2440 2439/2605/2439\nf 2443/2600/2443 2439/2605/2439 2451/2595/2451\nf 2434/2582/2434 2454/2606/2454 2453/2607/2453\nf 2434/2582/2434 2453/2607/2453 2429/2579/2429\nf 2434/2582/2434 2436/2586/2436 2446/2596/2446\nf 2434/2582/2434 2446/2596/2446 2454/2606/2454\nf 14/2608/14 2421/2573/2421 2426/2609/2426\nf 14/2608/14 2426/2609/2426 1/2610/1\nf 2431/2611/2431 2432/2612/2432 2457/2613/2457\nf 2431/2611/2431 2457/2613/2457 2456/2614/2456\nf 63/2615/63 2457/2613/2457 2432/2612/2432\nf 63/2615/63 2432/2612/2432 64/2616/64\nf 2460/2617/2460 2513/2618/2513 2512/2619/2512\nf 2460/2617/2460 2512/2619/2512 2458/2620/2458\nf 2514/2621/2514 2513/2618/2513 2460/2617/2460\nf 2514/2621/2514 2460/2617/2460 2462/2622/2462\nf 2463/2623/2463 2464/2624/2464 2467/2625/2467\nf 2463/2623/2463 2467/2625/2467 2466/2626/2466\nf 2465/2627/2465 2498/2628/2498 2466/2626/2466\nf 2465/2627/2465 2466/2626/2466 2467/2625/2467\nf 2460/2617/2460 2458/2620/2458 2468/2629/2468\nf 2460/2617/2460 2468/2629/2468 2469/2630/2469\nf 2464/2624/2464 2462/2622/2462 2469/2630/2469\nf 2464/2624/2464 2469/2630/2469 2500/2631/2500\nf 2465/2627/2465 2467/2625/2467 2471/2632/2471\nf 2465/2627/2465 2471/2632/2471 2470/2633/2470\nf 2467/2625/2467 2464/2624/2464 2500/2631/2500\nf 2467/2625/2467 2500/2631/2500 2471/2632/2471\nf 2473/2634/2473 2474/2635/2474 2432/2636/2432\nf 2473/2634/2473 2432/2636/2432 2472/2637/2472\nf 2476/2638/2476 2473/2634/2473 2472/2637/2472\nf 2476/2638/2476 2472/2637/2472 2475/2639/2475\nf 2478/2640/2478 2474/2635/2474 2473/2634/2473\nf 2478/2640/2478 2473/2634/2473 2479/2641/2479\nf 2479/2641/2479 2473/2634/2473 2476/2638/2476\nf 2479/2641/2479 2476/2638/2476 2480/2642/2480\nf 2488/2643/2488 2478/2640/2478 2479/2641/2479\nf 2488/2643/2488 2479/2641/2479 2482/2644/2482\nf 2479/2641/2479 2480/2642/2480 2485/2645/2485\nf 2479/2641/2479 2485/2645/2485 2482/2644/2482\nf 2488/2643/2488 2482/2644/2482 2484/2646/2484\nf 2488/2643/2488 2484/2646/2484 2483/2647/2483\nf 2486/2648/2486 2487/2649/2487 2476/2638/2476\nf 2486/2648/2486 2476/2638/2476 2475/2639/2475\nf 2480/2642/2480 2476/2638/2476 2487/2649/2487\nf 2480/2642/2480 2487/2649/2487 2481/2650/2481\nf 61/2651/61 2474/2635/2474 2478/2640/2478\nf 61/2651/61 2478/2640/2478 2490/2652/2490\nf 1332/2653/1332 2452/2654/2452 2448/2655/2448\nf 1332/2653/1332 2448/2655/2448 1331/2577/1331\nf 106/2656/106 2489/2657/2489 2452/2654/2452\nf 106/2656/106 2452/2654/2452 1332/2653/1332\nf 2478/2640/2478 2488/2643/2488 2489/2658/2489\nf 2478/2640/2478 2489/2658/2489 2490/2652/2490\nf 2492/2659/2492 1/2660/1 2426/2661/2426\nf 2492/2659/2492 2426/2661/2426 2491/2662/2491\nf 2425/2663/2425 2459/2664/2459 2491/2665/2491\nf 2425/2663/2425 2491/2665/2491 2426/2666/2426\nf 2496/2667/2496 2493/2668/2493 2461/2669/2461\nf 2496/2667/2496 2461/2669/2461 2463/2670/2463\nf 2492/2659/2492 2515/2671/2515 4/2672/4\nf 2492/2659/2492 4/2672/4 1/2660/1\nf 2518/2673/2518 2519/2674/2519 2494/2675/2494\nf 2518/2673/2518 2494/2675/2494 2516/2676/2516\nf 2466/2677/2466 2497/2678/2497 2496/2667/2496\nf 2466/2677/2466 2496/2667/2496 2463/2670/2463\nf 2499/2679/2499 2497/2678/2497 2466/2677/2466\nf 2499/2679/2499 2466/2677/2466 2498/2680/2498\nf 2497/2678/2497 2499/2679/2499 2470/2633/2470\nf 2497/2678/2497 2470/2633/2470 2471/2632/2471\nf 2517/2681/2517 2496/2667/2496 2497/2678/2497\nf 2517/2681/2517 2497/2678/2497 2471/2632/2471\nf 2516/2676/2516 2494/2675/2494 2496/2667/2496\nf 2516/2676/2516 2496/2667/2496 2517/2681/2517\nf 1356/2682/1356 2419/2571/2419 2422/2570/2422\nf 1356/2682/1356 2422/2570/2422 1357/2683/1357\nf 90/2684/90 1357/2683/1357 2422/2570/2422\nf 90/2684/90 2422/2570/2422 2502/2685/2502\nf 2507/2686/2507 1444/2687/1444 90/2688/90\nf 2507/2686/2507 90/2688/90 2502/2689/2502\nf 2507/2686/2507 2506/2690/2506 1445/2691/1445\nf 2507/2686/2507 1445/2691/1445 1444/2687/1444\nf 2504/2692/2504 2505/2693/2505 2508/2694/2508\nf 2504/2692/2504 2508/2694/2508 2507/2686/2507\nf 1446/2695/1446 1445/2691/1445 2506/2690/2506\nf 1446/2695/1446 2506/2690/2506 2509/2696/2509\nf 2176/2286/2176 2187/2285/2187 2177/2298/2177\nf 2176/2286/2176 2177/2298/2177 2510/2697/2510\nf 2175/2287/2175 2176/2286/2176 2510/2697/2510\nf 2175/2287/2175 2510/2697/2510 2511/2185/2511\nf 2513/2618/2513 2493/2698/2493 2459/2664/2459\nf 2513/2618/2513 2459/2664/2459 2512/2619/2512\nf 2461/2699/2461 2493/2698/2493 2513/2618/2513\nf 2461/2699/2461 2513/2618/2513 2514/2621/2514\nf 2468/2629/2468 46/2700/46 4/2672/4\nf 2468/2629/2468 4/2672/4 2515/2671/2515\nf 2500/2631/2500 2469/2630/2469 2516/2676/2516\nf 2500/2631/2500 2516/2676/2516 2517/2681/2517\nf 1/11/1 3/2701/3 2/12/2\nf 1/11/1 4/20/4 3/2701/3\nf 3/2701/3 4/20/4 5/2/5\nf 5/2/5 6/1/6 3/2701/3\nf 10/7/10 11/6/11 13/19/13\nf 7/4/7 19/51/19 18/50/18\nf 2/12/2 3/2701/3 6/1/6\nf 20/21/20 22/18/22 21/70/21\nf 25/15/25 26/56/26 24/16/24\nf 19/51/19 7/4/7 24/16/24\nf 24/16/24 26/56/26 19/51/19\nf 37/37/37 43/43/43 34/34/34\nf 46/46/46 9/8/9 4/20/4\nf 41/41/41 45/45/45 40/40/40\nf 26/56/26 49/60/49 48/48/48\nf 19/51/19 26/56/26 48/48/48\nf 1262/33/1262 51/62/51 33/30/33\nf 1262/33/1262 1281/2702/1281 51/62/51\nf 52/52/52 1281/2702/1281 1280/53/1280\nf 49/60/49 26/56/26 54/55/54\nf 31/26/31 55/59/55 30/25/30\nf 32/31/32 56/2703/56 31/26/31\nf 33/30/33 56/2703/56 32/31/32\nf 57/61/57 58/2704/58 56/2703/56\nf 57/61/57 56/2703/56 33/30/33\nf 54/55/54 59/57/59 49/60/49\nf 58/2704/58 60/58/60 56/2703/56\nf 60/58/60 58/2704/58 59/57/59\nf 58/2704/58 49/60/49 59/57/59\nf 58/2704/58 57/61/57 49/60/49\nf 60/58/60 55/59/55 56/2703/56\nf 55/59/55 31/26/31 56/2703/56\nf 51/62/51 1281/2702/1281 52/52/52\nf 63/2705/63 61/63/61 62/64/62\nf 63/2705/63 64/2706/64 61/63/61\nf 45/45/45 61/63/61 47/47/47\nf 47/47/47 65/66/65 44/44/44\nf 109/65/109 43/43/43 44/44/44\nf 21/70/21 36/36/36 20/21/20\nf 21/70/21 66/69/66 36/36/36\nf 39/39/39 66/69/66 42/42/42\nf 36/36/36 66/69/66 39/39/39\nf 12/5/12 67/68/67 11/6/11\nf 11/6/11 67/68/67 23/17/23\nf 22/18/22 67/68/67 21/70/21\nf 23/17/23 67/68/67 22/18/22\nf 42/42/42 67/68/67 12/5/12\nf 68/2707/68 14/10/14 15/9/15\nf 68/2707/68 15/9/15 16/13/16\nf 69/71/69 71/2708/71 16/13/16\nf 2/12/2 6/1/6 17/14/17\nf 77/78/77 80/88/80 79/79/79\nf 77/78/77 79/79/79 76/77/76\nf 72/73/72 70/72/70 17/14/17\nf 70/72/70 72/73/72 75/76/75\nf 75/76/75 81/82/81 70/72/70\nf 84/81/84 70/72/70 81/82/81\nf 84/81/84 69/71/69 70/72/70\nf 81/82/81 75/76/75 78/80/78\nf 86/87/86 87/86/87 89/102/89\nf 79/79/79 85/85/85 78/80/78\nf 7/4/7 18/50/18 6/1/6\nf 92/2709/92 69/71/69 84/81/84\nf 69/71/69 92/2709/92 71/2708/71\nf 82/84/82 92/2709/92 84/81/84\nf 86/87/86 94/2710/94 85/85/85\nf 92/90/92 94/98/94 86/94/86\nf 85/85/85 94/2710/94 83/83/83\nf 89/102/89 96/101/96 95/2711/95\nf 68/93/68 71/2712/71 92/90/92\nf 71/2708/71 68/2707/68 16/13/16\nf 101/111/101 103/108/103 102/2713/102\nf 102/2713/102 103/108/103 104/107/104\nf 98/105/98 99/104/99 105/2714/105\nf 110/2715/110 104/107/104 105/2714/105\nf 102/2713/102 104/107/104 110/2715/110\nf 103/108/103 108/113/108 111/114/111\nf 105/2714/105 104/107/104 98/105/98\nf 114/118/114 121/487/121 122/486/122\nf 126/120/126 116/167/116 115/117/115\nf 113/116/113 112/115/112 127/126/127\nf 112/115/112 117/122/117 120/129/120\nf 122/486/122 119/2716/119 118/123/118\nf 446/485/446 121/487/121 124/2717/124\nf 114/118/114 115/117/115 123/169/123\nf 121/487/121 125/170/125 124/2717/124\nf 121/487/121 123/169/123 125/170/125\nf 118/123/118 119/2716/119 174/125/174\nf 174/125/174 148/165/148 146/124/146\nf 127/126/127 130/131/130 131/143/131\nf 130/131/130 132/130/132 133/2718/133\nf 133/2718/133 136/142/136 130/131/130\nf 134/144/134 131/143/131 130/131/130\nf 136/142/136 133/2718/133 139/132/139\nf 157/141/157 134/144/134 136/142/136\nf 136/142/136 134/144/134 130/131/130\nf 132/130/132 137/134/137 138/133/138\nf 138/133/138 133/2718/133 132/130/132\nf 140/135/140 135/140/135 139/132/139\nf 133/2718/133 138/133/138 139/132/139\nf 137/134/137 132/130/132 141/137/141\nf 141/137/141 143/138/143 142/2719/142\nf 142/2719/142 137/134/137 141/137/141\nf 145/139/145 144/136/144 199/182/199\nf 117/122/117 146/124/146 147/183/147\nf 147/183/147 120/129/120 117/122/117\nf 144/136/144 120/129/120 147/183/147\nf 119/2716/119 188/166/188 174/125/174\nf 149/146/149 150/145/150 154/2720/154\nf 150/145/150 151/147/151 154/2720/154\nf 153/149/153 152/148/152 154/2720/154\nf 149/146/149 154/2720/154 152/148/152\nf 153/149/153 154/2720/154 151/147/151\nf 159/150/159 161/157/161 155/151/155\nf 149/146/149 152/148/152 165/2721/165\nf 157/141/157 135/140/135 158/152/158\nf 160/153/160 177/2722/177 161/157/161\nf 137/134/137 142/2719/142 140/135/140\nf 142/2719/142 143/138/143 164/2723/164\nf 140/135/140 142/2719/142 164/2723/164\nf 140/135/140 164/2723/164 135/140/135\nf 178/155/178 162/154/162 163/2724/163\nf 158/152/158 135/140/135 241/2725/241\nf 135/140/135 164/2723/164 241/2725/241\nf 160/153/160 158/152/158 241/2725/241\nf 152/148/152 155/151/155 165/2721/165\nf 131/143/131 149/146/149 165/2721/165\nf 165/2721/165 156/2726/156 131/143/131\nf 165/2721/165 155/151/155 166/2727/166\nf 166/2727/166 155/151/155 167/156/167\nf 155/151/155 161/157/161 167/156/167\nf 169/159/169 166/2727/166 167/156/167\nf 169/159/169 165/2721/165 166/2727/166\nf 156/2726/156 165/2721/165 168/158/168\nf 165/2721/165 169/159/169 168/158/168\nf 156/2726/156 170/2728/170 128/127/128\nf 156/2726/156 168/158/168 170/2728/170\nf 131/143/131 128/127/128 127/126/127\nf 571/588/571 173/163/173 191/162/191\nf 118/123/118 114/118/114 122/486/122\nf 172/179/172 148/165/148 189/164/189\nf 161/2729/161 177/2730/177 227/236/227\nf 176/2731/176 177/2722/177 164/2723/164\nf 163/2724/163 162/154/162 176/2731/176\nf 162/154/162 175/2732/175 176/2731/176\nf 176/2731/176 175/2732/175 177/2722/177\nf 163/2724/163 164/2723/164 178/155/178\nf 178/155/178 164/2723/164 143/138/143\nf 164/2723/164 163/2724/163 176/2731/176\nf 121/487/121 114/118/114 123/169/123\nf 125/170/125 123/169/123 179/168/179\nf 116/167/116 126/120/126 180/2733/180\nf 116/167/116 180/2733/180 182/173/182\nf 180/2733/180 181/174/181 182/173/182\nf 180/2733/180 126/120/126 181/174/181\nf 124/2717/124 125/170/125 183/172/183\nf 185/175/185 194/119/194 192/2734/192\nf 148/165/148 172/179/172 187/178/187\nf 568/585/568 571/588/571 189/164/189\nf 191/162/191 189/164/189 571/588/571\nf 194/119/194 195/2735/195 192/2734/192\nf 185/175/185 192/2734/192 193/242/193\nf 192/2734/192 195/2735/195 193/242/193\nf 113/116/113 129/128/129 196/121/196\nf 197/181/197 208/180/208 193/242/193\nf 181/174/181 185/175/185 193/242/193\nf 115/117/115 113/116/113 196/121/196\nf 193/242/193 195/2735/195 197/181/197\nf 197/181/197 195/2735/195 194/119/194\nf 197/181/197 194/119/194 196/121/196\nf 198/184/198 219/2736/219 200/185/200\nf 200/185/200 199/182/199 198/184/198\nf 148/165/148 198/184/198 146/124/146\nf 148/165/148 219/2736/219 198/184/198\nf 148/165/148 187/178/187 219/2736/219\nf 219/2736/219 187/178/187 233/230/233\nf 186/176/186 203/191/203 234/195/234\nf 129/128/129 128/127/128 207/198/207\nf 207/198/207 128/127/128 209/2737/209\nf 128/127/128 170/2728/170 209/2737/209\nf 209/200/209 170/2738/170 210/193/210\nf 218/351/218 212/206/212 215/210/215\nf 216/212/216 217/211/217 262/257/262\nf 214/209/214 211/214/211 218/351/218\nf 211/214/211 224/213/224 221/219/221\nf 220/215/220 223/220/223 224/213/224\nf 219/202/219 339/201/339 200/186/200\nf 225/187/225 226/222/226 175/188/175\nf 226/222/226 177/2730/177 175/188/175\nf 168/2739/168 228/245/228 170/2740/170\nf 168/2739/168 161/2729/161 228/245/228\nf 228/245/228 227/236/227 245/238/245\nf 228/245/228 229/247/229 170/2740/170\nf 231/223/231 230/225/230 240/228/240\nf 203/191/203 205/192/205 234/195/234\nf 234/195/234 201/177/201 186/176/186\nf 217/211/217 236/233/236 250/235/250\nf 230/246/230 247/239/247 240/250/240\nf 164/2723/164 177/2722/177 241/2725/241\nf 241/2725/241 177/2722/177 160/153/160\nf 161/157/161 159/150/159 160/153/160\nf 191/162/191 172/179/172 189/164/189\nf 243/241/243 182/173/182 181/174/181\nf 243/241/243 184/171/184 182/173/182\nf 206/199/206 242/244/242 208/180/208\nf 161/2729/161 227/236/227 228/245/228\nf 247/239/247 230/246/230 245/238/245\nf 226/222/226 227/236/227 177/2730/177\nf 246/2741/246 264/260/264 237/2742/237\nf 248/234/248 264/2743/264 249/251/249\nf 250/235/250 262/257/262 217/211/217\nf 216/212/216 262/257/262 260/217/260\nf 248/234/248 249/251/249 259/254/259\nf 257/258/257 251/259/251 252/295/252\nf 260/217/260 257/258/257 258/218/258\nf 220/215/220 222/216/222 255/256/255\nf 222/216/222 256/290/256 255/289/255\nf 258/218/258 252/295/252 256/290/256\nf 257/258/257 252/295/252 258/218/258\nf 250/235/250 248/234/248 259/254/259\nf 218/351/218 215/210/215 214/209/214\nf 246/2741/246 263/261/263 264/260/264\nf 266/263/266 265/262/265 285/2744/285\nf 267/2745/267 285/2744/285 269/2746/269\nf 269/2746/269 268/273/268 402/431/402\nf 271/266/271 265/262/265 274/267/274\nf 270/269/270 268/273/268 284/270/284\nf 246/2741/246 254/291/254 263/261/263\nf 273/264/273 276/271/276 272/2747/272\nf 276/271/276 273/264/273 279/275/279\nf 284/270/284 272/2747/272 276/271/276\nf 277/272/277 278/274/278 280/428/280\nf 278/274/278 281/277/281 280/428/280\nf 279/275/279 278/274/278 276/271/276\nf 276/271/276 278/274/278 277/272/277\nf 273/264/273 272/2747/272 283/265/283\nf 283/265/283 272/2747/272 284/270/284\nf 285/2744/285 265/262/265 271/266/271\nf 285/2744/285 271/266/271 268/273/268\nf 285/2744/285 267/2745/267 266/263/266\nf 285/2744/285 268/273/268 269/2746/269\nf 254/291/254 255/289/255 292/287/292\nf 290/285/290 342/354/342 294/398/294\nf 294/398/294 291/298/291 290/285/290\nf 298/278/298 275/268/275 263/261/263\nf 290/285/290 291/298/291 293/288/293\nf 249/251/249 264/2743/264 266/296/266\nf 267/297/267 269/279/269 253/252/253\nf 308/310/308 314/313/314 315/311/315\nf 312/317/312 317/316/317 313/350/313\nf 308/310/308 309/318/309 314/313/314\nf 314/313/314 310/312/310 315/311/315\nf 317/316/317 311/320/311 313/350/313\nf 306/308/306 304/306/304 323/321/323\nf 309/318/309 308/310/308 332/336/332\nf 315/311/315 310/312/310 318/333/318\nf 305/307/305 307/309/307 319/323/319\nf 307/309/307 315/311/315 319/323/319\nf 320/325/320 403/424/403 321/326/321\nf 323/321/323 304/306/304 302/304/302\nf 324/324/324 319/323/319 349/332/349\nf 403/424/403 320/325/320 432/2748/432\nf 331/344/331 333/337/333 329/339/329\nf 329/340/329 326/334/326 331/343/331\nf 318/333/318 310/312/310 345/346/345\nf 336/319/336 309/318/309 346/348/346\nf 339/201/339 211/214/211 221/219/221\nf 339/201/339 221/219/221 200/186/200\nf 221/219/221 225/187/225 200/186/200\nf 170/2749/170 341/224/341 210/353/210\nf 291/298/291 343/2750/343 344/328/344\nf 310/312/310 334/315/334 345/346/345\nf 309/318/309 332/336/332 346/348/346\nf 330/342/330 318/333/318 345/346/345\nf 346/348/346 332/336/332 330/345/330\nf 347/355/347 327/322/327 323/321/323\nf 322/329/322 384/2751/384 351/2752/351\nf 344/328/344 384/2751/384 322/329/322\nf 359/370/359 361/373/361 360/371/360\nf 363/374/363 367/2753/367 364/375/364\nf 359/370/359 365/376/365 361/373/361\nf 361/373/361 362/372/362 360/371/360\nf 366/377/366 367/2753/367 363/374/363\nf 357/368/357 355/366/355 368/378/368\nf 356/367/356 358/369/358 372/382/372\nf 358/369/358 360/371/360 372/382/372\nf 368/378/368 355/366/355 353/365/353\nf 373/383/373 372/382/372 383/384/383\nf 371/380/371 377/390/377 378/2754/378\nf 378/2755/378 377/394/377 370/385/370\nf 378/2755/378 370/385/370 375/387/375\nf 375/388/375 371/380/371 378/2754/378\nf 371/380/371 362/372/362 379/391/379\nf 366/377/366 365/376/365 380/393/380\nf 367/2753/367 381/392/381 364/375/364\nf 381/395/381 367/2753/367 366/377/366\nf 362/372/362 364/375/364 379/391/379\nf 365/376/365 370/385/370 380/393/380\nf 377/390/377 371/380/371 379/391/379\nf 380/393/380 370/385/370 377/394/377\nf 373/383/373 383/384/383 384/427/384\nf 344/363/344 354/362/354 373/383/373\nf 373/383/373 384/427/384 344/363/344\nf 343/2750/343 294/398/294 385/400/385\nf 291/298/291 294/398/294 343/2750/343\nf 386/399/386 342/354/342 387/294/387\nf 351/405/351 384/2756/384 395/406/395\nf 349/332/349 350/361/350 432/335/432\nf 393/413/393 386/399/386 387/294/387\nf 396/414/396 393/413/393 389/403/389\nf 385/400/385 386/399/386 394/410/394\nf 393/413/393 387/294/387 389/403/389\nf 297/292/297 299/299/299 321/326/321\nf 434/2757/434 391/421/391 433/420/433\nf 400/422/400 398/418/398 397/417/397\nf 397/417/397 399/423/399 400/422/400\nf 368/378/368 385/401/385 394/415/394\nf 401/425/401 399/423/399 397/417/397\nf 268/273/268 270/269/270 402/431/402\nf 408/439/408 409/438/409 410/441/410\nf 412/440/412 413/443/413 414/2758/414\nf 408/439/408 410/441/410 415/444/415\nf 410/441/410 409/438/409 411/442/411\nf 416/445/416 412/440/412 414/2758/414\nf 406/437/406 417/446/417 405/434/405\nf 404/433/404 421/450/421 407/436/407\nf 407/436/407 421/450/421 409/438/409\nf 419/449/419 427/2759/427 426/457/426\nf 427/2760/427 424/452/424 426/461/426\nf 427/2760/427 423/453/423 424/452/424\nf 423/456/423 427/2759/427 419/449/419\nf 419/449/419 428/459/428 411/442/411\nf 416/445/416 429/462/429 415/444/415\nf 413/443/413 430/458/430 414/2758/414\nf 430/460/430 416/445/416 414/2758/414\nf 411/442/411 428/459/428 413/443/413\nf 415/444/415 429/462/429 424/452/424\nf 426/457/426 428/459/428 419/449/419\nf 429/462/429 426/461/426 424/452/424\nf 421/450/421 432/468/432 422/451/422\nf 403/432/403 421/450/421 404/433/404\nf 421/450/421 403/432/403 432/468/432\nf 405/434/405 417/446/417 399/2761/399\nf 417/446/417 433/466/433 399/2761/399\nf 405/434/405 399/2761/399 401/435/401\nf 432/2762/432 350/2763/350 435/2764/435\nf 435/2764/435 434/2757/434 433/420/433\nf 350/2763/350 434/2757/434 435/2764/435\nf 441/478/441 446/485/446 442/479/442\nf 183/172/183 442/479/442 124/2717/124\nf 183/172/183 184/171/184 442/479/442\nf 442/479/442 446/485/446 124/2717/124\nf 588/2765/588 564/594/564 119/2716/119\nf 447/484/447 558/483/558 449/2766/449\nf 449/2766/449 122/486/122 447/484/447\nf 451/488/451 242/490/242 204/491/204\nf 477/524/477 476/523/476 478/2767/478\nf 478/2767/478 480/526/480 481/550/481\nf 478/2767/478 476/523/476 480/526/480\nf 481/550/481 480/526/480 485/2768/485\nf 480/526/480 479/525/479 482/527/482\nf 480/526/480 482/527/482 485/2768/485\nf 482/527/482 519/530/519 485/2768/485\nf 498/522/498 488/532/488 487/531/487\nf 487/531/487 468/513/468 498/522/498\nf 468/513/468 487/531/487 491/536/491\nf 497/541/497 496/540/496 493/537/493\nf 171/160/171 204/190/204 190/161/190\nf 475/521/475 499/543/499 498/522/498\nf 498/522/498 501/553/501 500/2769/500\nf 499/543/499 503/545/503 501/553/501\nf 475/521/475 477/524/477 505/544/505\nf 477/524/477 478/2767/478 505/544/505\nf 478/2767/478 481/550/481 505/544/505\nf 481/550/481 504/2770/504 505/544/505\nf 481/550/481 502/547/502 504/2770/504\nf 504/2770/504 503/545/503 505/544/505\nf 504/2770/504 506/2771/506 512/2772/512\nf 504/2770/504 502/547/502 506/2771/506\nf 506/2771/506 502/547/502 507/546/507\nf 506/2771/506 507/546/507 510/555/510\nf 510/555/510 512/2772/512 506/2771/506\nf 507/546/507 509/549/509 510/555/510\nf 481/550/481 485/2768/485 519/530/519\nf 503/545/503 504/2770/504 511/554/511\nf 504/2770/504 512/2772/512 511/554/511\nf 510/555/510 511/554/511 512/2772/512\nf 514/551/514 513/557/513 537/552/537\nf 500/2769/500 501/553/501 537/552/537\nf 498/522/498 499/543/499 501/553/501\nf 516/2773/516 517/2774/517 519/530/519\nf 517/2774/517 508/548/508 519/530/519\nf 517/2774/517 516/2773/516 518/2775/518\nf 519/530/519 515/556/515 516/2773/516\nf 486/529/486 515/556/515 519/530/519\nf 515/556/515 173/542/173 538/570/538\nf 173/163/173 571/588/571 538/2776/538\nf 508/548/508 517/2774/517 520/559/520\nf 520/559/520 509/549/509 508/548/508\nf 517/2774/517 518/2775/518 520/559/520\nf 520/559/520 510/555/510 509/549/509\nf 518/2775/518 516/2773/516 542/560/542\nf 542/560/542 520/559/520 518/2775/518\nf 526/566/526 473/519/473 472/518/472\nf 532/2777/532 523/563/523 527/2778/527\nf 523/563/523 469/515/469 527/2778/527\nf 534/2779/534 527/2778/527 529/2780/529\nf 529/2780/529 528/514/528 531/567/531\nf 527/2778/527 469/515/469 528/514/528\nf 529/2780/529 531/567/531 533/568/533\nf 530/2781/530 492/535/492 494/538/494\nf 534/2779/534 532/2777/532 527/2778/527\nf 492/535/492 530/2781/530 533/568/533\nf 533/568/533 530/2781/530 529/2780/529\nf 528/514/528 469/515/469 458/503/458\nf 529/2780/529 530/2781/530 534/2779/534\nf 468/513/468 491/536/491 531/567/531\nf 531/567/531 528/514/528 468/513/468\nf 528/514/528 529/2780/529 527/2778/527\nf 535/2782/535 467/512/467 466/511/466\nf 466/511/466 473/519/473 535/2782/535\nf 496/540/496 495/539/495 493/537/493\nf 498/522/498 500/2769/500 536/2783/536\nf 500/2769/500 537/552/537 536/2783/536\nf 513/557/513 536/2783/536 537/552/537\nf 495/539/495 498/522/498 536/2783/536\nf 516/2773/516 515/556/515 541/569/541\nf 541/569/541 542/560/542 516/2773/516\nf 541/569/541 543/573/543 542/560/542\nf 543/573/543 540/572/540 544/2784/544\nf 543/573/543 544/2784/544 545/574/545\nf 542/560/542 543/573/543 545/574/545\nf 592/607/592 548/582/548 549/579/549\nf 549/579/549 551/577/551 550/576/550\nf 552/578/552 443/480/443 445/482/445\nf 552/578/552 551/577/551 553/2785/553\nf 554/2786/554 558/481/558 443/480/443\nf 443/480/443 552/578/552 554/2786/554\nf 557/581/557 553/2785/553 551/577/551\nf 553/2785/553 557/581/557 556/2787/556\nf 554/2786/554 552/578/552 556/2787/556\nf 556/2787/556 552/578/552 553/2785/553\nf 556/2787/556 558/481/558 554/2786/554\nf 558/483/558 556/2788/556 449/2766/449\nf 548/582/548 592/607/592 593/601/593\nf 812/2789/812 813/2790/813 741/2791/741\nf 565/2792/565 450/584/450 188/166/188\nf 564/594/564 448/593/448 119/2716/119\nf 119/2716/119 448/593/448 589/2793/589\nf 119/2716/119 589/2793/589 188/166/188\nf 563/2794/563 565/2792/565 188/166/188\nf 563/2794/563 567/2795/567 587/2796/587\nf 565/2792/565 587/2796/587 566/2797/566\nf 566/2797/566 450/584/450 565/2792/565\nf 587/2796/587 565/2792/565 563/2794/563\nf 569/589/569 571/588/571 573/587/573\nf 568/585/568 570/2798/570 572/586/572\nf 570/2798/570 585/2799/585 572/586/572\nf 572/586/572 583/2800/583 573/587/573\nf 573/587/573 583/2800/583 569/589/569\nf 576/2801/576 579/2802/579 575/2803/575\nf 571/588/571 569/589/569 574/2804/574\nf 579/2802/579 539/571/539 575/2803/575\nf 539/571/539 538/570/538 575/2803/575\nf 575/2803/575 538/570/538 576/2801/576\nf 576/2805/576 574/2804/574 577/592/577\nf 577/592/577 574/2804/574 569/589/569\nf 538/2776/538 574/2804/574 576/2805/576\nf 574/2804/574 538/2776/538 571/588/571\nf 576/2801/576 582/2806/582 579/2802/579\nf 586/591/586 581/2807/581 580/2808/580\nf 578/590/578 581/2807/581 586/591/586\nf 576/2801/576 580/639/580 582/2806/582\nf 580/2808/580 576/2805/576 577/592/577\nf 569/589/569 584/2809/584 578/590/578\nf 578/590/578 584/2809/584 570/2798/570\nf 569/589/569 583/2800/583 584/2809/584\nf 583/2800/583 572/586/572 585/2799/585\nf 570/2798/570 584/2809/584 585/2799/585\nf 585/2799/585 584/2809/584 583/2800/583\nf 580/2808/580 577/592/577 586/591/586\nf 570/2798/570 568/585/568 450/584/450\nf 450/584/450 566/2797/566 607/2810/607\nf 566/2797/566 587/2796/587 607/2810/607\nf 607/2810/607 570/2798/570 450/584/450\nf 607/2810/607 578/590/578 570/2798/570\nf 587/2796/587 567/2795/567 590/596/590\nf 567/2795/567 448/593/448 590/596/590\nf 119/2716/119 122/486/122 588/2765/588\nf 448/593/448 567/2795/567 589/2793/589\nf 589/2793/589 567/2795/567 563/2794/563\nf 589/2793/589 563/2794/563 188/166/188\nf 122/486/122 449/2766/449 588/2765/588\nf 564/594/564 588/2765/588 591/595/591\nf 449/2766/449 556/2788/556 588/2765/588\nf 549/579/549 550/576/550 592/607/592\nf 550/576/550 602/2811/602 592/607/592\nf 602/2811/602 601/606/601 594/605/594\nf 745/771/745 595/600/595 744/599/744\nf 596/770/596 636/657/636 597/2812/597\nf 598/602/598 594/605/594 599/603/599\nf 548/582/548 593/601/593 600/583/600\nf 596/770/596 559/604/559 601/606/601\nf 559/604/559 596/770/596 638/655/638\nf 602/2811/602 594/605/594 592/607/592\nf 607/2810/607 587/2796/587 590/596/590\nf 607/623/607 590/612/590 604/611/604\nf 638/655/638 597/2812/597 637/656/637\nf 637/656/637 597/2812/597 636/657/636\nf 604/611/604 993/620/993 607/623/607\nf 605/610/605 606/659/606 609/2813/609\nf 604/611/604 605/610/605 608/1000/608\nf 578/2814/578 607/2815/607 610/641/610\nf 610/641/610 581/640/581 578/2814/578\nf 610/622/610 994/621/994 995/624/995\nf 609/2813/609 897/876/897 613/875/613\nf 996/2816/996 621/2817/621 611/1001/611\nf 611/1001/611 621/2817/621 614/2818/614\nf 609/2813/609 613/875/613 996/2816/996\nf 609/2813/609 608/1000/608 605/610/605\nf 642/1002/642 650/2819/650 619/627/619\nf 619/627/619 616/2820/616 620/628/620\nf 613/875/613 615/874/615 621/2817/621\nf 621/2817/621 615/874/615 622/2821/622\nf 614/2818/614 621/2817/621 622/2821/622\nf 614/2818/614 642/1002/642 611/1001/611\nf 619/627/619 995/624/995 642/1002/642\nf 616/2822/616 645/2823/645 643/632/643\nf 650/2819/650 642/1002/642 645/2824/645\nf 617/642/617 618/630/618 648/629/648\nf 620/631/620 616/2822/616 643/632/643\nf 628/636/628 625/634/625 627/633/627\nf 624/635/624 626/637/626 540/572/540\nf 626/637/626 545/574/545 544/2784/544\nf 626/637/626 544/2784/544 540/572/540\nf 624/635/624 540/572/540 539/571/539\nf 539/571/539 579/2802/579 624/635/624\nf 579/2802/579 582/2806/582 624/635/624\nf 545/574/545 626/637/626 627/633/627\nf 624/635/624 582/2806/582 580/639/580\nf 591/595/591 588/2765/588 556/2788/556\nf 630/646/630 632/649/632 634/651/634\nf 603/654/603 560/650/560 635/652/635\nf 936/1182/936 612/2825/612 606/659/606\nf 596/770/596 597/2812/597 638/655/638\nf 630/646/630 560/650/560 603/654/603\nf 614/2818/614 622/2821/622 640/2826/640\nf 622/2821/622 651/2827/651 640/2826/640\nf 622/2821/622 615/874/615 651/2827/651\nf 614/2818/614 639/2828/639 642/1002/642\nf 639/2828/639 645/2824/645 642/1002/642\nf 614/2818/614 640/2826/640 641/2829/641\nf 639/2830/639 644/660/644 645/2823/645\nf 644/660/644 643/632/643 645/2823/645\nf 623/2831/623 643/632/643 646/662/646\nf 643/632/643 623/2831/623 648/629/648\nf 625/2832/625 628/643/628 617/642/617\nf 648/629/648 623/2831/623 625/2832/625\nf 617/642/617 648/629/648 625/2832/625\nf 645/2824/645 616/2820/616 650/2819/650\nf 650/2819/650 616/2820/616 619/627/619\nf 614/2818/614 641/2829/641 639/2828/639\nf 644/2833/644 639/2834/639 653/674/653\nf 644/2833/644 653/674/653 673/673/673\nf 653/671/653 654/670/654 656/678/656\nf 665/683/665 659/2835/659 660/684/660\nf 661/685/661 659/2835/659 665/686/665\nf 661/685/661 669/691/669 659/2835/659\nf 669/691/669 660/684/660 659/2835/659\nf 671/693/671 670/692/670 669/691/669\nf 668/690/668 666/689/666 674/694/674\nf 673/673/673 676/698/676 644/2833/644\nf 672/688/672 674/694/674 677/696/677\nf 672/688/672 677/696/677 678/697/678\nf 729/2836/729 730/2837/730 771/2838/771\nf 680/701/680 679/700/679 684/738/684\nf 679/700/679 710/730/710 684/738/684\nf 690/714/690 703/723/703 698/715/698\nf 705/2839/705 702/2840/702 704/2841/704\nf 705/2839/705 706/2842/706 682/902/682\nf 692/2843/692 694/2844/694 695/2845/695\nf 681/705/681 699/710/699 696/718/696\nf 699/710/699 688/720/688 696/718/696\nf 696/718/696 694/717/694 692/782/692\nf 688/720/688 691/722/691 701/721/701\nf 701/721/701 691/722/691 703/723/703\nf 703/723/703 691/722/691 698/715/698\nf 704/724/704 703/723/703 689/712/689\nf 706/2842/706 705/2839/705 704/2841/704\nf 694/2844/694 693/2846/693 709/2847/709\nf 704/724/704 689/712/689 706/725/706\nf 708/727/708 695/2845/695 694/2844/694\nf 693/2846/693 750/729/750 709/2847/709\nf 694/2844/694 749/728/749 708/727/708\nf 689/712/689 690/714/690 711/713/711\nf 720/740/720 716/734/716 714/733/714\nf 718/742/718 713/732/713 712/731/712\nf 690/714/690 689/712/689 703/723/703\nf 718/741/718 720/740/720 724/749/724\nf 724/749/724 725/748/725 728/2848/728\nf 725/748/725 726/750/726 728/2848/728\nf 726/750/726 727/747/727 728/2848/728\nf 727/747/727 724/746/724 728/2848/728\nf 730/781/730 678/2849/678 677/778/677\nf 676/755/676 678/762/678 732/756/732\nf 730/763/730 729/758/729 734/761/734\nf 737/764/737 735/2850/735 736/765/736\nf 738/766/738 735/2850/735 739/767/739\nf 739/767/739 735/2850/735 737/764/737\nf 609/2813/609 606/659/606 612/2825/612\nf 629/647/629 742/769/742 741/2791/741\nf 813/2790/813 746/2851/746 741/2791/741\nf 741/2791/741 740/768/740 562/2852/562\nf 629/647/629 630/646/630 742/769/742\nf 742/769/742 740/768/740 741/2791/741\nf 742/769/742 630/646/630 743/598/743\nf 743/598/743 630/646/630 603/654/603\nf 744/599/744 636/657/636 596/770/596\nf 601/606/601 602/2811/602 745/771/745\nf 741/2791/741 562/2852/562 812/2789/812\nf 746/2851/746 629/647/629 741/2791/741\nf 813/2853/813 747/2854/747 748/2855/748\nf 748/2856/748 746/2851/746 813/2790/813\nf 629/647/629 746/2851/746 748/2856/748\nf 694/2844/694 709/2847/709 749/728/749\nf 749/728/749 709/2847/709 750/729/750\nf 693/2846/693 704/2841/704 750/729/750\nf 693/716/693 697/719/697 704/724/704\nf 704/2841/704 702/2840/702 750/729/750\nf 702/2840/702 707/726/707 750/729/750\nf 695/2845/695 708/727/708 751/2857/751\nf 751/2857/751 753/2858/753 754/788/754\nf 753/2858/753 755/2859/755 754/788/754\nf 788/2860/788 776/790/776 787/789/787\nf 751/2857/751 752/773/752 753/2858/753\nf 753/2858/753 752/773/752 758/784/758\nf 752/773/752 757/772/757 758/784/758\nf 752/773/752 707/726/707 759/774/759\nf 758/784/758 757/772/757 760/776/760\nf 755/2859/755 753/2858/753 763/783/763\nf 753/2858/753 758/784/758 763/783/763\nf 763/783/763 774/803/774 764/2861/764\nf 759/774/759 707/726/707 765/2862/765\nf 765/2862/765 707/726/707 702/2840/702\nf 702/2840/702 705/2839/705 766/2863/766\nf 765/2862/765 702/2840/702 766/2863/766\nf 705/2839/705 765/2862/765 766/2863/766\nf 765/2862/765 761/775/761 759/774/759\nf 771/2838/771 730/2837/730 920/2864/920\nf 924/917/924 769/904/769 768/903/768\nf 767/702/767 680/701/680 771/2838/771\nf 771/753/771 680/706/680 681/705/681\nf 692/782/692 700/2865/700 772/751/772\nf 772/751/772 700/2865/700 729/752/729\nf 708/727/708 707/726/707 751/2857/751\nf 707/726/707 752/773/752 751/2857/751\nf 763/783/763 799/804/799 774/803/774\nf 775/786/775 773/785/773 762/777/762\nf 763/783/763 775/786/775 799/804/799\nf 776/790/776 780/2866/780 777/787/777\nf 764/2861/764 788/2860/788 787/789/787\nf 788/2860/788 764/2861/764 778/2867/778\nf 764/2861/764 774/803/774 778/2867/778\nf 764/2861/764 755/2859/755 763/783/763\nf 788/2860/788 778/2867/778 805/2868/805\nf 805/2868/805 776/790/776 788/2860/788\nf 804/2869/804 780/2866/780 805/2868/805\nf 780/2866/780 776/790/776 805/2868/805\nf 782/792/782 756/791/756 780/2866/780\nf 780/2866/780 756/791/756 777/787/777\nf 782/792/782 803/2870/803 784/793/784\nf 785/2871/785 782/792/782 781/800/781\nf 785/2871/785 781/800/781 802/2872/802\nf 754/788/754 755/2859/755 787/789/787\nf 787/789/787 755/2859/755 764/2861/764\nf 761/775/761 795/2873/795 789/2874/789\nf 762/777/762 789/2874/789 790/2875/790\nf 775/786/775 762/777/762 798/2876/798\nf 790/2875/790 789/2874/789 791/795/791\nf 761/775/761 765/2862/765 792/2877/792\nf 789/2874/789 762/777/762 761/775/761\nf 761/775/761 792/2877/792 795/2873/795\nf 762/777/762 790/2875/790 798/2876/798\nf 798/2876/798 799/804/799 775/786/775\nf 790/2875/790 793/2878/793 798/2876/798\nf 790/2875/790 791/795/791 793/2878/793\nf 795/2873/795 796/2879/796 789/2874/789\nf 795/2873/795 792/2877/792 796/2879/796\nf 796/2879/796 792/2877/792 794/796/794\nf 796/2879/796 794/796/794 797/2880/797\nf 797/2880/797 789/2874/789 796/2879/796\nf 794/796/794 791/795/791 797/2880/797\nf 797/2880/797 791/795/791 789/2874/789\nf 792/2877/792 765/2862/765 826/2881/826\nf 798/2876/798 793/2878/793 799/804/799\nf 802/2872/802 803/2870/803 785/2871/785\nf 803/2870/803 802/2872/802 784/793/784\nf 804/2869/804 805/2868/805 806/802/806\nf 780/2866/780 779/801/779 781/800/781\nf 804/2869/804 779/801/779 780/2866/780\nf 780/2866/780 781/800/781 782/792/782\nf 779/801/779 804/2869/804 806/802/806\nf 806/802/806 805/2868/805 778/2867/778\nf 800/798/800 793/2878/793 791/795/791\nf 799/804/799 793/2878/793 810/805/810\nf 793/2878/793 800/798/800 810/805/810\nf 809/806/809 806/802/806 778/2867/778\nf 811/807/811 812/1227/812 1196/1224/1196\nf 813/2853/813 811/807/811 815/2882/815\nf 808/809/808 814/811/814 815/2882/815\nf 815/2882/815 814/811/814 816/1004/816\nf 815/2882/815 816/1004/816 817/2883/817\nf 747/2854/747 813/2853/813 815/2882/815\nf 747/2854/747 815/2882/815 818/2884/818\nf 815/2882/815 817/2883/817 818/2884/818\nf 818/2884/818 748/2855/748 747/2854/747\nf 820/812/820 819/810/819 821/2885/821\nf 821/2885/821 819/810/819 800/798/800\nf 800/798/800 801/797/801 821/2885/821\nf 822/814/822 820/812/820 821/2885/821\nf 821/2885/821 801/797/801 822/814/822\nf 765/2862/765 705/2839/705 826/2881/826\nf 705/2839/705 823/2886/823 826/2881/826\nf 824/1020/824 823/2886/823 828/900/828\nf 828/900/828 825/834/825 824/1020/824\nf 833/2887/833 823/2886/823 836/1023/836\nf 825/834/825 828/900/828 914/872/914\nf 823/2886/823 827/901/827 828/900/828\nf 827/901/827 823/2886/823 705/2839/705\nf 826/2881/826 830/813/830 829/815/829\nf 829/815/829 801/797/801 794/796/794\nf 792/2877/792 826/2881/826 829/815/829\nf 829/815/829 794/796/794 792/2877/792\nf 830/813/830 826/2881/826 831/2888/831\nf 830/813/830 831/2888/831 837/1008/837\nf 831/2888/831 833/2887/833 837/1008/837\nf 837/1008/837 833/2887/833 834/2889/834\nf 832/1009/832 834/2889/834 835/1022/835\nf 835/1022/835 834/2889/834 836/1023/836\nf 823/2886/823 824/1020/824 836/1023/836\nf 836/1023/836 834/2889/834 833/2887/833\nf 834/2889/834 832/1009/832 837/1008/837\nf 831/2888/831 826/2881/826 833/2887/833\nf 833/2887/833 826/2881/826 823/2886/823\nf 824/1020/824 825/834/825 863/833/863\nf 841/818/841 838/817/838 843/835/843\nf 824/1020/824 863/833/863 1024/2890/1024\nf 865/1011/865 844/836/844 864/838/864\nf 862/837/862 842/822/842 845/828/845\nf 846/926/846 867/2891/867 862/837/862\nf 862/837/862 845/828/845 846/926/846\nf 851/826/851 873/831/873 852/827/852\nf 849/823/849 851/826/851 852/827/852\nf 858/2892/858 855/840/855 874/2893/874\nf 857/839/857 856/843/856 873/831/873\nf 859/824/859 861/870/861 926/2894/926\nf 859/824/859 848/820/848 861/870/861\nf 838/817/838 842/822/842 843/835/843\nf 843/835/843 842/822/842 862/837/862\nf 867/2891/867 864/838/864 862/837/862\nf 927/871/927 839/816/839 840/819/840\nf 840/819/840 913/873/913 927/871/927\nf 864/838/864 818/2884/818 865/1011/865\nf 865/1011/865 818/2884/818 817/2883/817\nf 748/2855/748 818/2884/818 866/2895/866\nf 629/2896/629 748/2855/748 866/2895/866\nf 866/2897/866 633/653/633 631/648/631\nf 631/648/631 629/647/629 866/2897/866\nf 866/2895/866 867/2891/867 932/919/932\nf 855/840/855 858/2892/858 883/841/883\nf 858/2892/858 882/855/882 883/841/883\nf 873/831/873 872/949/872 869/845/869\nf 872/949/872 856/843/856 1380/844/1380\nf 856/843/856 872/949/872 873/831/873\nf 873/831/873 851/826/851 857/839/857\nf 855/840/855 850/825/850 874/2893/874\nf 874/2893/874 850/825/850 860/864/860\nf 946/856/946 868/850/868 875/869/875\nf 946/856/946 875/869/875 949/957/949\nf 877/849/877 875/869/875 868/850/868\nf 882/855/882 858/2892/858 885/861/885\nf 885/861/885 881/847/881 882/855/882\nf 946/856/946 1380/844/1380 884/842/884\nf 858/2892/858 887/857/887 885/861/885\nf 874/2893/874 886/858/886 887/857/887\nf 887/857/887 858/2892/858 874/2893/874\nf 860/864/860 926/2894/926 888/865/888\nf 896/863/896 874/2893/874 860/864/860\nf 896/863/896 886/858/886 874/2893/874\nf 897/876/897 899/2898/899 901/878/901\nf 898/881/898 900/2899/900 903/882/903\nf 900/2899/900 919/884/919 903/882/903\nf 902/883/902 651/2900/651 615/880/615\nf 651/2900/651 902/883/902 906/2901/906\nf 902/883/902 907/887/907 906/2901/906\nf 906/2901/906 904/2902/904 651/2900/651\nf 904/888/904 652/668/652 651/667/651\nf 906/2901/906 907/887/907 911/894/911\nf 911/895/911 909/893/909 906/892/906\nf 919/884/919 900/2899/900 912/2903/912\nf 927/871/927 913/873/913 916/897/916\nf 915/915/915 768/903/768 912/907/912\nf 827/901/827 705/2839/705 682/902/682\nf 915/896/915 914/872/914 682/902/682\nf 769/904/769 770/2904/770 918/2905/918\nf 770/2904/770 921/779/921 923/910/923\nf 918/2905/918 770/2904/770 923/910/923\nf 767/916/767 920/2906/920 922/780/922\nf 920/2864/920 767/702/767 771/2838/771\nf 921/779/921 925/2907/925 922/780/922\nf 922/780/922 925/2907/925 767/916/767\nf 923/913/923 917/906/917 918/905/918\nf 922/780/922 920/2906/920 730/781/730\nf 770/2904/770 769/904/769 925/2907/925\nf 925/2907/925 769/904/769 924/917/924\nf 925/2907/925 924/917/924 767/916/767\nf 921/779/921 770/2904/770 925/2907/925\nf 900/899/900 901/934/901 928/933/928\nf 928/933/928 927/871/927 916/897/916\nf 928/933/928 916/897/916 900/899/900\nf 899/2898/899 897/876/897 612/2825/612\nf 899/2898/899 612/2825/612 929/2908/929\nf 612/2825/612 936/1182/936 929/2908/929\nf 609/2813/609 612/2825/612 897/876/897\nf 634/2909/634 633/918/633 930/617/930\nf 635/616/635 634/2909/634 930/617/930\nf 932/919/932 867/2891/867 931/920/931\nf 867/2891/867 846/926/846 931/920/931\nf 932/919/932 633/918/633 866/2895/866\nf 811/807/811 813/2853/813 812/1227/812\nf 854/829/854 953/924/953 934/921/934\nf 937/925/937 931/920/931 846/926/846\nf 853/830/853 935/922/935 937/925/937\nf 936/618/936 937/925/937 929/2910/929\nf 933/923/933 955/951/955 953/924/953\nf 888/865/888 926/2894/926 939/931/939\nf 926/2894/926 861/870/861 939/931/939\nf 933/923/933 871/832/871 870/846/870\nf 889/862/889 940/935/940 943/2911/943\nf 891/860/891 890/859/890 940/935/940\nf 889/862/889 891/860/891 940/935/940\nf 894/868/894 889/862/889 943/2911/943\nf 893/867/893 894/868/894 942/936/942\nf 894/868/894 943/2911/943 942/936/942\nf 946/856/946 1379/1448/1379 1380/844/1380\nf 1379/1448/1379 946/856/946 949/957/949\nf 945/943/945 943/942/943 940/953/940\nf 952/946/952 945/943/945 951/950/951\nf 944/940/944 945/943/945 952/946/952\nf 955/951/955 933/923/933 956/952/956\nf 956/952/956 933/923/933 870/846/870\nf 935/922/935 899/956/899 929/2910/929\nf 929/2910/929 937/925/937 935/922/935\nf 935/922/935 934/921/934 899/956/899\nf 875/869/875 880/854/880 957/958/957\nf 957/958/957 961/961/961 962/964/962\nf 1115/969/1115 960/962/960 1153/974/1153\nf 1078/968/1078 961/961/961 1114/970/1114\nf 965/971/965 962/964/962 1077/967/1077\nf 973/981/973 976/991/976 977/982/977\nf 973/981/973 974/992/974 976/991/976\nf 976/991/976 975/988/975 977/982/977\nf 968/976/968 970/978/970 981/985/981\nf 970/978/970 972/980/972 981/985/981\nf 969/977/969 967/975/967 1028/1024/1028\nf 971/979/971 969/977/969 1028/1024/1028\nf 988/999/988 1052/998/1052 991/2912/991\nf 988/999/988 991/2912/991 992/941/992\nf 1187/1090/1187 990/1089/990 991/2913/991\nf 1052/998/1052 1187/1085/1187 991/2912/991\nf 991/2913/991 990/1089/990 989/2914/989\nf 991/2912/991 989/2915/989 992/941/992\nf 604/611/604 608/1000/608 993/620/993\nf 611/1001/611 608/1000/608 996/2816/996\nf 996/2816/996 608/1000/608 609/2813/609\nf 996/2816/996 613/875/613 621/2817/621\nf 997/1005/997 998/2916/998 1000/1003/1000\nf 1000/1003/1000 817/2883/817 816/1004/816\nf 814/811/814 820/812/820 997/1005/997\nf 998/2916/998 999/1017/999 1000/1003/1000\nf 1000/1003/1000 999/1017/999 817/2883/817\nf 999/1017/999 865/1011/865 817/2883/817\nf 1002/2917/1002 844/836/844 1003/1010/1003\nf 1004/2918/1004 1011/2919/1011 1005/2920/1005\nf 1011/2919/1011 1001/2921/1001 1005/2920/1005\nf 1004/2918/1004 1005/2920/1005 1008/2922/1008\nf 1005/2920/1005 1006/2923/1006 1008/2922/1008\nf 1006/2923/1006 1022/1015/1022 1008/2922/1008\nf 1022/1015/1022 1007/1014/1007 1008/2922/1008\nf 1008/2922/1008 1009/1007/1009 1004/2918/1004\nf 1008/2922/1008 1007/1014/1007 1009/1007/1009\nf 1004/2918/1004 1010/1006/1010 1011/2919/1011\nf 1004/2918/1004 1009/1007/1009 1010/1006/1010\nf 1009/1007/1009 1007/1014/1007 822/814/822\nf 1010/1006/1010 832/1009/832 1011/2919/1011\nf 1001/2921/1001 1011/2919/1011 1012/1021/1012\nf 1012/1021/1012 1011/2919/1011 835/1022/835\nf 832/1009/832 835/1022/835 1011/2919/1011\nf 1023/1019/1023 1019/1018/1019 1020/2924/1020\nf 1003/1010/1003 1013/1012/1013 1014/2925/1014\nf 1001/2921/1001 1003/1010/1003 1014/2925/1014\nf 1003/1010/1003 1001/2921/1001 1002/2917/1002\nf 1014/2925/1014 1006/2923/1006 1001/2921/1001\nf 1006/2923/1006 1005/2920/1005 1001/2921/1001\nf 1014/2925/1014 1013/1012/1013 1006/2923/1006\nf 1006/2923/1006 1021/2926/1021 1022/1015/1022\nf 1022/1015/1022 998/2916/998 997/1005/997\nf 1022/1015/1022 997/1005/997 1015/1016/1015\nf 997/1005/997 820/812/820 1015/1016/1015\nf 822/814/822 1007/1014/1007 1016/1013/1016\nf 1016/1013/1016 1017/2927/1017 1018/2928/1018\nf 1016/1013/1016 1015/1016/1015 1017/2927/1017\nf 1015/1016/1015 820/812/820 1017/2927/1017\nf 1017/2927/1017 820/812/820 1018/2928/1018\nf 820/812/820 822/814/822 1018/2928/1018\nf 1018/2928/1018 822/814/822 1016/1013/1016\nf 1019/1018/1019 999/1017/999 998/2916/998\nf 1019/1018/1019 998/2916/998 1021/2926/1021\nf 1021/2926/1021 998/2916/998 1022/1015/1022\nf 1023/1019/1023 1013/1012/1013 865/1011/865\nf 1020/2924/1020 1019/1018/1019 1021/2926/1021\nf 1023/1019/1023 1020/2924/1020 1013/1012/1013\nf 1013/1012/1013 1020/2924/1020 1006/2923/1006\nf 1006/2923/1006 1020/2924/1020 1021/2926/1021\nf 844/836/844 1002/2917/1002 1024/2890/1024\nf 1001/2921/1001 1012/1021/1012 1024/2890/1024\nf 1024/2890/1024 1012/1021/1012 824/1020/824\nf 1024/2890/1024 1002/2917/1002 1001/2921/1001\nf 844/836/844 1024/2890/1024 863/833/863\nf 811/807/811 808/809/808 815/2882/815\nf 926/2894/926 860/864/860 859/824/859\nf 860/864/860 850/825/850 859/824/859\nf 1026/1026/1026 984/993/984 974/992/974\nf 985/994/985 982/989/982 975/988/975\nf 1026/1026/1026 1032/1031/1032 1034/2929/1034\nf 984/993/984 1026/1026/1026 1034/2929/1034\nf 984/993/984 1034/2929/1034 1036/996/1036\nf 1035/997/1035 1033/2930/1033 985/994/985\nf 1033/2930/1033 1029/1028/1029 982/989/982\nf 982/989/982 985/994/985 1033/2930/1033\nf 987/995/987 1036/996/1036 1040/2931/1040\nf 1035/997/1035 987/995/987 1040/2931/1040\nf 1036/1039/1036 1035/1038/1035 1040/2932/1040\nf 1047/1052/1047 1049/1058/1049 1048/1053/1048\nf 1047/1052/1047 1050/1059/1050 1049/1058/1049\nf 1049/1058/1049 1051/1055/1051 1048/1053/1048\nf 1044/1049/1044 1046/1051/1046 1053/1054/1053\nf 1046/1051/1046 1048/1053/1048 1053/1054/1053\nf 1045/1050/1045 1043/1048/1043 1061/1065/1061\nf 1047/1052/1047 1045/1050/1045 1061/1065/1061\nf 1062/1066/1062 1056/1060/1056 1050/1059/1050\nf 1057/1061/1057 1054/1056/1054 1051/1055/1051\nf 1062/1066/1062 1064/1071/1064 1066/2933/1066\nf 1056/1060/1056 1062/1066/1062 1068/2934/1068\nf 1056/1060/1056 1068/2934/1068 1059/1063/1059\nf 1060/1064/1060 1067/2935/1067 1057/1061/1057\nf 1054/1056/1054 1067/2935/1067 1065/2936/1065\nf 1065/2936/1065 1063/1068/1063 1054/1056/1054\nf 1054/1056/1054 1057/1061/1057 1067/2935/1067\nf 1062/1066/1062 1066/2933/1066 1068/2934/1068\nf 1058/1062/1058 1059/1063/1059 1072/2937/1072\nf 1060/1064/1060 1058/1062/1058 1072/2937/1072\nf 1059/1081/1059 1060/1080/1060 1072/2938/1072\nf 989/2914/989 990/1089/990 1074/1088/1074\nf 1085/1099/1085 1087/1107/1087 1086/1100/1086\nf 1085/1099/1085 1088/1108/1088 1087/1107/1087\nf 1087/1107/1087 1089/1104/1089 1086/1100/1086\nf 1080/1094/1080 1082/1096/1082 1091/1101/1091\nf 1082/1096/1082 1084/1098/1084 1091/1101/1091\nf 1081/1095/1081 1079/1093/1079 1100/1114/1100\nf 1083/1097/1083 1081/1095/1081 1100/1114/1100\nf 1102/1116/1102 1095/1109/1095 1088/1108/1088\nf 1096/1110/1096 1093/1105/1093 1089/1104/1089\nf 1102/1116/1102 1107/1121/1107 1109/2939/1109\nf 1095/1109/1095 1102/1116/1102 1109/2939/1109\nf 1095/1109/1095 1109/2939/1109 1098/1112/1098\nf 1099/1113/1099 1108/2940/1108 1096/1110/1096\nf 1108/2940/1108 1104/1118/1104 1093/1105/1093\nf 1093/1105/1093 1096/1110/1096 1108/2940/1108\nf 1097/1111/1097 1098/1112/1098 1113/2941/1113\nf 1099/1113/1099 1097/1111/1097 1113/2941/1113\nf 1098/1129/1098 1099/1128/1099 1113/2942/1113\nf 1090/1102/1090 1112/1045/1112 1027/1027/1027\nf 1122/1142/1122 1124/1150/1124 1123/1143/1123\nf 1122/1142/1122 1125/1151/1125 1124/1150/1124\nf 1124/1150/1124 1126/1147/1126 1123/1143/1123\nf 1117/1137/1117 1119/1139/1119 1128/1144/1128\nf 1119/1139/1119 1121/1141/1121 1128/1144/1128\nf 1134/2943/1134 1131/1149/1131 1132/1152/1132\nf 1133/1153/1133 1131/1149/1131 1134/2943/1134\nf 1118/1138/1118 1116/1136/1116 1135/1154/1135\nf 1120/1140/1120 1118/1138/1118 1135/1154/1135\nf 1137/1156/1137 1132/1152/1132 1125/1151/1125\nf 1133/1153/1133 1130/1148/1130 1126/1147/1126\nf 1144/1167/1144 1143/1166/1143 1134/2944/1134\nf 1137/1156/1137 1142/1161/1142 1144/2945/1144\nf 1132/1152/1132 1137/1156/1137 1144/2945/1144\nf 1132/1152/1132 1144/2945/1144 1134/2943/1134\nf 1134/2943/1134 1143/2946/1143 1133/1153/1133\nf 1143/2946/1143 1139/1158/1139 1130/1148/1130\nf 1130/1148/1130 1133/1153/1133 1143/2946/1143\nf 1127/1145/1127 1148/1134/1148 1103/1117/1103\nf 1186/1217/1186 1150/1175/1150 1074/1178/1074\nf 992/941/992 989/2915/989 1151/938/1151\nf 989/1177/989 1149/1176/1149 1151/2947/1151\nf 880/854/880 892/853/892 1152/965/1152\nf 144/136/144 147/183/147 199/182/199\nf 222/216/222 258/218/258 256/290/256\nf 264/2743/264 248/234/248 237/232/237\nf 229/226/229 341/224/341 170/2749/170\nf 128/127/128 131/143/131 156/2726/156\nf 112/115/112 120/129/120 127/126/127\nf 864/838/864 867/2891/867 818/2884/818\nf 867/2891/867 866/2895/866 818/2884/818\nf 1161/1189/1161 1163/1197/1163 1162/1190/1162\nf 1161/1189/1161 1164/1198/1164 1163/1197/1163\nf 1163/1197/1163 1165/1194/1165 1162/1190/1162\nf 1156/1184/1156 1158/1186/1158 1167/1191/1167\nf 1158/1186/1158 1160/1188/1160 1167/1191/1167\nf 1173/2948/1173 1170/1196/1170 1171/1199/1171\nf 1172/1200/1172 1170/1196/1170 1173/2948/1173\nf 1157/1185/1157 1155/1183/1155 1174/1201/1174\nf 1159/1187/1159 1157/1185/1157 1174/1201/1174\nf 1176/1203/1176 1171/1199/1171 1164/1198/1164\nf 1172/1200/1172 1169/1195/1169 1165/1194/1165\nf 1183/1214/1183 1182/1213/1182 1173/2949/1173\nf 1176/1203/1176 1181/1208/1181 1183/2950/1183\nf 1171/1199/1171 1176/1203/1176 1183/2950/1183\nf 1171/1199/1171 1183/2950/1183 1173/2948/1173\nf 1173/2948/1173 1182/2951/1182 1172/1200/1172\nf 1182/2951/1182 1178/1205/1178 1169/1195/1169\nf 1169/1195/1169 1172/1200/1172 1182/2951/1182\nf 1166/1192/1166 1147/1173/1147 1138/1157/1138\nf 1177/1204/1177 1154/973/1154 964/966/964\nf 1071/2952/1071 1075/1092/1075 1076/1087/1076\nf 1071/2952/1071 1076/1087/1076 1187/1090/1187\nf 1042/983/1042 958/959/958 963/963/963\nf 1189/1221/1189 1188/1231/1188 1197/1222/1197\nf 1195/1223/1195 1192/1226/1192 1191/1232/1191\nf 812/1227/812 1190/1225/1190 1196/1224/1196\nf 562/1228/562 1191/1232/1191 1192/1226/1192\nf 1196/1224/1196 807/808/807 811/807/811\nf 1188/1231/1188 1198/1269/1198 1197/1222/1197\nf 1188/1231/1188 1193/1230/1193 1198/1269/1198\nf 786/799/786 806/802/806 1199/2953/1199\nf 1199/2954/1199 1197/2955/1197 1275/1309/1275\nf 1203/1308/1203 786/2956/786 1199/2954/1199\nf 1199/2954/1199 1275/1309/1275 1203/1308/1203\nf 809/806/809 1197/1222/1197 1199/2953/1199\nf 1199/2953/1199 806/802/806 809/806/809\nf 1202/1237/1202 1201/1240/1201 1205/1243/1205\nf 784/2957/784 802/2958/802 1210/2959/1210\nf 1215/1260/1215 1214/1253/1214 1223/1252/1223\nf 1210/2960/1210 1211/1263/1211 784/1251/784\nf 782/792/782 785/2871/785 803/2870/803\nf 1212/1264/1212 1217/1257/1217 1215/1260/1215\nf 1213/2961/1213 1216/1258/1216 1217/1257/1217\nf 1217/1257/1217 1212/1264/1212 1213/2961/1213\nf 784/1251/784 1211/1263/1211 1223/1252/1223\nf 1201/1240/1201 1320/2962/1320 1225/1265/1225\nf 1224/2963/1224 1220/1262/1220 1225/1265/1225\nf 1225/1265/1225 1220/1262/1220 1221/1261/1221\nf 1225/1265/1225 1221/1261/1221 1222/1259/1222\nf 1225/1265/1225 1222/1259/1222 1226/1266/1226\nf 1226/1266/1226 1222/1259/1222 1219/1256/1219\nf 1226/1266/1226 1219/1256/1219 1218/1255/1218\nf 1209/1245/1209 1208/1244/1208 1227/2964/1227\nf 1213/1249/1213 1209/1245/1209 1227/2964/1227\nf 1216/1258/1216 1213/2961/1213 1227/2964/1227\nf 1218/1255/1218 1216/1258/1216 1227/2964/1227\nf 1208/1244/1208 1218/1255/1218 1227/2964/1227\nf 1331/1234/1331 1200/1233/1200 1220/1370/1220\nf 1229/1280/1229 1237/1279/1237 1231/1273/1231\nf 1229/1280/1229 1231/1273/1231 1249/1289/1249\nf 1231/1273/1231 1248/1272/1248 1249/1289/1249\nf 1233/1270/1233 1247/1290/1247 1250/1271/1250\nf 1232/1276/1232 1251/1288/1251 1252/1277/1252\nf 1247/1290/1247 1245/1317/1245 1243/1316/1243\nf 1237/1279/1237 1233/1270/1233 1231/1273/1231\nf 1254/1291/1254 1240/1392/1240 1241/1285/1241\nf 1242/1284/1242 1234/1287/1234 1257/1322/1257\nf 1243/1316/1243 1234/1287/1234 1247/1290/1247\nf 1234/1287/1234 1243/1316/1243 1257/1322/1257\nf 1269/1301/1269 34/34/34 43/43/43\nf 1201/1240/1201 1204/1239/1204 1320/2962/1320\nf 1320/2962/1320 1224/2963/1224 1225/1265/1225\nf 1304/1313/1304 1249/1289/1249 1236/1275/1236\nf 1273/1305/1273 1272/1304/1272 1277/1312/1277\nf 1257/1322/1257 1244/1315/1244 1285/1327/1285\nf 1243/1316/1243 1244/1315/1244 1257/1322/1257\nf 1262/33/1262 1263/1297/1263 1291/1328/1291\nf 1262/33/1262 1291/1328/1291 1281/2702/1281\nf 1278/1319/1278 1280/53/1280 1281/2702/1281\nf 1285/1327/1285 1284/1321/1284 1257/1322/1257\nf 1259/1296/1259 1282/1295/1282 1290/1325/1290\nf 1264/1298/1264 1259/1296/1259 1286/2965/1286\nf 1263/1297/1263 1264/1298/1264 1286/2965/1286\nf 1279/1326/1279 1286/2965/1286 1289/2966/1289\nf 1279/1326/1279 1263/1297/1263 1286/2965/1286\nf 1284/1321/1284 1285/1327/1285 1287/1323/1287\nf 1289/2966/1289 1286/2965/1286 1288/1324/1288\nf 1288/1324/1288 1287/1323/1287 1289/2966/1289\nf 1289/2966/1289 1287/1323/1287 1285/1327/1285\nf 1289/2966/1289 1285/1327/1285 1279/1326/1279\nf 1288/1324/1288 1286/2965/1286 1290/1325/1290\nf 1290/1325/1290 1286/2965/1286 1259/1296/1259\nf 1291/1328/1291 1278/1319/1278 1281/2702/1281\nf 1292/2967/1292 1306/1330/1306 1325/1329/1325\nf 1276/2968/1276 1275/1401/1275 1436/1335/1436\nf 1292/2969/1292 1276/2968/1276 1293/1334/1293\nf 1438/1337/1438 1298/1339/1298 1299/1342/1299\nf 1293/1334/1293 1303/1346/1303 1306/2970/1306\nf 1295/1333/1295 1297/1338/1297 1305/1345/1305\nf 1292/2969/1292 1293/1334/1293 1306/2970/1306\nf 1204/1352/1204 1330/2971/1330 1311/1353/1311\nf 1324/1365/1324 1314/2972/1314 1323/1364/1323\nf 1314/2972/1314 1324/1365/1324 1318/1366/1318\nf 1319/1360/1319 1321/1363/1321 1322/1361/1322\nf 1321/1363/1321 1320/1362/1320 1204/2973/1204\nf 1204/2973/1204 1309/2974/1309 1321/1363/1321\nf 1322/1361/1322 1321/1363/1321 1309/2974/1309\nf 1309/2974/1309 1312/2975/1312 1322/1361/1322\nf 1322/1361/1322 1318/1366/1318 1317/1358/1317\nf 1312/2975/1312 1318/1366/1318 1322/1361/1322\nf 1323/2976/1323 1314/2972/1314 1318/1366/1318\nf 1318/1366/1318 1312/2975/1312 1323/2976/1323\nf 1328/1368/1328 1333/2977/1333 1336/2978/1336\nf 1320/1362/1320 1326/1359/1326 1327/1378/1327\nf 1224/1371/1224 1320/2979/1320 1327/1373/1327\nf 1329/2980/1329 1333/2977/1333 1328/1368/1328\nf 1328/1368/1328 1325/1367/1325 1329/2980/1329\nf 1292/2967/1292 1325/1329/1325 1330/2981/1330\nf 1330/2971/1330 1325/1367/1325 1311/1353/1311\nf 106/1372/106 1336/2982/1336 1337/2983/1337\nf 1333/1374/1333 1329/1314/1329 1334/1375/1334\nf 1277/1312/1277 1329/1314/1329 1325/1329/1325\nf 1329/1314/1329 1274/1307/1274 1334/1375/1334\nf 1334/1375/1334 109/65/109 1335/1376/1335\nf 106/1372/106 1327/1373/1327 1336/2982/1336\nf 1336/2978/1336 1327/1378/1327 1328/1368/1328\nf 101/111/101 102/2713/102 1341/1385/1341\nf 102/2713/102 1342/1386/1342 1341/1385/1341\nf 1340/1383/1340 105/2714/105 99/1384/99\nf 110/2715/110 105/2714/105 1342/1386/1342\nf 102/2713/102 110/2715/110 1342/1386/1342\nf 1341/1385/1341 1338/1390/1338 1335/1389/1335\nf 105/2714/105 1340/1383/1340 1342/1386/1342\nf 1240/1392/1240 1254/1291/1254 1266/1300/1266\nf 1240/1392/1240 1266/1300/1266 1343/1393/1343\nf 1268/1303/1268 1271/1306/1271 1343/1393/1343\nf 1266/1300/1266 1268/1303/1268 1343/1393/1343\nf 1235/1274/1235 1252/1277/1252 1344/1391/1344\nf 1252/1277/1252 1253/1286/1253 1344/1391/1344\nf 1241/1285/1241 1240/1392/1240 1344/1391/1344\nf 1253/1286/1253 1241/1285/1241 1344/1391/1344\nf 1271/1306/1271 1235/1274/1235 1344/1391/1344\nf 1443/1410/1443 1348/1405/1348 1345/1395/1345\nf 1348/1405/1348 1347/1404/1347 1349/2984/1349\nf 1349/2985/1349 1347/1505/1347 1294/1400/1294\nf 1294/1400/1294 1345/1399/1345 1349/2985/1349\nf 1345/1399/1345 1197/1398/1197 1198/2986/1198\nf 1350/1402/1350 1298/1412/1298 1296/1403/1296\nf 1300/1343/1300 1352/1344/1352 1355/2987/1355\nf 1307/1348/1307 1300/1343/1300 1355/2987/1355\nf 1352/1415/1352 1353/1414/1353 1355/2987/1355\nf 1353/1414/1353 1307/1348/1307 1355/2987/1355\nf 1191/1232/1191 562/1228/562 1356/1417/1356\nf 1193/1230/1193 1194/1229/1194 1358/1420/1358\nf 1358/1420/1358 1228/1267/1228 1193/1230/1193\nf 1358/2988/1358 1230/1278/1230 1228/1281/1228\nf 1358/2988/1358 1238/1282/1238 1230/1278/1230\nf 1359/1421/1359 1238/1282/1238 1361/2989/1361\nf 1237/1279/1237 1362/1283/1362 1233/1270/1233\nf 77/78/77 1372/1428/1372 80/88/80\nf 77/78/77 1365/1426/1365 1372/1428/1372\nf 1363/1423/1363 1362/1283/1362 1360/1422/1360\nf 1360/1422/1360 1366/1425/1366 1363/1423/1363\nf 1366/1425/1366 1360/1422/1360 1370/1432/1370\nf 1371/1429/1371 1370/1432/1370 1360/1422/1360\nf 1371/1429/1371 1360/1422/1360 1359/1421/1359\nf 1370/1432/1370 1367/1427/1367 1366/1425/1366\nf 1375/1435/1375 1378/1447/1378 1373/1433/1373\nf 1372/1428/1372 1367/1427/1367 1374/1434/1374\nf 1247/1290/1247 1233/1270/1233 1245/1317/1245\nf 1376/2990/1376 1371/1429/1371 1359/1421/1359\nf 1359/1421/1359 1361/2989/1361 1376/2990/1376\nf 1368/1430/1368 1371/1429/1371 1376/2990/1376\nf 1375/1435/1375 1374/1434/1374 1377/2991/1377\nf 1376/1436/1376 1375/1441/1375 1377/1443/1377\nf 1374/1434/1374 1369/1431/1369 1377/2991/1377\nf 1378/1447/1378 95/2711/95 96/101/96\nf 810/805/810 800/798/800 819/810/819\nf 781/800/781 786/799/786 802/2872/802\nf 802/2958/802 786/2992/786 1210/2959/1210\nf 809/806/809 778/2867/778 774/803/774\nf 1358/1437/1358 1376/1436/1376 1361/2993/1361\nf 1361/2989/1361 1238/1282/1238 1358/2988/1358\nf 1390/1462/1390 1393/1465/1393 1391/1463/1391\nf 1394/1484/1394 1395/1471/1395 1396/1472/1396\nf 1395/1471/1395 550/1466/550 1397/1468/1397\nf 1398/1467/1398 445/1460/445 1388/1459/1388\nf 1398/1467/1398 1399/2994/1399 1397/1468/1397\nf 1400/2995/1400 1388/1459/1388 1387/1458/1387\nf 1388/1459/1388 1400/2995/1400 1398/1467/1398\nf 1401/1469/1401 1397/1468/1397 1399/2994/1399\nf 1399/2994/1399 1403/2996/1403 1401/1469/1401\nf 1400/2995/1400 1403/2996/1403 1398/1467/1398\nf 1403/2996/1403 1399/2994/1399 1398/1467/1398\nf 1403/2996/1403 1400/2995/1400 1387/1458/1387\nf 1396/1472/1396 1405/1480/1405 1394/1484/1394\nf 1406/2997/1406 1407/2998/1407 1408/2999/1408\nf 1395/1471/1395 1394/1484/1394 550/1466/550\nf 550/1466/550 1394/1484/1394 602/3000/602\nf 602/3000/602 1409/1483/1409 1410/1482/1410\nf 745/1499/745 1411/1476/1411 595/1475/595\nf 1413/1500/1413 1414/3001/1414 1415/1494/1415\nf 1416/1479/1416 1417/1478/1417 1409/1483/1409\nf 1396/1472/1396 1404/1473/1404 1405/1480/1405\nf 1413/1500/1413 1410/1482/1410 1418/1481/1418\nf 1418/1481/1418 1419/1496/1419 1413/1500/1413\nf 602/3000/602 1394/1484/1394 1409/1483/1409\nf 1419/1496/1419 1420/1495/1420 1414/3001/1414\nf 1420/1495/1420 1415/1494/1415 1414/3001/1414\nf 1421/1485/1421 1427/1491/1427 1422/1486/1422\nf 1429/1493/1429 1426/1490/1426 1425/1489/1425\nf 1413/1500/1413 1419/1496/1419 1414/3001/1414\nf 1421/1485/1421 1429/1493/1429 1425/1489/1425\nf 1424/1488/1424 1407/2998/1407 1430/1497/1430\nf 1408/2999/1408 1407/2998/1407 1431/3002/1431\nf 1407/2998/1407 562/3003/562 740/1498/740\nf 1424/1488/1424 1430/1497/1430 1421/1485/1421\nf 1430/1497/1430 1407/2998/1407 740/1498/740\nf 1430/1497/1430 1412/1477/1412 1421/1485/1421\nf 1412/1477/1412 1429/1493/1429 1421/1485/1421\nf 1411/1476/1411 1413/1500/1413 1415/1494/1415\nf 1410/1482/1410 745/1499/745 602/3000/602\nf 1407/2998/1407 1406/2997/1406 562/3003/562\nf 1431/3002/1431 1407/2998/1407 1424/1488/1424\nf 1432/3004/1432 1408/2999/1408 1431/3002/1431\nf 1424/1488/1424 1432/3004/1432 1431/3002/1431\nf 1433/3005/1433 1423/1487/1423 1428/1492/1428\nf 1423/1487/1423 1433/3005/1433 1424/1488/1424\nf 1434/1501/1434 65/66/65 47/47/47\nf 1436/1335/1436 1293/1334/1293 1276/2968/1276\nf 1275/1401/1275 1294/1400/1294 1436/1335/1436\nf 1438/1337/1438 1296/1506/1296 1298/1339/1298\nf 1299/1342/1299 1297/1338/1297 1438/1337/1438\nf 1303/1346/1303 1304/1507/1304 1306/2970/1306\nf 1439/1407/1439 1303/1346/1303 1442/1408/1442\nf 1441/1416/1441 1354/1347/1354 1308/1349/1308\nf 1305/1345/1305 1440/1409/1440 1442/1408/1442\nf 1442/1408/1442 1303/1346/1303 1305/1345/1305\nf 1346/1394/1346 1439/1407/1439 1442/1408/1442\nf 1345/1395/1345 1346/1394/1346 1443/1410/1443\nf 1443/1410/1443 1346/1394/1346 1442/1408/1442\nf 1348/1405/1348 1349/2984/1349 1345/1395/1345\nf 1449/1509/1449 1457/1868/1457 1456/1867/1456\nf 1461/1514/1461 1450/1510/1450 1451/1560/1451\nf 1448/1511/1448 1462/1521/1462 1447/1508/1447\nf 1447/1508/1447 1455/1524/1455 1452/1515/1452\nf 1457/1868/1457 1453/1516/1453 1454/3006/1454\nf 1768/1864/1768 1459/3007/1459 1456/1867/1456\nf 1449/1509/1449 1458/1561/1458 1450/1510/1450\nf 1456/1867/1456 1459/3007/1459 1460/1563/1460\nf 1456/1867/1456 1460/1563/1460 1458/1561/1458\nf 1453/1516/1453 1509/1518/1509 1454/3006/1454\nf 1509/1518/1509 1481/1517/1481 1483/1559/1483\nf 1462/1521/1462 1466/1536/1466 1465/1522/1465\nf 1465/1522/1465 1468/3008/1468 1467/1523/1467\nf 1468/3008/1468 1465/1522/1465 1471/1533/1471\nf 1469/1539/1469 1465/1522/1465 1466/1536/1466\nf 1471/1533/1471 1474/1525/1474 1468/3008/1468\nf 1492/1534/1492 1471/1533/1471 1469/1539/1469\nf 1471/1533/1471 1465/1522/1465 1469/1539/1469\nf 1467/1523/1467 1473/1528/1473 1472/1527/1472\nf 1473/1528/1473 1467/1523/1467 1468/3008/1468\nf 1475/1526/1475 1474/1525/1474 1470/1535/1470\nf 1468/3008/1468 1474/1525/1474 1473/1528/1473\nf 1472/1527/1472 1476/1529/1476 1467/1523/1467\nf 1476/1529/1476 1477/3009/1477 1478/1531/1478\nf 1477/3009/1477 1476/1529/1476 1472/1527/1472\nf 1480/1532/1480 1534/1575/1534 1479/1530/1479\nf 1452/1515/1452 1482/1577/1482 1481/1517/1481\nf 1482/1577/1482 1452/1515/1452 1455/1524/1455\nf 1479/1530/1479 1482/1577/1482 1455/1524/1455\nf 1454/3006/1454 1509/1518/1509 1523/1558/1523\nf 1484/1537/1484 1489/3010/1489 1485/1538/1485\nf 1485/1538/1485 1489/3010/1489 1486/1540/1486\nf 1488/1544/1488 1489/3010/1489 1487/1541/1487\nf 1484/1537/1484 1487/1541/1487 1489/3010/1489\nf 1488/1544/1488 1486/1540/1486 1489/3010/1489\nf 1494/1543/1494 1490/1542/1490 1496/1552/1496\nf 1484/1537/1484 1500/3011/1500 1487/1541/1487\nf 1492/1534/1492 1493/1546/1493 1470/1535/1470\nf 1495/1545/1495 1496/1552/1496 1512/3012/1512\nf 1472/1527/1472 1475/1526/1475 1477/3009/1477\nf 1477/3009/1477 1499/3013/1499 1478/1531/1478\nf 1475/1526/1475 1499/3013/1499 1477/3009/1477\nf 1475/1526/1475 1470/1535/1470 1499/3013/1499\nf 1513/1547/1513 1498/3014/1498 1497/1548/1497\nf 1493/1546/1493 1575/3015/1575 1470/1535/1470\nf 1470/1535/1470 1575/3015/1575 1499/3013/1499\nf 1495/1545/1495 1575/3015/1575 1493/1546/1493\nf 1487/1541/1487 1500/3011/1500 1490/1542/1490\nf 1466/1536/1466 1500/3011/1500 1484/1537/1484\nf 1500/3011/1500 1466/1536/1466 1491/3016/1491\nf 1500/3011/1500 1501/3017/1501 1490/1542/1490\nf 1501/3017/1501 1502/1549/1502 1490/1542/1490\nf 1490/1542/1490 1502/1549/1502 1496/1552/1496\nf 1504/1550/1504 1502/1549/1502 1501/3017/1501\nf 1504/1550/1504 1501/3017/1501 1500/3011/1500\nf 1491/3016/1491 1503/1551/1503 1500/3011/1500\nf 1500/3011/1500 1503/1551/1503 1504/1550/1504\nf 1491/3016/1491 1463/1520/1463 1505/3018/1505\nf 1491/3016/1491 1505/3018/1505 1503/1551/1503\nf 1466/1536/1466 1462/1521/1462 1463/1520/1463\nf 1850/1954/1850 1526/1555/1526 1508/1554/1508\nf 1453/1516/1453 1457/1868/1457 1449/1509/1449\nf 1507/1570/1507 1524/1557/1524 1483/1559/1483\nf 1496/3019/1496 1561/1629/1561 1512/3020/1512\nf 1511/3021/1511 1499/3013/1499 1512/3012/1512\nf 1498/3014/1498 1511/3021/1511 1497/1548/1497\nf 1497/1548/1497 1511/3021/1511 1510/3022/1510\nf 1511/3021/1511 1512/3012/1512 1510/3022/1510\nf 1498/3014/1498 1513/1547/1513 1499/3013/1499\nf 1513/1547/1513 1478/1531/1478 1499/3013/1499\nf 1499/3013/1499 1511/3021/1511 1498/3014/1498\nf 1456/1867/1456 1458/1561/1458 1449/1509/1449\nf 1460/1563/1460 1514/1562/1514 1458/1561/1458\nf 1451/1560/1451 1515/3023/1515 1461/1514/1461\nf 1451/1560/1451 1517/1566/1517 1515/3023/1515\nf 1515/3023/1515 1517/1566/1517 1516/1567/1516\nf 1515/3023/1515 1516/1567/1516 1461/1514/1461\nf 1459/3007/1459 1518/1564/1518 1460/1563/1460\nf 1520/1568/1520 1527/3024/1527 1529/1512/1529\nf 1483/1559/1483 1522/1571/1522 1507/1570/1507\nf 1847/1953/1847 1524/1557/1524 1850/1954/1850\nf 1526/1555/1526 1850/1954/1850 1524/1557/1524\nf 1529/1512/1529 1527/3024/1527 1530/3025/1530\nf 1520/1568/1520 1528/1636/1528 1527/3024/1527\nf 1527/3024/1527 1528/1636/1528 1530/3025/1530\nf 1448/1511/1448 1531/1513/1531 1464/1519/1464\nf 1532/1573/1532 1528/1636/1528 1542/1574/1542\nf 1516/1567/1516 1528/1636/1528 1520/1568/1520\nf 1450/1510/1450 1531/1513/1531 1448/1511/1448\nf 1528/1636/1528 1532/1573/1532 1530/3025/1530\nf 1532/1573/1532 1529/1512/1529 1530/3025/1530\nf 1532/1573/1532 1531/1513/1531 1529/1512/1529\nf 1533/1576/1533 1535/1578/1535 1553/3026/1553\nf 1535/1578/1535 1533/1576/1533 1534/1575/1534\nf 1483/1559/1483 1481/1517/1481 1533/1576/1533\nf 1483/1559/1483 1533/1576/1533 1553/3026/1553\nf 1483/1559/1483 1553/3026/1553 1522/1571/1522\nf 1553/3026/1553 1567/1623/1567 1522/1571/1522\nf 1521/1569/1521 1568/1586/1568 1538/1583/1538\nf 1464/1519/1464 1541/1591/1541 1463/1520/1463\nf 1541/1591/1541 1543/3027/1543 1463/1520/1463\nf 1463/1520/1463 1543/3027/1543 1505/3018/1505\nf 1543/1593/1543 1544/1588/1544 1505/3028/1505\nf 1552/1744/1552 1549/1605/1549 1546/1601/1546\nf 1550/1603/1550 1593/1650/1593 1551/1604/1551\nf 1548/1602/1548 1552/1744/1552 1545/1608/1545\nf 1545/1608/1545 1555/1613/1555 1558/1606/1558\nf 1554/1607/1554 1558/1606/1558 1557/1612/1557\nf 1553/1597/1553 1535/1579/1535 1670/1594/1670\nf 1559/1582/1559 1510/1581/1510 1560/1615/1560\nf 1560/1615/1560 1510/1581/1510 1512/3020/1512\nf 1503/3029/1503 1505/3030/1505 1562/1638/1562\nf 1503/3029/1503 1562/1638/1562 1496/3019/1496\nf 1562/1638/1562 1576/1631/1576 1561/1629/1561\nf 1562/1638/1562 1505/3030/1505 1563/1639/1563\nf 1565/1616/1565 1574/1621/1574 1564/1618/1564\nf 1538/1583/1538 1568/1586/1568 1539/1585/1539\nf 1568/1586/1568 1521/1569/1521 1536/1572/1536\nf 1551/1604/1551 1581/1627/1581 1570/1625/1570\nf 1564/1640/1564 1574/1642/1574 1578/1632/1578\nf 1499/3013/1499 1575/3015/1575 1512/3012/1512\nf 1575/3015/1575 1495/1545/1495 1512/3012/1512\nf 1496/1552/1496 1495/1545/1495 1494/1543/1494\nf 1526/1555/1526 1524/1557/1524 1507/1570/1507\nf 1381/1634/1381 1516/1567/1516 1517/1566/1517\nf 1381/1634/1381 1517/1566/1517 1519/1565/1519\nf 1540/1592/1540 1542/1574/1542 1391/1637/1391\nf 1496/3019/1496 1562/1638/1562 1561/1629/1561\nf 1578/1632/1578 1576/1631/1576 1564/1640/1564\nf 1560/1615/1560 1512/3020/1512 1561/1629/1561\nf 1577/3031/1577 1571/3032/1571 1595/1653/1595\nf 1579/1628/1579 1580/1644/1580 1595/3033/1595\nf 1581/1627/1581 1551/1604/1551 1593/1650/1593\nf 1550/1603/1550 1591/1611/1591 1593/1650/1593\nf 1579/1628/1579 1590/1645/1590 1580/1644/1580\nf 1588/1651/1588 1583/1688/1583 1582/1652/1582\nf 1591/1611/1591 1589/1610/1589 1588/1651/1588\nf 1554/1607/1554 1586/1649/1586 1556/1609/1556\nf 1556/1609/1556 1586/1682/1586 1587/1683/1587\nf 1589/1610/1589 1587/1683/1587 1583/1688/1583\nf 1588/1651/1588 1589/1610/1589 1583/1688/1583\nf 1581/1627/1581 1590/1645/1590 1579/1628/1579\nf 1552/1744/1552 1548/1602/1548 1549/1605/1549\nf 1577/3031/1577 1595/1653/1595 1594/1656/1594\nf 1597/1654/1597 1616/3034/1616 1596/1655/1596\nf 1598/3035/1598 1600/3036/1600 1616/3034/1616\nf 1600/3036/1600 1733/1824/1733 1599/1666/1599\nf 1602/1659/1602 1605/1658/1605 1596/1655/1596\nf 1601/1662/1601 1615/1665/1615 1599/1666/1599\nf 1577/3031/1577 1594/1656/1594 1585/1685/1585\nf 1604/1657/1604 1603/3037/1603 1607/1664/1607\nf 1607/1664/1607 1610/1670/1610 1604/1657/1604\nf 1615/1665/1615 1607/1664/1607 1603/3037/1603\nf 1608/1663/1608 1611/1821/1611 1609/1667/1609\nf 1609/1667/1609 1611/1821/1611 1612/1668/1612\nf 1610/1670/1610 1607/1664/1607 1609/1667/1609\nf 1607/1664/1607 1608/1663/1608 1609/1667/1609\nf 1604/1657/1604 1614/1660/1614 1603/3037/1603\nf 1614/1660/1614 1615/1665/1615 1603/3037/1603\nf 1616/3034/1616 1602/1659/1602 1596/1655/1596\nf 1616/3034/1616 1599/1666/1599 1602/1659/1602\nf 1616/3034/1616 1597/1654/1597 1598/3035/1598\nf 1616/3034/1616 1600/3036/1600 1599/1666/1599\nf 1585/1685/1585 1623/1680/1623 1586/1682/1586\nf 1621/1679/1621 1625/1791/1625 1673/1747/1673\nf 1625/1791/1625 1621/1679/1621 1622/1692/1622\nf 1629/1671/1629 1594/1656/1594 1606/1661/1606\nf 1621/1679/1621 1624/1681/1624 1622/1692/1622\nf 1580/1644/1580 1597/1689/1597 1595/3033/1595\nf 1598/1690/1598 1584/1647/1584 1600/1672/1600\nf 1639/1704/1639 1646/1703/1646 1645/1708/1645\nf 1643/1709/1643 1644/1743/1644 1648/1710/1648\nf 1639/1704/1639 1645/1708/1645 1640/1711/1640\nf 1645/1708/1645 1646/1703/1646 1641/1705/1641\nf 1648/1710/1648 1644/1743/1644 1642/1713/1642\nf 1637/1702/1637 1654/1714/1654 1635/1700/1635\nf 1640/1711/1640 1663/1729/1663 1639/1704/1639\nf 1646/1703/1646 1649/1727/1649 1641/1705/1641\nf 1636/1699/1636 1650/1717/1650 1638/1701/1638\nf 1638/1701/1638 1650/1717/1650 1646/1703/1646\nf 1651/1719/1651 1652/1718/1652 1734/1818/1734\nf 1654/1714/1654 1633/1697/1633 1635/1700/1635\nf 1655/1716/1655 1680/1724/1680 1650/1717/1650\nf 1734/1818/1734 1763/3038/1763 1651/1719/1651\nf 1662/1737/1662 1660/1731/1660 1664/1730/1664\nf 1660/1734/1660 1662/1735/1662 1657/1726/1657\nf 1649/1727/1649 1676/1740/1676 1641/1705/1641\nf 1667/1712/1667 1677/1742/1677 1640/1711/1640\nf 1670/1594/1670 1555/1613/1555 1545/1608/1545\nf 1670/1594/1670 1535/1579/1535 1555/1613/1555\nf 1555/1613/1555 1535/1579/1535 1559/1582/1559\nf 1505/3039/1505 1544/1746/1544 1672/1617/1672\nf 1622/1692/1622 1675/1722/1675 1674/3040/1674\nf 1641/1705/1641 1676/1740/1676 1665/1706/1665\nf 1640/1711/1640 1677/1742/1677 1663/1729/1663\nf 1661/1736/1661 1676/1740/1676 1649/1727/1649\nf 1677/1742/1677 1661/1738/1661 1663/1729/1663\nf 1678/1749/1678 1654/1714/1654 1658/1715/1658\nf 1653/1721/1653 1682/3041/1682 1715/3042/1715\nf 1675/1722/1675 1653/1721/1653 1715/3042/1715\nf 1690/1764/1690 1691/1763/1691 1692/1768/1692\nf 1694/1767/1694 1695/1766/1695 1698/3043/1698\nf 1690/1764/1690 1692/1768/1692 1696/1769/1696\nf 1692/1768/1692 1691/1763/1691 1693/1765/1693\nf 1697/1770/1697 1694/1767/1694 1698/3043/1698\nf 1688/1762/1688 1699/1771/1699 1686/1760/1686\nf 1687/1759/1687 1703/1776/1703 1689/1761/1689\nf 1689/1761/1689 1703/1776/1703 1691/1763/1691\nf 1699/1771/1699 1684/1756/1684 1686/1760/1686\nf 1704/1775/1704 1714/1777/1714 1703/1776/1703\nf 1702/1774/1702 1709/3044/1709 1708/1783/1708\nf 1709/3045/1709 1701/1778/1701 1708/1787/1708\nf 1709/3045/1709 1706/1779/1706 1701/1778/1701\nf 1706/1782/1706 1709/3044/1709 1702/1774/1702\nf 1702/1774/1702 1710/1785/1710 1693/1765/1693\nf 1697/1770/1697 1711/1788/1711 1696/1769/1696\nf 1698/3043/1698 1695/1766/1695 1712/1784/1712\nf 1712/1786/1712 1697/1770/1697 1698/3043/1698\nf 1693/1765/1693 1710/1785/1710 1695/1766/1695\nf 1696/1769/1696 1711/1788/1711 1701/1778/1701\nf 1708/1783/1708 1710/1785/1710 1702/1774/1702\nf 1711/1788/1711 1708/1787/1708 1701/1778/1701\nf 1704/1775/1704 1715/1820/1715 1714/1777/1714\nf 1675/1758/1675 1704/1775/1704 1685/1755/1685\nf 1704/1775/1704 1675/1758/1675 1715/1820/1715\nf 1674/3040/1674 1716/1792/1716 1625/1791/1625\nf 1622/1692/1622 1674/3040/1674 1625/1791/1625\nf 1717/1793/1717 1718/1687/1718 1673/1747/1673\nf 1682/1800/1682 1726/1799/1726 1715/3046/1715\nf 1680/1724/1680 1763/1728/1763 1681/1753/1681\nf 1724/1806/1724 1718/1687/1718 1717/1793/1717\nf 1727/1807/1727 1720/1796/1720 1724/1806/1724\nf 1716/1792/1716 1725/1804/1725 1717/1793/1717\nf 1724/1806/1724 1720/1796/1720 1718/1687/1718\nf 1628/1684/1628 1652/1718/1652 1630/1691/1630\nf 1765/3047/1765 1764/1813/1764 1722/1816/1722\nf 1731/1815/1731 1728/1810/1728 1729/1812/1729\nf 1728/1810/1728 1731/1815/1731 1730/1814/1730\nf 1699/1771/1699 1725/1808/1725 1716/1794/1716\nf 1732/1817/1732 1728/1810/1728 1730/1814/1730\nf 1599/1666/1599 1733/1824/1733 1601/1662/1601\nf 1739/1831/1739 1741/1836/1741 1740/1832/1740\nf 1743/1833/1743 1745/3048/1745 1744/1834/1744\nf 1739/1831/1739 1746/1837/1746 1741/1836/1741\nf 1741/1836/1741 1742/1835/1742 1740/1832/1740\nf 1747/1838/1747 1745/3048/1745 1743/1833/1743\nf 1737/1829/1737 1736/1827/1736 1748/1839/1748\nf 1735/1828/1735 1738/1830/1738 1752/1843/1752\nf 1738/1830/1738 1740/1832/1740 1752/1843/1752\nf 1750/1841/1750 1757/1850/1757 1758/3049/1758\nf 1758/3050/1758 1757/1854/1757 1755/1845/1755\nf 1758/3050/1758 1755/1845/1755 1754/1847/1754\nf 1754/1848/1754 1750/1841/1750 1758/3049/1758\nf 1750/1841/1750 1742/1835/1742 1759/1851/1759\nf 1747/1838/1747 1746/1837/1746 1760/1853/1760\nf 1744/1834/1744 1745/3048/1745 1761/1852/1761\nf 1761/1855/1761 1745/3048/1745 1747/1838/1747\nf 1742/1835/1742 1744/1834/1744 1759/1851/1759\nf 1746/1837/1746 1755/1845/1755 1760/1853/1760\nf 1757/1850/1757 1750/1841/1750 1759/1851/1759\nf 1760/1853/1760 1755/1845/1755 1757/1854/1757\nf 1752/1843/1752 1753/1844/1753 1763/1861/1763\nf 1734/1825/1734 1735/1828/1735 1752/1843/1752\nf 1752/1843/1752 1763/1861/1763 1734/1825/1734\nf 1736/1827/1736 1730/3051/1730 1748/1839/1748\nf 1748/1839/1748 1730/3051/1730 1764/1858/1764\nf 1736/1827/1736 1732/1826/1732 1730/3051/1730\nf 1763/3052/1763 1766/3053/1766 1681/3054/1681\nf 1766/3053/1766 1764/1813/1764 1765/3047/1765\nf 1681/3054/1681 1766/3053/1766 1765/3047/1765\nf 1386/1863/1386 1767/1862/1767 1768/1864/1768\nf 1518/1564/1518 1459/3007/1459 1767/1862/1767\nf 1518/1564/1518 1767/1862/1767 1519/1565/1519\nf 1767/1862/1767 1459/3007/1459 1768/1864/1768\nf 1867/3055/1867 1454/3006/1454 1843/1964/1843\nf 1769/1865/1769 1771/3056/1771 1387/1866/1387\nf 1771/3056/1771 1769/1865/1769 1457/1868/1457\nf 1788/1899/1788 1789/3057/1789 1787/1900/1787\nf 1789/3057/1789 1792/1926/1792 1791/1901/1791\nf 1789/3057/1789 1791/1901/1791 1787/1900/1787\nf 1792/1926/1792 1796/3058/1796 1791/1901/1791\nf 1791/1901/1791 1793/1903/1793 1790/1902/1790\nf 1791/1901/1791 1796/3058/1796 1793/1903/1793\nf 1793/1903/1793 1796/3058/1796 1826/1905/1826\nf 1806/1897/1806 1798/1907/1798 1799/1910/1799\nf 1798/1907/1798 1806/1897/1806 1780/1890/1780\nf 1780/1890/1780 1802/1911/1802 1798/1907/1798\nf 1805/1917/1805 493/1914/493 1804/1915/1804\nf 1506/1553/1506 1525/1556/1525 1393/1584/1393\nf 1786/1898/1786 1806/1897/1806 1807/1919/1807\nf 1806/1897/1806 1808/3059/1808 1809/1927/1809\nf 1807/1919/1807 1809/1927/1809 1811/1920/1811\nf 1786/1898/1786 1813/1921/1813 1788/1899/1788\nf 1788/1899/1788 1813/1921/1813 1789/3057/1789\nf 1789/3057/1789 1813/1921/1813 1792/1926/1792\nf 1792/1926/1792 1813/1921/1813 1812/3060/1812\nf 1792/1926/1792 1812/3060/1812 1810/1925/1810\nf 1812/3060/1812 1813/1921/1813 1811/1920/1811\nf 1812/3060/1812 1820/3061/1820 1814/3062/1814\nf 1812/3060/1812 1814/3062/1814 1810/1925/1810\nf 1814/3062/1814 1815/1922/1815 1810/1925/1810\nf 1814/3062/1814 1818/1931/1818 1815/1922/1815\nf 1818/1931/1818 1814/3062/1814 1820/3061/1820\nf 1815/1922/1815 1818/1931/1818 1817/1923/1817\nf 1792/1926/1792 1826/1905/1826 1796/3058/1796\nf 1811/1920/1811 1819/1930/1819 1812/3060/1812\nf 1812/3060/1812 1819/1930/1819 1820/3061/1820\nf 1818/1931/1818 1820/3061/1820 1819/1930/1819\nf 1821/1929/1821 1833/1928/1833 513/1933/513\nf 1808/3059/1808 1833/1928/1833 1809/1927/1809\nf 1806/1897/1806 1809/1927/1809 1807/1919/1807\nf 1823/3063/1823 1826/1905/1826 1824/3064/1824\nf 1824/3064/1824 1826/1905/1826 1816/1924/1816\nf 1824/3064/1824 1825/3065/1825 1823/3063/1823\nf 1826/1905/1826 1823/3063/1823 1822/1932/1822\nf 1797/1906/1797 1826/1905/1826 1822/1932/1822\nf 1822/1932/1822 1834/1947/1834 1508/1918/1508\nf 1508/1554/1508 1834/3066/1834 1850/1954/1850\nf 1816/1924/1816 1827/1935/1827 1824/3064/1824\nf 1827/1935/1827 1816/1924/1816 1817/1923/1817\nf 1824/3064/1824 1827/1935/1827 1825/3065/1825\nf 1827/1935/1827 1817/1923/1817 1818/1931/1818\nf 1825/3065/1825 1838/1938/1838 1823/3063/1823\nf 1838/1938/1838 1825/3065/1825 1827/1935/1827\nf 526/1942/526 1784/1894/1784 473/1895/473\nf 532/3067/532 1828/3068/1828 523/1940/523\nf 523/1940/523 1828/3068/1828 1781/1892/1781\nf 534/3069/534 1830/3070/1830 1828/3068/1828\nf 1830/3070/1830 1831/1943/1831 1829/1889/1829\nf 1828/3068/1828 1829/1889/1829 1781/1892/1781\nf 1830/3070/1830 1832/1944/1832 1831/1943/1831\nf 530/3071/530 494/1913/494 1803/1912/1803\nf 534/3069/534 1828/3068/1828 532/3067/532\nf 1803/1912/1803 1832/1944/1832 530/3071/530\nf 1832/1944/1832 1830/3070/1830 530/3071/530\nf 1829/1889/1829 1775/1880/1775 1781/1892/1781\nf 1830/3070/1830 534/3069/534 530/3071/530\nf 1780/1890/1780 1831/1943/1831 1802/1911/1802\nf 1831/1943/1831 1780/1890/1780 1829/1889/1829\nf 1829/1889/1829 1828/3068/1828 1830/3070/1830\nf 535/3072/535 1779/1888/1779 467/1887/467\nf 1779/1888/1779 535/3072/535 473/1895/473\nf 1804/1915/1804 493/1914/493 495/1916/495\nf 1806/1897/1806 536/3073/536 1808/3059/1808\nf 1808/3059/1808 536/3073/536 1833/1928/1833\nf 513/1933/513 1833/1928/1833 536/3073/536\nf 495/1916/495 536/3073/536 1806/1897/1806\nf 1823/3063/1823 1837/1945/1837 1822/1932/1822\nf 1837/1945/1837 1823/3063/1823 1838/1938/1838\nf 1837/1945/1837 1838/1938/1838 1839/1948/1839\nf 1839/1948/1839 1840/3074/1840 1836/1949/1836\nf 1839/1948/1839 1841/1951/1841 1840/3074/1840\nf 1838/1938/1838 1841/1951/1841 1839/1948/1839\nf 1387/1866/1387 1771/3056/1771 1403/3075/1403\nf 1844/3076/1844 1523/1558/1523 1772/1952/1772\nf 1843/1964/1843 1454/3006/1454 1770/1961/1770\nf 1454/3006/1454 1868/3077/1868 1770/1961/1770\nf 1454/3006/1454 1523/1558/1523 1868/3077/1868\nf 1842/3078/1842 1523/1558/1523 1844/3076/1844\nf 1842/3078/1842 1866/3079/1866 1846/3080/1846\nf 1844/3076/1844 1845/3081/1845 1866/3079/1866\nf 1845/3081/1845 1844/3076/1844 1772/1952/1772\nf 1866/3079/1866 1842/3078/1842 1844/3076/1844\nf 1848/1957/1848 1852/1955/1852 1850/1954/1850\nf 1847/1953/1847 1851/1956/1851 1849/3082/1849\nf 1849/3082/1849 1851/1956/1851 1864/3083/1864\nf 1851/1956/1851 1852/1955/1852 1862/3084/1862\nf 1852/1955/1852 1848/1957/1848 1862/3084/1862\nf 1855/3085/1855 1854/3086/1854 1858/3087/1858\nf 1850/1954/1850 1853/3088/1853 1848/1957/1848\nf 1858/3087/1858 1854/3086/1854 1835/1946/1835\nf 1835/1946/1835 1854/3086/1854 1834/1947/1834\nf 1854/3086/1854 1855/3085/1855 1834/1947/1834\nf 1855/3089/1855 1856/1958/1856 1853/3088/1853\nf 1856/1958/1856 1848/1957/1848 1853/3088/1853\nf 1834/3066/1834 1855/3089/1855 1853/3088/1853\nf 1853/3088/1853 1850/1954/1850 1834/3066/1834\nf 1855/3085/1855 1858/3087/1858 1861/3090/1861\nf 1865/1959/1865 1859/3091/1859 1860/3092/1860\nf 1857/1960/1857 1865/1959/1865 1860/3092/1860\nf 1855/3085/1855 1861/3090/1861 1859/1996/1859\nf 1859/3091/1859 1856/1958/1856 1855/3089/1855\nf 1848/1957/1848 1857/1960/1857 1863/3093/1863\nf 1857/1960/1857 1849/3082/1849 1863/3093/1863\nf 1848/1957/1848 1863/3093/1863 1862/3084/1862\nf 1862/3084/1862 1864/3083/1864 1851/1956/1851\nf 1849/3082/1849 1864/3083/1864 1863/3093/1863\nf 1864/3083/1864 1862/3084/1862 1863/3093/1863\nf 1859/3091/1859 1865/1959/1865 1856/1958/1856\nf 1849/3082/1849 1772/1952/1772 1847/1953/1847\nf 1772/1952/1772 1874/3094/1874 1845/3081/1845\nf 1845/3081/1845 1874/3094/1874 1866/3079/1866\nf 1874/3094/1874 1772/1952/1772 1849/3082/1849\nf 1874/3094/1874 1849/3082/1849 1857/1960/1857\nf 1866/3079/1866 1869/1962/1869 1846/3080/1846\nf 1846/3080/1846 1869/1962/1869 1770/1961/1770\nf 1454/3006/1454 1867/3055/1867 1457/1868/1457\nf 1770/1961/1770 1868/3077/1868 1846/3080/1846\nf 1868/3077/1868 1842/3078/1842 1846/3080/1846\nf 1868/3077/1868 1523/1558/1523 1842/3078/1842\nf 1457/1868/1457 1867/3055/1867 1771/3056/1771\nf 1843/1964/1843 1870/1963/1870 1867/3055/1867\nf 1771/3056/1771 1867/3055/1867 1403/3075/1403\nf 1874/3094/1874 1869/1962/1869 1866/3079/1866\nf 1874/1978/1874 1871/1966/1871 1869/1970/1869\nf 1871/1966/1871 1874/1978/1874 2221/1977/2221\nf 1872/1967/1872 1876/3095/1876 1873/2003/1873\nf 1871/1966/1871 1875/2341/1875 1872/1967/1872\nf 1857/3096/1857 1877/2000/1877 1874/3097/1874\nf 1877/2000/1877 1857/3096/1857 1860/1997/1860\nf 1877/1979/1877 2223/1983/2223 2222/1980/2222\nf 1876/3095/1876 1880/2218/1880 2125/2217/2125\nf 2224/3098/2224 1878/2342/1878 1888/3099/1888\nf 1878/2342/1878 1881/3100/1881 1888/3099/1888\nf 1876/3095/1876 2224/3098/2224 1880/2218/1880\nf 1876/3095/1876 1872/1967/1872 1875/2341/1875\nf 1897/2343/1897 1886/1984/1886 1902/3101/1902\nf 1886/1984/1886 1887/1985/1887 1883/3102/1883\nf 1880/2218/1880 1888/3099/1888 1882/2215/1882\nf 1888/3099/1888 1889/3103/1889 1882/2215/1882\nf 1881/3100/1881 1889/3103/1889 1888/3099/1888\nf 1881/3100/1881 1878/2342/1878 1897/2343/1897\nf 1886/1984/1886 1897/2343/1897 2223/1983/2223\nf 1883/3104/1883 1898/1987/1898 1900/3105/1900\nf 1902/3101/1902 1900/3106/1900 1897/2343/1897\nf 1884/1999/1884 1901/1986/1901 1885/1989/1885\nf 1887/1988/1887 1898/1987/1898 1883/3104/1883\nf 1893/1994/1893 1892/1991/1892 625/1990/625\nf 1890/1992/1890 1836/1949/1836 1891/1993/1891\nf 1891/1993/1891 1840/3074/1840 1841/1951/1841\nf 1891/1993/1891 1836/1949/1836 1840/3074/1840\nf 1890/1992/1890 1835/1946/1835 1836/1949/1836\nf 1835/1946/1835 1890/1992/1890 1858/3087/1858\nf 1858/3087/1858 1890/1992/1890 1861/3090/1861\nf 1841/1951/1841 1892/1991/1892 1891/1993/1891\nf 1890/1992/1890 1859/1996/1859 1861/3090/1861\nf 1870/1963/1870 1403/3075/1403 1867/3055/1867\nf 2164/2522/2164 1873/2003/1873 1879/3107/1879\nf 1881/3100/1881 1895/3108/1895 1889/3103/1889\nf 1889/3103/1889 1895/3108/1895 1903/3109/1903\nf 1889/3103/1889 1903/3109/1903 1882/2215/1882\nf 1881/3100/1881 1897/2343/1897 1894/3110/1894\nf 1894/3110/1894 1897/2343/1897 1900/3106/1900\nf 1881/3100/1881 1896/3111/1896 1895/3108/1895\nf 1894/3112/1894 1900/3105/1900 1899/2007/1899\nf 1899/2007/1899 1900/3105/1900 1898/1987/1898\nf 623/3113/623 646/2005/646 1898/1987/1898\nf 1898/1987/1898 1901/1986/1901 623/3113/623\nf 625/3114/625 1884/1999/1884 1893/1998/1893\nf 1901/1986/1901 625/3114/625 623/3113/623\nf 1884/1999/1884 625/3114/625 1901/1986/1901\nf 1900/3106/1900 1902/3101/1902 1883/3102/1883\nf 1902/3101/1902 1886/1984/1886 1883/3102/1883\nf 1881/3100/1881 1894/3110/1894 1896/3111/1896\nf 1899/3115/1899 1905/2021/1905 1894/3116/1894\nf 1899/3115/1899 1925/2018/1925 1905/2021/1905\nf 1905/2015/1905 1908/2022/1908 1906/2016/1906\nf 1917/2029/1917 1912/2028/1912 1911/3117/1911\nf 1913/2030/1913 1917/2031/1917 1911/3117/1911\nf 1913/2030/1913 1911/3117/1911 1921/2037/1921\nf 1921/2037/1921 1911/3117/1911 1912/2028/1912\nf 1923/2038/1923 1921/2037/1921 1922/2036/1922\nf 1920/2034/1920 1926/2039/1926 1918/2035/1918\nf 1925/2018/1925 1899/3115/1899 1928/2042/1928\nf 1924/2032/1924 1929/2040/1929 1926/2039/1926\nf 1924/2032/1924 1930/2043/1930 1929/2040/1929\nf 1978/3118/1978 2004/3119/2004 1979/3120/1979\nf 1932/2046/1932 1936/2083/1936 1931/2047/1931\nf 1931/2047/1931 1936/2083/1936 1959/2075/1959\nf 1942/2060/1942 1948/2059/1948 1952/2069/1952\nf 1954/3121/1954 1953/3122/1953 1951/3123/1951\nf 1954/3121/1954 1934/2241/1934 1955/3124/1955\nf 692/3125/692 695/3126/695 1945/3127/1945\nf 1933/2050/1933 1946/2063/1946 1949/2054/1949\nf 1949/2054/1949 1946/2063/1946 1940/2065/1940\nf 1946/2063/1946 692/2123/692 1945/2064/1945\nf 1940/2065/1940 1950/2066/1950 1943/2067/1943\nf 1950/2066/1950 1952/2069/1952 1943/2067/1943\nf 1952/2069/1952 1948/2059/1948 1943/2067/1943\nf 1953/2068/1953 1941/2058/1941 1952/2069/1952\nf 1955/3124/1955 1953/3122/1953 1954/3121/1954\nf 1945/3127/1945 1958/3128/1958 1944/3129/1944\nf 1953/2068/1953 1955/2070/1955 1941/2058/1941\nf 1957/2074/1957 1945/3127/1945 695/3126/695\nf 1944/3129/1944 1958/3128/1958 1986/2072/1986\nf 1945/3127/1945 1957/2074/1957 1985/2073/1985\nf 1941/2058/1941 1960/2057/1960 1942/2060/1942\nf 1969/2086/1969 1963/2079/1963 1965/2078/1965\nf 1967/2088/1967 1961/2077/1961 1962/2076/1962\nf 1942/2060/1942 1952/2069/1952 1941/2058/1941\nf 1967/2085/1967 1973/2093/1973 1969/2086/1969\nf 1973/2093/1973 1977/3130/1977 1974/2094/1974\nf 1974/2094/1974 1977/3130/1977 1975/2095/1975\nf 1975/2095/1975 1977/3130/1977 1976/2091/1976\nf 1976/2091/1976 1977/3130/1977 1973/2092/1973\nf 1979/2120/1979 1929/2119/1929 1930/3131/1930\nf 1928/2102/1928 1980/2101/1980 1930/2107/1930\nf 1979/2108/1979 1981/2104/1981 1978/2103/1978\nf 1982/2110/1982 736/2109/736 735/3132/735\nf 738/2112/738 1983/2111/1983 735/3132/735\nf 1983/2111/1983 1982/2110/1982 735/3132/735\nf 1876/3095/1876 1879/3107/1879 1873/2003/1873\nf 1408/3133/1408 1432/3134/1432 1984/3135/1984\nf 1945/3127/1945 1985/2073/1985 1958/3128/1958\nf 1985/2073/1985 1986/2072/1986 1958/3128/1958\nf 1944/3129/1944 1986/2072/1986 1953/3122/1953\nf 1944/2061/1944 1953/2068/1953 1947/2062/1947\nf 1953/3122/1953 1986/2072/1986 1951/3123/1951\nf 1951/3123/1951 1986/2072/1986 1956/2071/1956\nf 695/3126/695 751/3136/751 1957/2074/1957\nf 751/3136/751 754/2131/754 1988/3137/1988\nf 1988/3137/1988 754/2131/754 1989/3138/1989\nf 2019/3139/2019 2018/2130/2018 2009/2129/2009\nf 751/3136/751 1988/3137/1988 1987/2116/1987\nf 1988/3137/1988 1991/2127/1991 1987/2116/1987\nf 1987/2116/1987 1991/2127/1991 1990/2113/1990\nf 1987/2116/1987 1992/2115/1992 1956/2071/1956\nf 1991/2127/1991 1993/2117/1993 1990/2113/1990\nf 1989/3138/1989 1996/2124/1996 1988/3137/1988\nf 1988/3137/1988 1996/2124/1996 1991/2127/1991\nf 1996/2124/1996 1997/3140/1997 2007/2144/2007\nf 1992/2115/1992 1998/3141/1998 1956/2071/1956\nf 1998/3141/1998 1951/3123/1951 1956/2071/1956\nf 1951/3123/1951 1999/3142/1999 1954/3121/1954\nf 1998/3141/1998 1999/3142/1999 1951/3123/1951\nf 1954/3121/1954 1999/3142/1999 1998/3141/1998\nf 1998/3141/1998 1992/2115/1992 1994/2114/1994\nf 2004/3119/2004 2148/3143/2148 1979/3120/1979\nf 2152/2256/2152 2001/2244/2001 2002/2247/2002\nf 2000/2045/2000 2004/3119/2004 1932/2046/1932\nf 2004/2097/2004 1933/2050/1933 1932/2053/1932\nf 692/2123/692 2005/2096/2005 700/3144/700\nf 2005/2096/2005 1978/2098/1978 700/3144/700\nf 1957/2074/1957 751/3136/751 1956/2071/1956\nf 1956/2071/1956 751/3136/751 1987/2116/1987\nf 1996/2124/1996 2007/2144/2007 2030/2147/2030\nf 2008/2125/2008 1995/2118/1995 2006/2126/2006\nf 1996/2124/1996 2030/2147/2030 2008/2125/2008\nf 2009/2129/2009 777/2128/777 2012/3145/2012\nf 1997/3140/1997 2018/2130/2018 2019/3139/2019\nf 2019/3139/2019 2010/3146/2010 1997/3140/1997\nf 1997/3140/1997 2010/3146/2010 2007/2144/2007\nf 1997/3140/1997 1996/2124/1996 1989/3138/1989\nf 2019/3139/2019 2036/3147/2036 2010/3146/2010\nf 2036/3147/2036 2019/3139/2019 2009/2129/2009\nf 2035/3148/2035 2036/3147/2036 2012/3145/2012\nf 2012/3145/2012 2036/3147/2036 2009/2129/2009\nf 2014/2135/2014 2012/3145/2012 756/2132/756\nf 2012/3145/2012 777/2128/777 756/2132/756\nf 2014/2135/2014 2015/2134/2015 2034/3149/2034\nf 2016/3150/2016 2013/2143/2013 2014/2135/2014\nf 2016/3150/2016 2033/3151/2033 2013/2143/2013\nf 754/2131/754 2018/2130/2018 1989/3138/1989\nf 2018/2130/2018 1997/3140/1997 1989/3138/1989\nf 1994/2114/1994 2020/3152/2020 2026/3153/2026\nf 1995/2118/1995 2021/3154/2021 2020/3152/2020\nf 2008/2125/2008 2029/3155/2029 1995/2118/1995\nf 2021/3154/2021 2022/2136/2022 2020/3152/2020\nf 1994/2114/1994 2023/3156/2023 1998/3141/1998\nf 2020/3152/2020 1994/2114/1994 1995/2118/1995\nf 1994/2114/1994 2026/3153/2026 2023/3156/2023\nf 1995/2118/1995 2029/3155/2029 2021/3154/2021\nf 2029/3155/2029 2008/2125/2008 2030/2147/2030\nf 2021/3154/2021 2029/3155/2029 2024/3157/2024\nf 2021/3154/2021 2024/3157/2024 2022/2136/2022\nf 2026/3153/2026 2020/3152/2020 2027/3158/2027\nf 2026/3153/2026 2027/3158/2027 2023/3156/2023\nf 2027/3158/2027 2025/2139/2025 2023/3156/2023\nf 2027/3158/2027 2028/3159/2028 2025/2139/2025\nf 2028/3159/2028 2027/3158/2027 2020/3152/2020\nf 2025/2139/2025 2028/3159/2028 2022/2136/2022\nf 2028/3159/2028 2020/3152/2020 2022/2136/2022\nf 2023/3156/2023 2055/3160/2055 1998/3141/1998\nf 2029/3155/2029 2030/2147/2030 2024/3157/2024\nf 2033/3151/2033 2016/3150/2016 2034/3149/2034\nf 2034/3149/2034 2015/2134/2015 2033/3151/2033\nf 2035/3148/2035 2037/2141/2037 2036/3147/2036\nf 2012/3145/2012 2013/2143/2013 2011/2142/2011\nf 2035/3148/2035 2012/3145/2012 2011/2142/2011\nf 2012/3145/2012 2014/2135/2014 2013/2143/2013\nf 2011/2142/2011 2037/2141/2037 2035/3148/2035\nf 2037/2141/2037 2010/3146/2010 2036/3147/2036\nf 2031/2137/2031 2022/2136/2022 2024/3157/2024\nf 2030/2147/2030 2041/2146/2041 2024/3157/2024\nf 2024/3157/2024 2041/2146/2041 2031/2137/2031\nf 2040/2145/2040 2010/3146/2010 2037/2141/2037\nf 2042/2148/2042 2424/2567/2424 1406/2568/1406\nf 1408/3133/1408 2044/3161/2044 2042/2148/2042\nf 2039/2150/2039 2044/3161/2044 2043/2152/2043\nf 2044/3161/2044 2045/2346/2045 2043/2152/2043\nf 2044/3161/2044 2046/3162/2046 2045/2346/2045\nf 1984/3135/1984 2044/3161/2044 1408/3133/1408\nf 1984/3135/1984 2047/3163/2047 2044/3161/2044\nf 2044/3161/2044 2047/3163/2047 2046/3162/2046\nf 2047/3163/2047 1984/3135/1984 1432/3134/1432\nf 2049/2153/2049 2050/3164/2050 2048/2151/2048\nf 2050/3164/2050 2031/2137/2031 2048/2151/2048\nf 2031/2137/2031 2050/3164/2050 2032/2138/2032\nf 2051/2156/2051 2050/3164/2050 2049/2153/2049\nf 2050/3164/2050 2051/2156/2051 2032/2138/2032\nf 1998/3141/1998 2055/3160/2055 1954/3121/1954\nf 1954/3121/1954 2055/3160/2055 2052/3165/2052\nf 2053/2361/2053 2057/2243/2057 2052/3165/2052\nf 2057/2243/2057 2053/2361/2053 2054/2175/2054\nf 2062/3166/2062 2065/2362/2065 2052/3165/2052\nf 2054/2175/2054 2142/2214/2142 2057/2243/2057\nf 2052/3165/2052 2057/2243/2057 2056/2242/2056\nf 2056/2242/2056 1954/3121/1954 2052/3165/2052\nf 2055/3160/2055 2058/2155/2058 2059/2154/2059\nf 2058/2155/2058 2025/2139/2025 2032/2138/2032\nf 2023/3156/2023 2058/2155/2058 2055/3160/2055\nf 2058/2155/2058 2023/3156/2023 2025/2139/2025\nf 2059/2154/2059 2060/3167/2060 2055/3160/2055\nf 2059/2154/2059 2066/2349/2066 2060/3167/2060\nf 2060/3167/2060 2066/2349/2066 2062/3166/2062\nf 2066/2349/2066 2063/3168/2063 2062/3166/2062\nf 2061/2350/2061 2064/2363/2064 2063/3168/2063\nf 2064/2363/2064 2065/2362/2065 2063/3168/2063\nf 2052/3165/2052 2065/2362/2065 2053/2361/2053\nf 2065/2362/2065 2062/3166/2062 2063/3168/2063\nf 2063/3168/2063 2066/2349/2066 2061/2350/2061\nf 2060/3167/2060 2062/3166/2062 2055/3160/2055\nf 2062/3166/2062 2052/3165/2052 2055/3160/2055\nf 2053/2361/2053 2092/2174/2092 2054/2175/2054\nf 2070/2159/2070 2072/2177/2072 2067/2160/2067\nf 2053/2361/2053 2252/3169/2252 2092/2174/2092\nf 2094/2353/2094 2093/2178/2093 2073/2176/2073\nf 2091/2179/2091 2074/2169/2074 2071/2163/2071\nf 2075/2267/2075 2091/2179/2091 2095/3170/2095\nf 2091/2179/2091 2075/2267/2075 2074/2169/2074\nf 2080/2167/2080 2081/2168/2081 2101/2173/2101\nf 2078/2164/2078 2081/2168/2081 2080/2167/2080\nf 2087/3171/2087 2102/3172/2102 2084/2183/2084\nf 2086/2180/2086 2101/2173/2101 2085/2184/2085\nf 2088/2166/2088 2154/3173/2154 2090/2211/2090\nf 2088/2166/2088 2090/2211/2090 2077/2162/2077\nf 2067/2160/2067 2072/2177/2072 2071/2163/2071\nf 2072/2177/2072 2091/2179/2091 2071/2163/2071\nf 2095/3170/2095 2091/2179/2091 2093/2178/2093\nf 2155/2212/2155 2069/2158/2069 2068/2157/2068\nf 2069/2158/2069 2155/2212/2155 2141/2213/2141\nf 2093/2178/2093 2094/2353/2094 2047/3163/2047\nf 2094/2353/2094 2046/3162/2046 2047/3163/2047\nf 1432/3134/1432 1433/3174/1433 2047/3163/2047\nf 1424/3175/1424 1433/3174/1433 1432/3134/1432\nf 1433/3174/1433 2160/2260/2160 2095/3170/2095\nf 2084/2183/2084 2111/2182/2111 2087/3171/2087\nf 2087/3171/2087 2111/2182/2111 2110/2196/2110\nf 2101/2173/2101 2097/2186/2097 2100/2289/2100\nf 2100/2289/2100 2511/2185/2511 2085/2184/2085\nf 2085/2184/2085 2101/2173/2101 2100/2289/2100\nf 2101/2173/2101 2086/2180/2086 2080/2167/2080\nf 2084/2183/2084 2102/3172/2102 2079/2165/2079\nf 2102/3172/2102 2089/2207/2089 2079/2165/2079\nf 2174/2197/2174 2103/2210/2103 2096/2189/2096\nf 2174/2197/2174 2177/2298/2177 2103/2210/2103\nf 2105/2190/2105 2096/2189/2096 2103/2210/2103\nf 2110/2196/2110 2113/2202/2113 2087/3171/2087\nf 2113/2202/2113 2110/2196/2110 2109/2188/2109\nf 2174/2197/2174 2112/2181/2112 2511/2185/2511\nf 2087/3171/2087 2113/2202/2113 2115/2198/2115\nf 2102/3172/2102 2115/2198/2115 2114/2201/2114\nf 2115/2198/2115 2102/3172/2102 2087/3171/2087\nf 2089/2207/2089 2116/2206/2116 2154/3173/2154\nf 2124/2204/2124 2089/2207/2089 2102/3172/2102\nf 2124/2204/2124 2102/3172/2102 2114/2201/2114\nf 2125/2217/2125 2129/2219/2129 2127/3176/2127\nf 2126/2224/2126 2131/2223/2131 2128/3177/2128\nf 2128/3177/2128 2131/2223/2131 2147/2227/2147\nf 2130/2222/2130 1882/2221/1882 1903/3178/1903\nf 1903/3178/1903 2134/3179/2134 2130/2222/2130\nf 2130/2222/2130 2134/3179/2134 2135/2228/2135\nf 2134/3179/2134 1903/3178/1903 2132/3180/2132\nf 2132/2230/2132 1903/2012/1903 1904/2011/1904\nf 2134/3179/2134 2139/2235/2139 2135/2228/2135\nf 2139/2236/2139 2134/2233/2134 2137/2232/2137\nf 2147/2227/2147 2140/3181/2140 2128/3177/2128\nf 2155/2212/2155 2144/2237/2144 2141/2213/2141\nf 2143/2258/2143 2140/2248/2140 2001/2244/2001\nf 2056/2242/2056 1934/2241/1934 1954/3121/1954\nf 2143/2238/2143 1934/2241/1934 2142/2214/2142\nf 2002/2247/2002 2146/3182/2146 2003/3183/2003\nf 2003/3183/2003 2151/2250/2151 2149/2122/2149\nf 2146/3182/2146 2151/2250/2151 2003/3183/2003\nf 2000/2257/2000 2150/2121/2150 2148/3184/2148\nf 2148/3143/2148 2004/3119/2004 2000/2045/2000\nf 2149/2122/2149 2150/2121/2150 2153/3185/2153\nf 2150/2121/2150 2000/2257/2000 2153/3185/2153\nf 2151/2253/2151 2146/2246/2146 2145/2245/2145\nf 2150/2121/2150 1979/2120/1979 2148/3184/2148\nf 2003/3183/2003 2153/3185/2153 2002/2247/2002\nf 2153/3185/2153 2152/2256/2152 2002/2247/2002\nf 2153/3185/2153 2000/2257/2000 2152/2256/2152\nf 2149/2122/2149 2153/3185/2153 2003/3183/2003\nf 2128/2240/2128 2156/2274/2156 2129/2275/2129\nf 2156/2274/2156 2144/2237/2144 2155/2212/2155\nf 2156/2274/2156 2128/2240/2128 2144/2237/2144\nf 2127/3176/2127 1879/3107/1879 2125/2217/2125\nf 2127/3176/2127 2157/3186/2157 1879/3107/1879\nf 1879/3107/1879 2157/3186/2157 2164/2522/2164\nf 1876/3095/1876 2125/2217/2125 1879/3107/1879\nf 1427/3187/1427 2158/1976/2158 1428/2261/1428\nf 1426/1973/1426 2158/1976/2158 1427/3187/1427\nf 2160/2260/2160 2159/2259/2159 2095/3170/2095\nf 2095/3170/2095 2159/2259/2159 2075/2267/2075\nf 2160/2260/2160 1433/3174/1433 1428/2261/1428\nf 2042/2148/2042 1406/2568/1406 1408/3133/1408\nf 2083/2171/2083 2162/2263/2162 2181/2264/2181\nf 2165/2266/2165 2075/2267/2075 2159/2259/2159\nf 2082/2170/2082 2165/2266/2165 2163/2262/2163\nf 2164/1975/2164 2157/3188/2157 2165/2266/2165\nf 2161/2265/2161 2181/2264/2181 2183/2293/2183\nf 2116/2206/2116 2167/2272/2167 2154/3173/2154\nf 2154/3173/2154 2167/2272/2167 2090/2211/2090\nf 2161/2265/2161 2098/2187/2098 2099/2172/2099\nf 2117/2203/2117 2171/3189/2171 2168/2276/2168\nf 2119/2199/2119 2168/2276/2168 2118/2200/2118\nf 2117/2203/2117 2168/2276/2168 2119/2199/2119\nf 2122/2209/2122 2171/3189/2171 2117/2203/2117\nf 2121/2208/2121 2170/2278/2170 2122/2209/2122\nf 2122/2209/2122 2170/2278/2170 2171/3189/2171\nf 2174/2197/2174 2511/2185/2511 2510/2697/2510\nf 2510/2697/2510 2177/2298/2177 2174/2197/2174\nf 2173/2283/2173 2168/2294/2168 2171/2284/2171\nf 2180/2288/2180 2179/2291/2179 2173/2283/2173\nf 2172/2281/2172 2180/2288/2180 2173/2283/2173\nf 2183/2293/2183 2184/2292/2184 2161/2265/2161\nf 2184/2292/2184 2098/2187/2098 2161/2265/2161\nf 2163/2262/2163 2157/3188/2157 2127/2296/2127\nf 2157/3188/2157 2163/2262/2163 2165/2266/2165\nf 2163/2262/2163 2127/2296/2127 2162/2263/2162\nf 2103/2210/2103 2185/2300/2185 2108/2194/2108\nf 2185/2300/2185 2190/2305/2190 2189/2302/2189\nf 2343/2311/2343 2381/2314/2381 2188/2303/2188\nf 2306/2309/2306 2342/2310/2342 2189/2302/2189\nf 2193/2313/2193 2305/2308/2305 2190/2305/2190\nf 2201/2323/2201 2205/2322/2205 2204/2334/2204\nf 2201/2323/2201 2204/2334/2204 2202/2333/2202\nf 2204/2334/2204 2205/2322/2205 2203/2330/2203\nf 2196/2316/2196 2209/2327/2209 2198/2318/2198\nf 2198/2318/2198 2209/2327/2209 2200/2320/2200\nf 2197/2319/2197 2256/2365/2256 2195/2317/2195\nf 2199/2321/2199 2256/2365/2256 2197/2319/2197\nf 2216/2339/2216 2219/3190/2219 2280/2340/2280\nf 2216/2339/2216 2220/2280/2220 2219/3190/2219\nf 2415/2429/2415 2219/3191/2219 2218/2430/2218\nf 2280/2340/2280 2219/3190/2219 2415/2426/2415\nf 2219/3191/2219 2217/3192/2217 2218/2430/2218\nf 2219/3190/2219 2220/2280/2220 2217/3193/2217\nf 1871/1966/1871 2221/1977/2221 1875/2341/1875\nf 1878/2342/1878 2224/3098/2224 1875/2341/1875\nf 2224/3098/2224 1876/3095/1876 1875/2341/1875\nf 2224/3098/2224 1888/3099/1888 1880/2218/1880\nf 2225/2345/2225 2228/2344/2228 2226/3194/2226\nf 2228/2344/2228 2045/2346/2045 2046/3162/2046\nf 2043/2152/2043 2225/2345/2225 2049/2153/2049\nf 2226/3194/2226 2228/2344/2228 2227/2360/2227\nf 2228/2344/2228 2046/3162/2046 2227/2360/2227\nf 2227/2360/2227 2046/3162/2046 2094/2353/2094\nf 2230/3195/2230 2231/2351/2231 2073/2176/2073\nf 2232/3196/2232 2233/3197/2233 2239/3198/2239\nf 2239/3198/2239 2233/3197/2233 2229/3199/2229\nf 2232/3196/2232 2236/3200/2236 2233/3197/2233\nf 2233/3197/2233 2236/3200/2236 2234/3201/2234\nf 2234/3201/2234 2236/3200/2236 2250/2356/2250\nf 2250/2356/2250 2236/3200/2236 2235/2357/2235\nf 2236/3200/2236 2232/3196/2232 2237/2347/2237\nf 2236/3200/2236 2237/2347/2237 2235/2357/2235\nf 2232/3196/2232 2239/3198/2239 2238/2348/2238\nf 2232/3196/2232 2238/2348/2238 2237/2347/2237\nf 2237/2347/2237 2051/2156/2051 2235/2357/2235\nf 2238/2348/2238 2239/3198/2239 2061/2350/2061\nf 2229/3199/2229 2240/2364/2240 2239/3198/2239\nf 2240/2364/2240 2064/2363/2064 2239/3198/2239\nf 2061/2350/2061 2239/3198/2239 2064/2363/2064\nf 2251/2358/2251 2248/3202/2248 2247/2359/2247\nf 2231/2351/2231 2242/3203/2242 2241/2352/2241\nf 2229/3199/2229 2242/3203/2242 2231/2351/2231\nf 2231/2351/2231 2230/3195/2230 2229/3199/2229\nf 2242/3203/2242 2229/3199/2229 2234/3201/2234\nf 2234/3201/2234 2229/3199/2229 2233/3197/2233\nf 2242/3203/2242 2234/3201/2234 2241/2352/2241\nf 2234/3201/2234 2250/2356/2250 2249/3204/2249\nf 2250/2356/2250 2225/2345/2225 2226/3194/2226\nf 2250/2356/2250 2243/2355/2243 2225/2345/2225\nf 2225/2345/2225 2243/2355/2243 2049/2153/2049\nf 2051/2156/2051 2244/2354/2244 2235/2357/2235\nf 2244/2354/2244 2246/3205/2246 2245/3206/2245\nf 2244/2354/2244 2245/3206/2245 2243/2355/2243\nf 2243/2355/2243 2245/3206/2245 2049/2153/2049\nf 2245/3206/2245 2246/3205/2246 2049/2153/2049\nf 2049/2153/2049 2246/3205/2246 2051/2156/2051\nf 2246/3205/2246 2244/2354/2244 2051/2156/2051\nf 2247/2359/2247 2226/3194/2226 2227/2360/2227\nf 2247/2359/2247 2249/3204/2249 2226/3194/2226\nf 2249/3204/2249 2250/2356/2250 2226/3194/2226\nf 2251/2358/2251 2094/2353/2094 2241/2352/2241\nf 2248/3202/2248 2249/3204/2249 2247/2359/2247\nf 2251/2358/2251 2241/2352/2241 2248/3202/2248\nf 2241/2352/2241 2234/3201/2234 2248/3202/2248\nf 2234/3201/2234 2249/3204/2249 2248/3202/2248\nf 2073/2176/2073 2252/3169/2252 2230/3195/2230\nf 2229/3199/2229 2252/3169/2252 2240/2364/2240\nf 2252/3169/2252 2053/2361/2053 2240/2364/2240\nf 2252/3169/2252 2229/3199/2229 2230/3195/2230\nf 2073/2176/2073 2092/2174/2092 2252/3169/2252\nf 2042/2148/2042 2044/3161/2044 2039/2150/2039\nf 2154/3173/2154 2088/2166/2088 2089/2207/2089\nf 2089/2207/2089 2088/2166/2088 2079/2165/2079\nf 2254/2367/2254 2202/2333/2202 2212/2332/2212\nf 2213/2335/2213 2203/2330/2203 2210/2329/2210\nf 2254/2367/2254 2262/3207/2262 2260/2372/2260\nf 2212/2332/2212 2262/3207/2262 2254/2367/2254\nf 2212/2332/2212 2264/2337/2264 2262/3207/2262\nf 2263/2338/2263 2213/2335/2213 2261/3208/2261\nf 2261/3208/2261 2210/2329/2210 2257/2369/2257\nf 2210/2329/2210 2261/3208/2261 2213/2335/2213\nf 2215/2336/2215 2268/3209/2268 2264/2337/2264\nf 2263/2338/2263 2268/3209/2268 2215/2336/2215\nf 2264/2380/2264 2268/3210/2268 2263/2379/2263\nf 2275/2394/2275 2276/2393/2276 2277/2401/2277\nf 2275/2394/2275 2277/2401/2277 2278/2400/2278\nf 2277/2401/2277 2276/2393/2276 2279/2397/2279\nf 2272/2389/2272 2281/2395/2281 2274/2391/2274\nf 2274/2391/2274 2281/2395/2281 2276/2393/2276\nf 2273/2392/2273 2289/2406/2289 2271/2390/2271\nf 2275/2394/2275 2289/2406/2289 2273/2392/2273\nf 2290/2407/2290 2278/2400/2278 2284/2399/2284\nf 2285/2402/2285 2279/2397/2279 2282/2396/2282\nf 2290/2407/2290 2294/3211/2294 2292/2412/2292\nf 2284/2399/2284 2296/3212/2296 2290/2407/2290\nf 2284/2399/2284 2287/2404/2287 2296/3212/2296\nf 2288/2405/2288 2285/2402/2285 2295/3213/2295\nf 2282/2396/2282 2293/3214/2293 2295/3213/2295\nf 2293/3214/2293 2282/2396/2282 2291/2409/2291\nf 2282/2396/2282 2295/3213/2295 2285/2402/2285\nf 2290/2407/2290 2296/3212/2296 2294/3211/2294\nf 2286/2403/2286 2300/3215/2300 2287/2404/2287\nf 2288/2405/2288 2300/3215/2300 2286/2403/2286\nf 2287/2422/2287 2300/3216/2300 2288/2421/2288\nf 2217/3192/2217 2302/2431/2302 2218/2430/2218\nf 2313/2441/2313 2314/2440/2314 2315/2450/2315\nf 2313/2441/2313 2315/2450/2315 2316/2449/2316\nf 2315/2450/2315 2314/2440/2314 2317/2446/2317\nf 2308/2434/2308 2319/2443/2319 2310/2436/2310\nf 2310/2436/2310 2319/2443/2319 2312/2438/2312\nf 2309/2437/2309 2328/2455/2328 2307/2435/2307\nf 2311/2439/2311 2328/2455/2328 2309/2437/2309\nf 2330/2457/2330 2316/2449/2316 2323/2448/2323\nf 2324/2451/2324 2317/2446/2317 2321/2445/2321\nf 2330/2457/2330 2337/3217/2337 2335/2462/2335\nf 2323/2448/2323 2337/3217/2337 2330/2457/2330\nf 2323/2448/2323 2326/2453/2326 2337/3217/2337\nf 2327/2454/2327 2324/2451/2324 2336/3218/2336\nf 2336/3218/2336 2321/2445/2321 2332/2460/2332\nf 2321/2445/2321 2336/3218/2336 2324/2451/2324\nf 2325/2452/2325 2341/3219/2341 2326/2453/2326\nf 2327/2454/2327 2341/3219/2341 2325/2452/2325\nf 2326/2470/2326 2341/3220/2341 2327/2469/2327\nf 2318/2442/2318 2255/2368/2255 2340/2386/2340\nf 2350/2484/2350 2351/2483/2351 2352/2493/2352\nf 2350/2484/2350 2352/2493/2352 2353/2492/2353\nf 2352/2493/2352 2351/2483/2351 2354/2489/2354\nf 2345/2477/2345 2356/2486/2356 2347/2479/2347\nf 2347/2479/2347 2356/2486/2356 2349/2481/2349\nf 2362/3221/2362 2360/2491/2360 2359/2490/2359\nf 2361/2494/2361 2362/3221/2362 2359/2490/2359\nf 2346/2480/2346 2363/2495/2363 2344/2478/2344\nf 2348/2482/2348 2363/2495/2363 2346/2480/2346\nf 2365/2497/2365 2353/2492/2353 2360/2491/2360\nf 2361/2494/2361 2354/2489/2354 2358/2488/2358\nf 2372/2508/2372 2362/3222/2362 2371/2507/2371\nf 2365/2497/2365 2372/3223/2372 2370/2502/2370\nf 2360/2491/2360 2372/3223/2372 2365/2497/2365\nf 2360/2491/2360 2362/3221/2362 2372/3223/2372\nf 2362/3221/2362 2361/2494/2361 2371/3224/2371\nf 2371/3224/2371 2358/2488/2358 2367/2499/2367\nf 2358/2488/2358 2371/3224/2371 2361/2494/2361\nf 2355/2485/2355 2331/2458/2331 2376/2475/2376\nf 2414/2558/2414 2302/2517/2302 2378/2516/2378\nf 2220/2280/2220 2379/2279/2379 2217/3193/2217\nf 2217/2518/2217 2379/3225/2379 2377/2519/2377\nf 2108/2194/2108 2380/2306/2380 2120/2195/2120\nf 1479/1530/1479 1534/1575/1534 1482/1577/1482\nf 1556/1609/1556 1587/1683/1587 1589/1610/1589\nf 1595/3033/1595 1571/1626/1571 1579/1628/1579\nf 1563/1619/1563 1505/3039/1505 1672/1617/1672\nf 1463/1520/1463 1491/3016/1491 1466/1536/1466\nf 1447/1508/1447 1462/1521/1462 1455/1524/1455\nf 2093/2178/2093 2047/3163/2047 2095/3170/2095\nf 2095/3170/2095 2047/3163/2047 1433/3174/1433\nf 2389/2531/2389 2390/2530/2390 2391/2540/2391\nf 2389/2531/2389 2391/2540/2391 2392/2539/2392\nf 2391/2540/2391 2390/2530/2390 2393/2536/2393\nf 2384/2524/2384 2395/2533/2395 2386/2526/2386\nf 2386/2526/2386 2395/2533/2395 2388/2528/2388\nf 2401/3226/2401 2399/2538/2399 2398/2537/2398\nf 2400/2541/2400 2401/3226/2401 2398/2537/2398\nf 2385/2527/2385 2402/2542/2402 2383/2525/2383\nf 2387/2529/2387 2402/2542/2402 2385/2527/2385\nf 2404/2544/2404 2392/2539/2392 2399/2538/2399\nf 2400/2541/2400 2393/2536/2393 2397/2535/2397\nf 2411/2555/2411 2401/3227/2401 2410/2554/2410\nf 2404/2544/2404 2411/3228/2411 2409/2549/2409\nf 2399/2538/2399 2411/3228/2411 2404/2544/2404\nf 2399/2538/2399 2401/3226/2401 2411/3228/2411\nf 2401/3226/2401 2400/2541/2400 2410/3229/2410\nf 2410/3229/2410 2397/2535/2397 2406/2546/2406\nf 2397/2535/2397 2410/3229/2410 2400/2541/2400\nf 2394/2532/2394 2366/2498/2366 2375/2514/2375\nf 2405/2545/2405 2192/2307/2192 2382/2315/2382\nf 2299/3230/2299 2304/2428/2304 2303/2433/2303\nf 2299/3230/2299 2415/2429/2415 2304/2428/2304\nf 2270/2325/2270 2191/2304/2191 2186/2299/2186\nf 2417/2563/2417 2425/2562/2425 2416/2572/2416\nf 2423/2564/2423 2419/2571/2419 2420/2565/2420\nf 1406/2568/1406 2424/2567/2424 2418/2566/2418\nf 562/2569/562 2420/2565/2420 2419/2571/2419\nf 2424/2567/2424 2042/2148/2042 2038/2149/2038\nf 2416/2572/2416 2425/2562/2425 2426/2609/2426\nf 2416/2572/2416 2426/2609/2426 2421/2573/2421\nf 2017/2140/2017 2427/3231/2427 2037/2141/2037\nf 2427/3232/2427 2456/2614/2456 2425/3233/2425\nf 2431/2611/2431 2427/3232/2427 2017/3234/2017\nf 2427/3232/2427 2431/2611/2431 2456/2614/2456\nf 2040/2145/2040 2427/3231/2427 2425/2562/2425\nf 2427/3231/2427 2040/2145/2040 2037/2141/2037\nf 2430/2578/2430 2433/2583/2433 2429/2579/2429\nf 2015/3235/2015 2438/3236/2438 2033/3237/2033\nf 2443/2600/2443 2451/2595/2451 2442/2594/2442\nf 2438/3238/2438 2015/2592/2015 2439/2605/2439\nf 2014/2135/2014 2034/3149/2034 2016/3150/2016\nf 2440/2604/2440 2443/2600/2443 2445/2598/2445\nf 2441/3239/2441 2445/2598/2445 2444/2597/2444\nf 2445/2598/2445 2441/3239/2441 2440/2604/2440\nf 2015/2592/2015 2451/2595/2451 2439/2605/2439\nf 2429/2579/2429 2453/2607/2453 2483/3240/2483\nf 2452/3241/2452 2453/2607/2453 2448/2603/2448\nf 2453/2607/2453 2449/2602/2449 2448/2603/2448\nf 2453/2607/2453 2450/2601/2450 2449/2602/2449\nf 2453/2607/2453 2454/2606/2454 2450/2601/2450\nf 2454/2606/2454 2447/2599/2447 2450/2601/2450\nf 2454/2606/2454 2446/2596/2446 2447/2599/2447\nf 2437/2585/2437 2455/3242/2455 2436/2586/2436\nf 2441/2590/2441 2455/3242/2455 2437/2585/2437\nf 2444/2597/2444 2455/3242/2455 2441/3239/2441\nf 2446/2596/2446 2455/3242/2455 2444/2597/2444\nf 2436/2586/2436 2455/3242/2455 2446/2596/2446\nf 1331/2577/1331 2448/2655/2448 2428/2574/2428\nf 2429/2579/2429 2483/3240/2483 2432/2580/2432\nf 2483/3240/2483 2453/2607/2453 2452/3241/2452\nf 2457/3243/2457 2512/2619/2512 2456/3244/2456\nf 63/3245/63 2458/2620/2458 2457/3243/2457\nf 2514/2621/2514 2464/2624/2464 2463/2623/2463\nf 2458/2620/2458 62/3246/62 2468/2629/2468\nf 2460/2617/2460 2469/2630/2469 2462/2622/2462\nf 63/3245/63 62/3246/62 2458/2620/2458\nf 2432/2636/2432 2474/2635/2474 64/3247/64\nf 2487/2649/2487 2486/2648/2486 2477/3248/2477\nf 2477/3248/2477 2481/2650/2481 2487/2649/2487\nf 2482/2644/2482 2485/2645/2485 2484/2646/2484\nf 2484/2646/2484 2432/3249/2432 2483/2647/2483\nf 2432/3249/2432 2484/2646/2484 2472/3250/2472\nf 2485/2645/2485 2472/3250/2472 2484/2646/2484\nf 2472/3250/2472 2485/2645/2485 2475/3251/2475\nf 2485/2645/2485 2480/2642/2480 2481/2650/2481\nf 2475/3251/2475 2485/2645/2485 2481/2650/2481\nf 2486/3252/2486 2481/2650/2481 2477/3248/2477\nf 2481/2650/2481 2486/3252/2486 2475/3251/2475\nf 2490/2652/2490 1435/3253/1435 1434/3254/1434\nf 2483/2647/2483 2489/2658/2489 2488/2643/2488\nf 2452/2654/2452 2489/2657/2489 2483/3255/2483\nf 47/3256/47 2490/2652/2490 1434/3254/1434\nf 2490/2652/2490 47/3256/47 61/2651/61\nf 64/3247/64 2474/2635/2474 61/2651/61\nf 106/2656/106 107/3257/107 1435/3258/1435\nf 106/2656/106 1435/3258/1435 2489/2657/2489\nf 1435/3253/1435 2490/2652/2490 2489/2658/2489\nf 2519/2674/2519 2491/2662/2491 2494/2675/2494\nf 2494/2675/2494 2495/3259/2495 2493/2668/2493\nf 2495/3260/2495 2459/2664/2459 2493/2698/2493\nf 2459/2664/2459 2495/3260/2495 2491/2665/2491\nf 2425/2663/2425 2456/3244/2456 2459/2664/2459\nf 2493/2668/2493 2496/2667/2496 2494/2675/2494\nf 2465/2627/2465 2501/3261/2501 2498/2628/2498\nf 2470/2633/2470 2501/3261/2501 2465/2627/2465\nf 2498/2680/2498 2501/3261/2501 2499/2679/2499\nf 2499/2679/2499 2501/3261/2501 2470/2633/2470\nf 2419/2571/2419 1356/2682/1356 562/2569/562\nf 2421/2573/2421 2502/2685/2502 2422/2570/2422\nf 2502/2685/2502 2421/2573/2421 14/2608/14\nf 2507/2686/2507 2508/2694/2508 2506/2690/2506\nf 2041/2146/2041 2048/2151/2048 2031/2137/2031\nf 2013/2143/2013 2033/3151/2033 2017/2140/2017\nf 2033/3237/2033 2438/3236/2438 2017/3262/2017\nf 2040/2145/2040 2007/2144/2007 2010/3146/2010\nf 2502/2689/2502 2503/3263/2503 2507/2686/2507\nf 2512/2619/2512 2457/3243/2457 2458/2620/2458\nf 2456/3244/2456 2512/2619/2512 2459/2664/2459\nf 2514/2621/2514 2463/2623/2463 2461/2699/2461\nf 2464/2624/2464 2514/2621/2514 2462/2622/2462\nf 2468/2629/2468 62/3246/62 46/2700/46\nf 2515/2671/2515 2518/2673/2518 2468/2629/2468\nf 2517/2681/2517 2471/2632/2471 2500/2631/2500\nf 2469/2630/2469 2518/2673/2518 2516/2676/2516\nf 2518/2673/2518 2469/2630/2469 2468/2629/2468\nf 2492/2659/2492 2518/2673/2518 2515/2671/2515\nf 2491/2662/2491 2519/2674/2519 2492/2659/2492\nf 2519/2674/2519 2518/2673/2518 2492/2659/2492\nf 2494/2675/2494 2491/2662/2491 2495/3259/2495\n# 5022 faces\n\ng\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1]),\n\t\t\ty = float.Parse (strItems [2]),\n\t\t\tz = float.Parse (strItems [3])\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\n#load \"lesson6.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n```\n\n# Lesson 6bis: tangent space normal mapping\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\nThe subject for today is [normal mapping](https://en.wikipedia.org/wiki/Normal_mapping). What is the main difference between normal mapping and Phong shading? The key is the density of information we have. For Phong shading we use normal vectors given per vertex of triangle mesh (and interpolate it inside triangles), whereas normal mapping textures provide dense information, dramatically improving rendering details.\n\nWell, we have already applied normal mapping in previous lesson, however we used the global system of coordinates to store the texture. Today we are talking about [tangent space](https://en.wikipedia.org/wiki/Darboux_frame) normal mapping.\n\nSo, we have two textures, the left one is given in the global frame (direct transformation from RGB to XYZ normal), whereas the right one in the Darboux frame:\n\n![](./img/lesson6bis_nm.jpg)\n\nTo use right texture, for each pixel we draw we compute tangent space (Darboux) frame. In this basis one vector (usually z) is orthogonal to our surface, and two others give a plane tangent to the current point. Then we read a (perturbed) normal vector from our texture, transform its coordinates from Darboux frame to the global system coordinates and we are done. Usually normal maps provide small perturbations of normal vectors, thus textures are in dominant blue color.\n\nWell, why such a mess? Why not to use global system as we did before? Imagine we want to animate our model. For example, I took the black guy model and opened his mouth. It is obvious that normal vectors are to be modified.\n\n![  ](./img/lesson6bis_mouth.jpg)\n\nLeft image gives the head with open mouth, but unchanged (global frame) normal texture. Inspect closely the interior of the lower lip. The light coming directly to his face; when the mouth was closed the backside of the lower lip naturally was not lit. Now the mouth is open, but the lip is not lit... The right image was computed with tangent space normal mapping.\n\nTherefore, if we have an animated model, then for correct normal mapping in global frame we need to have one texture per frame of the animation, whereas tangent space deforms accordingly to the model and we need one texture only!\n\nHere is another example:\n\n![  ](./img/global_vs_tangent_diablo.jpg)\n\nThese are textures for the Diablo model. Notice that only one hand is drawn in the texture, and only one side of the tail. The artist used the same texture for both arms and for both sides of the tail. It means that in the global coordinate system I can provide normal vectors either for the left side of the tail, either for the right one, but not for both! Same goes for the arms. And I need different information for the left and the right sides, for example, inspect left and right cheekbones in the left image, naturally normal vectors are pointing in the opposite directions!\n\nLet us finish with the motivation section and go straight ahead to the computations.\n\n# **Starting point, Phong shading**\n\nOkay, here is the starting point. The shader is really simple, it is Phong shading.\n\n```csharp\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        Vec3f bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        Vec3f l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (bn, l));\n\n        color = GetColor (texture, uv);\n        color *= diff;\n\n        return false;\n    }\n}\n\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, headTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\nFor the educational and debugging purposes I am removing the skin texture and apply a regular grid with horizontal red and vertical blue lines:\n\n```csharp\nvar gridTexture = Image.Load (\"obj/grid.tga\");\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, gridTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\nLet us remember how Phong shading works:\n\n![  ](./img/lesson6bis_triangle.png)\n\nFor each vertex of a triangle we have its coordinates p, texture coordinates uv and normal vectors. For shading current fragment our software rasterizer gives us barycentric coordinates of the fragment (alpha, beta, gamma). It means that the coordinates of the fragment can be obtained as p = alpha p0 \\+ beta p1 \\+ gamma p2. Then in the same way we interpolate texture coordinates and the normal vector:\n\n![ ](./img/lesson6bis_f00.png)\n\nNotice that blue and red lines are isolines of u and v, correspondingly. So, for each point of our surface we define a so-called Darboux frame, with x and y axes parallel to blue and red lines, and z axis orthogonal to the surface. This is the frame where tangent space normal map lives.\n\n# **How to reconstruct a (3D) linear function from three samples**\n\nOkay, so our goal is to compute three vectors (tangent basis) for each pixel we draw. Let us put that aside for a while and imagine a linear function f that for each point (x,y,z) gives a real number f(x,y,z) = Ax \\+ By \\+ Cz \\+ D. The only problem that we do not know A, B, C and D, however we do know three values of the function at three different points of the space (p0, p1, p2):\n\n![  ](./img/lesson6bis_f01.png)\n\n![  ](./img/lesson6bis_gradient_a.png)\n\nIt is convenient to imagine f as a height map of an inclined plane. We fix three different (non collinear) points on the plane and we know values of f in those points. Red lines inside the triangle show the iso-heights f0, f0 \\+ 1 meter, f0 \\+ 2 meters and so on. For a linear function we have the isolines are parallel (straight) lines.\n\nIn fact, I am more interested in the direction, orthogonal to the isolines. If we move along an iso, the height does not change (well duh, it is an iso!). If we deviate a little bit from an iso, the height starts to change a little bit. The steepest ascent we obtain when we move orthogonally to the isolines.\n\nLet us recall that the steepest ascent direction for a function is nothing else than its [gradient](https://en.wikipedia.org/wiki/Gradient). For a linear function f(x,y,z) = Ax \\+ By \\+ Cz \\+ D its gradient is a constant vector (A, B, C). Recall that we do not know the values of (A,B,C). We know only three samples of the function. Can we reconstruct A,B and C? Sure thing.\n\nSo, we have three points p0, p1, p2 and thre values f0, f1, f2. We need to find the vector of the steepest ascent (A,B,C). Let us consider another function defined as g(p) = f(p) - f(p0):\n\n![  ](./img/lesson6bis_gradient_b.png)\n\nObviously that we simply translated our inclined plane, without changing its inclination, therefore the steepest ascent direction for f and g is the same.\n\nLet us rewrite the definition of g:\n\n![  ](./img/lesson6bis_f02.png)\n\nPlease note that superscript x in p^x means x coordinate of the point p and not a power. So, the function g is simply a dot product between vector (p-p0) and (ABC). And we still do not know (A,B,C)!\n\nOkay, let us recall what we know. We know that if we go from point p0 to point p2, then the function g will go from zero to f2-f0. In other words, the dot product between vectors (p2-p0) and (ABC) is equal to f2-f0. Same thing for (p1-p0). Therefore, we are looking for the vector ABC, orthogonal to the normal n and respecting two constraints on dot products:\n\n![  ](./img/lesson6bis_f03.png)\n\nLet us rewrite this in a matrix form:\n\n![  ](./img/lesson6bis_f04.png)\n\nSo, we got an easy to solve linear matrix equation Ax = b:\n\n![  ](./img/lesson6bis_f05.png)\n\nPlease note that I used the letter A for two different things, the meaning should be clear from the context. So, our 3x3 matrix A, multiplied with the unknown vector x=(A,B,C), gives the vector b = (f1-f0, f2-f0, 0). Unknown vector x becomes known when we multiply inverse to A by b.\n\nAlso note that in the matrix A we have nothing related to the function f. It contains only some information about our triangle.\n\n# **Let us compute Darboux basis and apply the perturbation of normals**\n\nSo, Darboux basis is a triplet of vectors (i,j,n), where n - is the original normal vector, and i, j can be computed as follows:\n\n![  ](./img/lesson6bis_f06.png)\n\nUsing the normal maps in the tangent space.\n\n```csharp\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n\n    readonly Matrix4 transformation;\n    readonly Vec3f[] ndcTri = new Vec3f[3];     // triangle in normalized device coordinates\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        ndcTri[nthvert] = Project3D (glVertex / glVertex.h);\n\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        var A = new Matrix3 ();\n        A.SetRow (0, ndcTri [1] - ndcTri [0]);\n        A.SetRow (1, ndcTri [2] - ndcTri [0]);\n        A.SetRow (2, bn);\n\n        var AI = Inverse (A);\n        var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n        var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n\n        var B = new Matrix3 ();\n        B.SetColumn (0, i.Normalize ());\n        B.SetColumn (1, j.Normalize ());\n        B.SetColumn (2, bn);\n\n        var n = Mult (B, Normal (normalMap, uv)).Normalize ();\n\n        var l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (n, l));\n\n        color = GetColor (texture, uv) * diff;\n        return false;\n    }\n}\n```\n\nAll is quite straightforward, I compute the matrix A:\n\n```csharp\n// var A = new Matrix3 ();\n// A.SetRow (0, ndcTri [1] - ndcTri [0]);\n// A.SetRow (1, ndcTri [2] - ndcTri [0]);\n// A.SetRow (2, bn);\n```\n\nThen compute two unknown vectors (i,j) of Darboux basis:\n\n```csharp\n// var AI = Inverse (A);\n// var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n// var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n```\n\nOnce we have all the tangent basis, I read the perturbed normal from the texture and apply the basis change from the tangent basis to the global coordinates. Recall that I have already described how to perform change of basis.\n\nHere is the final rendered image, compare the details with Phong shading:\n\n```csharp\nvar headTangentMap = Image.Load (\"obj/african_head_nm_tangent.tga\");\nheadTangentMap.VerticalFlip ();\n\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headTangentMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Were you paying attention?**\n\nHave you noticed that generally a (flat) triangle has a constant normal vector, whereas I used the interpolated normal in the last row of the matrix A? Why did I do it?\n\nHappy coding!"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson1.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson2.csx",
    "content": "using static Geometry;\n\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\n\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n\tLine(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n\tLine(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n\tLine(image, t[0], t[1], color);\n\tLine(image, t[1], t[2], color);\n\tLine(image, t[2], t[0], color);\n}\n\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson2.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\nusing static Geometry;\n```\n\n# Lesson 2: Triangle rasterization and back face culling\n\n# Old-school method: Line sweeping\n\nThus, the task is to draw two-dimensional triangles. For motivated students it normally takes a couple of hours, even if they are bad programmers. Last time we saw Bresenham’s line drawing algorithm. Today’s task is to draw a filled triangle. Funny enough, but this task is not trivial. I don’t know why, but I know that it’s true. Most of my students struggle with this simple task. So, the initial stub will look like this:\n\n```csharp\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n    Line(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n    Line(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    Line(image, t[0], t[1], color);\n    Line(image, t[1], t[2], color);\n    Line(image, t[2], t[0], color);\n}\n\nVec2i[] t0 = {\n    new Vec2i { x = 10, y = 70 },\n    new Vec2i { x = 50, y = 160 },\n    new Vec2i { x = 70, y = 80 }\n};\nVec2i[] t1 = {\n    new Vec2i { x = 180, y = 50 },\n    new Vec2i { x = 150, y = 1 },\n    new Vec2i { x = 70, y = 180 }\n};\nVec2i[] t2 = {\n    new Vec2i { x = 180, y = 150 },\n    new Vec2i { x = 120, y = 160 },\n    new Vec2i { x = 130, y = 180 }\n};\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThe code is simple: I provide three triangles for the initial debugging of your code. If we invoke `Line` inside the triangle function, we’ll get the contour of the triangle. How to draw a filled triangle?\n\nA good method of drawing a triangle must have the following features:\n\n* It should be (surprise!) simple and fast.\n\n\n* It should be symmetrical: the picture should not depend on the order of vertices passed to the drawing function.\n\n\n* If two triangles have two common vertices, there should be no holes between them because of rasterization rounding.\n\nWe could add more requirements, but let’s do with these ones. Traditionally a line sweeping is used:\n\n1. Sort vertices of the triangle by their y-coordinates\n\n2. Rasterize simultaneously the left and the right sides of the triangle\n\n3. Draw a horizontal line segment between the left and the right boundary points\n\nAt this point my students start to lose the firm ground: which segment is the left one, which one is right? Besides, there are three segments in a triangle... Usually, after this introduction I leave my students for about an hour: once again, reading my code is much less valuable than comparing your own code with mine.\n\n`[One hour passes]`\n\nHow do I draw a triangle? Once again, if you have a better method, I’d be glad to adopt it. Let us assume that we have three points of the triangle: `t0`, `t1`, `t2`, they are sorted in ascending order by the y-coordinate. Then, the boundary A is between `t0` and `t2`, boundary B is between `t0` and `t1`, and then between `t1` and `t2`.\n\n```csharp\nvoid OrderByY (Vec2i[] t)\n{\n    if(t[0].y > t[1].y) Swap(t, 0, 1);\n    if(t[1].y > t[2].y) Swap(t, 1, 2);\n    if(t[0].y > t[1].y) Swap(t, 0, 1);   \n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    Line(image, t[0], t[1], Color.Green);\n    Line(image, t[1], t[2], Color.Green);\n    Line(image, t[2], t[0], Color.Red);    \n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\n// Here boundary A is red, and boundary B is green.\nimage.VerticalFlip ();\nimage\n```\n\nUnfortunately, boundary B is made of two parts. Let us draw the bottom half of the triangle by cutting it horizontally:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        image[A.x, y] = Color.Red; \n        image[B.x, y] = Color.Green; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNote that the segments are not continuous. Last time when we drew straight lines we struggled to get continuous segments and here I did not bother with rotating the image (remember the xy swapping?). Why? We fill the triangles aftewards, that’s why. If we connect the corresponding pairs of points by horizontal lines, the gaps disappear:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        Line(image, A, B, Color.White);\n        image[B.x, y] = Color.Green; \n        image[A.x, y] = Color.Red; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNow, let us draw the second (upper) half of the triangle. We can do this by adding a second loop:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    \n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n    \n    float height_21 = t[2].y - t[1].y;\n    for(int y=t[1].y; y<=t[2].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[1].y) / height_21; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[1].x + (int)((t[2].x-t[1].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThis could be enough, but I dislike to see the same code twice. That is why we will make it a bit less readable, but more handy for modifications/maintaining:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    // I dont care about degenerate triangles\n    if(t[0].y == t[1].y && t[1].y == t[2].y)\n        return;\n\n    OrderByY(t);\n\n    float height_10 = t[1].y - t[0].y;\n    float total_height = t[2].y - t[0].y;\n    for(int i=0; i<total_height; i++) {\n        bool second_half = i > t[1].y - t[0].y || t[1].y == t[0].y;\n        float segment_height = second_half ? t[2].y-t[1].y : t[1].y-t[0].y;\n        var alpha = i / total_height;\n        // be careful with divisions by zero\n        var beta = (i - (second_half ? t[1].y-t[0].y : 0)) / segment_height;\n        Vec2i A = new Vec2i {\n            x = t[0].x + (int)((t[2].x-t[0].x)*alpha),\n            y = t[0].y + i\n        };\n        Vec2i B = new Vec2i {\n            x = second_half ? t[1].x + (int)((t[2].x-t[1].x)*beta) : t[0].x + (int)((t[1].x-t[0].x)*beta),\n            y = t[0].y + i\n        };\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, t[0].y + i] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\n# The method I adopt for my code\n\nWhile not being really complicated, the source code for the line sweeping is a bit messy. Moreover, it is really an old-school approach designed for mono-thread CPU programming. Let us take a look at the following pseudo-code:\n\n```csharp\n// triangle(Vec2i[] points) { \n//     Vec2i bbox[2] = find_bounding_box(points); \n//     for (each pixel in the bounding box) { \n//         if (inside(points, pixel)) { \n//             put_pixel(pixel); \n//         } \n//     } \n// }\n```\n\nDo you like it? I do. It is really easy to find a bounding box. It is certainly no problem to check whether a point belongs a 2D triangle (or any convex polygon).\n\n*Off Topic: if I have to implement some code to check whether a point belongs to a polygon, and this program will run on a plane, I will never get on this plane. Turns out, it is a surprisingly difficult task to solve this problem reliably. But here we just painting pixels. I am okay with that.*\n\nThere is another thing I like about this pseudocode: a neophyte in programming accepts it with enthusiasm, more experienced programmers often chuckle: “*What an idiot wrote it?*”. And an expert in computer graphics programming will shrug his shoulders and say: “*Well, that’s how it works in real life*”. Massively parallel computations in thousands of threads (i’m talking about regular consumer computers here) change the way of thinking.\n\nOkay, let us start: first of all we need to know what the [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) are. Given a 2D triangle ABC and a point P, all in old good Cartesian coordinates `(xy)`. Our goal is to find barycentric coordinates of the point P with respect to the triangle ABC. It means that we look for three numbers `(1 − u − v,u,v)` such that we can find the point P as follows:\n\n![ ](./img/lesson2_f1.png)\n\nWhile being a bit frightening at the first glance, it is really simple: imagine that we put three weights `(1−u−v,u,v)` at the vertices A, B and C, respectively. Then the barycenter of the system is exactly in the point P. We can say the same thing with other words: the point P has coordinates `(u,v)` in the (oblique) basis (A,![](./img/lesson2_ab.png),![](./img/lesson2_ac.png)):\n\n![ ](./img/lesson2_f2.png)\n\nSo, we have vectors ![](./img/lesson2_ab.png)￼, ![](./img/lesson2_ac.png)￼ and ![￼](./img/lesson2_ap.png), we need to find two real numbers u and v respecting the following constraint:\n\n![ ](./img/lesson2_f3.png)\n\nIt is a simple vector equation, or a linear system of two equations with two variables:\n\n![ ](./img/lesson2_f4.png)\n\nI am lazy and do not want to solve linear systems in a scholar way. Let us write it in matrix form:\n\n![ ](./img/lesson2_f5.png)\n\nIt means that we are looking for a vector `(u,v,1)` that is orthogonal to `(￼ABx,AC￼x,￼PAx)` and `(￼ABy,AC￼y,PA￼y)` *at the same time*! I hope you see [where I am heading](https://en.wikipedia.org/wiki/Cross_product). That is a small hint: to find an intersection of two straight lines in a plane (that is exactly what we did here), it is sufficient to compute one cross product. By the way, test yourself: how do we find an equation of a line passing through two given points?\n\nSo, let us program our new rasterization routine: we iterate through all pixels of a bounding box for a given triangle. For each pixel we compute its barycentric coordinates. If it has at least one negative component, then the pixel is outside of the triangle. Probably it is more clear to see the program directly:\n\n```csharp\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}\n```\n\n# Flat shading render\n\nWe already know how to draw a model with empty triangles. Let us fill them with a random color. This will help us to see how well we have encoded filling of triangles. Here is the code:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\n// Map world coordinates [-1..-1] to screen coordinates [0..width]\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*image.Width/2),\n    y = (int)((v.y+1)*image.Height/2)\n};\n\nvar rnd = new Random();\nFunc<byte> rndByte = () => (byte)rnd.Next(255);\nFunc<Color> rndColor = () => new Color(rndByte(), rndByte(), rndByte()); \n\nvar coordinates = new Vec3f[3];\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        var v = headModel.Vertices[vIndex];\n        coordinates[i] = map(v);\n    }    \n    Triangle(image, coordinates, rndColor());\n}\n\nimage.VerticalFlip ();\nimage\n```\n\nLet us get rid of these clown-colors and put some lighting. Captain Obvious: ”*At the same light intensity, the polygon is illuminated most brightly when it is orthogonal to the light direction.*”\n\nLet us compare:\n\n![ ](./img/lesson2_light1.jpeg)\n\n![](./img/lesson2_light2.jpeg)\n\nWe get zero illumination if the polygon is parallel to the vector of light. To paraphrase: the intensity of illumination is equal to the scalar product of the light vector and the normal to the given triangle. The normal to the triangle can be calculated simply as the [cross product](https://en.wikipedia.org/wiki/Cross_product) of its two sides.\n\nAs a side note, at this course we will perform linear computations on the colors. However `(128,128,128)` color is not half as bright as `(255, 255, 255)`. We are going to ignore gamma correction and tolerate the incorrectness of the brightness of our colors.\n\n```csharp\nvar image = new Image (width, height, Format.BGR);\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\nforeach (var face in headModel.Faces) {\n    for (int i = 0; i < 3; i++) {\n        var vIndex = face.Vertices [i];\n        world [i] = headModel.Vertices [vIndex];\n        screen [i] = map (world [i]);\n    }\n\n    var n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n    var intensivity = Dot (n, light_dir);\n    if (intensivity > 0)\n        Triangle (image, screen, Color.White * intensivity);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson3.csx",
    "content": "using static Geometry;\n\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nfloat [] InitZBuffer (Image image)\n{\n\tvar zbuffer = new float [image.Width * image.Height];\n\tfor (int idx = 0; idx < zbuffer.Length; idx++)\n\t\tzbuffer [idx] = float.NegativeInfinity;\n\treturn zbuffer;\n}\n\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n\tvar ab = b - a;\n\tvar ac = c - a;\n\tvar pa = a - p;\n\n\tvar r = Cross (new Vec3f {\n\t\tx = ab.x,\n\t\ty = ac.x,\n\t\tz = pa.x\n\t}, new Vec3f {\n\t\tx = ab.y,\n\t\ty = ac.y,\n\t\tz = pa.y\n\t});\n\n\t// triangle is degenerate, in this case return smth with negative coordinates\n\t// dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n\tif ((int)r.z == 0)\n\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\treturn new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n\tVec3f t0 = coordinates [0];\n\tVec3f t1 = coordinates [1];\n\tVec3f t2 = coordinates [2];\n\n\tvar pMax = new Vec2i {\n\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t};\n\tvar pMin = new Vec2i {\n\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t};\n\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\tx = x + 0.5f,\n\t\t\t\ty = y + 0.5f\n\t\t\t};\n\t\t\tvar bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\tcontinue;\n\n\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\tvar u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n\t\t\tvar v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\tzbuffer [idx] = z;\n\n\t\t\t\tvar color = texture [u, v];\n\t\t\t\timage [x, y] = color * intensivity;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson3.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\nusing static Geometry;\n```\n\n# **Lesson 3: Hidden faces removal (z buffer)**\n\n# Introduction\n\nHello, let me introduce you my friend z-buffer of a black guy. He will help us get rid of the visual artifacts of the hidden faces removal we had during the last lesson.\n\n![](./img/lesson3_face1.png)\n\nBy the way, i'd like to mention that this model i use heavily in the course is created by [Vidar Rapp](https://se.linkedin.com/in/vidarrapp). He kindely granted me a permission to use it for teaching rendering basics and i vandalized it, but i promise you to give back the eyes to the guy.\n\nWell, back to the topic, in theory we could just draw all the triangles without discarding any. If we do it properly starting rear-to-front, the front facets will erase the back ones. It is called the [painter's algorithm](http://en.wikipedia.org/wiki/Painter%27s_algorithm). Unfortunately, it comes along with a high computational cost: for each camera movement we need to re-sort all the scene. And then there are dynamic scenes... And this is not even the main problem. The main problem is it is not always possible to determine the correct order.\n\n# **Let us try to render a simple scene**\n\nImagine a simple scene made of three triangles: the camera looks up-to-down, we project the colored triangles onto the white screen:\n\n![ ](./img/lesson3_scene1.png)\n\nThe render should look like this:\n\n![ ](./img/lesson3_scene2.png)\n\nBlue facet - is it behind or in front of the red one? The painter's algorithm does not work here. It is possible to split blue facet in two (one in front of the red facet and one behind). And then the one in front of the red one is to be split in two - one in front of the green triangle and one behind... I think you get the problem: in scenes with millions of triangles it is really expensive to compute. It is possible to use [BSP trees](https://en.wikipedia.org/wiki/Binary_space_partitioning) to get it done. By the way, this data structure is constant for moving camera, but it is really messy. And the life is too short to get it messy.\n\n# **Even simpler: let us lose a dimension. Y-buffer!**\n\nLet us lose a dimension for a while and to cut the above scene along the yellow plane:\n\n![ ](./img/lesson3_scene3.png)\n\nI mean, now our scene is made of three line segments (intersection of the yellow plane and each of the triangles), and the final render has a normal width but 1 pixel height:\n\n![ ](./img/lesson3_scene4.png)\n\nOur scene is two-dimensional, so it is easy to draw it using the line() function we programmed in the very first lesson.\n\n```csharp\nvar scene = new Image (800, 500, Format.BGR);\n\n// scene \"2d mesh\"\nLine(scene, new Vec2i {x=20, y=34}, new Vec2i {x=744, y=400}, Color.Red);\nLine(scene, new Vec2i {x=120, y=434}, new Vec2i {x=444, y=400}, Color.Green);\nLine(scene, new Vec2i {x=330, y=463}, new Vec2i {x=594, y=200}, Color.Blue);\n\n// screen line\nLine(scene, new Vec2i {x=10, y=10}, new Vec2i{x=790, y=10}, Color.White);\n\nscene.VerticalFlip(); // I want to have the origin at the left bottom corner of the image\nscene // This is how our 2D scene looks like if we look at it sideways:\n```\n\nLet us render it. Recall that the render is 1 pixel height. In my source code I create images 16 pixels height for the ease of reading on high resolution screens. `Rasterize()` function writes only in the first line of the image `render`\n\n```csharp\nvoid Rasterize(Image image, Vec2i p0, Vec2i p1, int[] ybuffer, Color color)\n{\n    if (p0.x>p1.x)\n        Swap(ref p0, ref p1);\n    \n    for (int x=p0.x; x<=p1.x; x++) {\n        float t = (x-p0.x)/(float)(p1.x-p0.x);\n        var y = (int)(p0.y*(1-t) + p1.y*t);\n        if (ybuffer[x] < y) {\n            ybuffer[x] = y;\n            image[x, 0] = color;\n        }\n    }\n}\n\nvar ybuffer = new int [width];\nfor (int i = 0; i < width; i++)\n    ybuffer[i] = int.MinValue;\n\nvar render = new Image (width, 16, Format.BGR);\nRasterize(render, new Vec2i{x=20,y=34}, new Vec2i{x=744, y=400}, ybuffer, Color.Red);\nRasterize(render, new Vec2i{x=120, y=434}, new Vec2i{x=444,y=400}, ybuffer, Color.Green);\nRasterize(render, new Vec2i{x=330, y=463}, new Vec2i{x=594,y=200}, ybuffer, Color.Blue);\n\nrender\n```\n\nIt is really-really simple: I iterate through all x-coordinates between `p0.x` and `p1.x` and compute the corresponding y-coordinate of the segment. Then I check what we got in our array `ybuffer` with current `x` index. If the current `y`-value is closer to the camera than the value in the `ybuffer`, then I draw it on the screen and update the `ybuffer`.\n\nLet us see it step-by-step. After calling `Rasterize()` on the first (red) segment this is our memory:\n\nscreen:![](./img/lesson3_rasterize1.png)\n\nybuffer: ![ ](./img/lesson3_rasterize2.png)\n\nHere the magenta color indicates the minus infinity, those are places corresponding to the screen we did not touch. All the rest is shown in the shades of gray: clear colors are close to the camera, dark colors far from the camera.\n\nThen we draw the green segment.\n\nscreen:![ ](./img/lesson3_rasterize3.png)\n\nybuffer:![ ](./img/lesson3_rasterize4.png)\n\nAnd finally the blue one.\n\nscreen:![ ](./img/lesson3_rasterize5.png)\n\nybuffer:![ ](./img/lesson3_rasterize6.png)\n\nCongratulations, we just drew a 2D scene on a 1D screen! Let us admire once again the render: ![ ](./img/lesson3_rasterize7.png)\n\n# Back to 3D\n\nSo, for drawing on a 2D screen the z-buffer must be two-dimensional:\n\n`var zbuffer = new int[width * height];`\n\nPersonally I pack a two-dimensional buffer into a one-dimensional, the conversion is trivial:\n\n`var idx = x + y* width;`\n\nand the back one:\n\n`var x = idx % width;`\\\n`var y = idx % width;`\n\nThen in the code I simply iterate through all the triangles and call the rasterizer function with current triangle and a reference to the z-buffer.\n\nThe only difficulty is how to compute the z-value of a pixel we want to draw. Let us recall how we computed the y-value in the y-buffer example:\n\n`int y = p0.y*(1-t) + p1.y*t;`\n\nWhat is the nature of the `t` variable? It turns out that `(1-t, t)` are barycentric coordinates of the point `(x,y)` with respect to the segment `p0, p1: (x,y) = p0*(1-t) + p1*t`. So the idea is to take the barycentric coordinates version of triangle rasterization, and for every pixel we want to draw simply to multiply its barycentric coordinates by the z-values of the vertices of the triangle we rasterize:\n\n```csharp\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - p;\n\n    var r = Cross (new Vec3f {\n        x = ab.x,\n        y = ac.x,\n        z = pa.x\n    }, new Vec3f {\n        x = ab.y,\n        y = ac.y,\n        z = pa.y\n    });\n\n    // triangle is degenerate, in this case return smth with negative coordinates\n    // dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n    if ((int)r.z == 0)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n    return new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D (t0), Project2D (t1), Project2D (t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n\nfloat [] InitZBuffer (Image image)\n{\n    var zbuffer = new float [image.Width * image.Height];\n    for (int idx = 0; idx < zbuffer.Length; idx++)\n        zbuffer [idx] = float.NegativeInfinity;\n    return zbuffer;\n}\n\nvar image = new Image(width, height, Format.BGR);\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*(image.Width-1)/2 + 0.5f),\n    y = (int)((v.y+1)*(image.Height-1)/2 + 0.5f),\n    z = v.z\n};\n\nvar zbuffer = InitZBuffer(image);\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = headModel.Vertices[vIndex];\n        screen[i] = map(world[i]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, Color.White * intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Okay, we just interpolated the z-values. What else can we do?\n\nTexture!\n\nIn the `.obj` file we have lines starting with `vt u v`, they give an array of texture coordinates. The number in the middle (between the slashes) in the facet lines\\\n`f x/x/x x/x/x x/x/x` are the texture coordinates of this vertex of this triangle. Interpolate it inside the triangle, multiply by the width-height of the texture image and you will get the color to put in your render.\n\n```csharp\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n            var v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n\n                var color = texture [u, v];\n                image [x, y] = color * intensivity;\n            }\n        }\n    }\n}\n\nvar image = new Image(width, height, Format.BGR);\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nFunc<Vec3f, Vec2f> uvMap = v => new Vec2f {\n    x = v.x * (headTexture.Width - 1),\n    y = v.y * (headTexture.Height - 1)\n}; \n\nvar zbuffer = InitZBuffer(image);\nvar uv = new Vec2f[3];\nvar model = headModel;\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson4.csx",
    "content": "Vec2f[] uv = new Vec2f [3];\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n\tx = v.x * (texture.Width - 1),\n\ty = v.y * (texture.Height - 1)\n};\n\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n\tvar depth = 255f;\n\n\tvar m = Matrix4.Identity ();\n\tm [0, 3] = x + w / 2f;\n\tm [1, 3] = y + h / 2f;\n\tm [2, 3] = depth / 2f;\n\n\tm [0, 0] = w / 2f;\n\tm [1, 1] = h / 2f;\n\tm [2, 2] = depth / 2f;\n\treturn m;\n}\n\nMatrix4 Projection (float coeff)\n{\n\tvar projection = Matrix4.Identity ();\n\tprojection [3, 2] = coeff;\n\treturn projection;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson4.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 4: Perspective projection**\n\n# The goal\n\nIn previous lessons we rendered our model in orthographic projection by simply forgetting the z-coordinate. The goal for today is to learn how to draw in perspective:\n\n![  ](./img/lesson4_the_goal.png)\n\n# 2D geometry: Linear transformations\n\nA linear transformation on a plane can be represented by a corresponding matrix. If we take a point `(x,y)` then its transformation can be written as follows:\n\n![  ](./img/lesson4_formula1.svg)\n\nThe simplest (not degenerate) transformation is the identity, it does not move any point:\n\n![  ](./img/lesson4_formula_2d_identity.svg)\n\nDiagonal coefficients of the matrix give scaling along coordinate axes. Let us illustrate it, if we take the following transformation:\n\n![  ](./img/lesson4_formula_2d_scale.svg)\n\nThen the white object (the white square with one corner chopped) will be transformed into the yellow one. Red and green line segments give unit length vectors aligned with `x` and `y`, respectively. All the images for this article were generated using this code:\n\n```csharp\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n\nMatrix4 Projection (float coeff)\n{\n    var projection = Matrix4.Identity ();\n    projection [3, 2] = coeff;\n    return projection;\n}\n\nVec4f Embed4D (Vec3f v, float fill = 1)\n{\n    return new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n}\n\nVec3f Project3D (Vec4f v)\n{\n    return new Vec3f { x = v.x, y = v.y, z = v.z };\n}\n\nFunc<Vec4f, Vec3f> map = v => Project3D(v/v.h);\nvoid RenderAxes (Image image)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n\n    // draw the axes\n    var x = new Vec3f { x = 1 };\n    var y = new Vec3f { y = 1 };\n    var o = new Vec3f ();\n    o = map(Mult(vp, Embed4D(o)));\n    x = map(Mult(vp, Embed4D(x)));\n    y = map(Mult(vp, Embed4D(y)));\n    Line(image, o, x, Color.Red);\n    Line(image, o, y, Color.Green);\n}\n\nvar cube = Model.FromFile(\"obj/cube.obj\");\nvoid RenderCube(Image image, Matrix4 deformation, Color color)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n    var face = cube.Faces[0];\n    var faceLen = face.Vertices.Length;\n\n    for(int j=0; j<faceLen; j++) {\n        var wp0 = cube.Vertices[face.Vertices [j]];\n        var wp1 = cube.Vertices[face.Vertices [(j+1) % faceLen]];\n\n        var sp0 = map(Mult(vp*deformation, Embed4D(wp0)));\n        var sp1 = map(Mult(vp*deformation, Embed4D(wp1)));\n        Line(image, sp0, sp1, color);\n    }\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Zoom(1f), color: Color.White);\n// draw the deformed model\nRenderCube(image, deformation: Matrix4.Zoom(1.5f), color: Color.Yellow); \n\nimage.VerticalFlip ();\nimage\n```\n\nWhy do we bother with matrices? Because it is handy. First of all, in matrix form we can express a transformation of the entire object like this:\n\n![  ](img/lesson4_formula_2d_scale32.svg)\n\nIn this expression the transformation matrix is the same as in the previous one, but the 2x5 matrix is nothing else but the vertices of our squarish object. We simply took all the vertices in an array, multiplied it by the transformation matrix and obtained the transformed object. Cool, is not it?\n\nWell, the true reason hides here: very, very often we wish to transform our object with many transformations in a row. Imagine that in your source code you write transformation functions like:\n\n```csharp\n// vec2 foo(vec2 p) return vec2(ax+by, cx+dy);\n// vec2 bar(vec2 p) return vec2(ex+fy, gx+hy);\n// [..]\n// for (each p in object) {\n//     p = foo(bar(p));\n// }\n```\n\nThis code performs two linear transformations for each vertex of our object, and often we count those vertices in millions. And tens of transformations in a row is not a rare case, resulting in tens millions of operations, really expensive. In matrix form we can pre-multiply all the transformation matrices and to transform our object one time. For an expression with multiplications only we can put parentheses where we want, can we?\n\nOkay, let us continue. We know that diagonal coefficients of the matrix scale our world along the coordinate axes. What other coefficients are responsible for? Let us consider the following transformation:\n\n![  ](./img/lesson4_formula_2d_tr_example1.svg)\n\nHere is its action on our object:\n\n```csharp\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Identity(), color: Color.White);\n\nvar deformation = Matrix4.Identity ();\ndeformation[0, 1] = 1/3f;\nRenderCube(image, deformation, Color.Yellow); // draw the deformed model\n\nimage.VerticalFlip();\nimage\n```\n\nIt is a simple shearing along the x-axis. Another anti-diagonal element shears our space along the y-axis. Thus, there are two base linear transformations on a plane: scaling and shearing. Many readers react: wait, what about rotations?!\n\nIt turns out that any rotation (around the origin) can be represented as a composite action of three shears, here the white object is transformed to the red one, then to the green one and finally to the blue:\n\n![](./img/lesson4_formula_rotation.png)\n\nBut those are intricate details, to keep the things simple, a rotation matrix can be written directly (do you remember the pre-multiplication trick?):\n\n![  ](img/lesson4_formula_rotation.svg)\n\nWe can multiply the matrices in any order, but let us remember that the multiplication for matrices is not commutative:\n\n![  ](img/lesson4_formula_noncomutative.svg)\n\nIt makes sense: to shear an object and then to rotate it is not the same as to rotate it and then to shear it!\n\n```csharp\nfloat DegToRad (float degAngle)\n{\n    return degAngle * (float)Math.PI / 180;\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nvar angle = DegToRad(30);\n\nvar rotation = Matrix4.RotationZ(angle);\nvar shear = Matrix4.Identity ();\nshear[0, 1] = 1/3f;\n\nRenderCube(image, deformation: rotation * shear, color: Color.Green);\nRenderCube(image, deformation: shear * rotation, color: Color.Red);\n\nimage.VerticalFlip();\nimage\n```\n\n# 2D affine transformations\n\nSo, any linear transformation on a plane is a composition of scale and shear transformations. And it means that we can do any linear transformation we want, the origin wont ever move! Those possibilities are great, but if we can not perform simple translations, our life will be miserable. Can we? Okay, translations are not linear, no problem, let us try to append translations after performing the linear part:\n\n![  ](./img/lesson4_formula_translation.svg)\n\nThis expression is really cool, we can rotate, we can scale, shear and translate. However. Let us recall that we are interested in composing multiple transformation, here is what a composition of two transformations look like (remember, we need to compose dozes of those?):\n\n![  ](./img/lesson4_formula_composition.svg)\n\nIt is starting to look ugly even for a single composition, add more and things get even worse.\n\n# Homogeneous coordinates\n\nOkay, now it is the time for the black magic. Imagine that i add one column and one row to our transformation matrix (thus making it 3x3) and append one coordinate always equal to 1 to our vector to be transformed:\n\n![  ](./img/lesson4_formula_3d.svg)\n\nIf we multiply this matrix and the vector augmented by 1 we get another vector with 1 in the last component, but the other two components have exactly the shape we would like! Magic.\n\nIn fact, the idea is really simple. Parallel translations are not linear in the 2D space. So we embed our 2D into 3D space (by simply adding 1 for the 3rd component). It means that our 2D space is the plane z=1 in the 3D space. Then we perform a linear 3D transformation and project the result onto our 2D physical plane. Parallel translations have not become linear, but the pipeline is simple.\n\nHow do we project 3D back onto the 2D plane? Simply by dividing by the 3d component:\n\n![  ](./img/lesson4_formula_project.svg)\n\n## Wait a second, it is forbidden to divide by zero!\n\nWho said this? \\[Shoots\\] Let us recall the pipeline:\n\n* We embed 2D into 3D by putting it inside the plane z=3\n\n* We do whatever we want in 3d\n\n* For every point we want to project from 3D into 2D we draw a straight line between the origin and the point to project and then we find its intersection with the plane z=1.\n\nIn this image our 2D plane is in magenta, the point `(x,y,z)` is projected onto `(x/z, y/z)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nLet us imagine a vertical rail through the point `(x,y,1)`. Where will be projected the point `(x,y,1)`? Doh, onto `(x,y)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nNow let us descend on the rail, for example, the point `(x,y,1/2)` is projected onto `(2x, 2y)`:\n\n![](./img/lesson4_sketch3.png)\n\nLet us continue, point `(x,y,1/4)` becomes `(4x, 4y)`:\n\n![](./img/lesson4_sketch4.png)\n\nIf we continue the process, approaching to `z=0`, then the projection goes farther from the origin in the direction `(x,y)`. In other words, point `(x,y,0)` is projected onto an infinitely far point in the direction `(x,y)`. What is it? Right, it is simply a vector!\n\nHomogeneous coordinates allow to distinguish between a vector and a point. If a programmer writes `vec2(x,y)`, is it a vector or a point? Hard to say. In homogeneous coordinates all things with `z=0` are vectors, all the rest are points. Look: `vector + vector = vector`. `vector - vector = vector`. `point + vector = point`. Great, is not it?\n\n## A composite transformation\n\nAs i said before, we should be able to accumulate dozens of transformations. Why? Let us imagine we need to rotate an object (2D) around a point `(x0,y0)`. How to do it? Well, we could look up for formulas somewhere, or we can do it by hand, we have all the tools we need!\n\nWe know to rotate around the origin, we know how to translate. It is all we need: translate `(x0,y0)` into the origin, rotate, un-translate, done:\n\n![  ](img/lesson4_formula_rotate_xy.svg)\n\nIn 3D sequences of actions will be a bit longer, but the idea is the same: we need to know few basic transformations and with their aid we can represent any composed action.\n\n# Wait a minute, may I touch this magical bottom row of the 3x3 matrix?\n\nSure thing! Let us apply the following transformation to our standard squarish object:\n\n![  ](./img/lesson4_matrix_third_line.svg)\n\nRecall that the original object is in white, unit axis vectors are in red and green:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nimage.VerticalFlip ();\nimage\n```\n\nHere is the transformed object:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\n\nvar deformation = Matrix4.Identity ();\ndeformation[3, 0] = -1/5f;\nRenderCube(image, deformation, color: Color.Red);\n\nimage.VerticalFlip ();\nimage\n```\n\nAnd here another kind of magic (white!) happens. Do you remember our y-buffer exercise? Here we will do the same: we project our 2D object onto the vertical line `x=0`. Let us harden the rules a bit: we have to use a central projection, our camera is in the point `(5,0)` and is pointed onto the origin. To find the projection we need to trace straight lines between the camera and the points to be projected (yellow) and to find the intersection with the screen line (white vertical).\n\n![  ](./img/lesson4_sketch5.png)\n\nNow i replace the original object with the transformed one, but i do not touch the yellow lines we drew before:\n\n![  ](./img/lesson4_sketch6.png)\n\nIf we project the red object onto the screen using **standard orthogonal projection**, then we find exactly the same points! Let us look closely how the transformation works: all vertical segments are transformed into vertical segments, but those close to the camera are stretched and those far from the camera are shrunk. If we choose the coefficient correctly (in our transformation matrix it is the -1/5 coefficient), we obtain an image in perspective (central) projection!\n\n# Time to work in full 3D\n\nLet us explain the magic. As for 2D affine transformations, for 3D affine transformations we will use homogeneous coordinates: a point `(x,y,z)` is augmented with 1`(x,y,z,1)`, then we transform it in 4D and project back to 3D. For example, if we take the following transformation:\n\n![  ](./img/lesson4_formula_4d_1.svg)\n\nThe retro-projection gives us the following 3D coordinages:\n\n![  ](./img/lesson4_formula_central_project.svg)\n\nLet us remember this result, but put it aside for a while. Let us return to the standard definition of the central projection, without any fancy stuff as 4D transformations. Given a point `P=(x,y,z)` we want to project it onto the plane z=0, the camera is on the z-axis in the point `(0,0,c)`:\n\n![](./img/lesson4_sketch7.png)\n\nTriangles ABC and ODC are similar. It means that we can write the following: |AB|/|AC|=|OD|/|OC| => x/(c-z) = x'/c. In other words:\n\n![ ](./img/lesson4_formula_x.svg)\n\nBy doing the same reasoning for triangles CPB and CP'D, it is easy to find the following expression:\n\n![](./img/lesson4_formula_y.svg)\n\nIt is really similar to the result we put aside few moments ago, but there we got the result by a single matrix multiplication. We got the law for the coefficient: `r = -1/c`\n\n# Let us sum up: the main formula for today\n\n*If you simply copy-paste this formula without understanding the above material, I hate you.*\n\nSo, if we want to compute a central projection with a camera **(important!) camera located on the z-axis with distance c from the origin**, then we embed the point into 4D by augmenting it with 1, then we multiply it with the following matrix, and retro-project it into 3D.\n\n![  ](./img/lesson4_formula_last.svg)\n\nWe deformed our object in a way, that simply forgetting its z-coordinate we will get a drawing in a perspective. If we want to use the z-buffer, then, naturally, do not forget the z:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\nvar camera = new Vec3f { z = 3 };\nvar projection = Projection(-1/camera.z);\nvar viewPort   = Viewport(width/8, height/8, width*3/4, height*3/4);\n\nFunc<Vec3f, Vec3f> map = v => {\n    var r4 = Mult (viewPort * projection, Embed4D (v));\n    var r = Project3D (r4 / r4.h);\n    r.x = (int)(r.x + 0.5f);\n    r.y = (int)(r.y + 0.5f);\n    return r;\n};\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n    x = v.x * (texture.Width - 1),\n    y = v.y * (texture.Height - 1)\n};\n\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nVec2f[] uv = new Vec2f [3];\n\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson5.csx",
    "content": "using static Geometry;\n\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n\tvar z = (eye - center).Normalize ();\n\tvar x = Cross (up, z).Normalize ();\n\tvar y = Cross (z, x).Normalize ();\n\n\tvar Minv = Matrix4.Identity ();\n\tMinv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n\tMinv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n\tMinv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n\tvar Tr = Matrix4.Identity ();\n\tTr [0, 3] = -center.x;\n\tTr [1, 3] = -center.y;\n\tTr [2, 3] = -center.y;\n\n\treturn Minv * Tr;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson5.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# Lesson 5: Moving the camera\n\n# Change of basis in 3D space\n\nIn Euclidean space coordinates can be given by a point (the origin) and a basis. What does it mean that point P has coordinates `(x,y,z)` in the frame `(O, i,j,k)`? It means that the vector OP can be expressed as follows:\n\n![  ](./img/lesson5_basis.svg)\n\nNow image that we have another frame `(O', i',j',k')`. How do we transform coordinates given in one frame to another? First of all let us note that since `(i,j,k)` and `(i',j',k')` are bases of 3D, there exists a (non degenerate) matrix M such that:\n\n![  ](./img/lesson5_new_basis.svg)\n\nLet us draw an illustration:\n\n![](./img/lesson5_sketch1.png)\n\nThen let us re-express the vector OP:\n\n![  ](./img/lesson5_change_basis1.svg)\n\nNow let us substitute `(i',j',k')` in the right part with the change of basis matrix:\n\n![  ](./img/lesson5_change_basis2.svg)\n\nAnd it gives us the formula to transform coordinates from one frame to another:\n\n![  ](./img/lesson5_change_basis3.svg)\n\n# Let us create our own gluLookAt\n\nOpenGL and, as a consequence, our tiny renderer are able to draw scenes **only with the camera located on the z-axis.** If we want to move the camera, no problem, we can move all the scene, leaving the camera immobile.\n\nLet us put the problem this way: we want to draw a scene with a camera situated in point **e**(eye), the camera should be pointed to the point **c** (center) in such way that a given vector **u**(up) is to be vertical in the final render.\n\nHere is an illustration:\n\n![  ](./img/lesson5_change_basis4.png)\n\n```csharp\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n    var z = (eye - center).Normalize ();\n    var x = Cross (up, z).Normalize ();\n    var y = Cross (z, x).Normalize ();\n\n    var Minv = Matrix4.Identity ();\n    Minv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n    Minv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n    Minv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n    var Tr = Matrix4.Identity ();\n    Tr [0, 3] = -center.x;\n    Tr [1, 3] = -center.y;\n    Tr [2, 3] = -center.y;\n\n    return Minv * Tr;\n}\n```\n\nNote that `z'` is given by the vector **`ce`** (do not forget to normalize it, it helps later). How do we compute `x'`? Simply by a cross product between **`u`** and **`z'`**. Then we compute `y'`, such that it is orthogonal to already calculated `x'` and `z'` (let me remind you that in our problem settings \\*\\*`ce` \\*\\*and **`u`** are not necessarily orthogonal). The very last step is a translation of the origin to the center **c** and our transformation matrix is ready. Now it suffices to get any point with coordinates `(x,y,z,1)` in the model frame, multiply it by the matrix ModelView and we get the coordinates in the camera frame! By the way, the name ModelView comes from OpenGL terminology.\n\n# Viewport\n\nIf you followed this course from the beginning, you should remember strange lines like this one:\n\n```csharp\n// x = (v.x+1)*(width-1)/2\n// y = (v.y+1)*(height-1)/2\n```\n\nWhat does it mean? It means that i have a point Vec2f v, it belongs to the square \\[-1,1\\]\\*\\[-1,1\\]. I want to draw it in the image of (width, height) dimensions. Value (v.x\\+1) is varying between 0 and 2, (v.x\\+1)/2 between 0 and 1, and (v.x\\+1)\\*width/2 sweeps all the image. Thus we effectively mapped the bi-unit square onto the image.\n\nBut now we are getting rid of these ugly constructs, and i want to rewrite all the computiations in the matrix form. Let us consider the following C# code:\n\n```csharp\n/*\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n*/\n```\n\nThis code creates this matrix:\n\n![  ](./img/lesson5_viewport.svg)\n\nIt means that the bi-unit cube \\[-1,1\\]*\\[-1,1\\]*\\[-1,1\\] is mapped onto the screen cube \\[0,w\\]*\\[0,h\\]*\\[0,d\\]. Right, cube, and not a rectangle, this is because of the depth computations with the z-buffer. Here d is the resolution of the z-buffer. I like to have it equal to 255 because of simplicity of dumping black-and-white images of the z-buffer for debugging.\n\nIn the OpenGL terminology this matrix is called viewport matrix.\n\n# Chain of coordinate transformations\n\nSo, let us sum up. Our models (characters, for example) are created in their own local frame (**object coordinates**). They are inserted into a scene expressed in **world coordinates**. The transformation from one to another is made with matrix **Model**. Then, we want to express it in the camera frame (**eye coordinates**), the transformation is called **View**. Then, we deform the scene to create a perspective deformation with **Projection** matrix (lesson 4), this matrix transforms the scene to so-called **clip coordinates**. Finally, we draw the scene, and the matrix transforming clip coordinates to the **screen coordinates** is called **Viewport**.\n\nAgain, if we read a point **v** from the .obj file, then to draw it on the screen it undergoes the following chain of transformations:\n\nViewport \\* Projection \\* View \\* Model \\* v\n\nAs i draw a single object only, the matrix Model is equal to identity, and i merged it with the matrix View:\n\n```csharp\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n// draw the model\nvar modelView  = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1/(eye-center).Norm());\n\nFunc<Vec3f, Vec3f> map = v => {\n\tvar r4 = Mult (viewPort * projection * modelView, Embed4D (v));\n\tvar r = Project3D (r4 / r4.h);\n\tr.x = (int)(r.x + 0.5f);\n\tr.y = (int)(r.y + 0.5f);\n\treturn r;\n};\n\nvar image = new Image(width, height, Format.BGR);\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Transformation of normal vectors\n\nThere is a widely-known fact:\n\n* If we have a model and its normal vectors are given by the artist AND this model is transformed with an affine mapping, then normal vectors are to be transformed with a mapping, equal to the transposition of the inverse matrix of the original mapping matrix\n\nWhat-what-what?! I met quite a few programmers who know this fact, but it remains a black magic for them. In fact, it is not so complicated. Take a pencil and draw a 2D triangle `(0,0)`, `(0,1)`, `(1,0)` and a vector **n**, normal to the hypothenuse. Naturally, **n** is equal to `(1,1)`. Then let us stretch all the y-coordinates by a factor of 2, leaving x-coordinates intact. Thus, our triangle becomes `(0,0)`, `(0,2)`, `(1,0)`. If we transform the vector **n** in the same way, it becomes `(1, 2)` and it is no longer orthogonal to the transformed edge of the triangle.\n\nThus, to remove all the black magic fog, we need to understand one simple thing: **we do not need to simply transform normal vectors (as they can become not normal anymore), we need to compute (new) normal vectors to the transformed model.**\n\nBack to 3D, we have a vector **n** = (A,B,C). We know that the plane passing through the origin and having **n** for its normal, has an equation `Ax+By+Cz=0`. Let us write it in the matrix form (i do it in homogeneous coordinates from the beginning):\n\n![  ](./img/lesson5_transform_normal1.png)\n\nRecall that `(A,B,C)` - is a vector, so we augment it with 0 when embedding into the 4D, and `(x,y,z)` is augmented with 1 since it is a point.\n\nLet us insert an identity matrix in between (inverse to M multiplied by M is equal to identity):\n\n![  ](./img/lesson5_transform_normal2.png)\n\nThe expression in right parentheses - are for the transformed points of the object. In the left - are for normal vectors to the transformed object! In standard convention we usually write coordinates as columns (please let us not raise all the stuff about contra- and co-variant vectors), so we can rewrite the previous expression as follows:\n\n![  ](./img/lesson5_transform_normal2.png)\n\nAnd the left parentheses tell us that a normal to the transformed object can be computed from the old normal by applying the inverse transpose matrix of the affine mapping.\n\nPlease note that if our transformation matrix M is a composition of uniform scalings, rotations and translations, then M is equal to its inverse transpose, since inverse and transpose are cancelling each other in this case. But since our matrices include perspective deformations, usually this trick does not help.\n\nIn the current code we do not use the transformation of normal vectors, but in the next lesson it will be very, very handy.\n\nHappy coding!\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson6.csx",
    "content": "using static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n\nvar diabloModel = Model.FromFile (\"obj/diablo3_pose.obj\");\nvar diabloTexture = Image.Load (\"obj/diablo3_pose_diffuse.tga\");\nvar diabloNormalMap = Image.Load (\"obj/diablo3_pose_nm.tga\");\nvar diabloTangentMap = Image.Load (\"obj/diablo3_pose_nm_tangent.tga\");\nvar diabloSpecularMap = Image.Load (\"obj/diablo3_pose_spec.tga\");\ndiabloTexture.VerticalFlip ();\ndiabloNormalMap.VerticalFlip ();\ndiabloTangentMap.VerticalFlip ();\ndiabloSpecularMap.VerticalFlip ();\n\nlight_dir = new Vec3f { x = 1, y = 1, z = 1 };\neye = new Vec3f { x = 1, y = 1, z = 3 };\ncenter = new Vec3f { x = 0, y = 0, z = 0 };\nup = new Vec3f { x = 0, y = 1, z = 0 };\n\nvar modelView = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1f/(eye-center).Norm());\n\ninterface IShader\n{\n\tVec4f Vertex (Face face, int nthvert);\n\tbool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n};\n\nclass RenderResult\n{\n\tpublic Image Image { get; set; }\n\tpublic float [] ZBuffer { get; set; }\n}\n\nRenderResult Render (Model model, IShader shader)\n{\n\tvar image = new Image (width, height, Format.BGR);\n\tvar zbuffer = InitZBuffer (image);\n\tvar screen_coords = new Vec4f [3];\n\n\tforeach (var face in model.Faces) {\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tscreen_coords [i] = shader.Vertex (face, i);\n\t\tTriangle (image, screen_coords, shader, zbuffer);\n\t}\n\n\treturn new RenderResult {\n\t\tImage = image,\n\t\tZBuffer = zbuffer\n\t};\n}\n\nvoid Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n{\n\tpMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n\tpMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n\tfor (int i = 0; i < 3; i++) {\n\t\tpMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n\t\tpMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n\t\tpMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n\t\tpMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n\t}\n}\n\nvoid Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n{\n\tVec2i pMin, pMax;\n\tBox (pts, out pMin, out pMax);\n\n\tColor color;\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n\t\t\tvar bc = Barycentric (Project2D (pts [0] / pts [0].h),\n\t\t\t\t\t\t\t\t  Project2D (pts [1] / pts [1].h),\n\t\t\t\t\t\t\t\t  Project2D (pts [2] / pts [2].h),\n\t\t\t\t\t\t\t\t  pixelCenter);\n\n\t\t\tvar z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n\t\t\tvar w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n\t\t\tvar frag_depth = z / w;\n\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n\t\t\t\tcontinue;\n\n\n\t\t\tvar fragment = new Vec3f { x = x, y = y, z = frag_depth };\n\t\t\tvar discard = shader.Fragment (fragment, bc, out color);\n\t\t\tif (!discard) {\n\t\t\t\tzbuffer [idx] = frag_depth;\n\t\t\t\timage [x, y] = color;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic class ShaderUtils\n{\n    public static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n    {\n        var v = model.Vertex (face, nthvert); // read the vertex from model\n        var glVertex = Embed4D (v);\n        return Mult (t, glVertex); // transform it to screen coordinates\n    }\n\n    public static void UpdateVarayingUV (Model model, Face face, int nthvert,\n                                         ref Vec3f varyingU, ref Vec3f varyingV)\n    {\n        var vt = model.GetUV (face, nthvert);\n        varyingU [nthvert] = vt.x;\n        varyingV [nthvert] = vt.y;\n    }\n\n    public static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n    {\n        return new Vec2f {\n            x = Dot (varU, bar),\n            y = Dot (varV, bar)\n        };\n    }\n\n    public static Color GetColor (Image texture, Vec2f uvf)\n    {\n        var uvi = CalcXY(texture, uvf);\n        return texture [uvi.x, uvi.y];\n    }\n\n    public static Vec3f Transform (Matrix4 t, Vec3f v)\n    {\n        var v4d = Mult (t, Embed4D (v));\n        return Project3D (v4d);\n    }\n\n    public static Vec3f Normal (Image normalMap, Vec2f uvf)\n    {\n        // RGB values as xyz. But Color stores data as BGR (zyx)\n        var c = GetColor (normalMap, uvf);\n\n        return new Vec3f {\n            x = (c [2] / 255f) * 2 - 1,\n            y = (c [1] / 255f) * 2 - 1,\n            z = (c [0] / 255f) * 2 - 1\n        };\n    }\n\n    public static float Specular (Image specularMap, Vec2f uvf)\n    {\n        var uvi = CalcXY (specularMap, uvf);\n        var color = specularMap [uvi.x, uvi.y];\n        return color[0];\n    }\n\n    public static Vec2i CalcXY (Image texture, Vec2f uvf)\n    {\n        return new Vec2i {\n            x = (int)(uvf.x * texture.Width),\n            y = (int)(uvf.y * texture.Height)\n        };\n    }\n}\n\nclass TextureShader : IShader\n{\n\treadonly Model model;\n\treadonly Vec3f lightDir;\n\treadonly Matrix4 transformation;\n\treadonly Image texture;\n\n\t// written by vertex shader, read by fragment shader\n\tVec3f varyingIntensity = new Vec3f ();\n\tVec3f varyingU = new Vec3f ();\n\tVec3f varyingV = new Vec3f ();\n\n\tpublic TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n\t{\n\t\tthis.model = model;\n\t\ttransformation = viewPort * projection * modelView;\n\t\tthis.lightDir = lightDir.Normalize ();\n\t\tthis.texture = texture;\n\t}\n\n\tpublic Vec4f Vertex (Face face, int nthvert)\n\t{\n\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n\t\tvar n = model.Normal (face, nthvert).Normalize ();\n\t\tvaryingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n\t\treturn TransformFace (model, face, nthvert, transformation);\n\t}\n\n\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t{\n\t\t// interpolate intensity for the current pixel\n\t\tvar intensity = Dot (varyingIntensity, bar);\n\n\t\t// interpolate uv for the current pixel\n\t\tvar uvf = CalcUV (varyingU, varyingV, bar);\n\n\t\tcolor = GetColor (texture, uvf) * intensity;\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson6.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 6: Shaders for the software renderer**\n\nRefactoring the source code. IShader.\n\n```csharp\ninterface IShader\n{\n    Vec4f Vertex (Face face, int nthvert);\n    bool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n};\n\nclass RenderResult\n{\n    public Image Image { get; set; }\n    public float [] ZBuffer { get; set; }\n}\n\nRenderResult Render (Model model, IShader shader)\n{\n    var image = new Image (width, height, Format.BGR);\n    var zbuffer = InitZBuffer (image);\n    var screen_coords = new Vec4f [3];\n\n    foreach (var face in model.Faces) {\n        for (int i = 0; i < 3; i++)\n            screen_coords [i] = shader.Vertex (face, i);\n        Triangle (image, screen_coords, shader, zbuffer);\n    }\n\n    return new RenderResult {\n        Image = image,\n        ZBuffer = zbuffer\n    };\n}\n\nvoid Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n{\n    pMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n    pMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n    for (int i = 0; i < 3; i++) {\n        pMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n        pMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n        pMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n        pMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n    }\n}\n\nvoid Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n{\n    Vec2i pMin, pMax;\n    Box (pts, out pMin, out pMax);\n\n    Color color;\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n            var bc = Barycentric (Project2D (pts [0] / pts [0].h),\n                                    Project2D (pts [1] / pts [1].h),\n                                    Project2D (pts [2] / pts [2].h),\n                                    pixelCenter);\n\n            var z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n            var w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n            var frag_depth = z / w;\n\n            var idx = x + y * image.Width;\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n                continue;\n\n\n            var fragment = new Vec3f { x = x, y = y, z = frag_depth };\n            var discard = shader.Fragment (fragment, bc, out color);\n            if (!discard) {\n                zbuffer [idx] = frag_depth;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n```\n\nLet us see how it works. The actual render code:\n\n* Parsing the .obj file\n\n* Iteration through all triangles of the model and rasterization of each triangle.\n\nThe last step is the most interesting. Outer loop iterates through all the triangles. Inner loop iterates through all the vertices of the current triangle and calls a vertex shader for each vertex.\n\n**The main goal of the vertex shader is to transform the coordinates of the vertices. The secondary goal is to prepare data for the fragment shader.**\n\nWhat happens after that? We call the rasterization routine. What happens inside the rasterizer we do not know (well, okay, we do know since we programmed it!) with one exception. We know that the rasterizer calls **our** routine for each pixel, namely, the fragment shader. Again, for each pixel inside the triangle the rasterizer calls our own callback, the fragment shader.\n\n**The main goal of the fragment shader - is to determine the color of the current pixel. Secondary goal - we can discard current pixel by returning true.**\n\nThe rendering pipeline for the OpenGL 2 can be represented as follows (in fact, it is more or less the same for newer versions too):\n\n![  ](./img/lesson6_opengl2_pipeline.png)\n\nBecause of the time limits I have for my course, I restrict myself to the OpenGL 2 pipeline and therefore to fragment and vertex shaders only. In newer versions of OpenGL there are other shaders, allowing, for example, to generate geometry on the fly.\n\nOkay, in the above image all the stages we can not touch are shown in blue, whereas our callbacks are shown in orange. In fact, our render code - is the \\*\\*primitive processing \\*\\*routine. It calls the vertex shader. We do not have primitive assembly here, since we are drawing dumb triangles only (in our code it is merged with the primitive processing). `Triangle` function - is the **rasterizer**, for each point inside the triangle it calls the **fragment shader**, then performs depth checks (z-buffer) and such.\n\nThat is all. You know what the shaders are and now you can create your own shaders.\n\n# **My implementation of shaders shown on Gouraud shading**\n\nAccording to its name, it is a Gouraud shader. Here is the code:\n\n```csharp\nusing static ShaderUtils;\n\nclass GouraudShader : IShader\n{\n    readonly Model model;\n    readonly Vec3f lightDir;\n\n    // written by vertex shader, read by fragment shader\n    protected Vec3f varyingIntensity = new Vec3f ();\n\n    readonly Matrix4 transformation;\n\n    public GouraudShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n    {\n        this.model = model;\n        transformation = viewPort * projection * modelView;\n        this.lightDir = lightDir.Normalize ();\n    }\n\n    public virtual Vec4f Vertex (Face face, int nthvert)\n    {\n        var n = model.Normal (face, nthvert).Normalize ();\n        // get diffuse lighting intensity\n        varyingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir));\n        var d = Dot(n, lightDir);\n\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public virtual bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // interpolate intensity for the current pixel\n        var intensity = Dot (varyingIntensity, bar);\n        color = Color.White * intensity; // well duh\n        return false;\n    }\n}\n\n// set of utils which will be used in our shaders\nstatic class ShaderUtils\n{\n    public static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n    {\n        var v = model.Vertex (face, nthvert); // read the vertex from model\n        var glVertex = Embed4D (v);\n        return Mult (t, glVertex); // transform it to screen coordinates\n    }\n\n    public static void UpdateVarayingUV (Model model, Face face, int nthvert,\n                                         ref Vec3f varyingU, ref Vec3f varyingV)\n    {\n        var vt = model.GetUV (face, nthvert);\n        varyingU [nthvert] = vt.x;\n        varyingV [nthvert] = vt.y;\n    }\n\n    public static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n    {\n        return new Vec2f {\n            x = Dot (varU, bar),\n            y = Dot (varV, bar)\n        };\n    }\n\n    public static Color GetColor (Image texture, Vec2f uvf)\n    {\n        var uvi = CalcXY(texture, uvf);\n        return texture [uvi.x, uvi.y];\n    }\n\n    public static Vec3f Transform (Matrix4 t, Vec3f v)\n    {\n        var v4d = Mult (t, Embed4D (v));\n        return Project3D (v4d);\n    }\n\n    public static Vec3f Normal (Image normalMap, Vec2f uvf)\n    {\n        // RGB values as xyz. But Color stores data as BGR (zyx)\n        var c = GetColor (normalMap, uvf);\n\n        return new Vec3f {\n            x = (c [2] / 255f) * 2 - 1,\n            y = (c [1] / 255f) * 2 - 1,\n            z = (c [0] / 255f) * 2 - 1\n        };\n    }\n\n    public static float Specular (Image specularMap, Vec2f uvf)\n    {\n        var uvi = CalcXY (specularMap, uvf);\n        var color = specularMap [uvi.x, uvi.y];\n        return color[0];\n    }\n\n    public static Vec2i CalcXY (Image texture, Vec2f uvf)\n    {\n        return new Vec2i {\n            x = (int)(uvf.x * texture.Width),\n            y = (int)(uvf.y * texture.Height)\n        };\n    }\n}\n\nvar light_dir = new Vec3f { x = 1, y = 1, z = 1 };\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\nvar modelView = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1f/(eye-center).Norm());\n\nvar shader = new GouraudShader (headModel, viewPort, projection, modelView, light_dir);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n**vayring** is a reserved keyword in GLSL language, I have used VaryingIntensity as a name in order to show the correspondence. In varying variables we store data to be interpolated inside the triangle, and the fragment shaders get the interpolated value (for the current pixel).\n\nFragment routine is called for each pixel inside the triangle we draw; as an input it receives [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) for interpolation of VaryingXXX data. Thus, interpolated intensity can be computed as:\n\nVaryingIntensity\\[0\\]\\*bar\\[0\\] \\+ VaryingIntensity\\[1\\]\\*bar\\[1\\] \\+ VaryingIntensity\\[2\\]\\*bar\\[2\\]\n\nor simply as a dot product between two vectors: `Dot(VaryingIntensity,bar)`. In true GLSL, of course, fragment shaders receive ready interpolated values.\n\nNotice that the shader returns a bool value. It is easy to understand what it does if we look inside the updated rasterizer:\n\n```csharp\n/*\n...\nvar discard = shader.Fragment (fragment, bc, out color);\nif (!discard) {\n    zbuffer [idx] = frag_depth;\n    image [x, y] = color;\n}\n*/\n```\n\nFragment shader can discard drawing of the current pixel, then the rasterizer simply skips it. It is handy if we want to create binary masks or whatever you want.\n\nOf course, the rasterizer can not imagine all the weird stuff you could program, therefore it can not be pre-compiled with your shader. Here we use IShader interface as an intermediate between the two.\n\n# **First modification of the shaders**\n\nSimple modification of the Gourad shading, where the intensities are allowed to have 6 values only:\n\n```csharp\nclass GouraudShader6 : GouraudShader\n{\n    public GouraudShader6 (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n        : base (model, viewPort, projection, modelView, lightDir)\n    {\n    }\n\n    public override bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var intensity = Dot (varyingIntensity, bar);\n        if (intensity > 0.85f) intensity = 1;\n        else if (intensity > 0.60f) intensity = 0.80f;\n        else if (intensity > 0.45f) intensity = 0.60f;\n        else if (intensity > 0.30f) intensity = 0.45f;\n        else if (intensity > 0.15f) intensity = 0.30f;\n        else intensity = 0;\n        color = new Color (255, 155, 0) * intensity;\n        return false;\n    }\n}\n\nvar shader = new GouraudShader6 (headModel, viewPort, projection, modelView, light_dir);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Textures**\n\nI'll skip the [Phong shading](https://en.wikipedia.org/wiki/Phong_shading), but take a look at the article. Remember the homework assignment I gave you for texturing? We had to interpolate uv-coordinates.\n\n```csharp\nusing static ShaderUtils;\n\nclass TextureShader : IShader\n{\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 transformation;\n    readonly Image texture;\n\n    // written by vertex shader, read by fragment shader\n    Vec3f varyingIntensity = new Vec3f ();\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    public TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n    {\n        this.model = model;\n        transformation = viewPort * projection * modelView;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var n = model.Normal (face, nthvert).Normalize ();\n        varyingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // interpolate intensity for the current pixel\n        var intensity = Dot (varyingIntensity, bar);\n\n        // interpolate uv for the current pixel\n        var uvf = CalcUV (varyingU, varyingV, bar);\n\n        color = GetColor (texture, uvf) * intensity;\n        return false;\n    }\n}\n\nvar shader = new TextureShader (headModel, viewPort, projection, modelView, light_dir, headTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Normalmapping**\n\nOkay, now we have texture coordinates. What can we store in texture images? In fact, almost anything. It can be color, directions, temperature and so on. Let us load this texture:\n\n![  ](./img/lesson6_african_head_nm.png)\n\nIf we interpret RGB values as xyz directions, this image gives us normal vectors **for each pixel** of our render and not only per vertex as before.\n\nBy the way, compare this image to another one, it gives exactly the same information, but in another frame:\n\n![  ](./img/lesson6_african_head_nm_tangent.png)\n\nOne of the images gives normal vectors in global (Cartesian) coordinate system, another one in [Darboux frame](https://en.wikipedia.org/wiki/Darboux_frame) (so-called tangent space). In Darboux frame the z-vector is normal to the object, x - principal curvature direction and y - their cross product.\n\n**Exercise 1:** Can you tell which image is represented in Darboux frame and which one is in the global coordinate frame?\n\n**Exercise 2:** Can you tell which representation is better and if yes, why is that?\n\n**Uniform** is a reserved keyword in GLSL, it allows to pass constants to the shaders. Here I pass the matrix Projection\\*ModelView and its inverse transpose to transform the normal vectors (refer to the end of the lesson5). So, computation of the lighting intensity is the same as before with one exception: instead of interpolating normal vectors we retrieve the information from the normal mapping texture (do not forget to transform light vector and normal vectors).\n\n```csharp\nclass NormalMapShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public NormalMapShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n\n        var intensity = Math.Max (0f, Dot (n, l));\n        color = GetColor (texture, uv) * intensity;\n        return false;\n    }\n}\n\nvar headNormalMap = Image.Load (\"obj/african_head_nm.tga\");\nheadNormalMap.VerticalFlip ();\n\nvar shader = new NormalMapShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Specular mapping**\n\nOkay, let us continue the fun. All the computer graphics science is the art to cheat. To (cheaply) trick the eye we use the [Phong's approximation](https://en.wikipedia.org/wiki/Phong_reflection_model) of the lighting model. Phong proposed to consider the final lighting as a (weighted) sum of three light intensities: ambient lighting (constant per scene), diffuse lighting (the one we computed up to this moment) and specular lighting.\n\nTake a look at the following image, it speaks for itself:\n\n![  ](./img/lesson6_phong.png)\n\nWe compute diffuse lighting as a cosine of the angle between the normal vector and the light direction vector. I mean, this supposes that the light is reflected in all directions uniformly. What happens to glossy surfaces? In the limit case (mirror) the pixel is illuminated if and only if we can see the light source reflected by this pixel:\n\n![  ](./img/lesson6_reflection.png)\n\nFor diffuse lighting we computed the (cosine of) angle between vectors **n** and **l**, and now we are interested in the (cosine of) angle between vectors **r** (reflected light direction) and **v**(view direction).\n\n**Exercise 3:** Given vectors **n** and **l**, find vector **r**.\n\n*Answer:* If **n** and **l** are normalized, then **r** = 2**n**<**n**,**l**> - **l**\n\nFor diffused lighting we computed the light intensity as the cosine. But a glossy surface reflects in one direction much more than in others! Okay then, what happens if we take tenth power of the cosine? Recall that all numbers inferior to 1 will decrease when we apply the power. It means that tenth power of the cosine will give smaller radius of the reflected beam. And hundredth power **much** smaller beam radius. This power is stored in a special texture (specular mapping texture) that tells for each point if it is glossy or not.\\\n\\\nI think that i do not need to comment anything in the below code at the exception of coefficients: `5 + color [i] * (diff + 1.3f * specular)`\n\nI took 5 for the ambient component, 1 for the diffuse component and 1.3 for the specular component. What coefficients to choose - is your choice. Different choices give different appearances for the object. Normally it is for the artist to decide.\n\n*Please note that normally the sum of the coefficents must be equal to 1, but you know. I like to create light.*\n\n```csharp\nclass SpecularShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n    readonly Image specularMap;\n\n    public SpecularShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap, Image specularMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n        this.specularMap = specularMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n\n        var r = (n * (2 * Dot (n, l)) - l).Normalize ();\n\n        var diff = Math.Max (0f, Dot (n, l));\n        var specular = Math.Pow (Math.Max (0f, r.z), Specular (specularMap, uv) + 15);\n\n        color = GetColor (texture, uv);\n\n        int v = 0;\n        for (int i = 0; i < 4; i++)\n            v = (v << 8) | (byte)Math.Min (255, (int)(5 + color [i] * (diff + 1.3f * specular)));\n        color = new Color (v, color.format);\n\n        return false;\n    }\n}\n\nvar headSpecularMap = Image.Load (\"./obj/african_head_spec.tga\");\nvar shader = new SpecularShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap, headSpecularMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n```csharp\nvar diabloModel = Model.FromFile (\"obj/diablo3_pose.obj\");\nvar diabloTexture = Image.Load (\"obj/diablo3_pose_diffuse.tga\");\nvar diabloNormalMap = Image.Load (\"obj/diablo3_pose_nm.tga\");\nvar diabloTangentMap = Image.Load (\"obj/diablo3_pose_nm_tangent.tga\");\nvar diabloSpecularMap = Image.Load (\"obj/diablo3_pose_spec.tga\");\ndiabloTexture.VerticalFlip ();\ndiabloNormalMap.VerticalFlip ();\ndiabloTangentMap.VerticalFlip ();\ndiabloSpecularMap.VerticalFlip ();\n\nvar shader = new SpecularShader (diabloModel, viewPort, projection, modelView, light_dir, diabloTexture, diabloNormalMap, diabloSpecularMap);\n\nvar image = Render (diabloModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Conclusion**\n\nWe know how to render quite nice scenes, but our lighting is far from being real. In the next articles I will talk about shadows.\n\nEnjoy!"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/lesson6bis.csx",
    "content": "using static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n\n    readonly Matrix4 transformation;\n    readonly Vec3f[] ndcTri = new Vec3f[3];     // triangle in normalized device coordinates\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        ndcTri[nthvert] = Project3D (glVertex / glVertex.h);\n\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        var A = new Matrix3 ();\n        A.SetRow (0, ndcTri [1] - ndcTri [0]);\n        A.SetRow (1, ndcTri [2] - ndcTri [0]);\n        A.SetRow (2, bn);\n\n        var AI = Inverse (A);\n        var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n        var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n\n        var B = new Matrix3 ();\n        B.SetColumn (0, i.Normalize ());\n        B.SetColumn (1, j.Normalize ());\n        B.SetColumn (2, bn);\n\n        var n = Mult (B, Normal (normalMap, uv)).Normalize ();\n\n        var l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (n, l));\n\n        color = GetColor (texture, uv) * diff;\n        return false;\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson6bis.workbook/obj/african_head.obj",
    "content": "v -0.000581696 -0.734665 -0.623267\nv 0.000283538 -1 0.286843\nv -0.117277 -0.973564 0.306907\nv -0.382144 -0.890788 0.221243\nv -0.247144 -0.942602 0.276051\nv -0.656078 -0.718512 -0.109025\nv -0.609847 -0.786562 0.0198068\nv -0.66248 -0.632053 -0.244271\nv -0.511812 -0.845392 0.127809\nv -0.609326 -0.569868 -0.41571\nv -0.426949 -0.649767 -0.567143\nv -0.201076 -0.720822 -0.633205\nv 0.117382 -0.973645 0.306766\nv 0.382454 -0.890869 0.221097\nv 0.247512 -0.942667 0.275986\nv 0.656371 -0.718624 -0.109224\nv 0.610273 -0.786562 0.0197893\nv 0.66248 -0.631463 -0.244119\nv 0.511631 -0.845357 0.127832\nv 0.608654 -0.568839 -0.416318\nv 0.424663 -0.649937 -0.567418\nv 0.198972 -0.720968 -0.633141\nv 0.153371 -0.140519 0.477416\nv 0.134781 -0.14723 0.48805\nv 0.131261 -0.132153 0.49872\nv 0.14749 -0.135105 0.489565\nv 0.000686924 -0.0534984 0.505694\nv 0.075062 -0.0473306 0.49955\nv 0.0695841 -0.0997942 0.550277\nv 0.0302569 -0.0971868 0.55389\nv 0.0745124 -0.135953 0.523215\nv 0.0354892 -0.12785 0.535159\nv 0.0389268 -0.109557 0.550558\nv 0.0734835 -0.11538 0.538029\nv 0.106386 -0.125623 0.51513\nv 0.107415 -0.144295 0.5047\nv 0.15968 -0.130861 0.484794\nv 0.156224 -0.123705 0.486735\nv 0.15792 -0.107798 0.4677\nv 0.163784 -0.126996 0.470144\nv 0.154687 -0.134655 0.486373\nv 0.160668 -0.135649 0.476189\nv 0.143433 -0.119034 0.499854\nv 0.131606 -0.0726738 0.476148\nv -0.000260156 -0.124553 0.539058\nv -0.000646004 -0.110651 0.55444\nv 0.100423 -0.10574 0.537643\nv 0.126128 -0.115784 0.515598\nv 0.250944 -0.275583 0.380381\nv 0.221602 -0.335752 0.330174\nv 0.275434 -0.301318 0.24751\nv 0.307699 -0.239869 0.292356\nv 0.332124 -0.0415605 0.412962\nv 0.319444 0.00732526 0.451091\nv 0.28667 -0.025805 0.481549\nv 0.297006 -0.0758717 0.454242\nv 0.357953 -0.159928 -0.223225\nv 0.303981 -0.144611 -0.343644\nv 0.296386 -0.0547553 -0.357792\nv 0.357339 -0.0633433 -0.24278\nv 0.45086 0.331215 0.047962\nv 0.438899 0.336167 0.131147\nv 0.447405 0.226107 0.139349\nv 0.455613 0.205353 0.0827643\nv 0.197493 -0.411308 0.138256\nv 0.204911 -0.353378 0.2082\nv 0.102001 -0.419375 0.24969\nv 0.0995867 -0.475697 0.20834\nv 0.150133 -0.372261 0.431226\nv 0.176423 -0.362054 0.392056\nv 0.196019 -0.326474 0.426929\nv 0.154611 -0.348549 0.463444\nv 0.0892273 -0.391968 0.303592\nv 0.159013 -0.363737 0.305077\nv 0.455712 0.508986 -0.0641442\nv 0.432146 0.648411 -0.0417475\nv 0.417051 0.611568 0.0817295\nv 0.44205 0.483438 0.0478626\nv 0.3446 0.43288 0.398633\nv 0.372358 0.383369 0.353998\nv 0.388341 0.404485 0.306953\nv 0.355059 0.467372 0.356967\nv 0.305162 0.338815 0.458112\nv 0.298579 0.319803 0.456627\nv 0.313422 0.304568 0.427776\nv 0.323711 0.315968 0.429291\nv 0.33161 0.397557 0.430226\nv 0.354427 0.359727 0.390478\nv 0.304162 0.291952 0.432377\nv 0.292662 0.309771 0.452991\nv 0.282934 0.292496 0.4562\nv 0.292025 0.281663 0.435178\nv 0.397344 0.565249 0.192585\nv 0.42257 0.455996 0.145494\nv 0.317848 0.364866 0.448834\nv 0.340595 0.337517 0.417978\nv 0.243227 0.479439 0.494236\nv 0.250155 0.546138 0.465934\nv 0.179019 0.560251 0.511681\nv 0.170173 0.4781 0.536229\nv 0.162386 0.410407 0.547009\nv 0.235031 0.427051 0.517018\nv 0.271745 0.634415 0.42162\nv 0.196896 0.657291 0.472505\nv 0.186589 0.312952 0.511073\nv 0.189518 0.32493 0.514165\nv 0.146286 0.31277 0.509009\nv 0.144959 0.300178 0.501713\nv 0.143965 0.300412 0.49409\nv 0.187203 0.310596 0.506407\nv 0.157744 0.364614 0.528804\nv 0.216697 0.382527 0.516083\nv 0.194441 0.332425 0.515989\nv 0.204286 0.349818 0.516732\nv 0.156254 0.334062 0.519579\nv 0.151565 0.320341 0.513961\nv 0.0431068 0.071791 0.618005\nv 0.0477954 0.0867105 0.593486\nv 0.0780844 0.0816652 0.602518\nv 0.0574124 0.0746147 0.621185\nv 0.448253 0.130656 0.149533\nv 0.431801 0.159355 0.215905\nv 0.422792 0.0771637 0.237185\nv 0.428691 0.0348783 0.166914\nv 0.365073 -0.0526507 0.316126\nv 0.326974 -0.104793 0.373068\nv 0.312773 -0.172965 0.33446\nv 0.368107 -0.126698 0.269222\nv 0.203695 -0.131796 0.523934\nv 0.180463 -0.136479 0.525396\nv 0.182848 -0.14892 0.516989\nv 0.204163 -0.152533 0.514914\nv 0.39379 0.00616771 0.269368\nv 0.40177 -0.0591341 0.209048\nv 0.26083 -0.0996422 0.484274\nv 0.250406 -0.0552171 0.50321\nv 0.15851 -0.136292 0.498474\nv 0.155032 -0.134684 0.502964\nv 0.145006 -0.133819 0.514504\nv 0.171033 -0.12032 0.538263\nv 0.158849 -0.127938 0.534943\nv 0.167969 -0.138075 0.523788\nv 0.232061 -0.151474 0.497024\nv 0.23074 -0.117128 0.507191\nv 0.365798 0.221617 0.362743\nv 0.342501 0.235507 0.392185\nv 0.325951 0.202558 0.415114\nv 0.359268 0.178677 0.383229\nv 0.352369 0.0489033 0.417452\nv 0.322262 0.0907619 0.44953\nv 0.295322 0.04895 0.483251\nv 0.367108 0.00328555 0.369771\nv 0.138972 -0.18796 0.555521\nv 0.161562 -0.177794 0.535913\nv 0.154015 -0.155093 0.536392\nv 0.136131 -0.156414 0.558491\nv 0.220263 -0.08194 0.518603\nv 0.202088 -0.0486753 0.52791\nv 0.17564 -0.0814314 0.545822\nv 0.193131 -0.106435 0.533575\nv 0.199492 -0.169714 0.509722\nv 0.190033 -0.188183 0.514668\nv 0.207302 -0.213011 0.492721\nv 0.222415 -0.183044 0.489617\nv 0.125088 -0.132884 0.551294\nv 0.144497 -0.139192 0.530254\nv 0.135014 0.119128 0.544717\nv 0.119534 0.149685 0.554253\nv 0.096915 0.171211 0.569382\nv 0.112553 0.137432 0.569616\nv 0.0878476 0.217858 0.555667\nv 0.0649773 0.232128 0.568628\nv 0.073466 0.185119 0.584571\nv 0.116359 0.191199 0.548932\nv 0.111419 0.228591 0.524951\nv 0.0858774 0.255408 0.530312\nv 0.301408 0.0368718 -0.387812\nv 0.366839 0.037626 -0.269538\nv 0.272125 -0.199781 0.399533\nv 0.246349 -0.195514 0.453266\nv 0.223339 -0.243049 0.450553\nv 0.364021 -0.197455 0.21335\nv 0.411416 -0.124798 0.140589\nv 0.431568 -0.0028997 0.0907502\nv 0.449346 0.11075 0.0889086\nv 0.0649948 0.777167 0.432594\nv 0.133465 0.770619 0.418569\nv 0.14341 0.869244 0.301253\nv 0.0689586 0.877043 0.315395\nv 0.305372 0.809321 0.22043\nv 0.289307 0.723856 0.335524\nv 0.355187 0.660735 0.264773\nv 0.372264 0.728258 0.148528\nv 0.382308 0.7766 0.0116631\nv 0.0971488 0.470588 0.557912\nv 0.110788 0.565185 0.534317\nv 0.100113 0.277828 0.510938\nv 0.10966 0.248679 0.503771\nv 0.0443988 0.240822 0.58581\nv 0.0522151 0.193614 0.604337\nv 0.052601 0.564735 0.541859\nv 0.123726 0.667896 0.498907\nv 0.0597976 0.671147 0.508711\nv 0.0466729 0.466215 0.561034\nv 0.000423846 0.462807 0.558988\nv -0.00017831 0.388326 0.563478\nv 0.0352086 0.389069 0.560584\nv 0.000833078 0.56384 0.544139\nv 0.295773 0.426823 0.470722\nv 0.301706 0.464689 0.451056\nv 0.189957 0.181465 0.501181\nv 0.186163 0.208931 0.491956\nv 0.141574 0.222722 0.500509\nv 0.146526 0.195338 0.518293\nv 0.111986 0.0116865 0.562811\nv 0.111343 0.0404672 0.565769\nv 0.0577164 0.0420398 0.577988\nv 0.0656438 -0.00796249 0.596918\nv 0.147695 0.0440509 0.537258\nv 0.144778 0.0631738 0.538491\nv 0.0268719 -0.0140834 0.602378\nv 0.0270356 -0.0372401 0.622027\nv 0.0876429 -0.0456996 0.601127\nv 0.183093 0.146552 0.519439\nv 0.148589 0.164593 0.536819\nv 0.147344 0.131095 0.542934\nv 0.176733 0.112264 0.532435\nv -0.000394618 -0.0441035 0.617625\nv -0.000260156 -0.0187662 0.600677\nv 0.165058 0.0770935 0.530856\nv 0.148554 0.0982976 0.535562\nv 0.116476 0.272829 0.494797\nv 0.119084 0.26261 0.493569\nv 0.120873 0.268971 0.480883\nv 0.11761 0.27287 0.484221\nv 0.224695 0.848444 0.271198\nv 0.231324 0.918189 0.121063\nv 0.14614 0.9439 0.150241\nv 0.241894 0.945736 -0.185803\nv 0.156043 0.976475 -0.183418\nv 0.146906 0.980702 -0.0177607\nv 0.23195 0.948285 -0.0402158\nv 0.0684324 0.995189 -0.00981573\nv 0.0682103 0.955014 0.162933\nv 0.0891571 0.383649 0.555118\nv 0.110613 0.336412 0.528863\nv 0.122749 0.310759 0.512914\nv 0.147081 -0.111919 0.55631\nv 0.158656 -0.0994551 0.55786\nv 0.0939743 0.0869969 0.616333\nv 0.101206 0.119326 0.615532\nv 0.0670469 0.122121 0.645885\nv 0.0560853 0.0831385 0.640601\nv 0.0795284 0.0820978 0.567845\nv 0.0337354 0.0564741 0.595059\nv 0.0854448 -0.103577 0.606979\nv 0.0826211 -0.0671141 0.612931\nv 0.0280704 -0.0555854 0.637736\nv 0.0319698 -0.0970874 0.628212\nv 0.0789964 -0.121811 0.579602\nv 0.0327415 -0.116959 0.594106\nv 0.0216981 0.0173339 0.585915\nv -0.00123062 -0.095585 0.625704\nv -0.000511542 -0.0598999 0.637227\nv -0.00157555 -0.115643 0.593966\nv -0.000219233 -0.0988881 0.554498\nv 0.0291929 0.0853015 0.665324\nv 0.0352671 0.124524 0.666125\nv 0.0371846 0.159004 0.648446\nv 0.0654158 0.154462 0.629171\nv 0.0280178 0.19967 0.620548\nv 0.0221015 0.245843 0.59797\nv 0.0432997 0.281499 0.556866\nv 0.0222008 0.28717 0.567459\nv -0.000400465 0.125745 0.673871\nv -0.00057585 0.0822265 0.675105\nv -0.000347849 0.160916 0.656029\nv 0.367195 0.315074 0.363767\nv 0.346658 0.302744 0.393991\nv 0.344389 0.266656 0.384439\nv 0.371726 0.266504 0.352507\nv 0.40246 0.429197 0.234116\nv 0.422126 0.335763 0.207276\nv 0.393316 0.264083 0.313887\nv 0.387102 0.325737 0.325369\nv 0.3274 0.295928 0.408636\nv 0.316392 0.29076 0.418709\nv 0.3085 0.274624 0.423199\nv 0.323636 0.272379 0.406602\nv 0.429381 0.244458 0.204002\nv 0.407084 0.332408 0.277313\nv 0.410597 0.257869 0.266264\nv -0.0012657 -0.456867 0.290093\nv -0.00137093 -0.520579 0.266159\nv 0.154137 -0.304206 0.500479\nv 0.193482 -0.282873 0.473493\nv 0.186367 -0.242201 0.509588\nv 0.148993 -0.26399 0.525367\nv 0.110332 -0.274916 0.545857\nv 0.099347 -0.233134 0.560204\nv 0.0558865 -0.227615 0.569605\nv 0.0659185 -0.270006 0.563817\nv 0.154687 -0.142577 0.51838\nv 0.159498 -0.143009 0.513072\nv 0.154646 -0.138239 0.502496\nv 0.149045 -0.137596 0.50639\nv 0.15958 -0.138174 0.517463\nv 0.161574 -0.141559 0.511657\nv 0.0940387 -0.129288 0.582226\nv 0.109215 -0.12609 0.531844\nv 0.0782715 -0.117578 0.557129\nv 0.264817 0.0151299 0.501573\nv 0.280122 0.127096 0.47057\nv 0.262508 0.0886748 0.494464\nv 0.187613 0.050926 0.529248\nv 0.207829 0.0868157 0.523449\nv 0.231821 -0.0170182 0.518246\nv 0.304138 0.164985 0.443485\nv 0.343004 0.132813 0.418235\nv 0.313621 0.250742 0.418382\nv 0.290815 0.22492 0.444303\nv 0.355269 -0.194146 0.0276407\nv 0.388534 -0.179618 0.0746089\nv 0.336544 -0.25083 0.156379\nv 0.29365 -0.279868 0.104617\nv 0.389288 0.153006 0.345258\nv 0.39155 0.205715 0.320166\nv 0.127262 0.566927 -0.64996\nv 0.000868155 0.562946 -0.661419\nv 0.000850617 0.724441 -0.605705\nv 0.118774 0.725955 -0.596105\nv 0.21095 0.754513 0.387525\nv 0.133734 -0.133188 0.514651\nv 0.131302 -0.13393 0.53047\nv 0.0671053 -0.326445 0.551902\nv 0.0661056 -0.374553 0.504765\nv 0.117289 -0.365439 0.489939\nv 0.116552 -0.318792 0.528974\nv 0.288249 -0.135286 0.424736\nv 0.39393 0.0544045 0.33225\nv 0.374655 0.0965379 0.38044\nv 0.000792155 1 -0.0074948\nv 0.0731795 0.993937 -0.182792\nv 0.000868155 0.999152 -0.181886\nv 0.179405 0.936399 -0.330549\nv 0.0842755 0.953459 -0.338026\nv 0.141767 0.271455 0.486238\nv 0.139978 0.267433 0.490862\nv 0.175908 0.259465 0.501362\nv 0.175312 0.263359 0.495861\nv 0.181597 0.230187 0.495539\nv 0.140253 0.240576 0.495341\nv 0.336982 0.587763 0.356927\nv 0.312043 0.518258 0.416183\nv 0.259971 0.350203 0.495411\nv 0.250763 0.331028 0.496036\nv 0.114179 0.255893 0.495902\nv 0.111069 0.276518 0.499456\nv 0.125433 0.293116 0.500415\nv 0.124965 0.282353 0.489968\nv 0.13906 0.254928 0.497457\nv 0.17737 0.2462 0.50062\nv 0.121796 0.272327 0.47658\nv 0.149548 0.0847578 0.549377\nv 0.142825 -0.226381 0.544992\nv 0.106181 -0.197232 0.576871\nv 0.258193 -0.146669 0.465227\nv 0.2105 0.0188071 0.525711\nv 0.181041 -0.0155508 0.531721\nv 0.173453 -0.168949 0.5218\nv 0.180322 -0.15877 0.514949\nv 0.168554 -0.150118 0.516667\nv 0.163082 -0.153579 0.523344\nv 0.139124 -0.128733 0.545343\nv 0.152348 -0.134468 0.527471\nv 0.416192 -0.0714636 0.0335278\nv 0.0220956 0.0520719 0.640232\nv 0.0361615 0.0619695 0.628476\nv -0.000283541 0.202056 0.62768\nv 0.0869063 -0.0493125 -0.489641\nv 0.192289 -0.0534399 -0.447186\nv 0.192003 -0.134672 -0.429197\nv 0.0851642 -0.130335 -0.46373\nv 0.236434 0.310245 0.495686\nv 0.237714 0.31211 0.497539\nv 0.244636 0.32534 0.496212\nv 0.121253 0.281932 0.477293\nv 0.173149 -0.207241 0.528208\nv -0.000242618 0.247989 0.603612\nv -0.00037708 0.28838 0.571697\nv 0.108496 -0.160507 0.588207\nv 0.0613995 -0.166388 0.620127\nv 0.0634222 -0.199565 0.59462\nv 0.0893734 0.151176 0.600127\nv 0.122124 0.0729427 0.596088\nv 0.0993528 0.072475 0.584781\nv 0.108315 0.0599584 0.583916\nv 0.133524 0.0551528 0.575778\nv 0.13315 0.107517 0.580426\nv 0.274937 0.384257 0.485735\nv 0.170606 -0.145383 0.517205\nv 0.0464391 -0.130399 0.611931\nv 0.0392892 -0.113439 0.575094\nv -0.00161647 -0.112428 0.579865\nv -0.00351648 -0.131685 0.617859\nv 0.0194356 0.03489 0.601858\nv -0.000564158 0.0478802 0.644208\nv -2.04632e-05 0.0350303 0.598835\nv 0.222163 0.246884 0.4972\nv 0.217802 0.257547 0.498129\nv 0.293159 0.278716 0.430419\nv 0.302852 0.281932 0.427367\nv 0.285209 0.277366 0.434932\nv 0.289307 0.275834 0.436551\nv 0.290061 0.280494 0.427963\nv -0.000225079 -0.384287 0.444245\nv 0.0651001 -0.383883 0.440585\nv -0.000891543 -0.364076 0.502426\nv 0.116576 -0.381784 0.436341\nv 0.363734 0.712842 -0.467571\nv 0.32166 0.832542 -0.392653\nv 0.376508 0.821429 -0.265451\nv 0.427095 0.698004 -0.319575\nv 0.27178 0.90956 -0.29643\nv 0.310423 0.901357 -0.210644\nv 0.441869 0.677005 -0.175175\nv 0.389019 0.807076 -0.128411\nv 0.313311 0.894506 -0.0788532\nv 0.12783 -0.376125 0.378248\nv 0.0722266 -0.391483 0.37664\nv 0.125579 0.302411 0.505741\nv 0.101656 0.861358 -0.486525\nv 0.214084 0.849981 -0.463327\nv 0.2467 0.723207 -0.559263\nv 0.104913 0.117397 -0.600268\nv 0.221579 0.117865 -0.555159\nv 0.200848 0.0268164 -0.488992\nv 0.0944011 0.0271204 -0.539134\nv 0.391141 0.144178 -0.303545\nv 0.331241 0.130393 -0.444613\nv 0.360829 0.250357 -0.491155\nv 0.424003 0.258021 -0.333419\nv 0.000868155 0.23912 -0.655479\nv 0.00089154 0.393909 -0.675105\nv 0.125626 0.397949 -0.664716\nv 0.115418 0.240453 -0.645617\nv 0.452175 0.547687 -0.348309\nv 0.450217 0.395605 -0.350776\nv 0.383015 0.40193 -0.511868\nv 0.3854 0.562496 -0.506472\nv 0.464078 0.52881 -0.195929\nv 0.311698 0.866351 0.071908\nv -9.64635e-05 -0.406882 0.376985\nv 0.373883 -0.18312 -0.115123\nv 0.389189 -0.0789467 -0.141776\nv 0.247109 0.197607 0.47589\nv 0.22891 0.231497 0.489717\nv 0.121077 -0.116725 0.574393\nv 0.125626 -0.0895459 0.583057\nv 0.110548 -0.128452 0.555428\nv 0.000710309 0.959638 0.167019\nv 0.000710309 0.881206 0.320973\nv 0.224163 0.124079 0.505215\nv 0.255305 0.260798 0.480649\nv 0.25188 0.263516 0.478322\nv 0.214891 0.26119 0.49413\nv 0.116476 0.273741 0.475423\nv 0.290704 0.283902 0.433377\nv 0.29641 0.299523 0.422813\nv 0.29406 0.288222 0.418078\nv 0.142655 0.263364 0.482467\nv 0.121638 0.267831 0.470296\nv 0.171711 0.256898 0.489693\nv 0.246864 0.257401 0.473821\nv 0.274311 0.271648 0.453301\nv 0.274539 0.26862 0.446654\nv 0.233686 0.331104 0.49074\nv 0.187548 0.326632 0.49682\nv 0.296971 0.273928 0.433476\nv 0.134067 -0.0744861 0.577333\nv 0.237434 0.052867 0.514604\nv 0.0637905 0.27076 0.54346\nv 0.375421 0.514218 0.287328\nv 0.353808 -0.333437 -0.190615\nv 0.349365 -0.276331 -0.333858\nv 0.323337 -0.214946 -0.338453\nv 0.356725 -0.247925 -0.205557\nv -0.000330311 -0.581268 0.237302\nv 0.092922 -0.548418 0.185458\nv 0.394783 -0.0876049 -0.0664009\nv 0.358315 -0.197624 -0.02995\nv 0.292785 -0.321493 0.0377429\nv 0.395175 -0.0904345 -0.0143524\nv 0.243385 0.243183 -0.602957\nv 0.000587539 -0.0451091 -0.498205\nv 0.000751232 0.030862 -0.55154\nv 0.000809694 0.11928 -0.61144\nv 0.000850617 0.862837 -0.491295\nv 0.000868155 0.958527 -0.339277\nv 0.000423846 -0.128189 -0.469085\nv 0.264186 0.56961 -0.608026\nv 0.35127 -0.283317 -0.0863656\nv 0.196201 -0.209591 -0.418785\nv 0.0873097 -0.206341 -0.44839\nv 0.000488154 -0.206259 -0.449945\nv 0.263397 0.402579 -0.621226\nv 0.456683 0.384813 -0.0591516\nv 0.457776 0.372302 -0.191281\nv 0.000850617 0.671351 0.512487\nv 0.000809694 0.77919 0.437668\nv 0.408656 0.116286 0.298547\nv 0.295913 0.259781 0.439334\nv 0.285355 0.265481 0.449775\nv 0.278766 0.270035 0.454663\nv 0.128946 -0.0227065 0.564741\nv 0.16203 0.016989 0.534633\nv 0.0985987 0.0583799 0.58087\nv 0.0538462 0.323165 0.543729\nv 0.0794758 0.301522 0.528465\nv -0.00330601 -0.197759 0.600525\nv -0.000511542 -0.225551 0.572931\nv -0.00456879 -0.164231 0.628277\nv -0.000336157 -0.26392 0.574381\nv -0.000768774 -0.325515 0.55686\nv 0.269921 0.242499 0.464742\nv 0.260573 0.253022 0.476072\nv 0.235066 0.15963 0.493271\nv 0.411369 0.186119 0.273583\nv 0.000178307 0.0131539 0.584682\nv 0.153436 -0.0554568 0.55786\nv 0.0264569 0.331747 0.554112\nv -0.000342003 0.332998 0.557743\nv 0.285589 0.277974 0.428156\nv 0.184795 -0.499655 0.1217\nv 0.332808 -0.386298 -0.0699261\nv 0.20739 -0.274419 -0.415909\nv 0.0927467 -0.274308 -0.43723\nv 0.278029 -0.438791 0.0475586\nv 0.000505693 -0.27722 -0.43768\nv 0.438191 0.12488 -0.0367783\nv 0.460214 0.163208 -0.055258\nv 0.485388 0.177437 -0.0277343\nv 0.472304 0.161641 -0.00367724\nv 0.496244 0.232684 -0.0170708\nv 0.477425 0.247036 0.00446648\nv 0.517015 0.298681 -0.0523876\nv 0.492233 0.31788 -0.0441737\nv 0.53425 0.316407 -0.124009\nv 0.511491 0.332595 -0.129276\nv 0.535904 0.290111 -0.170685\nv 0.511128 0.30365 -0.186838\nv 0.538611 0.228878 -0.193017\nv 0.511286 0.231199 -0.218992\nv 0.520242 0.128838 -0.191421\nv 0.490433 0.122168 -0.208603\nv 0.487562 0.00951757 -0.0819458\nv 0.472286 -0.00658864 -0.0930419\nv 0.47079 0.0399937 -0.154257\nv 0.496437 0.0472722 -0.136917\nv 0.485142 -0.0247586 -0.0238758\nv 0.46129 -0.0429694 -0.0334343\nv 0.474888 0.238927 -0.0419989\nv 0.495232 0.289088 -0.0628581\nv 0.508398 0.299996 -0.11766\nv 0.51311 0.283323 -0.158478\nv 0.514642 0.235303 -0.176531\nv 0.501751 0.136134 -0.181559\nv 0.486025 0.0533522 -0.11859\nv 0.486451 0.0268164 -0.067155\nv 0.482529 0.0136625 -0.0120607\nv 0.464265 0.0280383 0.0249515\nv 0.457519 -0.0185791 0.0196256\nv 0.442769 0.0582571 -0.0293244\nv 0.45632 0.0847169 -0.0600578\nv 0.442465 0.0842785 -0.0209644\nv 0.459612 0.268106 0.0209995\nv 0.458559 0.182857 0.0414318\nv 0.463026 0.318488 -0.0446005\nv 0.470222 0.311835 -0.142898\nv 0.455063 0.232836 -0.195221\nv 0.43839 0.13186 -0.191088\nv 0.424564 0.0473131 -0.148417\nv 0.423447 -0.00471202 -0.0897563\nv 0.425377 -0.0292075 -0.0262143\nv 0.430714 -0.0102191 0.0297161\nv 0.446335 0.0345567 0.0460036\nv 0.475607 0.129364 -0.0864649\nv 0.482611 0.0600636 -0.0525396\nv 0.481517 0.0827175 -0.101349\nv 0.470503 0.0444835 -0.0133527\nv 0.479278 0.0776957 0.00471786\nv 0.504692 0.223938 -0.101723\nv 0.50375 0.131866 -0.1473\nv 0.45452 0.100016 0.0450097\nv 0.403623 0.0251386 -0.16934\nv 0.414719 0.138607 -0.218957\nv 0.435461 0.249632 -0.229924\nv -0.000201695 -0.407876 0.310666\nv 0.000347846 -0.171521 0.505794\nv 0.0884205 -0.186598 0.484028\nv 0.141147 -0.173807 0.465513\nv 0.159878 -0.142255 0.458644\nv 0.152483 -0.116468 0.431278\nv 0.0708352 0.0121893 0.376371\nv 0.128069 -0.116368 0.360528\nv 0.143994 -0.166791 0.41184\nv 0.0748398 -0.218144 0.372349\nv 0.280941 0.292858 0.454897\nv 0.281356 0.319879 0.451494\nv 0.127268 0.269088 0.455435\nv 0.116921 0.284697 0.447653\nv 0.119996 0.274998 0.469126\nv 0.15699 0.254759 0.466326\nv 0.265916 0.273601 0.421176\nv 0.214885 0.253946 0.455259\nv 0.141223 0.313133 0.482117\nv 0.211436 0.255823 0.486852\nv 0.277135 0.302686 0.410799\nv 0.252505 0.333881 0.433599\nv 0.202023 0.342182 0.464578\nv 0.11989 0.295816 0.471196\nv 0.146526 0.322539 0.455943\nv 0.126292 0.301838 0.454973\nv 0.119744 0.284878 0.469419\nv 0.00103185 0.0191579 0.374711\nv 0.000909079 -0.205715 0.379849\nv 0.0536357 -0.100847 0.27211\nv 0.00103185 -0.098929 0.27128\nv 0.255463 -0.398733 -0.446098\nv 0.412907 -0.372688 -0.332858\nv 0.452596 -0.41557 -0.353559\nv 0.293329 -0.465367 -0.476007\nv 0.0815337 -0.637104 0.176286\nv 0.0726358 -0.738524 0.179519\nv 0.174763 -0.714911 0.155526\nv 0.172032 -0.601823 0.129884\nv 0.380782 -0.504069 -0.184377\nv 0.357368 -0.419095 -0.180384\nv 0.337538 -0.494803 -0.0548371\nv 0.372989 -0.619402 -0.0373571\nv 0.453578 -0.652661 -0.0939539\nv 0.452351 -0.545892 -0.196981\nv 0.173576 -0.814197 0.195654\nv 0.0739044 -0.845866 0.20734\nv 0.0964414 -0.904976 0.254455\nv 0.197703 -0.864562 0.243353\nv 0.519564 -0.487407 -0.384801\nv 0.555004 -0.584226 -0.219366\nv 0.451357 -0.731555 -0.0215899\nv 0.382594 -0.74824 0.0443666\nv 0.439805 -0.799196 0.0975376\nv 0.519108 -0.768071 -0.00769357\nv 0.274837 -0.806199 0.115503\nv 0.320508 -0.838061 0.183769\nv 0.354533 -0.544232 -0.525256\nv 0.162503 -0.604343 -0.559076\nv 0.131098 -0.496837 -0.498761\nv 0.115161 -0.410103 -0.457756\nv -0.00017831 -0.492774 -0.504192\nv 2.046e-05 -0.40666 -0.465186\nv -0.000482311 -0.600531 -0.555322\nv 0.546217 -0.696736 -0.117257\nv 0.22746 -0.332063 -0.424345\nv 0.101627 -0.33885 -0.437002\nv 0.280193 -0.554165 0.0658922\nv 0.274843 -0.684891 0.0781517\nv 0.000347846 -0.34199 -0.438165\nv 0.000733693 -0.746364 0.176765\nv 0.000312769 -0.874904 0.179121\nv 0.378648 -0.322586 -0.326994\nv -0.000114002 -0.940246 0.234262\nv 0.000979233 -0.650317 0.207112\nv -0.130513 -0.13217 0.498924\nv -0.133687 -0.14723 0.488109\nv -0.15222 -0.140519 0.477457\nv -0.14666 -0.13514 0.489746\nv -0.0697653 -0.0999404 0.550318\nv -0.0736414 -0.0473131 0.499649\nv -0.0305784 -0.0972511 0.55389\nv -0.0396517 -0.109762 0.550014\nv -0.0358517 -0.127727 0.53534\nv -0.0742493 -0.135994 0.523315\nv -0.0733373 -0.115561 0.537643\nv -0.106766 -0.144336 0.504823\nv -0.106281 -0.125786 0.515779\nv -0.156505 -0.107798 0.467782\nv -0.155611 -0.123682 0.486899\nv -0.159311 -0.130796 0.484958\nv -0.162872 -0.126996 0.470243\nv -0.159919 -0.135625 0.47627\nv -0.154055 -0.134696 0.486513\nv -0.142597 -0.118993 0.499994\nv -0.130051 -0.0726738 0.476189\nv -0.10054 -0.105798 0.538111\nv -0.125684 -0.115824 0.51596\nv -0.274604 -0.301394 0.247527\nv -0.220831 -0.335775 0.330215\nv -0.250102 -0.275554 0.380393\nv -0.3066 -0.239804 0.292309\nv -0.284302 -0.0258401 0.479772\nv -0.319479 0.00809111 0.449577\nv -0.331873 -0.0412272 0.412243\nv -0.293674 -0.0747667 0.452418\nv -0.294668 -0.0547787 -0.357622\nv -0.302063 -0.144319 -0.34334\nv -0.356012 -0.159916 -0.223184\nv -0.355474 -0.0633082 -0.24271\nv -0.447241 0.22613 0.139332\nv -0.437922 0.336149 0.131124\nv -0.449486 0.331215 0.047962\nv -0.454982 0.205353 0.0827818\nv -0.103311 -0.419241 0.249936\nv -0.203701 -0.353384 0.208147\nv -0.196966 -0.411506 0.138841\nv -0.101797 -0.475733 0.208638\nv -0.196499 -0.327216 0.427455\nv -0.176283 -0.362363 0.392138\nv -0.150331 -0.372548 0.431378\nv -0.155575 -0.349484 0.46435\nv -0.0890109 -0.391945 0.303855\nv -0.158306 -0.363848 0.305182\nv -0.415613 0.611627 0.0817705\nv -0.430808 0.648493 -0.0417066\nv -0.45411 0.508986 -0.0641209\nv -0.440308 0.483438 0.0478393\nv -0.389808 0.40462 0.306977\nv -0.375935 0.38348 0.354021\nv -0.34643 0.433026 0.398499\nv -0.354807 0.467378 0.356891\nv -0.317409 0.30382 0.429121\nv -0.30173 0.320499 0.456861\nv -0.309295 0.339493 0.457756\nv -0.328406 0.316144 0.429519\nv -0.358297 0.360101 0.389344\nv -0.335684 0.397733 0.427864\nv -0.285156 0.29304 0.457387\nv -0.294212 0.310695 0.451757\nv -0.307675 0.294425 0.430781\nv -0.29475 0.281949 0.435698\nv -0.421091 0.455996 0.145494\nv -0.395403 0.565208 0.19252\nv -0.321999 0.364421 0.449238\nv -0.345494 0.336792 0.417218\nv -0.178165 0.560672 0.512335\nv -0.249354 0.546354 0.466589\nv -0.243286 0.479638 0.494943\nv -0.170168 0.4781 0.536796\nv -0.164123 0.410647 0.547114\nv -0.236966 0.427297 0.516007\nv -0.270669 0.634748 0.422187\nv -0.195815 0.657882 0.47347\nv -0.14597 0.313039 0.508126\nv -0.18946 0.324971 0.513312\nv -0.186823 0.312829 0.511757\nv -0.144895 0.300213 0.501871\nv -0.186911 0.310514 0.506612\nv -0.143462 0.300341 0.494353\nv -0.160048 0.365076 0.528073\nv -0.219468 0.382854 0.516404\nv -0.15782 0.334506 0.520076\nv -0.205952 0.349935 0.517012\nv -0.195236 0.332495 0.516264\nv -0.151653 0.320785 0.513142\nv -0.0805691 0.0827468 0.603261\nv -0.0493739 0.08878 0.593591\nv -0.0448723 0.0732117 0.617958\nv -0.0594819 0.0761932 0.621314\nv -0.422927 0.0771812 0.237185\nv -0.432205 0.159355 0.215905\nv -0.448112 0.130656 0.149516\nv -0.4282 0.0348607 0.166897\nv -0.311779 -0.172912 0.334378\nv -0.324787 -0.103758 0.371735\nv -0.364851 -0.052639 0.316097\nv -0.367254 -0.126698 0.269146\nv -0.183918 -0.149136 0.51793\nv -0.182024 -0.137865 0.527822\nv -0.205163 -0.131463 0.524127\nv -0.205514 -0.152071 0.514943\nv -0.39379 0.00614433 0.269368\nv -0.400951 -0.0591282 0.208995\nv -0.261011 -0.0993382 0.483865\nv -0.25102 -0.0551177 0.50328\nv -0.158849 -0.136444 0.499199\nv -0.155155 -0.134784 0.503397\nv -0.145304 -0.133848 0.514902\nv -0.160802 -0.128394 0.536919\nv -0.173424 -0.121349 0.541327\nv -0.169156 -0.138478 0.524928\nv -0.232096 -0.116964 0.50767\nv -0.232727 -0.151188 0.49696\nv -0.326085 0.202611 0.415651\nv -0.34094 0.235683 0.392156\nv -0.367727 0.221336 0.359031\nv -0.358829 0.177595 0.3841\nv -0.295603 0.0501836 0.478632\nv -0.32232 0.0902006 0.449922\nv -0.351843 0.04895 0.416686\nv -0.367248 0.00336155 0.369624\nv -0.156137 -0.154941 0.536878\nv -0.165134 -0.177028 0.538193\nv -0.144573 -0.187364 0.558725\nv -0.140533 -0.155882 0.559046\nv -0.17761 -0.0804258 0.547933\nv -0.201667 -0.0484356 0.526945\nv -0.22024 -0.0817529 0.517585\nv -0.195826 -0.106131 0.536439\nv -0.207794 -0.213087 0.493049\nv -0.191711 -0.188305 0.515551\nv -0.201111 -0.170071 0.510745\nv -0.223385 -0.183243 0.490178\nv -0.128595 -0.132761 0.551212\nv -0.145777 -0.139513 0.530605\nv -0.0971664 0.171538 0.569909\nv -0.120048 0.150182 0.555387\nv -0.13557 0.119437 0.545004\nv -0.113103 0.137432 0.569453\nv -0.0653573 0.232432 0.569575\nv -0.08745 0.217992 0.556468\nv -0.0739395 0.185388 0.584933\nv -0.0855266 0.255554 0.53095\nv -0.110583 0.228714 0.525501\nv -0.115915 0.191404 0.5495\nv -0.300099 0.0366964 -0.387999\nv -0.364734 0.0377897 -0.269357\nv -0.223181 -0.243207 0.45081\nv -0.246139 -0.195666 0.45347\nv -0.271201 -0.199869 0.399446\nv -0.362846 -0.197443 0.213286\nv -0.410176 -0.124757 0.140565\nv -0.430404 -0.00290555 0.0907385\nv -0.448779 0.11075 0.0889086\nv -0.142135 0.869847 0.301633\nv -0.132167 0.771303 0.419317\nv -0.0633989 0.777407 0.43288\nv -0.0675789 0.877324 0.315577\nv -0.353469 0.660735 0.264732\nv -0.2875 0.723792 0.335465\nv -0.30353 0.809117 0.220313\nv -0.37099 0.728422 0.148627\nv -0.381016 0.776764 0.0117274\nv -0.0996744 0.472587 0.557146\nv -0.109525 0.565325 0.53475\nv -0.100294 0.277787 0.511248\nv -0.108689 0.248457 0.503268\nv -0.0528874 0.193947 0.604898\nv -0.0453926 0.241125 0.586705\nv -0.12255 0.668732 0.500514\nv -0.0511336 0.564922 0.542589\nv -0.0582191 0.671655 0.50974\nv -0.0440363 0.465776 0.561151\nv -0.0361966 0.388923 0.562367\nv -0.301894 0.466338 0.448542\nv -0.295831 0.424807 0.472166\nv -0.140867 0.22264 0.499754\nv -0.185742 0.209381 0.492394\nv -0.186338 0.179495 0.502724\nv -0.145859 0.19535 0.519018\nv -0.0600022 0.0437294 0.578309\nv -0.113337 0.0407946 0.564875\nv -0.114196 0.0121659 0.564255\nv -0.0686019 -0.00676987 0.598064\nv -0.143661 0.0637116 0.537807\nv -0.147607 0.0440217 0.535469\nv -0.0907706 -0.0459919 0.600525\nv -0.0300113 -0.0346152 0.623594\nv -0.028047 -0.0138554 0.603173\nv -0.148028 0.131527 0.5437\nv -0.148519 0.164868 0.537322\nv -0.183164 0.146873 0.520193\nv -0.176978 0.112363 0.532908\nv -0.147823 0.0979234 0.535574\nv -0.165064 0.0766492 0.532955\nv -0.120107 0.268649 0.480825\nv -0.118558 0.262394 0.493353\nv -0.115979 0.27287 0.494434\nv -0.116476 0.272952 0.483859\nv -0.229115 0.916634 0.120496\nv -0.223379 0.848952 0.271461\nv -0.145146 0.945128 0.150709\nv -0.145409 0.980883 -0.0176788\nv -0.154278 0.976311 -0.1834\nv -0.240088 0.945514 -0.185786\nv -0.230512 0.948548 -0.0401515\nv -0.0669533 0.995411 -0.00979819\nv -0.0669124 0.955581 0.163097\nv -0.0891746 0.383199 0.554861\nv -0.112226 0.336757 0.527307\nv -0.123381 0.311174 0.513382\nv -0.149484 -0.111966 0.558549\nv -0.160264 -0.0991219 0.559216\nv -0.0695139 0.122828 0.646821\nv -0.103574 0.1197 0.616608\nv -0.0967747 0.0873945 0.617683\nv -0.0583127 0.0845006 0.640951\nv -0.0810075 0.0824603 0.567973\nv -0.0347818 0.058339 0.594989\nv -0.031812 -0.0520134 0.636181\nv -0.0876079 -0.0656701 0.61341\nv -0.0905251 -0.101683 0.607529\nv -0.0378686 -0.0937434 0.629054\nv -0.0836617 -0.122507 0.579642\nv -0.0385351 -0.11728 0.594673\nv -0.0223295 0.0177081 0.586652\nv -0.0307538 0.0864766 0.665646\nv -0.0369098 0.125196 0.667078\nv -0.0659946 0.154643 0.629212\nv -0.0379446 0.159028 0.648136\nv -0.0287544 0.19984 0.620642\nv -0.0228205 0.245931 0.598298\nv -0.0444456 0.281523 0.558544\nv -0.0233467 0.287164 0.569581\nv -0.348774 0.267521 0.384632\nv -0.352083 0.30296 0.39367\nv -0.371253 0.315308 0.363077\nv -0.374871 0.266369 0.352501\nv -0.422202 0.335746 0.207253\nv -0.401928 0.429197 0.234116\nv -0.395345 0.264083 0.313998\nv -0.391071 0.32586 0.325679\nv -0.312703 0.275793 0.421661\nv -0.320315 0.291642 0.417107\nv -0.332077 0.295173 0.409057\nv -0.327599 0.271742 0.406824\nv -0.429802 0.244434 0.203979\nv -0.409282 0.332454 0.277442\nv -0.411848 0.257886 0.266369\nv -0.187414 -0.242265 0.510307\nv -0.193763 -0.283183 0.474066\nv -0.155254 -0.304954 0.501777\nv -0.149998 -0.264183 0.526518\nv -0.0567108 -0.227311 0.569523\nv -0.101124 -0.233508 0.561461\nv -0.11039 -0.27508 0.546021\nv -0.066205 -0.270351 0.564711\nv -0.154225 -0.138052 0.502391\nv -0.159867 -0.142787 0.513271\nv -0.15533 -0.142366 0.518626\nv -0.148566 -0.137426 0.506285\nv -0.160416 -0.138344 0.518258\nv -0.161965 -0.141513 0.511996\nv -0.110811 -0.126394 0.533276\nv -0.10089 -0.129879 0.583501\nv -0.0809374 -0.117865 0.558397\nv -0.263876 0.014785 0.500935\nv -0.26083 0.088932 0.49537\nv -0.279702 0.127055 0.470506\nv -0.207764 0.0867397 0.523776\nv -0.187729 0.0509786 0.529558\nv -0.232096 -0.0167025 0.518065\nv -0.344056 0.133304 0.417078\nv -0.302046 0.166376 0.445239\nv -0.292551 0.225429 0.44414\nv -0.316041 0.250468 0.418475\nv -0.335386 -0.250836 0.156385\nv -0.387207 -0.179618 0.074568\nv -0.353755 -0.194151 0.0276524\nv -0.292388 -0.279891 0.104617\nv -0.392211 0.205733 0.320201\nv -0.386651 0.150025 0.344942\nv -0.126064 0.567371 -0.651942\nv -0.117096 0.725914 -0.596082\nv -0.209068 0.754227 0.387245\nv -0.134091 -0.133281 0.515294\nv -0.132384 -0.133778 0.530774\nv -0.118289 -0.366228 0.490722\nv -0.0673742 -0.375085 0.505343\nv -0.0685259 -0.327012 0.553422\nv -0.117722 -0.319453 0.530388\nv -0.287793 -0.13528 0.424643\nv -0.375234 0.0965671 0.380457\nv -0.394351 0.054463 0.33218\nv -0.0714373 0.993797 -0.182751\nv -0.0825568 0.953558 -0.338084\nv -0.177458 0.935674 -0.330221\nv -0.176961 0.259482 0.501637\nv -0.139651 0.267463 0.490903\nv -0.141176 0.271537 0.486156\nv -0.175792 0.263446 0.495797\nv -0.139621 0.240295 0.49489\nv -0.181918 0.230053 0.49499\nv -0.335299 0.587722 0.356851\nv -0.311189 0.51838 0.416464\nv -0.263028 0.350391 0.495528\nv -0.252435 0.331198 0.496568\nv -0.111168 0.276448 0.500608\nv -0.113553 0.255671 0.49582\nv -0.124754 0.293525 0.500263\nv -0.124275 0.282616 0.489933\nv -0.138587 0.254671 0.496603\nv -0.17851 0.246346 0.500783\nv -0.120744 0.272286 0.476557\nv -0.150635 0.0843194 0.549231\nv -0.110981 -0.197039 0.578654\nv -0.145877 -0.226522 0.547184\nv -0.257825 -0.146365 0.464946\nv -0.181813 -0.015013 0.533586\nv -0.21057 0.0188715 0.525811\nv -0.169226 -0.14996 0.516989\nv -0.181743 -0.1588 0.515902\nv -0.175376 -0.168545 0.522911\nv -0.163813 -0.153415 0.52335\nv -0.140253 -0.128364 0.545887\nv -0.153091 -0.134363 0.527834\nv -0.414608 -0.0714286 0.0335337\nv -0.0376523 0.063203 0.628721\nv -0.0232707 0.0530365 0.640016\nv -0.190483 -0.134521 -0.42891\nv -0.190425 -0.0530365 -0.446291\nv -0.0856669 -0.0492716 -0.489617\nv -0.0841703 -0.13027 -0.463549\nv -0.238743 0.312729 0.498784\nv -0.236568 0.310718 0.495914\nv -0.245034 0.325784 0.495083\nv -0.120311 0.281967 0.47734\nv -0.176107 -0.207054 0.530523\nv -0.114635 -0.15994 0.588938\nv -0.0702155 -0.19877 0.595006\nv -0.0735478 -0.165324 0.619338\nv -0.0899814 0.151661 0.600396\nv -0.111016 0.0572925 0.58557\nv -0.101867 0.0715163 0.586237\nv -0.127064 0.0733753 0.597824\nv -0.136833 0.0543987 0.574241\nv -0.135833 0.107312 0.581379\nv -0.278287 0.38386 0.485911\nv -0.171226 -0.145371 0.517737\nv -0.0426215 -0.114106 0.575498\nv -0.0575293 -0.131258 0.610721\nv -0.0203535 0.0339429 0.602828\nv -0.224215 0.246978 0.496697\nv -0.219644 0.257664 0.498129\nv -0.308126 0.284604 0.426215\nv -0.296275 0.279026 0.430641\nv -0.291721 0.275554 0.437358\nv -0.286612 0.276705 0.435172\nv -0.291949 0.280143 0.428238\nv -0.065825 -0.384532 0.440825\nv -0.11702 -0.382428 0.436651\nv -0.374667 0.821265 -0.265393\nv -0.3198 0.831958 -0.392208\nv -0.362179 0.712818 -0.467507\nv -0.425879 0.698185 -0.319692\nv -0.269938 0.909215 -0.296313\nv -0.308015 0.900609 -0.210562\nv -0.440407 0.677046 -0.175192\nv -0.387417 0.807117 -0.128411\nv -0.312037 0.894728 -0.0788123\nv -0.0720161 -0.391612 0.376675\nv -0.127765 -0.376523 0.378341\nv -0.124801 0.303066 0.504835\nv -0.0997913 0.860855 -0.486022\nv -0.212687 0.850449 -0.463771\nv -0.245244 0.723306 -0.559461\nv -0.199083 0.0271847 -0.488407\nv -0.21986 0.118005 -0.554936\nv -0.10327 0.117479 -0.600127\nv -0.0928636 0.0273016 -0.53883\nv -0.389259 0.144254 -0.303446\nv -0.329178 0.130557 -0.444432\nv -0.359227 0.250316 -0.491237\nv -0.422325 0.258021 -0.333419\nv -0.123907 0.397932 -0.664658\nv -0.113699 0.240517 -0.645459\nv -0.381641 0.401913 -0.512072\nv -0.448592 0.395605 -0.3508\nv -0.450574 0.547705 -0.348333\nv -0.384366 0.562601 -0.506817\nv -0.462722 0.528827 -0.195952\nv -0.310604 0.866976 0.0721301\nv -0.372013 -0.183143 -0.115123\nv -0.387686 -0.0789994 -0.141781\nv -0.2476 0.197566 0.475487\nv -0.230342 0.231532 0.488372\nv -0.129238 -0.0890256 0.584927\nv -0.123544 -0.115971 0.574872\nv -0.114588 -0.128867 0.557082\nv -0.221702 0.122764 0.506442\nv -0.216107 0.26119 0.49413\nv -0.253242 0.263207 0.478422\nv -0.256568 0.260547 0.479737\nv -0.115342 0.273619 0.475323\nv -0.298743 0.299903 0.422953\nv -0.291698 0.283732 0.432722\nv -0.295854 0.288181 0.418253\nv -0.142059 0.263388 0.482491\nv -0.120428 0.267802 0.470325\nv -0.172108 0.256934 0.489641\nv -0.275083 0.271584 0.453242\nv -0.248582 0.25684 0.473757\nv -0.275001 0.268573 0.446274\nv -0.234253 0.331396 0.490634\nv -0.187624 0.326819 0.49717\nv -0.300292 0.274694 0.432944\nv -0.135658 -0.0739483 0.577444\nv -0.237428 0.052791 0.514919\nv -0.0645564 0.270789 0.544612\nv -0.373819 0.514195 0.287264\nv -0.321852 -0.214718 -0.338184\nv -0.348166 -0.27584 -0.333396\nv -0.352171 -0.333378 -0.190533\nv -0.354936 -0.247872 -0.205511\nv -0.0936937 -0.549137 0.186785\nv -0.35669 -0.197653 -0.0299733\nv -0.393228 -0.0876225 -0.0664009\nv -0.29161 -0.321499 0.0380294\nv -0.393638 -0.0904403 -0.014329\nv -0.241608 0.243201 -0.602916\nv -0.263209 0.569914 -0.609242\nv -0.349441 -0.283282 -0.0863831\nv -0.194821 -0.209504 -0.418674\nv -0.0862925 -0.206323 -0.448413\nv -0.261795 0.402579 -0.621448\nv -0.456233 0.372302 -0.191263\nv -0.455245 0.384813 -0.0591282\nv -0.408072 0.116608 0.297155\nv -0.298661 0.260278 0.439147\nv -0.287606 0.265861 0.450068\nv -0.279696 0.270216 0.454289\nv -0.162731 0.0172638 0.536515\nv -0.13087 -0.0222973 0.565699\nv -0.101475 0.0572691 0.580946\nv -0.0809198 0.301049 0.528407\nv -0.0556351 0.322972 0.54498\nv -0.272306 0.242932 0.464508\nv -0.262964 0.253017 0.476001\nv -0.233067 0.158607 0.487893\nv -0.412053 0.186142 0.273695\nv -0.154815 -0.0532762 0.55793\nv -0.0277489 0.331782 0.556427\nv -0.286179 0.277611 0.427928\nv -0.183941 -0.499632 0.122144\nv -0.331493 -0.386257 -0.0698735\nv -0.206238 -0.274279 -0.416026\nv -0.0915482 -0.274332 -0.437317\nv -0.277193 -0.438779 0.0481257\nv -0.484037 0.177414 -0.0276816\nv -0.458618 0.163319 -0.0553633\nv -0.437233 0.124752 -0.0367315\nv -0.471526 0.1616 -0.00366555\nv -0.476232 0.247018 0.00445479\nv -0.494987 0.232631 -0.0169773\nv -0.491035 0.317921 -0.0441971\nv -0.515688 0.298728 -0.0523583\nv -0.510175 0.332513 -0.1293\nv -0.532917 0.316524 -0.12405\nv -0.50993 0.303592 -0.186815\nv -0.534671 0.290233 -0.170849\nv -0.510152 0.231181 -0.21891\nv -0.537459 0.228895 -0.193058\nv -0.48934 0.122068 -0.20872\nv -0.519208 0.128879 -0.191363\nv -0.469632 0.0399528 -0.15424\nv -0.470766 -0.00661202 -0.0930419\nv -0.486142 0.00947665 -0.0819458\nv -0.495221 0.0472722 -0.1369\nv -0.459705 -0.0431682 -0.033446\nv -0.483546 -0.0248521 -0.0238816\nv -0.494011 0.289082 -0.0628932\nv -0.473502 0.238904 -0.0420457\nv -0.507246 0.300137 -0.117724\nv -0.512134 0.2833 -0.158502\nv -0.513712 0.235303 -0.176549\nv -0.50102 0.136093 -0.181582\nv -0.485095 0.0532704 -0.118549\nv -0.485253 0.0267755 -0.0671726\nv -0.481172 0.0136801 -0.012201\nv -0.456127 -0.0187428 0.0196958\nv -0.462909 0.027933 0.024969\nv -0.454923 0.0845591 -0.060163\nv -0.441284 0.0577602 -0.0294063\nv -0.440921 0.0840388 -0.0210813\nv -0.457712 0.18288 0.0414318\nv -0.458378 0.268123 0.0210228\nv -0.461588 0.318505 -0.044618\nv -0.468843 0.311858 -0.142898\nv -0.453707 0.232836 -0.195204\nv -0.436969 0.13182 -0.191047\nv -0.423167 0.0473306 -0.148288\nv -0.421945 -0.00467109 -0.089692\nv -0.423991 -0.0291198 -0.0260915\nv -0.429434 -0.0102776 0.0297746\nv -0.445242 0.0345158 0.0460211\nv -0.481617 0.0602039 -0.0524227\nv -0.474104 0.129276 -0.0866754\nv -0.480325 0.0824545 -0.101285\nv -0.469474 0.0446648 -0.013376\nv -0.478167 0.0776431 0.00467109\nv -0.503592 0.223961 -0.101887\nv -0.502575 0.131983 -0.147242\nv -0.453707 0.0999988 0.0450097\nv -0.413357 0.138549 -0.218945\nv -0.402232 0.0251035 -0.169299\nv -0.434023 0.249632 -0.229901\nv -0.0871226 -0.186639 0.484069\nv -0.139686 -0.173807 0.465537\nv -0.158481 -0.142278 0.458685\nv -0.0688299 0.0121893 0.376371\nv -0.150805 -0.116468 0.431278\nv -0.126228 -0.116368 0.360528\nv -0.142316 -0.166791 0.41184\nv -0.0730392 -0.218144 0.372349\nv -0.282087 0.293548 0.454716\nv -0.283513 0.320341 0.45129\nv -0.124398 0.285323 0.452968\nv -0.126795 0.269175 0.455978\nv -0.119353 0.275057 0.469524\nv -0.156265 0.2548 0.466332\nv -0.265074 0.27356 0.421036\nv -0.214762 0.253899 0.455218\nv -0.141855 0.312577 0.484315\nv -0.212745 0.255776 0.486875\nv -0.277117 0.302621 0.410811\nv -0.252014 0.333887 0.433371\nv -0.20141 0.342405 0.464461\nv -0.120767 0.295565 0.473184\nv -0.145333 0.322832 0.456154\nv -0.126041 0.301873 0.455785\nv -0.119879 0.284837 0.470541\nv -0.0516539 -0.100847 0.27211\nv -0.454245 -0.41571 -0.353027\nv -0.413392 -0.372097 -0.332203\nv -0.255785 -0.398019 -0.4467\nv -0.294685 -0.464338 -0.476902\nv -0.174388 -0.714777 0.156607\nv -0.0715543 -0.738454 0.180284\nv -0.0798266 -0.636725 0.177765\nv -0.171536 -0.601788 0.131147\nv -0.337345 -0.494639 -0.0546091\nv -0.355094 -0.419334 -0.180442\nv -0.379665 -0.504905 -0.184915\nv -0.373053 -0.619338 -0.0373044\nv -0.45328 -0.545816 -0.197379\nv -0.454128 -0.653065 -0.0942754\nv -0.0965876 -0.904778 0.254759\nv -0.0736004 -0.845567 0.20775\nv -0.172974 -0.81408 0.195975\nv -0.1973 -0.864375 0.243622\nv -0.520961 -0.488138 -0.3841\nv -0.556272 -0.584635 -0.21946\nv -0.439238 -0.799155 0.0975785\nv -0.381694 -0.748264 0.0442672\nv -0.45103 -0.731883 -0.0219173\nv -0.519067 -0.768135 -0.0077988\nv -0.273785 -0.806328 0.115322\nv -0.319391 -0.83802 0.183769\nv -0.163088 -0.604103 -0.559421\nv -0.356672 -0.543712 -0.525361\nv -0.131226 -0.496761 -0.498854\nv -0.114629 -0.410074 -0.45775\nv -0.546533 -0.697291 -0.117619\nv -0.100633 -0.33885 -0.437013\nv -0.22677 -0.331835 -0.424707\nv -0.274931 -0.684651 0.0790578\nv -0.28021 -0.553908 0.0669913\nv -0.378028 -0.321668 -0.326088\nv 0.172833 0.300014 0.41564\nv -0.171097 0.299996 0.415616\n# 1258 vertices\n\nvt  0.532 0.923 0.000\nvt  0.535 0.917 0.000\nvt  0.542 0.923 0.000\nvt  0.541 0.929 0.000\nvt  0.521 0.984 0.000\nvt  0.521 0.996 0.000\nvt  0.505 0.998 0.000\nvt  0.500 0.985 0.000\nvt  0.504 0.917 0.000\nvt  0.507 0.910 0.000\nvt  0.516 0.910 0.000\nvt  0.515 0.918 0.000\nvt  0.523 0.921 0.000\nvt  0.525 0.913 0.000\nvt  0.549 0.958 0.000\nvt  0.538 0.954 0.000\nvt  0.544 0.942 0.000\nvt  0.550 0.946 0.000\nvt  0.545 0.935 0.000\nvt  0.550 0.932 0.000\nvt  0.547 0.974 0.000\nvt  0.533 0.967 0.000\nvt  0.500 0.917 0.000\nvt  0.500 0.910 0.000\nvt  0.542 0.987 0.000\nvt  0.533 0.994 0.000\nvt  0.616 0.254 0.000\nvt  0.653 0.261 0.000\nvt  0.658 0.307 0.000\nvt  0.619 0.292 0.000\nvt  0.636 0.438 0.000\nvt  0.620 0.419 0.000\nvt  0.627 0.396 0.000\nvt  0.647 0.414 0.000\nvt  0.886 0.312 0.000\nvt  0.897 0.370 0.000\nvt  0.860 0.369 0.000\nvt  0.844 0.308 0.000\nvt  0.740 0.593 0.000\nvt  0.741 0.542 0.000\nvt  0.759 0.541 0.000\nvt  0.768 0.598 0.000\nvt  0.644 0.213 0.000\nvt  0.561 0.175 0.000\nvt  0.566 0.146 0.000\nvt  0.644 0.174 0.000\nvt  0.580 0.254 0.000\nvt  0.585 0.277 0.000\nvt  0.565 0.268 0.000\nvt  0.565 0.256 0.000\nvt  0.590 0.217 0.000\nvt  0.544 0.195 0.000\nvt  0.771 0.721 0.000\nvt  0.736 0.712 0.000\nvt  0.758 0.653 0.000\nvt  0.794 0.663 0.000\nvt  0.669 0.622 0.000\nvt  0.685 0.632 0.000\nvt  0.665 0.669 0.000\nvt  0.652 0.651 0.000\nvt  0.623 0.588 0.000\nvt  0.632 0.582 0.000\nvt  0.639 0.590 0.000\nvt  0.627 0.599 0.000\nvt  0.641 0.632 0.000\nvt  0.657 0.612 0.000\nvt  0.619 0.580 0.000\nvt  0.617 0.575 0.000\nvt  0.623 0.573 0.000\nvt  0.627 0.576 0.000\nvt  0.708 0.702 0.000\nvt  0.729 0.646 0.000\nvt  0.633 0.614 0.000\nvt  0.647 0.601 0.000\nvt  0.604 0.718 0.000\nvt  0.574 0.725 0.000\nvt  0.567 0.686 0.000\nvt  0.596 0.682 0.000\nvt  0.562 0.648 0.000\nvt  0.590 0.649 0.000\nvt  0.618 0.756 0.000\nvt  0.584 0.769 0.000\nvt  0.586 0.587 0.000\nvt  0.566 0.586 0.000\nvt  0.568 0.579 0.000\nvt  0.586 0.580 0.000\nvt  0.569 0.574 0.000\nvt  0.586 0.573 0.000\nvt  0.562 0.627 0.000\nvt  0.587 0.627 0.000\nvt  0.587 0.610 0.000\nvt  0.563 0.608 0.000\nvt  0.565 0.595 0.000\nvt  0.587 0.596 0.000\nvt  0.521 0.441 0.000\nvt  0.526 0.450 0.000\nvt  0.520 0.450 0.000\nvt  0.517 0.445 0.000\nvt  0.720 0.504 0.000\nvt  0.709 0.467 0.000\nvt  0.727 0.446 0.000\nvt  0.738 0.494 0.000\nvt  0.656 0.383 0.000\nvt  0.660 0.348 0.000\nvt  0.684 0.368 0.000\nvt  0.673 0.403 0.000\nvt  0.572 0.371 0.000\nvt  0.573 0.365 0.000\nvt  0.581 0.364 0.000\nvt  0.581 0.374 0.000\nvt  0.708 0.400 0.000\nvt  0.693 0.431 0.000\nvt  0.604 0.401 0.000\nvt  0.609 0.383 0.000\nvt  0.557 0.364 0.000\nvt  0.559 0.365 0.000\nvt  0.557 0.366 0.000\nvt  0.556 0.364 0.000\nvt  0.552 0.367 0.000\nvt  0.552 0.364 0.000\nvt  0.568 0.377 0.000\nvt  0.561 0.374 0.000\nvt  0.566 0.370 0.000\nvt  0.594 0.377 0.000\nvt  0.594 0.363 0.000\nvt  0.653 0.551 0.000\nvt  0.644 0.534 0.000\nvt  0.658 0.523 0.000\nvt  0.666 0.545 0.000\nvt  0.637 0.480 0.000\nvt  0.625 0.458 0.000\nvt  0.649 0.459 0.000\nvt  0.662 0.434 0.000\nvt  0.557 0.345 0.000\nvt  0.553 0.353 0.000\nvt  0.543 0.349 0.000\nvt  0.546 0.337 0.000\nvt  0.586 0.403 0.000\nvt  0.573 0.392 0.000\nvt  0.579 0.382 0.000\nvt  0.591 0.389 0.000\nvt  0.572 0.343 0.000\nvt  0.584 0.331 0.000\nvt  0.590 0.347 0.000\nvt  0.578 0.353 0.000\nvt  0.553 0.358 0.000\nvt  0.543 0.355 0.000\nvt  0.553 0.499 0.000\nvt  0.541 0.507 0.000\nvt  0.542 0.484 0.000\nvt  0.553 0.477 0.000\nvt  0.539 0.532 0.000\nvt  0.529 0.541 0.000\nvt  0.531 0.513 0.000\nvt  0.551 0.538 0.000\nvt  0.538 0.552 0.000\nvt  0.552 0.521 0.000\nvt  0.908 0.437 0.000\nvt  0.876 0.429 0.000\nvt  0.608 0.340 0.000\nvt  0.599 0.314 0.000\nvt  0.629 0.336 0.000\nvt  0.691 0.326 0.000\nvt  0.723 0.365 0.000\nvt  0.748 0.426 0.000\nvt  0.755 0.489 0.000\nvt  0.564 0.825 0.000\nvt  0.590 0.868 0.000\nvt  0.558 0.886 0.000\nvt  0.533 0.834 0.000\nvt  0.637 0.789 0.000\nvt  0.673 0.755 0.000\nvt  0.702 0.774 0.000\nvt  0.665 0.817 0.000\nvt  0.740 0.787 0.000\nvt  0.545 0.727 0.000\nvt  0.540 0.686 0.000\nvt  0.551 0.550 0.000\nvt  0.538 0.572 0.000\nvt  0.520 0.546 0.000\nvt  0.522 0.517 0.000\nvt  0.552 0.775 0.000\nvt  0.524 0.777 0.000\nvt  0.521 0.728 0.000\nvt  0.500 0.687 0.000\nvt  0.500 0.651 0.000\nvt  0.515 0.650 0.000\nvt  0.518 0.687 0.000\nvt  0.500 0.727 0.000\nvt  0.625 0.671 0.000\nvt  0.618 0.644 0.000\nvt  0.591 0.533 0.000\nvt  0.571 0.539 0.000\nvt  0.569 0.527 0.000\nvt  0.589 0.518 0.000\nvt  0.545 0.436 0.000\nvt  0.525 0.427 0.000\nvt  0.528 0.413 0.000\nvt  0.549 0.425 0.000\nvt  0.556 0.449 0.000\nvt  0.563 0.439 0.000\nvt  0.514 0.395 0.000\nvt  0.532 0.396 0.000\nvt  0.513 0.409 0.000\nvt  0.566 0.511 0.000\nvt  0.564 0.490 0.000\nvt  0.577 0.478 0.000\nvt  0.584 0.500 0.000\nvt  0.500 0.408 0.000\nvt  0.500 0.394 0.000\nvt  0.571 0.457 0.000\nvt  0.561 0.468 0.000\nvt  0.554 0.561 0.000\nvt  0.557 0.563 0.000\nvt  0.552 0.569 0.000\nvt  0.548 0.569 0.000\nvt  0.627 0.847 0.000\nvt  0.674 0.871 0.000\nvt  0.645 0.898 0.000\nvt  0.776 0.920 0.000\nvt  0.709 0.921 0.000\nvt  0.729 0.888 0.000\nvt  0.783 0.887 0.000\nvt  0.693 0.947 0.000\nvt  0.621 0.920 0.000\nvt  0.535 0.642 0.000\nvt  0.542 0.618 0.000\nvt  0.545 0.599 0.000\nvt  0.559 0.383 0.000\nvt  0.552 0.377 0.000\nvt  0.531 0.470 0.000\nvt  0.520 0.472 0.000\nvt  0.517 0.456 0.000\nvt  0.528 0.457 0.000\nvt  0.530 0.438 0.000\nvt  0.517 0.436 0.000\nvt  0.528 0.383 0.000\nvt  0.513 0.384 0.000\nvt  0.512 0.374 0.000\nvt  0.526 0.374 0.000\nvt  0.512 0.367 0.000\nvt  0.526 0.366 0.000\nvt  0.512 0.362 0.000\nvt  0.526 0.362 0.000\nvt  0.511 0.422 0.000\nvt  0.500 0.384 0.000\nvt  0.500 0.375 0.000\nvt  0.500 0.362 0.000\nvt  0.500 0.367 0.000\nvt  0.511 0.472 0.000\nvt  0.508 0.457 0.000\nvt  0.521 0.491 0.000\nvt  0.512 0.519 0.000\nvt  0.512 0.491 0.000\nvt  0.511 0.550 0.000\nvt  0.520 0.576 0.000\nvt  0.510 0.583 0.000\nvt  0.500 0.457 0.000\nvt  0.500 0.472 0.000\nvt  0.500 0.491 0.000\nvt  0.654 0.584 0.000\nvt  0.656 0.568 0.000\nvt  0.669 0.567 0.000\nvt  0.666 0.589 0.000\nvt  0.705 0.639 0.000\nvt  0.718 0.591 0.000\nvt  0.684 0.563 0.000\nvt  0.680 0.592 0.000\nvt  0.637 0.575 0.000\nvt  0.636 0.566 0.000\nvt  0.645 0.567 0.000\nvt  0.645 0.579 0.000\nvt  0.723 0.546 0.000\nvt  0.697 0.592 0.000\nvt  0.702 0.554 0.000\nvt  0.500 0.163 0.000\nvt  0.500 0.137 0.000\nvt  0.579 0.298 0.000\nvt  0.570 0.317 0.000\nvt  0.554 0.307 0.000\nvt  0.560 0.287 0.000\nvt  0.534 0.318 0.000\nvt  0.517 0.314 0.000\nvt  0.519 0.296 0.000\nvt  0.538 0.300 0.000\nvt  0.562 0.362 0.000\nvt  0.559 0.363 0.000\nvt  0.557 0.362 0.000\nvt  0.559 0.360 0.000\nvt  0.563 0.365 0.000\nvt  0.561 0.368 0.000\nvt  0.543 0.360 0.000\nvt  0.531 0.358 0.000\nvt  0.531 0.351 0.000\nvt  0.611 0.437 0.000\nvt  0.613 0.475 0.000\nvt  0.624 0.497 0.000\nvt  0.580 0.445 0.000\nvt  0.590 0.466 0.000\nvt  0.598 0.418 0.000\nvt  0.648 0.501 0.000\nvt  0.633 0.516 0.000\nvt  0.641 0.554 0.000\nvt  0.630 0.541 0.000\nvt  0.733 0.331 0.000\nvt  0.696 0.288 0.000\nvt  0.706 0.252 0.000\nvt  0.751 0.313 0.000\nvt  0.683 0.535 0.000\nvt  0.674 0.508 0.000\nvt  0.999 0.696 0.000\nvt  0.986 0.778 0.000\nvt  0.950 0.772 0.000\nvt  0.967 0.695 0.000\nvt  0.600 0.811 0.000\nvt  0.552 0.361 0.000\nvt  0.547 0.367 0.000\nvt  0.546 0.364 0.000\nvt  0.525 0.254 0.000\nvt  0.546 0.261 0.000\nvt  0.542 0.280 0.000\nvt  0.522 0.274 0.000\nvt  0.631 0.369 0.000\nvt  0.678 0.460 0.000\nvt  0.662 0.482 0.000\nvt  0.770 0.948 0.000\nvt  0.762 0.981 0.000\nvt  0.676 0.977 0.000\nvt  0.845 0.915 0.000\nvt  0.835 0.891 0.000\nvt  0.569 0.560 0.000\nvt  0.582 0.558 0.000\nvt  0.580 0.563 0.000\nvt  0.569 0.564 0.000\nvt  0.590 0.544 0.000\nvt  0.571 0.548 0.000\nvt  0.635 0.701 0.000\nvt  0.651 0.731 0.000\nvt  0.607 0.593 0.000\nvt  0.609 0.606 0.000\nvt  0.543 0.570 0.000\nvt  0.553 0.556 0.000\nvt  0.552 0.580 0.000\nvt  0.556 0.574 0.000\nvt  0.569 0.554 0.000\nvt  0.585 0.551 0.000\nvt  0.559 0.566 0.000\nvt  0.550 0.458 0.000\nvt  0.532 0.330 0.000\nvt  0.549 0.325 0.000\nvt  0.610 0.364 0.000\nvt  0.589 0.432 0.000\nvt  0.578 0.417 0.000\nvt  0.570 0.357 0.000\nvt  0.565 0.360 0.000\nvt  0.562 0.356 0.000\nvt  0.565 0.351 0.000\nvt  0.557 0.364 0.000\nvt  0.556 0.364 0.000\nvt  0.548 0.371 0.000\nvt  0.557 0.371 0.000\nvt  0.762 0.385 0.000\nvt  0.513 0.445 0.000\nvt  0.508 0.444 0.000\nvt  0.500 0.520 0.000\nvt  0.939 0.378 0.000\nvt  0.932 0.316 0.000\nvt  0.972 0.321 0.000\nvt  0.974 0.384 0.000\nvt  0.605 0.572 0.000\nvt  0.605 0.578 0.000\nvt  0.605 0.584 0.000\nvt  0.559 0.571 0.000\nvt  0.562 0.333 0.000\nvt  0.500 0.552 0.000\nvt  0.500 0.585 0.000\nvt  0.531 0.343 0.000\nvt  0.514 0.338 0.000\nvt  0.516 0.324 0.000\nvt  0.532 0.488 0.000\nvt  0.534 0.448 0.000\nvt  0.540 0.446 0.000\nvt  0.545 0.448 0.000\nvt  0.538 0.455 0.000\nvt  0.541 0.466 0.000\nvt  0.612 0.623 0.000\nvt  0.567 0.366 0.000\nvt  0.513 0.356 0.000\nvt  0.500 0.355 0.000\nvt  0.500 0.346 0.000\nvt  0.514 0.348 0.000\nvt  0.543 0.363 0.000\nvt  0.552 0.364 0.000\nvt  0.531 0.362 0.000\nvt  0.512 0.361 0.000\nvt  0.509 0.433 0.000\nvt  0.500 0.444 0.000\nvt  0.500 0.432 0.000\nvt  0.603 0.551 0.000\nvt  0.599 0.557 0.000\nvt  0.627 0.570 0.000\nvt  0.631 0.571 0.000\nvt  0.625 0.566 0.000\nvt  0.622 0.569 0.000\nvt  0.621 0.567 0.000\nvt  0.529 0.234 0.000\nvt  0.500 0.249 0.000\nvt  0.500 0.227 0.000\nvt  0.550 0.245 0.000\nvt  0.857 0.816 0.000\nvt  0.825 0.804 0.000\nvt  0.851 0.737 0.000\nvt  0.886 0.748 0.000\nvt  0.821 0.866 0.000\nvt  0.798 0.856 0.000\nvt  0.783 0.797 0.000\nvt  0.810 0.729 0.000\nvt  0.755 0.848 0.000\nvt  0.534 0.215 0.000\nvt  0.563 0.233 0.000\nvt  0.548 0.588 0.000\nvt  0.884 0.835 0.000\nvt  0.908 0.854 0.000\nvt  0.919 0.761 0.000\nvt  0.947 0.512 0.000\nvt  0.944 0.446 0.000\nvt  0.974 0.452 0.000\nvt  0.974 0.519 0.000\nvt  0.915 0.504 0.000\nvt  0.887 0.498 0.000\nvt  0.917 0.564 0.000\nvt  0.890 0.556 0.000\nvt  0.999 0.634 0.000\nvt  0.973 0.633 0.000\nvt  0.975 0.577 0.000\nvt  0.999 0.579 0.000\nvt  0.882 0.614 0.000\nvt  0.911 0.622 0.000\nvt  0.901 0.679 0.000\nvt  0.868 0.671 0.000\nvt  0.833 0.667 0.000\nvt  0.708 0.836 0.000\nvt  0.500 0.205 0.000\nvt  0.826 0.364 0.000\nvt  0.801 0.303 0.000\nvt  0.613 0.529 0.000\nvt  0.607 0.544 0.000\nvt  0.541 0.380 0.000\nvt  0.538 0.372 0.000\nvt  0.537 0.366 0.000\nvt  0.537 0.363 0.000\nvt  0.598 0.945 0.000\nvt  0.524 0.902 0.000\nvt  0.599 0.489 0.000\nvt  0.609 0.563 0.000\nvt  0.596 0.563 0.000\nvt  0.612 0.559 0.000\nvt  0.557 0.569 0.000\nvt  0.620 0.571 0.000\nvt  0.616 0.569 0.000\nvt  0.618 0.569 0.000\nvt  0.569 0.568 0.000\nvt  0.561 0.568 0.000\nvt  0.579 0.567 0.000\nvt  0.616 0.564 0.000\nvt  0.613 0.567 0.000\nvt  0.607 0.567 0.000\nvt  0.587 0.568 0.000\nvt  0.606 0.568 0.000\nvt  0.630 0.565 0.000\nvt  0.548 0.389 0.000\nvt  0.601 0.452 0.000\nvt  0.529 0.566 0.000\nvt  0.684 0.686 0.000\nvt  0.872 0.222 0.000\nvt  0.876 0.265 0.000\nvt  0.825 0.258 0.000\nvt  0.821 0.214 0.000\nvt  0.561 0.119 0.000\nvt  0.500 0.114 0.000\nvt  0.771 0.304 0.000\nvt  0.797 0.363 0.000\nvt  0.726 0.227 0.000\nvt  0.777 0.371 0.000\nvt  0.947 0.571 0.000\nvt  0.999 0.388 0.000\nvt  0.999 0.456 0.000\nvt  0.999 0.524 0.000\nvt  0.936 0.877 0.000\nvt  0.856 0.945 0.000\nvt  0.999 0.323 0.000\nvt  0.935 0.689 0.000\nvt  0.776 0.240 0.000\nvt  0.928 0.265 0.000\nvt  0.969 0.264 0.000\nvt  0.999 0.267 0.000\nvt  0.943 0.628 0.000\nvt  0.806 0.622 0.000\nvt  0.851 0.611 0.000\nvt  0.500 0.777 0.000\nvt  0.500 0.839 0.000\nvt  0.692 0.489 0.000\nvt  0.631 0.558 0.000\nvt  0.622 0.562 0.000\nvt  0.626 0.560 0.000\nvt  0.555 0.413 0.000\nvt  0.570 0.429 0.000\nvt  0.539 0.440 0.000\nvt  0.524 0.607 0.000\nvt  0.531 0.591 0.000\nvt  0.500 0.361 0.000\nvt  0.500 0.321 0.000\nvt  0.500 0.312 0.000\nvt  0.500 0.336 0.000\nvt  0.500 0.294 0.000\nvt  0.500 0.273 0.000\nvt  0.622 0.549 0.000\nvt  0.616 0.554 0.000\nvt  0.607 0.509 0.000\nvt  0.701 0.520 0.000\nvt  0.500 0.421 0.000\nvt  0.564 0.403 0.000\nvt  0.511 0.615 0.000\nvt  0.500 0.618 0.000\nvt  0.617 0.568 0.000\nvt  0.636 0.139 0.000\nvt  0.764 0.192 0.000\nvt  0.921 0.220 0.000\nvt  0.967 0.219 0.000\nvt  0.708 0.168 0.000\nvt  0.999 0.218 0.000\nvt  0.803 0.523 0.000\nvt  0.794 0.535 0.000\nvt  0.783 0.527 0.000\nvt  0.791 0.508 0.000\nvt  0.789 0.571 0.000\nvt  0.797 0.562 0.000\nvt  0.813 0.591 0.000\nvt  0.815 0.578 0.000\nvt  0.839 0.583 0.000\nvt  0.835 0.574 0.000\nvt  0.850 0.569 0.000\nvt  0.845 0.560 0.000\nvt  0.855 0.539 0.000\nvt  0.847 0.535 0.000\nvt  0.850 0.501 0.000\nvt  0.841 0.502 0.000\nvt  0.814 0.438 0.000\nvt  0.836 0.464 0.000\nvt  0.828 0.472 0.000\nvt  0.809 0.452 0.000\nvt  0.792 0.427 0.000\nvt  0.790 0.441 0.000\nvt  0.818 0.567 0.000\nvt  0.807 0.550 0.000\nvt  0.831 0.561 0.000\nvt  0.839 0.553 0.000\nvt  0.837 0.534 0.000\nvt  0.831 0.505 0.000\nvt  0.820 0.479 0.000\nvt  0.804 0.465 0.000\nvt  0.786 0.460 0.000\nvt  0.773 0.456 0.000\nvt  0.779 0.433 0.000\nvt  0.797 0.489 0.000\nvt  0.785 0.495 0.000\nvt  0.789 0.486 0.000\nvt  0.772 0.537 0.000\nvt  0.781 0.583 0.000\nvt  0.812 0.602 0.000\nvt  0.848 0.587 0.000\nvt  0.862 0.546 0.000\nvt  0.859 0.500 0.000\nvt  0.820 0.412 0.000\nvt  0.843 0.450 0.000\nvt  0.791 0.404 0.000\nvt  0.773 0.417 0.000\nvt  0.764 0.447 0.000\nvt  0.801 0.477 0.000\nvt  0.813 0.487 0.000\nvt  0.806 0.496 0.000\nvt  0.787 0.478 0.000\nvt  0.778 0.489 0.000\nvt  0.822 0.538 0.000\nvt  0.822 0.510 0.000\nvt  0.767 0.492 0.000\nvt  0.870 0.496 0.000\nvt  0.851 0.425 0.000\nvt  0.872 0.552 0.000\nvt  0.500 0.183 0.000\nvt  0.516 0.930 0.000\nvt  0.500 0.928 0.000\nvt  0.528 0.934 0.000\nvt  0.537 0.938 0.000\nvt  0.516 0.970 0.000\nvt  0.520 0.955 0.000\nvt  0.530 0.952 0.000\nvt  0.522 0.944 0.000\nvt  0.512 0.942 0.000\nvt  0.615 0.572 0.000\nvt  0.612 0.569 0.000\nvt  0.576 0.968 0.000\nvt  0.573 0.973 0.000\nvt  0.562 0.969 0.000\nvt  0.563 0.961 0.000\nvt  0.571 0.956 0.000\nvt  0.582 0.961 0.000\nvt  0.611 0.961 0.000\nvt  0.606 0.967 0.000\nvt  0.595 0.960 0.000\nvt  0.601 0.955 0.000\nvt  0.570 0.569 0.000\nvt  0.595 0.566 0.000\nvt  0.616 0.967 0.000\nvt  0.617 0.975 0.000\nvt  0.607 0.978 0.000\nvt  0.614 0.982 0.000\nvt  0.605 0.991 0.000\nvt  0.599 0.986 0.000\nvt  0.593 0.996 0.000\nvt  0.589 0.989 0.000\nvt  0.562 0.570 0.000\nvt  0.573 0.994 0.000\nvt  0.579 0.987 0.000\nvt  0.584 0.996 0.000\nvt  0.581 0.953 0.000\nvt  0.592 0.953 0.000\nvt  0.561 0.988 0.000\nvt  0.572 0.981 0.000\nvt  0.563 0.978 0.000\nvt  0.500 0.970 0.000\nvt  0.500 0.943 0.000\nvt  0.511 0.956 0.000\nvt  0.500 0.956 0.000\nvt  0.868 0.132 0.000\nvt  0.867 0.090 0.000\nvt  0.916 0.092 0.000\nvt  0.918 0.133 0.000\nvt  0.554 0.066 0.000\nvt  0.612 0.070 0.000\nvt  0.619 0.103 0.000\nvt  0.558 0.095 0.000\nvt  0.815 0.169 0.000\nvt  0.758 0.148 0.000\nvt  0.747 0.102 0.000\nvt  0.814 0.126 0.000\nvt  0.770 0.072 0.000\nvt  0.817 0.087 0.000\nvt  0.552 0.038 0.000\nvt  0.551 0.020 0.000\nvt  0.602 0.021 0.000\nvt  0.605 0.039 0.000\nvt  0.821 0.050 0.000\nvt  0.867 0.055 0.000\nvt  0.712 0.053 0.000\nvt  0.700 0.022 0.000\nvt  0.739 0.023 0.000\nvt  0.740 0.052 0.000\nvt  0.652 0.022 0.000\nvt  0.659 0.043 0.000\nvt  0.913 0.055 0.000\nvt  0.959 0.055 0.000\nvt  0.960 0.091 0.000\nvt  0.999 0.089 0.000\nvt  0.999 0.131 0.000\nvt  0.962 0.133 0.000\nvt  0.999 0.053 0.000\nvt  0.778 0.038 0.000\nvt  0.917 0.177 0.000\nvt  0.965 0.178 0.000\nvt  0.674 0.083 0.000\nvt  0.685 0.124 0.000\nvt  0.999 0.175 0.000\nvt  0.500 0.037 0.000\nvt  0.500 0.066 0.000\nvt  0.871 0.175 0.000\nvt  0.500 0.019 0.000\nvt  0.500 0.092 0.000\nvt  0.999 0.002 0.000\nvt  0.958 0.002 0.000\nvt  0.867 0.002 0.000\nvt  0.823 0.002 0.000\nvt  0.908 0.002 0.000\nvt  0.601 0.002 0.000\nvt  0.550 0.002 0.000\nvt  0.697 0.002 0.000\nvt  0.650 0.002 0.000\nvt  0.782 0.002 0.000\nvt  0.740 0.002 0.000\nvt  0.500 0.002 0.000\nvt  0.468 0.923 0.000\nvt  0.459 0.929 0.000\nvt  0.458 0.923 0.000\nvt  0.465 0.917 0.000\nvt  0.479 0.984 0.000\nvt  0.495 0.998 0.000\nvt  0.479 0.996 0.000\nvt  0.496 0.917 0.000\nvt  0.485 0.918 0.000\nvt  0.484 0.910 0.000\nvt  0.493 0.910 0.000\nvt  0.477 0.921 0.000\nvt  0.475 0.913 0.000\nvt  0.451 0.958 0.000\nvt  0.450 0.946 0.000\nvt  0.456 0.942 0.000\nvt  0.462 0.954 0.000\nvt  0.455 0.935 0.000\nvt  0.450 0.932 0.000\nvt  0.467 0.967 0.000\nvt  0.453 0.974 0.000\nvt  0.467 0.994 0.000\nvt  0.458 0.987 0.000\nvt  0.384 0.254 0.000\nvt  0.381 0.292 0.000\nvt  0.342 0.307 0.000\nvt  0.347 0.261 0.000\nvt  0.364 0.438 0.000\nvt  0.353 0.414 0.000\nvt  0.373 0.396 0.000\nvt  0.380 0.419 0.000\nvt  0.114 0.312 0.000\nvt  0.156 0.308 0.000\nvt  0.140 0.369 0.000\nvt  0.103 0.370 0.000\nvt  0.260 0.593 0.000\nvt  0.232 0.598 0.000\nvt  0.241 0.541 0.000\nvt  0.259 0.542 0.000\nvt  0.356 0.213 0.000\nvt  0.356 0.174 0.000\nvt  0.434 0.146 0.000\nvt  0.439 0.175 0.000\nvt  0.420 0.254 0.000\nvt  0.435 0.256 0.000\nvt  0.435 0.268 0.000\nvt  0.415 0.277 0.000\nvt  0.456 0.195 0.000\nvt  0.410 0.217 0.000\nvt  0.229 0.721 0.000\nvt  0.206 0.663 0.000\nvt  0.242 0.653 0.000\nvt  0.264 0.712 0.000\nvt  0.331 0.622 0.000\nvt  0.348 0.651 0.000\nvt  0.335 0.669 0.000\nvt  0.315 0.632 0.000\nvt  0.377 0.588 0.000\nvt  0.373 0.599 0.000\nvt  0.361 0.590 0.000\nvt  0.368 0.582 0.000\nvt  0.359 0.632 0.000\nvt  0.343 0.612 0.000\nvt  0.381 0.580 0.000\nvt  0.373 0.576 0.000\nvt  0.377 0.573 0.000\nvt  0.383 0.575 0.000\nvt  0.292 0.702 0.000\nvt  0.271 0.646 0.000\nvt  0.353 0.601 0.000\nvt  0.367 0.614 0.000\nvt  0.396 0.718 0.000\nvt  0.404 0.682 0.000\nvt  0.433 0.686 0.000\nvt  0.426 0.725 0.000\nvt  0.410 0.649 0.000\nvt  0.438 0.648 0.000\nvt  0.416 0.769 0.000\nvt  0.382 0.756 0.000\nvt  0.414 0.587 0.000\nvt  0.414 0.580 0.000\nvt  0.432 0.579 0.000\nvt  0.434 0.586 0.000\nvt  0.431 0.574 0.000\nvt  0.414 0.573 0.000\nvt  0.413 0.627 0.000\nvt  0.438 0.627 0.000\nvt  0.413 0.610 0.000\nvt  0.413 0.596 0.000\nvt  0.435 0.595 0.000\nvt  0.437 0.608 0.000\nvt  0.479 0.441 0.000\nvt  0.483 0.445 0.000\nvt  0.480 0.450 0.000\nvt  0.474 0.450 0.000\nvt  0.280 0.504 0.000\nvt  0.262 0.494 0.000\nvt  0.273 0.446 0.000\nvt  0.291 0.467 0.000\nvt  0.344 0.383 0.000\nvt  0.327 0.403 0.000\nvt  0.316 0.368 0.000\nvt  0.340 0.348 0.000\nvt  0.428 0.371 0.000\nvt  0.419 0.374 0.000\nvt  0.419 0.364 0.000\nvt  0.427 0.365 0.000\nvt  0.307 0.431 0.000\nvt  0.292 0.400 0.000\nvt  0.391 0.383 0.000\nvt  0.396 0.401 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.366 0.000\nvt  0.441 0.365 0.000\nvt  0.448 0.367 0.000\nvt  0.448 0.364 0.000\nvt  0.432 0.377 0.000\nvt  0.434 0.370 0.000\nvt  0.439 0.374 0.000\nvt  0.406 0.377 0.000\nvt  0.406 0.363 0.000\nvt  0.347 0.551 0.000\nvt  0.334 0.545 0.000\nvt  0.342 0.523 0.000\nvt  0.356 0.534 0.000\nvt  0.363 0.480 0.000\nvt  0.351 0.459 0.000\nvt  0.375 0.458 0.000\nvt  0.338 0.434 0.000\nvt  0.443 0.345 0.000\nvt  0.454 0.337 0.000\nvt  0.457 0.349 0.000\nvt  0.447 0.353 0.000\nvt  0.414 0.403 0.000\nvt  0.409 0.389 0.000\nvt  0.421 0.382 0.000\nvt  0.427 0.392 0.000\nvt  0.428 0.343 0.000\nvt  0.422 0.353 0.000\nvt  0.410 0.347 0.000\nvt  0.416 0.331 0.000\nvt  0.457 0.355 0.000\nvt  0.447 0.358 0.000\nvt  0.447 0.499 0.000\nvt  0.447 0.477 0.000\nvt  0.458 0.484 0.000\nvt  0.459 0.507 0.000\nvt  0.461 0.532 0.000\nvt  0.469 0.513 0.000\nvt  0.471 0.541 0.000\nvt  0.449 0.538 0.000\nvt  0.448 0.521 0.000\nvt  0.462 0.552 0.000\nvt  0.124 0.429 0.000\nvt  0.092 0.437 0.000\nvt  0.392 0.340 0.000\nvt  0.371 0.336 0.000\nvt  0.401 0.314 0.000\nvt  0.309 0.326 0.000\nvt  0.252 0.426 0.000\nvt  0.277 0.365 0.000\nvt  0.245 0.489 0.000\nvt  0.436 0.825 0.000\nvt  0.467 0.834 0.000\nvt  0.442 0.886 0.000\nvt  0.410 0.868 0.000\nvt  0.363 0.789 0.000\nvt  0.335 0.817 0.000\nvt  0.298 0.774 0.000\nvt  0.327 0.755 0.000\nvt  0.260 0.787 0.000\nvt  0.460 0.686 0.000\nvt  0.455 0.727 0.000\nvt  0.462 0.572 0.000\nvt  0.449 0.550 0.000\nvt  0.480 0.546 0.000\nvt  0.478 0.517 0.000\nvt  0.479 0.728 0.000\nvt  0.476 0.777 0.000\nvt  0.448 0.775 0.000\nvt  0.482 0.687 0.000\nvt  0.485 0.650 0.000\nvt  0.375 0.671 0.000\nvt  0.382 0.644 0.000\nvt  0.409 0.533 0.000\nvt  0.411 0.518 0.000\nvt  0.431 0.527 0.000\nvt  0.429 0.539 0.000\nvt  0.455 0.436 0.000\nvt  0.451 0.425 0.000\nvt  0.472 0.413 0.000\nvt  0.475 0.427 0.000\nvt  0.444 0.449 0.000\nvt  0.437 0.439 0.000\nvt  0.486 0.395 0.000\nvt  0.487 0.409 0.000\nvt  0.468 0.396 0.000\nvt  0.434 0.511 0.000\nvt  0.416 0.500 0.000\nvt  0.423 0.478 0.000\nvt  0.436 0.490 0.000\nvt  0.429 0.457 0.000\nvt  0.439 0.468 0.000\nvt  0.446 0.561 0.000\nvt  0.452 0.569 0.000\nvt  0.448 0.569 0.000\nvt  0.443 0.563 0.000\nvt  0.373 0.847 0.000\nvt  0.355 0.898 0.000\nvt  0.326 0.871 0.000\nvt  0.224 0.920 0.000\nvt  0.217 0.887 0.000\nvt  0.271 0.888 0.000\nvt  0.291 0.921 0.000\nvt  0.379 0.920 0.000\nvt  0.307 0.947 0.000\nvt  0.465 0.642 0.000\nvt  0.455 0.599 0.000\nvt  0.458 0.618 0.000\nvt  0.448 0.377 0.000\nvt  0.441 0.383 0.000\nvt  0.469 0.470 0.000\nvt  0.472 0.457 0.000\nvt  0.483 0.456 0.000\nvt  0.480 0.472 0.000\nvt  0.470 0.438 0.000\nvt  0.483 0.436 0.000\nvt  0.472 0.383 0.000\nvt  0.474 0.374 0.000\nvt  0.488 0.374 0.000\nvt  0.487 0.384 0.000\nvt  0.474 0.366 0.000\nvt  0.488 0.367 0.000\nvt  0.474 0.362 0.000\nvt  0.488 0.362 0.000\nvt  0.489 0.422 0.000\nvt  0.492 0.457 0.000\nvt  0.489 0.472 0.000\nvt  0.479 0.491 0.000\nvt  0.488 0.491 0.000\nvt  0.488 0.519 0.000\nvt  0.489 0.550 0.000\nvt  0.490 0.583 0.000\nvt  0.480 0.576 0.000\nvt  0.346 0.584 0.000\nvt  0.334 0.589 0.000\nvt  0.331 0.567 0.000\nvt  0.344 0.568 0.000\nvt  0.295 0.639 0.000\nvt  0.282 0.591 0.000\nvt  0.320 0.592 0.000\nvt  0.316 0.563 0.000\nvt  0.363 0.575 0.000\nvt  0.355 0.579 0.000\nvt  0.355 0.567 0.000\nvt  0.364 0.566 0.000\nvt  0.277 0.546 0.000\nvt  0.298 0.554 0.000\nvt  0.303 0.592 0.000\nvt  0.421 0.298 0.000\nvt  0.440 0.287 0.000\nvt  0.446 0.307 0.000\nvt  0.430 0.317 0.000\nvt  0.466 0.318 0.000\nvt  0.462 0.300 0.000\nvt  0.481 0.296 0.000\nvt  0.483 0.314 0.000\nvt  0.438 0.362 0.000\nvt  0.441 0.360 0.000\nvt  0.443 0.362 0.000\nvt  0.441 0.363 0.000\nvt  0.439 0.368 0.000\nvt  0.437 0.365 0.000\nvt  0.469 0.351 0.000\nvt  0.469 0.358 0.000\nvt  0.457 0.360 0.000\nvt  0.389 0.437 0.000\nvt  0.387 0.475 0.000\nvt  0.376 0.497 0.000\nvt  0.420 0.445 0.000\nvt  0.410 0.466 0.000\nvt  0.402 0.418 0.000\nvt  0.352 0.501 0.000\nvt  0.367 0.516 0.000\nvt  0.359 0.554 0.000\nvt  0.370 0.541 0.000\nvt  0.267 0.331 0.000\nvt  0.249 0.313 0.000\nvt  0.294 0.252 0.000\nvt  0.304 0.288 0.000\nvt  0.317 0.535 0.000\nvt  0.326 0.508 0.000\nvt  0.001 0.696 0.000\nvt  0.033 0.695 0.000\nvt  0.050 0.772 0.000\nvt  0.014 0.778 0.000\nvt  0.400 0.811 0.000\nvt  0.448 0.361 0.000\nvt  0.454 0.364 0.000\nvt  0.453 0.367 0.000\nvt  0.475 0.254 0.000\nvt  0.478 0.274 0.000\nvt  0.458 0.280 0.000\nvt  0.454 0.261 0.000\nvt  0.369 0.369 0.000\nvt  0.322 0.460 0.000\nvt  0.338 0.482 0.000\nvt  0.324 0.977 0.000\nvt  0.238 0.981 0.000\nvt  0.230 0.948 0.000\nvt  0.155 0.915 0.000\nvt  0.165 0.891 0.000\nvt  0.431 0.560 0.000\nvt  0.431 0.564 0.000\nvt  0.420 0.563 0.000\nvt  0.418 0.558 0.000\nvt  0.410 0.544 0.000\nvt  0.429 0.548 0.000\nvt  0.349 0.731 0.000\nvt  0.365 0.701 0.000\nvt  0.391 0.606 0.000\nvt  0.393 0.593 0.000\nvt  0.457 0.570 0.000\nvt  0.447 0.556 0.000\nvt  0.444 0.574 0.000\nvt  0.448 0.580 0.000\nvt  0.415 0.551 0.000\nvt  0.431 0.554 0.000\nvt  0.441 0.566 0.000\nvt  0.450 0.458 0.000\nvt  0.451 0.325 0.000\nvt  0.468 0.330 0.000\nvt  0.390 0.364 0.000\nvt  0.411 0.432 0.000\nvt  0.422 0.417 0.000\nvt  0.430 0.357 0.000\nvt  0.435 0.351 0.000\nvt  0.438 0.356 0.000\nvt  0.435 0.360 0.000\nvt  0.443 0.364 0.000\nvt  0.444 0.364 0.000\nvt  0.443 0.371 0.000\nvt  0.452 0.371 0.000\nvt  0.238 0.385 0.000\nvt  0.487 0.445 0.000\nvt  0.492 0.444 0.000\nvt  0.061 0.378 0.000\nvt  0.026 0.384 0.000\nvt  0.028 0.321 0.000\nvt  0.068 0.316 0.000\nvt  0.395 0.572 0.000\nvt  0.395 0.578 0.000\nvt  0.395 0.584 0.000\nvt  0.441 0.571 0.000\nvt  0.438 0.333 0.000\nvt  0.469 0.343 0.000\nvt  0.486 0.338 0.000\nvt  0.484 0.324 0.000\nvt  0.468 0.488 0.000\nvt  0.466 0.448 0.000\nvt  0.462 0.455 0.000\nvt  0.455 0.448 0.000\nvt  0.460 0.446 0.000\nvt  0.459 0.466 0.000\nvt  0.388 0.623 0.000\nvt  0.433 0.366 0.000\nvt  0.487 0.356 0.000\nvt  0.486 0.348 0.000\nvt  0.457 0.363 0.000\nvt  0.448 0.364 0.000\nvt  0.469 0.362 0.000\nvt  0.488 0.361 0.000\nvt  0.491 0.433 0.000\nvt  0.401 0.557 0.000\nvt  0.397 0.551 0.000\nvt  0.373 0.570 0.000\nvt  0.369 0.571 0.000\nvt  0.375 0.566 0.000\nvt  0.379 0.567 0.000\nvt  0.378 0.569 0.000\nvt  0.471 0.234 0.000\nvt  0.450 0.245 0.000\nvt  0.143 0.816 0.000\nvt  0.114 0.748 0.000\nvt  0.149 0.737 0.000\nvt  0.175 0.804 0.000\nvt  0.202 0.856 0.000\nvt  0.179 0.866 0.000\nvt  0.190 0.729 0.000\nvt  0.217 0.797 0.000\nvt  0.245 0.848 0.000\nvt  0.466 0.215 0.000\nvt  0.437 0.233 0.000\nvt  0.452 0.588 0.000\nvt  0.092 0.854 0.000\nvt  0.116 0.835 0.000\nvt  0.081 0.761 0.000\nvt  0.053 0.512 0.000\nvt  0.026 0.519 0.000\nvt  0.026 0.452 0.000\nvt  0.056 0.446 0.000\nvt  0.113 0.498 0.000\nvt  0.085 0.504 0.000\nvt  0.110 0.556 0.000\nvt  0.083 0.564 0.000\nvt  0.001 0.634 0.000\nvt  0.001 0.579 0.000\nvt  0.025 0.577 0.000\nvt  0.027 0.633 0.000\nvt  0.118 0.614 0.000\nvt  0.132 0.671 0.000\nvt  0.099 0.679 0.000\nvt  0.089 0.622 0.000\nvt  0.167 0.667 0.000\nvt  0.292 0.836 0.000\nvt  0.199 0.303 0.000\nvt  0.174 0.364 0.000\nvt  0.393 0.544 0.000\nvt  0.387 0.529 0.000\nvt  0.459 0.380 0.000\nvt  0.462 0.372 0.000\nvt  0.463 0.366 0.000\nvt  0.463 0.363 0.000\nvt  0.402 0.945 0.000\nvt  0.476 0.902 0.000\nvt  0.401 0.489 0.000\nvt  0.391 0.563 0.000\nvt  0.388 0.559 0.000\nvt  0.404 0.563 0.000\nvt  0.443 0.569 0.000\nvt  0.380 0.571 0.000\nvt  0.382 0.569 0.000\nvt  0.384 0.569 0.000\nvt  0.439 0.568 0.000\nvt  0.431 0.568 0.000\nvt  0.421 0.567 0.000\nvt  0.393 0.567 0.000\nvt  0.387 0.567 0.000\nvt  0.384 0.564 0.000\nvt  0.394 0.568 0.000\nvt  0.413 0.568 0.000\nvt  0.370 0.565 0.000\nvt  0.452 0.389 0.000\nvt  0.399 0.452 0.000\nvt  0.471 0.566 0.000\nvt  0.316 0.686 0.000\nvt  0.128 0.222 0.000\nvt  0.179 0.214 0.000\nvt  0.175 0.258 0.000\nvt  0.124 0.265 0.000\nvt  0.439 0.119 0.000\nvt  0.229 0.304 0.000\nvt  0.203 0.363 0.000\nvt  0.274 0.227 0.000\nvt  0.223 0.371 0.000\nvt  0.053 0.571 0.000\nvt  0.001 0.388 0.000\nvt  0.001 0.456 0.000\nvt  0.001 0.524 0.000\nvt  0.064 0.877 0.000\nvt  0.144 0.945 0.000\nvt  0.001 0.323 0.000\nvt  0.065 0.689 0.000\nvt  0.224 0.240 0.000\nvt  0.072 0.265 0.000\nvt  0.001 0.267 0.000\nvt  0.031 0.264 0.000\nvt  0.057 0.628 0.000\nvt  0.194 0.622 0.000\nvt  0.149 0.611 0.000\nvt  0.308 0.489 0.000\nvt  0.369 0.558 0.000\nvt  0.374 0.560 0.000\nvt  0.378 0.562 0.000\nvt  0.445 0.413 0.000\nvt  0.430 0.429 0.000\nvt  0.461 0.440 0.000\nvt  0.476 0.607 0.000\nvt  0.469 0.591 0.000\nvt  0.378 0.549 0.000\nvt  0.384 0.554 0.000\nvt  0.393 0.509 0.000\nvt  0.299 0.520 0.000\nvt  0.436 0.403 0.000\nvt  0.489 0.615 0.000\nvt  0.383 0.568 0.000\nvt  0.364 0.139 0.000\nvt  0.236 0.192 0.000\nvt  0.033 0.219 0.000\nvt  0.079 0.220 0.000\nvt  0.292 0.168 0.000\nvt  0.001 0.218 0.000\nvt  0.197 0.523 0.000\nvt  0.209 0.508 0.000\nvt  0.217 0.527 0.000\nvt  0.206 0.535 0.000\nvt  0.211 0.571 0.000\nvt  0.203 0.562 0.000\nvt  0.187 0.591 0.000\nvt  0.185 0.578 0.000\nvt  0.161 0.583 0.000\nvt  0.165 0.574 0.000\nvt  0.150 0.569 0.000\nvt  0.155 0.560 0.000\nvt  0.145 0.539 0.000\nvt  0.153 0.535 0.000\nvt  0.150 0.501 0.000\nvt  0.159 0.502 0.000\nvt  0.186 0.438 0.000\nvt  0.191 0.452 0.000\nvt  0.172 0.472 0.000\nvt  0.164 0.464 0.000\nvt  0.208 0.427 0.000\nvt  0.210 0.441 0.000\nvt  0.182 0.567 0.000\nvt  0.193 0.550 0.000\nvt  0.169 0.561 0.000\nvt  0.161 0.553 0.000\nvt  0.163 0.534 0.000\nvt  0.169 0.505 0.000\nvt  0.196 0.465 0.000\nvt  0.180 0.479 0.000\nvt  0.214 0.460 0.000\nvt  0.227 0.456 0.000\nvt  0.221 0.433 0.000\nvt  0.203 0.489 0.000\nvt  0.211 0.486 0.000\nvt  0.215 0.495 0.000\nvt  0.228 0.537 0.000\nvt  0.219 0.583 0.000\nvt  0.188 0.602 0.000\nvt  0.152 0.587 0.000\nvt  0.138 0.546 0.000\nvt  0.141 0.500 0.000\nvt  0.157 0.450 0.000\nvt  0.180 0.412 0.000\nvt  0.209 0.404 0.000\nvt  0.227 0.417 0.000\nvt  0.236 0.447 0.000\nvt  0.194 0.496 0.000\nvt  0.187 0.487 0.000\nvt  0.199 0.477 0.000\nvt  0.213 0.478 0.000\nvt  0.222 0.489 0.000\nvt  0.178 0.538 0.000\nvt  0.178 0.510 0.000\nvt  0.233 0.492 0.000\nvt  0.130 0.496 0.000\nvt  0.149 0.425 0.000\nvt  0.128 0.552 0.000\nvt  0.484 0.930 0.000\nvt  0.472 0.934 0.000\nvt  0.463 0.938 0.000\nvt  0.470 0.952 0.000\nvt  0.480 0.955 0.000\nvt  0.484 0.970 0.000\nvt  0.488 0.942 0.000\nvt  0.478 0.944 0.000\nvt  0.388 0.569 0.000\nvt  0.385 0.572 0.000\nvt  0.424 0.968 0.000\nvt  0.437 0.961 0.000\nvt  0.438 0.969 0.000\nvt  0.427 0.973 0.000\nvt  0.418 0.961 0.000\nvt  0.429 0.956 0.000\nvt  0.389 0.961 0.000\nvt  0.399 0.955 0.000\nvt  0.405 0.960 0.000\nvt  0.394 0.967 0.000\nvt  0.429 0.569 0.000\nvt  0.405 0.566 0.000\nvt  0.393 0.978 0.000\nvt  0.383 0.975 0.000\nvt  0.384 0.967 0.000\nvt  0.401 0.986 0.000\nvt  0.395 0.991 0.000\nvt  0.386 0.982 0.000\nvt  0.411 0.989 0.000\nvt  0.407 0.996 0.000\nvt  0.438 0.570 0.000\nvt  0.427 0.994 0.000\nvt  0.416 0.996 0.000\nvt  0.421 0.987 0.000\nvt  0.419 0.953 0.000\nvt  0.408 0.953 0.000\nvt  0.439 0.988 0.000\nvt  0.428 0.981 0.000\nvt  0.437 0.978 0.000\nvt  0.489 0.956 0.000\nvt  0.132 0.132 0.000\nvt  0.082 0.133 0.000\nvt  0.084 0.092 0.000\nvt  0.133 0.090 0.000\nvt  0.446 0.066 0.000\nvt  0.442 0.095 0.000\nvt  0.381 0.103 0.000\nvt  0.388 0.070 0.000\nvt  0.185 0.169 0.000\nvt  0.186 0.126 0.000\nvt  0.253 0.102 0.000\nvt  0.242 0.148 0.000\nvt  0.230 0.072 0.000\nvt  0.183 0.087 0.000\nvt  0.448 0.038 0.000\nvt  0.395 0.039 0.000\nvt  0.398 0.021 0.000\nvt  0.449 0.020 0.000\nvt  0.133 0.055 0.000\nvt  0.179 0.050 0.000\nvt  0.288 0.053 0.000\nvt  0.260 0.052 0.000\nvt  0.261 0.023 0.000\nvt  0.300 0.022 0.000\nvt  0.341 0.043 0.000\nvt  0.348 0.022 0.000\nvt  0.087 0.055 0.000\nvt  0.040 0.091 0.000\nvt  0.041 0.055 0.000\nvt  0.038 0.133 0.000\nvt  0.001 0.131 0.000\nvt  0.001 0.089 0.000\nvt  0.001 0.053 0.000\nvt  0.222 0.038 0.000\nvt  0.083 0.177 0.000\nvt  0.035 0.178 0.000\nvt  0.326 0.083 0.000\nvt  0.315 0.124 0.000\nvt  0.001 0.175 0.000\nvt  0.129 0.175 0.000\nvt  0.001 0.002 0.000\nvt  0.042 0.002 0.000\nvt  0.133 0.002 0.000\nvt  0.177 0.002 0.000\nvt  0.092 0.002 0.000\nvt  0.399 0.002 0.000\nvt  0.450 0.002 0.000\nvt  0.303 0.002 0.000\nvt  0.350 0.002 0.000\nvt  0.218 0.002 0.000\nvt  0.260 0.002 0.000\nvt  0.558 0.967 0.000\nvt  0.557 0.976 0.000\nvt  0.500 0.997 0.000\nvt  0.588 0.975 0.000\nvt  0.442 0.967 0.000\nvt  0.443 0.976 0.000\nvt  0.412 0.975 0.000\n# 1339 texture vertices\n\nvn  0.001 0.482 -0.876\nvn  -0.001 0.661 0.751\nvn  0.136 0.595 0.792\nvn  -0.203 0.679 0.706\nvn  -0.092 0.474 0.876\nvn  -0.184 0.792 0.581\nvn  -0.098 0.863 0.495\nvn  -0.449 0.820 0.356\nvn  -0.220 0.748 0.626\nvn  -0.560 0.798 -0.222\nvn  -0.233 0.531 -0.815\nvn  0.001 0.534 -0.845\nvn  -0.135 0.596 0.791\nvn  0.203 0.676 0.708\nvn  0.091 0.476 0.875\nvn  0.189 0.792 0.581\nvn  0.099 0.862 0.496\nvn  0.444 0.821 0.360\nvn  0.221 0.747 0.627\nvn  0.556 0.801 -0.221\nvn  0.228 0.532 -0.815\nvn  -0.002 0.536 -0.844\nvn  -0.574 0.744 -0.343\nvn  -0.485 0.523 -0.701\nvn  -0.121 0.869 -0.480\nvn  -0.215 0.930 -0.298\nvn  -0.000 -0.806 -0.591\nvn  -0.277 -0.779 -0.562\nvn  -0.258 -0.731 -0.632\nvn  -0.046 -0.809 -0.586\nvn  -0.210 0.565 -0.798\nvn  -0.094 0.624 -0.775\nvn  0.015 0.952 -0.307\nvn  0.045 0.919 -0.392\nvn  -0.099 0.857 -0.505\nvn  -0.379 0.493 -0.783\nvn  -0.947 0.285 -0.149\nvn  -0.809 -0.421 -0.411\nvn  -0.895 -0.443 -0.043\nvn  -0.999 -0.020 0.035\nvn  -0.359 0.933 -0.019\nvn  -0.809 0.586 0.047\nvn  -0.667 -0.516 -0.538\nvn  -0.726 -0.626 -0.285\nvn  -0.001 0.671 -0.741\nvn  -0.001 0.945 -0.327\nvn  -0.531 -0.632 -0.565\nvn  -0.618 -0.566 -0.546\nvn  0.800 -0.473 0.369\nvn  0.618 -0.771 0.151\nvn  0.693 -0.711 0.116\nvn  0.818 -0.467 0.335\nvn  0.849 -0.259 0.460\nvn  0.775 -0.130 0.619\nvn  0.667 -0.132 0.733\nvn  0.775 -0.270 0.571\nvn  0.958 -0.057 -0.280\nvn  0.763 0.033 -0.646\nvn  0.763 -0.153 -0.628\nvn  0.911 -0.129 -0.391\nvn  0.990 0.067 0.126\nvn  0.979 0.090 0.185\nvn  0.981 0.057 0.184\nvn  0.996 0.020 0.090\nvn  0.770 -0.392 0.504\nvn  0.657 -0.721 0.219\nvn  0.478 -0.656 0.584\nvn  0.599 -0.389 0.700\nvn  0.498 -0.846 0.192\nvn  0.537 -0.840 0.082\nvn  0.740 -0.557 0.378\nvn  0.668 -0.570 0.479\nvn  0.280 -0.914 0.294\nvn  0.421 -0.898 0.126\nvn  0.991 0.084 0.103\nvn  0.964 0.223 0.143\nvn  0.960 0.189 0.207\nvn  0.979 0.103 0.175\nvn  0.868 0.172 0.465\nvn  0.907 0.085 0.413\nvn  0.938 0.144 0.316\nvn  0.897 0.178 0.405\nvn  0.662 -0.174 0.729\nvn  0.583 -0.417 0.697\nvn  0.627 -0.449 0.637\nvn  0.685 -0.405 0.605\nvn  0.827 0.091 0.555\nvn  0.890 0.018 0.455\nvn  0.663 -0.395 0.636\nvn  0.606 -0.428 0.671\nvn  0.313 -0.735 0.602\nvn  -0.136 -0.864 0.485\nvn  0.951 0.158 0.267\nvn  0.964 0.113 0.241\nvn  0.731 -0.036 0.681\nvn  0.819 -0.134 0.558\nvn  0.546 0.270 0.793\nvn  0.602 0.237 0.763\nvn  0.444 0.233 0.865\nvn  0.353 0.173 0.920\nvn  0.240 -0.093 0.966\nvn  0.498 0.051 0.866\nvn  0.675 0.338 0.656\nvn  0.480 0.400 0.780\nvn  0.064 -0.572 0.818\nvn  0.126 -0.313 0.941\nvn  0.207 -0.613 0.763\nvn  0.221 -0.810 0.544\nvn  0.598 -0.694 -0.401\nvn  0.124 -0.977 -0.175\nvn  0.218 -0.333 0.917\nvn  0.377 -0.161 0.912\nvn  0.142 -0.210 0.967\nvn  0.256 -0.155 0.954\nvn  0.111 -0.351 0.930\nvn  0.107 -0.480 0.871\nvn  0.675 -0.732 -0.096\nvn  0.496 -0.844 0.206\nvn  -0.016 -0.986 0.167\nvn  0.304 -0.948 0.097\nvn  0.982 -0.082 0.171\nvn  0.963 -0.002 0.269\nvn  0.967 -0.134 0.216\nvn  0.969 -0.177 0.175\nvn  0.916 -0.244 0.319\nvn  0.853 -0.341 0.394\nvn  0.837 -0.365 0.407\nvn  0.886 -0.281 0.368\nvn  0.422 -0.292 0.858\nvn  0.039 -0.571 0.820\nvn  -0.011 -0.399 0.917\nvn  0.333 -0.349 0.876\nvn  0.935 -0.237 0.263\nvn  0.949 -0.159 0.273\nvn  0.697 -0.213 0.685\nvn  0.568 -0.123 0.814\nvn  -0.938 0.322 0.130\nvn  -0.609 -0.738 -0.291\nvn  -0.447 -0.857 -0.258\nvn  0.259 -0.528 0.809\nvn  0.137 -0.704 0.697\nvn  -0.107 -0.741 0.663\nvn  0.647 -0.296 0.703\nvn  0.603 -0.168 0.780\nvn  0.836 0.072 0.545\nvn  0.744 0.114 0.659\nvn  0.701 0.149 0.698\nvn  0.802 0.157 0.577\nvn  0.823 -0.080 0.562\nvn  0.690 0.142 0.710\nvn  0.628 0.036 0.778\nvn  0.894 -0.247 0.373\nvn  0.624 -0.153 0.766\nvn  0.661 0.110 0.742\nvn  0.712 0.424 0.559\nvn  0.701 0.284 0.654\nvn  0.504 -0.050 0.862\nvn  0.413 0.027 0.910\nvn  0.569 0.046 0.821\nvn  0.488 -0.134 0.862\nvn  0.411 -0.180 0.894\nvn  0.610 -0.024 0.792\nvn  0.747 -0.250 0.616\nvn  0.672 -0.313 0.671\nvn  0.536 0.762 0.363\nvn  0.559 0.768 0.312\nvn  0.802 0.272 0.531\nvn  0.618 0.206 0.759\nvn  0.717 0.383 0.583\nvn  0.780 0.464 0.420\nvn  0.617 0.401 0.678\nvn  0.658 0.397 0.640\nvn  0.672 0.440 0.596\nvn  0.501 0.314 0.807\nvn  0.612 0.527 0.589\nvn  0.679 0.320 0.661\nvn  0.732 -0.406 -0.547\nvn  0.885 -0.261 -0.386\nvn  0.842 -0.347 0.414\nvn  0.782 -0.349 0.517\nvn  0.784 -0.368 0.500\nvn  0.858 -0.453 0.244\nvn  0.953 -0.279 0.118\nvn  0.977 -0.189 0.104\nvn  0.989 -0.110 0.102\nvn  0.142 0.669 0.730\nvn  0.300 0.652 0.696\nvn  0.291 0.792 0.536\nvn  0.143 0.821 0.553\nvn  0.737 0.561 0.378\nvn  0.716 0.470 0.515\nvn  0.884 0.306 0.353\nvn  0.898 0.354 0.263\nvn  0.890 0.423 0.171\nvn  0.174 0.078 0.982\nvn  0.219 0.254 0.942\nvn  0.665 -0.104 0.739\nvn  0.671 0.390 0.631\nvn  0.596 0.435 0.675\nvn  0.636 0.467 0.614\nvn  0.076 0.244 0.967\nvn  0.261 0.437 0.861\nvn  0.107 0.440 0.892\nvn  0.011 0.082 0.997\nvn  0.005 0.082 0.997\nvn  0.028 -0.027 0.999\nvn  0.073 -0.057 0.996\nvn  0.006 0.228 0.974\nvn  0.683 0.140 0.717\nvn  0.724 0.233 0.650\nvn  0.400 0.338 0.852\nvn  0.270 0.126 0.955\nvn  0.357 0.433 0.828\nvn  0.503 0.485 0.716\nvn  0.536 0.133 0.834\nvn  0.416 -0.306 0.856\nvn  0.337 0.097 0.937\nvn  0.262 0.372 0.891\nvn  0.425 0.075 0.902\nvn  0.701 -0.147 0.698\nvn  -0.056 0.558 0.828\nvn  0.005 0.605 0.796\nvn  0.483 0.327 0.812\nvn  0.497 0.276 0.823\nvn  0.505 0.283 0.815\nvn  0.340 -0.030 0.940\nvn  0.332 0.066 0.941\nvn  0.026 0.644 0.765\nvn  0.021 0.538 0.843\nvn  0.170 -0.012 0.985\nvn  0.365 -0.067 0.929\nvn  0.826 -0.173 0.537\nvn  0.320 0.415 0.852\nvn  0.384 0.739 0.554\nvn  0.987 -0.013 0.160\nvn  0.495 0.720 0.487\nvn  0.490 0.830 0.268\nvn  0.279 0.906 0.317\nvn  0.431 0.899 -0.074\nvn  0.267 0.957 -0.112\nvn  0.283 0.953 0.107\nvn  0.471 0.877 0.092\nvn  0.132 0.985 0.113\nvn  0.135 0.931 0.339\nvn  0.190 -0.184 0.964\nvn  0.292 -0.372 0.881\nvn  0.307 -0.447 0.840\nvn  0.393 -0.580 0.713\nvn  0.524 -0.286 0.802\nvn  0.380 -0.582 0.719\nvn  0.697 0.212 0.685\nvn  0.603 0.070 0.795\nvn  0.558 -0.571 0.602\nvn  -0.089 -0.701 0.707\nvn  0.794 -0.345 0.500\nvn  0.345 -0.517 0.783\nvn  0.481 0.101 0.871\nvn  0.134 0.283 0.950\nvn  0.113 -0.558 0.822\nvn  -0.073 -0.993 0.089\nvn  -0.041 -0.994 0.103\nvn  0.084 -0.038 0.996\nvn  -0.012 -0.622 0.783\nvn  -0.002 0.254 0.967\nvn  0.004 -0.997 0.079\nvn  0.001 -0.832 -0.555\nvn  0.477 -0.363 0.801\nvn  0.414 0.160 0.896\nvn  0.395 0.485 0.780\nvn  0.611 0.484 0.627\nvn  0.406 0.510 0.758\nvn  0.375 0.498 0.782\nvn  0.555 0.314 0.770\nvn  0.349 0.411 0.842\nvn  0.012 0.247 0.969\nvn  0.002 -0.369 0.930\nvn  -0.003 0.509 0.861\nvn  0.876 -0.041 0.481\nvn  0.757 -0.214 0.618\nvn  0.737 -0.048 0.674\nvn  0.840 -0.012 0.542\nvn  0.960 0.137 0.243\nvn  0.969 0.103 0.226\nvn  0.909 0.015 0.417\nvn  0.906 0.015 0.423\nvn  0.676 -0.276 0.683\nvn  0.688 -0.223 0.691\nvn  0.691 0.035 0.722\nvn  0.719 -0.082 0.691\nvn  0.964 0.062 0.260\nvn  0.956 0.070 0.286\nvn  0.953 0.037 0.300\nvn  -0.003 -0.415 0.910\nvn  -0.001 -0.380 0.925\nvn  0.658 -0.419 0.625\nvn  0.735 -0.421 0.532\nvn  0.663 -0.303 0.685\nvn  0.550 -0.321 0.771\nvn  0.423 -0.236 0.875\nvn  0.326 -0.294 0.899\nvn  0.124 -0.396 0.910\nvn  0.218 -0.177 0.960\nvn  0.530 0.781 0.331\nvn  0.167 0.827 0.537\nvn  0.094 0.948 0.303\nvn  0.313 0.934 0.171\nvn  -0.406 -0.892 0.201\nvn  -0.743 0.107 0.661\nvn  0.455 0.704 0.546\nvn  0.288 0.957 0.025\nvn  0.245 0.958 0.150\nvn  0.532 -0.027 0.846\nvn  0.566 0.213 0.796\nvn  0.508 0.208 0.836\nvn  0.173 0.028 0.984\nvn  0.371 0.122 0.921\nvn  0.429 -0.045 0.902\nvn  0.614 0.165 0.772\nvn  0.737 0.157 0.657\nvn  0.726 0.057 0.685\nvn  0.662 0.061 0.747\nvn  0.845 -0.523 -0.112\nvn  0.845 -0.501 -0.185\nvn  0.744 -0.668 0.009\nvn  0.773 -0.630 0.079\nvn  0.889 0.108 0.445\nvn  0.899 0.077 0.430\nvn  0.184 0.204 -0.961\nvn  0.005 0.202 -0.979\nvn  -0.000 0.485 -0.875\nvn  0.159 0.484 -0.861\nvn  0.499 0.592 0.633\nvn  0.305 0.950 0.065\nvn  -0.274 -0.953 -0.127\nvn  0.245 -0.456 0.856\nvn  0.083 -0.881 0.465\nvn  0.435 -0.739 0.515\nvn  0.504 -0.429 0.750\nvn  0.818 -0.367 0.443\nvn  0.933 -0.162 0.322\nvn  0.872 0.029 0.489\nvn  0.002 0.994 0.113\nvn  0.133 0.983 -0.126\nvn  -0.001 0.992 -0.127\nvn  0.280 0.892 -0.356\nvn  0.126 0.916 -0.381\nvn  0.210 0.974 -0.083\nvn  -0.082 0.663 0.745\nvn  -0.059 0.391 0.919\nvn  0.111 0.992 -0.055\nvn  0.081 -0.190 0.978\nvn  0.035 0.076 0.996\nvn  0.852 0.236 0.467\nvn  0.775 0.219 0.593\nvn  0.505 -0.109 0.856\nvn  0.446 -0.314 0.838\nvn  0.511 0.200 0.836\nvn  0.623 -0.242 0.744\nvn  0.436 -0.554 0.709\nvn  0.599 -0.742 0.300\nvn  -0.036 0.177 0.984\nvn  -0.039 -0.159 0.987\nvn  0.308 0.942 -0.135\nvn  0.989 0.093 -0.111\nvn  0.477 -0.259 0.840\nvn  0.473 -0.423 0.773\nvn  0.774 -0.329 0.541\nvn  0.285 0.019 0.958\nvn  0.350 0.101 0.931\nvn  0.579 0.261 0.773\nvn  0.298 0.015 0.954\nvn  0.165 0.336 0.927\nvn  0.577 0.511 0.636\nvn  0.254 -0.834 0.490\nvn  -0.114 -0.925 0.363\nvn  0.941 -0.280 -0.188\nvn  0.460 -0.738 0.493\nvn  0.740 -0.635 0.221\nvn  0.003 0.529 0.849\nvn  0.206 -0.427 -0.881\nvn  0.497 -0.316 -0.808\nvn  0.457 -0.144 -0.878\nvn  0.179 -0.244 -0.953\nvn  -0.182 -0.980 -0.078\nvn  0.342 -0.427 0.837\nvn  0.424 -0.296 0.856\nvn  0.896 -0.357 -0.264\nvn  0.594 -0.104 0.798\nvn  0.012 0.528 0.849\nvn  0.042 0.469 0.882\nvn  0.624 0.102 0.775\nvn  0.324 -0.123 0.938\nvn  0.202 -0.638 0.743\nvn  0.714 0.512 0.477\nvn  0.433 -0.511 0.742\nvn  -0.350 -0.708 0.613\nvn  0.095 -0.410 0.907\nvn  0.622 -0.593 0.512\nvn  0.846 0.304 0.437\nvn  0.582 -0.043 0.812\nvn  -0.226 -0.380 0.897\nvn  0.215 0.644 0.734\nvn  0.123 0.952 0.280\nvn  -0.004 0.956 0.293\nvn  -0.005 0.635 0.772\nvn  0.325 -0.730 0.601\nvn  -0.017 -0.840 0.543\nvn  0.017 -0.788 0.616\nvn  0.294 -0.138 0.946\nvn  0.214 0.401 0.891\nvn  -0.150 0.490 0.859\nvn  0.573 -0.125 0.810\nvn  -0.134 0.957 0.258\nvn  0.252 0.828 0.501\nvn  -0.673 0.643 0.364\nvn  0.004 -0.960 0.279\nvn  0.032 -0.991 0.133\nvn  0.006 -0.908 0.419\nvn  0.180 -0.980 0.086\nvn  0.740 0.403 -0.538\nvn  0.627 0.652 -0.426\nvn  0.814 0.561 -0.149\nvn  0.925 0.321 -0.206\nvn  0.492 0.825 -0.280\nvn  0.649 0.757 -0.076\nvn  0.966 0.258 0.022\nvn  0.864 0.501 0.053\nvn  0.680 0.729 0.077\nvn  0.272 -0.962 -0.032\nvn  0.225 -0.968 0.111\nvn  0.288 -0.510 0.810\nvn  0.126 0.748 -0.651\nvn  0.340 0.725 -0.598\nvn  0.421 0.466 -0.778\nvn  0.205 -0.458 -0.865\nvn  0.489 -0.479 -0.729\nvn  0.500 -0.523 -0.690\nvn  0.210 -0.566 -0.798\nvn  0.895 -0.322 -0.309\nvn  0.759 -0.434 -0.485\nvn  0.797 -0.287 -0.532\nvn  0.937 -0.248 -0.245\nvn  -0.001 -0.238 -0.971\nvn  -0.000 -0.025 -1.000\nvn  0.194 -0.025 -0.981\nvn  0.201 -0.248 -0.948\nvn  0.969 0.094 -0.229\nvn  0.968 -0.101 -0.228\nvn  0.814 -0.088 -0.575\nvn  0.800 0.142 -0.583\nvn  0.998 0.061 -0.010\nvn  0.726 0.657 0.205\nvn  0.000 -0.985 0.174\nvn  0.985 -0.166 0.038\nvn  0.955 -0.220 -0.200\nvn  0.472 0.076 0.879\nvn  0.343 -0.235 0.909\nvn  0.464 -0.641 0.612\nvn  0.578 -0.186 0.795\nvn  -0.189 -0.982 0.010\nvn  0.004 0.938 0.345\nvn  0.002 0.829 0.559\nvn  0.445 0.232 0.865\nvn  0.463 0.340 0.818\nvn  -0.116 0.983 0.143\nvn  0.004 0.995 0.102\nvn  0.978 0.204 0.044\nvn  -0.967 -0.216 -0.137\nvn  -0.911 -0.347 0.224\nvn  -0.728 0.350 0.590\nvn  0.426 0.738 -0.523\nvn  0.618 0.786 0.011\nvn  0.151 0.857 -0.493\nvn  -0.333 0.912 -0.241\nvn  -0.277 0.956 0.095\nvn  -0.569 0.822 -0.032\nvn  -0.341 -0.671 -0.658\nvn  0.161 -0.736 -0.657\nvn  0.528 0.432 0.731\nvn  0.586 0.105 0.803\nvn  0.436 0.074 0.897\nvn  0.621 0.267 0.737\nvn  0.936 0.153 0.316\nvn  0.999 -0.010 0.042\nvn  0.826 0.281 -0.489\nvn  0.775 0.178 -0.606\nvn  0.995 -0.039 -0.095\nvn  0.005 -0.414 0.910\nvn  0.580 -0.243 0.778\nvn  0.938 -0.339 -0.068\nvn  0.925 -0.371 0.080\nvn  0.888 -0.269 0.373\nvn  0.923 -0.371 -0.106\nvn  0.494 -0.274 -0.825\nvn  -0.001 -0.456 -0.890\nvn  -0.002 -0.569 -0.822\nvn  -0.001 -0.452 -0.892\nvn  -0.003 0.749 -0.663\nvn  -0.000 0.920 -0.391\nvn  -0.001 -0.280 -0.960\nvn  0.470 0.194 -0.861\nvn  0.965 -0.123 0.234\nvn  0.400 -0.039 -0.916\nvn  0.142 -0.166 -0.976\nvn  -0.000 -0.194 -0.981\nvn  0.497 -0.049 -0.867\nvn  0.998 0.042 0.045\nvn  0.996 -0.037 -0.082\nvn  0.009 0.433 0.901\nvn  0.004 0.669 0.743\nvn  0.955 0.004 0.296\nvn  0.737 -0.001 0.675\nvn  0.707 0.177 0.684\nvn  0.484 0.627 0.610\nvn  0.515 0.250 0.820\nvn  0.360 0.121 0.925\nvn  -0.544 -0.573 0.613\nvn  0.382 -0.114 0.917\nvn  0.489 -0.108 0.866\nvn  -0.002 -0.670 0.742\nvn  0.002 -0.394 0.919\nvn  -0.004 -0.168 0.986\nvn  0.007 -0.109 0.994\nvn  0.009 -0.519 0.855\nvn  0.660 -0.118 0.742\nvn  0.621 -0.127 0.774\nvn  0.416 0.220 0.882\nvn  0.946 0.046 0.322\nvn  0.014 0.006 1.000\nvn  0.569 0.184 0.802\nvn  0.218 0.013 0.976\nvn  0.044 0.087 0.995\nvn  -0.419 0.862 0.284\nvn  0.647 -0.120 0.753\nvn  0.954 -0.017 0.301\nvn  0.352 0.140 -0.926\nvn  0.095 -0.050 -0.994\nvn  0.770 0.025 0.638\nvn  0.000 -0.078 -0.997\nvn  0.985 -0.172 0.009\nvn  0.920 -0.340 0.195\nvn  0.929 -0.331 -0.163\nvn  0.969 -0.237 0.074\nvn  0.969 -0.183 0.165\nvn  0.801 0.160 0.577\nvn  0.954 -0.021 0.301\nvn  0.293 0.803 0.520\nvn  0.977 0.170 0.129\nvn  0.134 0.985 -0.104\nvn  0.994 0.106 -0.036\nvn  0.099 0.675 -0.731\nvn  0.997 -0.079 -0.000\nvn  0.197 0.126 -0.972\nvn  0.978 -0.175 -0.110\nvn  0.110 -0.321 -0.941\nvn  0.939 -0.332 -0.089\nvn  0.400 -0.789 -0.467\nvn  0.171 -0.673 -0.720\nvn  0.931 -0.336 -0.144\nvn  0.854 -0.500 0.146\nvn  0.161 -0.985 -0.069\nvn  0.931 -0.304 -0.200\nvn  0.813 -0.565 -0.143\nvn  0.823 -0.546 0.154\nvn  0.795 -0.387 0.467\nvn  0.809 -0.168 0.563\nvn  0.826 0.053 0.562\nvn  0.925 0.261 0.275\nvn  0.990 0.071 0.119\nvn  0.951 0.129 0.281\nvn  0.810 -0.147 0.568\nvn  0.383 -0.603 0.699\nvn  0.769 0.635 0.079\nvn  0.786 0.352 0.508\nvn  0.919 0.082 -0.386\nvn  0.937 0.163 0.310\nvn  0.974 -0.026 0.224\nvn  0.787 0.550 0.279\nvn  0.517 0.758 -0.397\nvn  0.337 0.112 -0.935\nvn  0.221 -0.300 -0.928\nvn  0.395 -0.578 -0.714\nvn  0.521 -0.711 -0.472\nvn  0.432 -0.901 -0.043\nvn  0.826 -0.520 0.218\nvn  0.885 -0.217 0.412\nvn  0.786 -0.107 0.609\nvn  0.864 0.400 0.304\nvn  0.954 0.061 0.293\nvn  0.949 0.313 0.046\nvn  0.991 0.028 -0.131\nvn  0.945 -0.116 0.305\nvn  0.970 -0.241 0.032\nvn  0.946 -0.038 0.322\nvn  0.886 -0.270 -0.376\nvn  0.855 -0.272 -0.441\nvn  0.952 -0.122 -0.281\nvn  0.002 -0.883 0.469\nvn  -0.001 0.792 -0.611\nvn  -0.180 0.823 -0.539\nvn  -0.642 0.677 -0.360\nvn  -0.957 0.288 -0.031\nvn  -0.912 -0.300 0.281\nvn  -0.454 -0.866 0.207\nvn  -0.855 -0.043 0.517\nvn  -0.834 0.460 0.305\nvn  -0.242 0.911 0.334\nvn  -0.720 -0.667 -0.192\nvn  -0.762 -0.580 -0.288\nvn  0.452 0.774 0.444\nvn  0.857 0.048 0.513\nvn  0.966 0.131 0.225\nvn  0.211 0.953 0.219\nvn  -0.108 0.726 0.679\nvn  0.021 0.946 0.324\nvn  0.566 -0.691 -0.450\nvn  -0.068 0.939 -0.338\nvn  -0.261 -0.298 0.918\nvn  -0.200 -0.891 0.407\nvn  0.124 -0.991 0.059\nvn  0.913 -0.350 -0.211\nvn  0.488 -0.838 0.244\nvn  0.738 -0.593 0.322\nvn  0.994 -0.060 -0.087\nvn  -0.000 -0.981 0.193\nvn  0.000 0.974 0.227\nvn  -0.350 -0.016 0.936\nvn  0.000 -0.017 1.000\nvn  0.252 0.455 -0.854\nvn  0.774 0.620 -0.127\nvn  0.634 0.759 -0.148\nvn  0.192 0.569 -0.800\nvn  0.405 -0.094 0.909\nvn  0.031 0.149 0.988\nvn  0.360 0.283 0.889\nvn  0.469 0.080 0.880\nvn  0.769 0.452 0.452\nvn  0.946 0.185 0.266\nvn  0.893 0.181 0.413\nvn  0.654 0.429 0.623\nvn  0.506 0.610 0.610\nvn  0.436 0.659 0.613\nvn  0.160 0.558 0.814\nvn  -0.285 0.396 0.873\nvn  -0.223 0.539 0.812\nvn  0.037 0.570 0.821\nvn  0.623 0.727 -0.289\nvn  0.456 0.738 0.497\nvn  0.382 0.656 0.651\nvn  0.278 0.687 0.671\nvn  0.213 0.798 0.563\nvn  0.171 0.844 0.508\nvn  0.300 0.690 0.659\nvn  0.144 0.793 0.591\nvn  0.204 0.541 -0.816\nvn  -0.001 0.494 -0.870\nvn  0.029 0.458 -0.888\nvn  0.060 0.366 -0.929\nvn  0.000 0.421 -0.907\nvn  0.000 0.386 -0.922\nvn  0.001 0.455 -0.891\nvn  0.264 0.718 0.644\nvn  0.307 0.317 -0.897\nvn  0.056 0.164 -0.985\nvn  0.717 0.079 0.693\nvn  0.638 0.188 0.746\nvn  0.000 0.202 -0.979\nvn  0.006 -0.044 0.999\nvn  0.001 0.405 0.914\nvn  0.805 0.560 -0.194\nvn  0.002 0.627 0.779\nvn  0.010 -0.298 0.954\nvn  0.124 0.870 -0.477\nvn  0.488 0.530 -0.693\nvn  0.566 0.756 -0.329\nvn  0.213 0.932 -0.294\nvn  0.245 -0.741 -0.626\nvn  0.275 -0.782 -0.559\nvn  0.044 -0.811 -0.584\nvn  -0.012 0.949 -0.315\nvn  0.097 0.621 -0.778\nvn  0.215 0.561 -0.799\nvn  -0.030 0.913 -0.407\nvn  0.378 0.505 -0.776\nvn  0.084 0.865 -0.495\nvn  0.892 -0.451 -0.026\nvn  0.803 -0.447 -0.394\nvn  0.954 0.274 -0.123\nvn  0.998 -0.024 0.066\nvn  0.806 0.588 0.057\nvn  0.351 0.936 -0.012\nvn  0.662 -0.536 -0.524\nvn  0.725 -0.630 -0.278\nvn  0.524 -0.662 -0.536\nvn  0.620 -0.585 -0.522\nvn  -0.694 -0.711 0.115\nvn  -0.621 -0.770 0.148\nvn  -0.805 -0.470 0.362\nvn  -0.819 -0.465 0.335\nvn  -0.680 -0.145 0.719\nvn  -0.763 -0.140 0.631\nvn  -0.840 -0.272 0.470\nvn  -0.773 -0.256 0.580\nvn  -0.763 -0.155 -0.627\nvn  -0.763 0.034 -0.645\nvn  -0.958 -0.057 -0.281\nvn  -0.910 -0.129 -0.393\nvn  -0.983 0.060 0.175\nvn  -0.980 0.096 0.177\nvn  -0.990 0.069 0.123\nvn  -0.996 0.023 0.083\nvn  -0.484 -0.649 0.587\nvn  -0.662 -0.717 0.220\nvn  -0.775 -0.388 0.499\nvn  -0.606 -0.384 0.697\nvn  -0.748 -0.556 0.363\nvn  -0.539 -0.840 0.071\nvn  -0.496 -0.849 0.183\nvn  -0.668 -0.580 0.467\nvn  -0.280 -0.913 0.296\nvn  -0.424 -0.897 0.125\nvn  -0.960 0.187 0.209\nvn  -0.965 0.222 0.143\nvn  -0.991 0.084 0.104\nvn  -0.979 0.104 0.175\nvn  -0.940 0.170 0.295\nvn  -0.909 0.107 0.404\nvn  -0.862 0.204 0.464\nvn  -0.896 0.204 0.395\nvn  -0.570 -0.493 0.658\nvn  -0.531 -0.465 0.709\nvn  -0.651 -0.181 0.737\nvn  -0.688 -0.376 0.620\nvn  -0.892 0.030 0.452\nvn  -0.827 0.122 0.549\nvn  -0.345 -0.706 0.619\nvn  -0.566 -0.461 0.684\nvn  -0.543 -0.393 0.742\nvn  -0.097 -0.841 0.533\nvn  -0.964 0.119 0.237\nvn  -0.950 0.158 0.268\nvn  -0.733 -0.024 0.679\nvn  -0.825 -0.117 0.552\nvn  -0.442 0.232 0.866\nvn  -0.605 0.237 0.760\nvn  -0.556 0.267 0.787\nvn  -0.350 0.172 0.921\nvn  -0.239 -0.096 0.966\nvn  -0.501 0.068 0.863\nvn  -0.679 0.342 0.650\nvn  -0.486 0.403 0.776\nvn  -0.211 -0.600 0.772\nvn  -0.123 -0.334 0.934\nvn  -0.052 -0.530 0.847\nvn  -0.176 -0.798 0.577\nvn  -0.131 -0.968 -0.212\nvn  -0.598 -0.684 -0.418\nvn  -0.205 -0.329 0.922\nvn  -0.374 -0.151 0.915\nvn  -0.117 -0.376 0.919\nvn  -0.246 -0.160 0.956\nvn  -0.126 -0.268 0.955\nvn  -0.137 -0.531 0.837\nvn  0.062 -0.980 0.190\nvn  -0.478 -0.855 0.203\nvn  -0.669 -0.734 -0.114\nvn  -0.286 -0.955 0.083\nvn  -0.967 -0.136 0.215\nvn  -0.965 -0.005 0.263\nvn  -0.983 -0.085 0.164\nvn  -0.969 -0.182 0.170\nvn  -0.840 -0.358 0.408\nvn  -0.857 -0.341 0.386\nvn  -0.910 -0.256 0.326\nvn  -0.884 -0.284 0.371\nvn  0.022 -0.449 0.893\nvn  -0.046 -0.611 0.791\nvn  -0.478 -0.294 0.827\nvn  -0.375 -0.338 0.863\nvn  -0.935 -0.243 0.259\nvn  -0.949 -0.164 0.269\nvn  -0.736 -0.207 0.645\nvn  -0.587 -0.108 0.802\nvn  0.945 0.284 0.163\nvn  0.592 -0.756 -0.279\nvn  0.442 -0.866 -0.236\nvn  -0.053 -0.740 0.670\nvn  -0.228 -0.529 0.817\nvn  0.170 -0.772 0.613\nvn  -0.609 -0.162 0.777\nvn  -0.663 -0.292 0.690\nvn  -0.713 0.145 0.686\nvn  -0.759 0.059 0.648\nvn  -0.825 0.047 0.564\nvn  -0.809 0.158 0.566\nvn  -0.637 0.025 0.770\nvn  -0.687 0.129 0.715\nvn  -0.821 -0.086 0.564\nvn  -0.891 -0.252 0.378\nvn  -0.721 0.489 0.490\nvn  -0.698 0.164 0.697\nvn  -0.646 -0.143 0.750\nvn  -0.712 0.352 0.608\nvn  -0.567 0.074 0.821\nvn  -0.464 0.032 0.885\nvn  -0.518 -0.023 0.855\nvn  -0.550 -0.128 0.825\nvn  -0.756 -0.260 0.601\nvn  -0.645 -0.025 0.764\nvn  -0.437 -0.158 0.885\nvn  -0.687 -0.310 0.657\nvn  -0.541 0.781 0.313\nvn  -0.565 0.780 0.270\nvn  -0.712 0.385 0.587\nvn  -0.611 0.201 0.765\nvn  -0.859 0.335 0.388\nvn  -0.775 0.474 0.417\nvn  -0.673 0.387 0.630\nvn  -0.628 0.400 0.668\nvn  -0.676 0.438 0.592\nvn  -0.698 0.309 0.646\nvn  -0.622 0.535 0.573\nvn  -0.511 0.327 0.795\nvn  -0.733 -0.405 -0.547\nvn  -0.884 -0.261 -0.388\nvn  -0.791 -0.366 0.490\nvn  -0.793 -0.344 0.502\nvn  -0.844 -0.347 0.408\nvn  -0.858 -0.453 0.243\nvn  -0.953 -0.280 0.116\nvn  -0.976 -0.193 0.100\nvn  -0.989 -0.113 0.096\nvn  -0.289 0.792 0.537\nvn  -0.301 0.654 0.693\nvn  -0.134 0.672 0.728\nvn  -0.137 0.821 0.554\nvn  -0.884 0.305 0.354\nvn  -0.716 0.471 0.515\nvn  -0.736 0.562 0.377\nvn  -0.897 0.355 0.265\nvn  -0.890 0.422 0.171\nvn  -0.179 0.082 0.981\nvn  -0.216 0.250 0.944\nvn  -0.661 -0.125 0.740\nvn  -0.679 0.371 0.633\nvn  -0.636 0.460 0.620\nvn  -0.594 0.426 0.682\nvn  -0.258 0.436 0.862\nvn  -0.070 0.240 0.968\nvn  -0.095 0.440 0.893\nvn  -0.011 0.089 0.996\nvn  -0.069 -0.049 0.996\nvn  -0.719 0.247 0.649\nvn  -0.673 0.172 0.719\nvn  -0.353 0.447 0.822\nvn  -0.270 0.134 0.954\nvn  -0.440 0.328 0.836\nvn  -0.511 0.490 0.706\nvn  -0.342 0.114 0.933\nvn  -0.435 -0.298 0.849\nvn  -0.552 0.158 0.818\nvn  -0.273 0.369 0.888\nvn  -0.705 -0.192 0.683\nvn  -0.357 0.088 0.930\nvn  -0.499 0.346 0.795\nvn  0.009 0.585 0.811\nvn  0.086 0.584 0.807\nvn  -0.348 -0.035 0.937\nvn  -0.516 0.299 0.803\nvn  -0.512 0.295 0.806\nvn  -0.339 0.070 0.938\nvn  -0.348 -0.070 0.935\nvn  -0.148 -0.003 0.989\nvn  -0.349 0.750 0.561\nvn  -0.322 0.418 0.849\nvn  -0.890 -0.163 0.425\nvn  -0.990 -0.001 0.144\nvn  -0.500 0.824 0.267\nvn  -0.501 0.717 0.484\nvn  -0.285 0.905 0.315\nvn  -0.282 0.954 0.103\nvn  -0.268 0.957 -0.114\nvn  -0.433 0.898 -0.078\nvn  -0.473 0.876 0.093\nvn  -0.131 0.985 0.111\nvn  -0.127 0.932 0.339\nvn  -0.211 -0.186 0.960\nvn  -0.293 -0.359 0.886\nvn  -0.344 -0.465 0.816\nvn  -0.382 -0.591 0.710\nvn  -0.525 -0.255 0.812\nvn  -0.598 0.089 0.796\nvn  -0.688 0.244 0.683\nvn  -0.344 -0.576 0.742\nvn  -0.544 -0.583 0.603\nvn  0.098 -0.695 0.712\nvn  -0.805 -0.326 0.496\nvn  -0.132 0.306 0.943\nvn  -0.485 0.160 0.860\nvn  -0.351 -0.498 0.793\nvn  -0.141 -0.499 0.855\nvn  0.065 -0.990 0.123\nvn  0.037 -0.989 0.143\nvn  -0.065 -0.055 0.996\nvn  -0.473 -0.369 0.800\nvn  -0.396 0.179 0.900\nvn  -0.600 0.505 0.620\nvn  -0.387 0.499 0.776\nvn  -0.398 0.505 0.766\nvn  -0.358 0.488 0.796\nvn  -0.570 0.304 0.763\nvn  -0.317 0.412 0.854\nvn  -0.742 -0.129 0.658\nvn  -0.771 -0.207 0.602\nvn  -0.881 -0.036 0.472\nvn  -0.841 -0.052 0.538\nvn  -0.972 0.111 0.208\nvn  -0.961 0.151 0.230\nvn  -0.916 -0.004 0.402\nvn  -0.913 0.013 0.408\nvn  -0.689 0.026 0.724\nvn  -0.641 -0.316 0.699\nvn  -0.647 -0.304 0.699\nvn  -0.697 -0.094 0.711\nvn  -0.966 0.063 0.249\nvn  -0.963 0.075 0.259\nvn  -0.958 0.031 0.287\nvn  -0.681 -0.315 0.661\nvn  -0.745 -0.412 0.525\nvn  -0.666 -0.413 0.621\nvn  -0.548 -0.335 0.767\nvn  -0.107 -0.395 0.913\nvn  -0.299 -0.320 0.899\nvn  -0.418 -0.236 0.877\nvn  -0.210 -0.169 0.963\nvn  -0.090 0.952 0.291\nvn  -0.166 0.838 0.520\nvn  -0.523 0.797 0.302\nvn  -0.302 0.941 0.154\nvn  0.408 -0.888 0.211\nvn  0.735 0.117 0.668\nvn  -0.279 0.960 0.001\nvn  -0.468 0.706 0.531\nvn  -0.232 0.964 0.131\nvn  -0.555 -0.033 0.831\nvn  -0.517 0.199 0.833\nvn  -0.549 0.222 0.806\nvn  -0.376 0.125 0.918\nvn  -0.210 0.031 0.977\nvn  -0.435 -0.045 0.899\nvn  -0.739 0.154 0.656\nvn  -0.610 0.153 0.777\nvn  -0.663 0.041 0.748\nvn  -0.733 0.013 0.681\nvn  -0.744 -0.668 0.007\nvn  -0.845 -0.501 -0.187\nvn  -0.845 -0.522 -0.114\nvn  -0.774 -0.629 0.079\nvn  -0.897 0.040 0.440\nvn  -0.896 0.094 0.434\nvn  -0.179 0.204 -0.962\nvn  -0.157 0.488 -0.858\nvn  -0.506 0.590 0.630\nvn  -0.305 0.951 0.047\nvn  0.267 -0.958 -0.102\nvn  -0.432 -0.745 0.509\nvn  -0.075 -0.883 0.463\nvn  -0.236 -0.454 0.859\nvn  -0.504 -0.423 0.753\nvn  -0.821 -0.351 0.449\nvn  -0.876 0.033 0.481\nvn  -0.934 -0.155 0.322\nvn  -0.134 0.983 -0.126\nvn  -0.128 0.916 -0.381\nvn  -0.284 0.891 -0.353\nvn  0.055 0.396 0.917\nvn  0.092 0.644 0.760\nvn  -0.199 0.976 -0.093\nvn  -0.109 0.991 -0.072\nvn  -0.039 0.079 0.996\nvn  -0.081 -0.191 0.978\nvn  -0.854 0.239 0.462\nvn  -0.774 0.223 0.593\nvn  -0.502 -0.119 0.856\nvn  -0.403 -0.420 0.813\nvn  -0.680 -0.255 0.687\nvn  -0.525 0.172 0.834\nvn  -0.376 -0.531 0.759\nvn  -0.576 -0.754 0.316\nvn  0.040 0.159 0.986\nvn  0.036 -0.180 0.983\nvn  -0.308 0.943 -0.129\nvn  -0.983 0.074 -0.170\nvn  -0.456 -0.445 0.771\nvn  -0.476 -0.297 0.828\nvn  -0.788 -0.316 0.528\nvn  -0.393 0.095 0.915\nvn  -0.308 0.018 0.951\nvn  -0.125 0.331 0.935\nvn  -0.283 0.033 0.959\nvn  -0.598 0.322 0.734\nvn  -0.575 0.559 0.598\nvn  -0.216 -0.852 0.476\nvn  0.156 -0.927 0.342\nvn  -0.941 -0.282 -0.189\nvn  -0.739 -0.637 0.221\nvn  -0.469 -0.731 0.495\nvn  -0.458 -0.139 -0.878\nvn  -0.498 -0.315 -0.808\nvn  -0.210 -0.426 -0.880\nvn  -0.182 -0.243 -0.953\nvn  -0.334 -0.402 0.853\nvn  0.221 -0.960 -0.173\nvn  -0.414 -0.366 0.834\nvn  -0.902 -0.373 -0.218\nvn  -0.632 -0.114 0.767\nvn  -0.642 0.122 0.757\nvn  -0.194 -0.651 0.734\nvn  -0.351 -0.095 0.931\nvn  -0.707 0.530 0.467\nvn  -0.087 -0.550 0.831\nvn  0.352 -0.710 0.610\nvn  -0.500 -0.482 0.720\nvn  -0.653 -0.626 0.427\nvn  -0.856 0.328 0.399\nvn  -0.578 -0.029 0.816\nvn  0.275 -0.432 0.859\nvn  -0.123 0.953 0.277\nvn  -0.228 0.657 0.719\nvn  -0.298 -0.735 0.609\nvn  -0.300 -0.179 0.937\nvn  -0.219 0.400 0.890\nvn  -0.587 -0.175 0.791\nvn  0.175 0.460 0.870\nvn  -0.179 0.856 0.485\nvn  0.114 0.959 0.259\nvn  0.664 0.620 0.418\nvn  -0.026 -0.991 0.129\nvn  -0.184 -0.979 0.082\nvn  -0.810 0.566 -0.151\nvn  -0.628 0.654 -0.422\nvn  -0.741 0.405 -0.536\nvn  -0.924 0.322 -0.207\nvn  -0.493 0.823 -0.280\nvn  -0.648 0.758 -0.080\nvn  -0.966 0.258 0.022\nvn  -0.864 0.501 0.051\nvn  -0.679 0.730 0.075\nvn  -0.221 -0.970 0.105\nvn  -0.271 -0.962 -0.038\nvn  -0.376 -0.516 0.769\nvn  -0.124 0.748 -0.652\nvn  -0.339 0.727 -0.598\nvn  -0.420 0.469 -0.777\nvn  -0.500 -0.524 -0.690\nvn  -0.489 -0.481 -0.728\nvn  -0.206 -0.458 -0.865\nvn  -0.212 -0.565 -0.797\nvn  -0.893 -0.325 -0.312\nvn  -0.759 -0.435 -0.485\nvn  -0.796 -0.289 -0.532\nvn  -0.937 -0.249 -0.246\nvn  -0.193 -0.029 -0.981\nvn  -0.202 -0.249 -0.947\nvn  -0.814 -0.090 -0.574\nvn  -0.969 -0.102 -0.227\nvn  -0.969 0.093 -0.229\nvn  -0.801 0.142 -0.581\nvn  -0.998 0.061 -0.010\nvn  -0.718 0.664 0.209\nvn  -0.985 -0.168 0.036\nvn  -0.954 -0.222 -0.201\nvn  -0.451 0.039 0.891\nvn  -0.341 -0.253 0.905\nvn  -0.604 -0.144 0.784\nvn  -0.472 -0.641 0.606\nvn  0.107 -0.991 0.080\nvn  -0.463 0.274 0.843\nvn  -0.002 0.997 0.081\nvn  0.083 0.977 0.195\nvn  -0.466 0.366 0.805\nvn  -0.977 0.200 0.072\nvn  0.916 -0.331 0.226\nvn  0.929 -0.364 -0.067\nvn  0.728 0.359 0.584\nvn  -0.419 0.737 -0.531\nvn  -0.638 0.769 0.043\nvn  -0.146 0.857 -0.494\nvn  0.280 0.954 0.105\nvn  0.343 0.909 -0.237\nvn  0.546 0.838 -0.008\nvn  0.342 -0.678 -0.651\nvn  -0.159 -0.734 -0.660\nvn  -0.545 0.363 0.756\nvn  -0.599 0.165 0.783\nvn  -0.447 0.066 0.892\nvn  -0.645 0.255 0.721\nvn  -0.936 0.164 0.311\nvn  -0.776 0.182 -0.604\nvn  -0.827 0.285 -0.485\nvn  -0.999 -0.012 0.041\nvn  -0.995 -0.037 -0.093\nvn  -0.586 -0.252 0.770\nvn  -0.926 -0.370 0.079\nvn  -0.938 -0.339 -0.067\nvn  -0.889 -0.266 0.372\nvn  -0.922 -0.372 -0.106\nvn  -0.493 -0.275 -0.825\nvn  -0.473 0.194 -0.860\nvn  -0.965 -0.122 0.231\nvn  -0.401 -0.036 -0.915\nvn  -0.143 -0.164 -0.976\nvn  -0.496 -0.052 -0.867\nvn  -0.996 -0.037 -0.083\nvn  -0.998 0.042 0.045\nvn  -0.950 0.012 0.313\nvn  -0.733 -0.008 0.681\nvn  -0.670 0.247 0.700\nvn  -0.408 0.697 0.589\nvn  -0.330 0.155 0.931\nvn  -0.517 0.244 0.821\nvn  0.568 -0.625 0.535\nvn  -0.512 -0.108 0.852\nvn  -0.414 -0.112 0.903\nvn  -0.654 -0.140 0.743\nvn  -0.608 -0.086 0.789\nvn  -0.422 0.215 0.881\nvn  -0.943 0.031 0.332\nvn  -0.549 0.190 0.814\nvn  -0.193 0.018 0.981\nvn  0.358 0.872 0.335\nvn  -0.651 -0.118 0.750\nvn  -0.954 -0.010 0.300\nvn  -0.352 0.145 -0.925\nvn  -0.095 -0.049 -0.994\nvn  -0.769 0.031 0.639\nvn  -0.929 -0.329 -0.171\nvn  -0.923 -0.336 0.190\nvn  -0.985 -0.174 0.005\nvn  -0.970 -0.234 0.068\nvn  -0.801 0.162 0.576\nvn  -0.969 -0.184 0.166\nvn  -0.293 0.803 0.519\nvn  -0.954 -0.019 0.300\nvn  -0.133 0.986 -0.105\nvn  -0.976 0.175 0.130\nvn  -0.098 0.675 -0.732\nvn  -0.993 0.112 -0.041\nvn  -0.197 0.127 -0.972\nvn  -0.997 -0.077 -0.003\nvn  -0.112 -0.322 -0.940\nvn  -0.978 -0.176 -0.109\nvn  -0.171 -0.674 -0.719\nvn  -0.397 -0.789 -0.468\nvn  -0.937 -0.337 -0.091\nvn  -0.929 -0.341 -0.146\nvn  -0.158 -0.985 -0.070\nvn  -0.854 -0.500 0.145\nvn  -0.814 -0.564 -0.141\nvn  -0.931 -0.306 -0.199\nvn  -0.824 -0.545 0.156\nvn  -0.797 -0.383 0.466\nvn  -0.811 -0.165 0.562\nvn  -0.824 0.053 0.564\nvn  -0.926 0.257 0.275\nvn  -0.991 0.062 0.118\nvn  -0.952 0.122 0.281\nvn  -0.383 -0.604 0.699\nvn  -0.810 -0.150 0.567\nvn  -0.784 0.355 0.509\nvn  -0.761 0.645 0.076\nvn  -0.920 0.079 -0.385\nvn  -0.975 -0.023 0.222\nvn  -0.937 0.166 0.308\nvn  -0.787 0.551 0.279\nvn  -0.517 0.758 -0.396\nvn  -0.337 0.112 -0.935\nvn  -0.221 -0.301 -0.928\nvn  -0.395 -0.579 -0.714\nvn  -0.520 -0.711 -0.473\nvn  -0.426 -0.904 -0.044\nvn  -0.824 -0.523 0.219\nvn  -0.886 -0.220 0.409\nvn  -0.863 0.404 0.303\nvn  -0.782 -0.104 0.615\nvn  -0.953 0.066 0.297\nvn  -0.949 0.312 0.046\nvn  -0.991 0.025 -0.134\nvn  -0.944 -0.116 0.308\nvn  -0.971 -0.237 0.041\nvn  -0.947 -0.041 0.318\nvn  -0.854 -0.274 -0.443\nvn  -0.885 -0.271 -0.378\nvn  -0.952 -0.121 -0.282\nvn  0.180 0.824 -0.537\nvn  0.642 0.679 -0.355\nvn  0.956 0.291 -0.021\nvn  0.453 -0.867 0.208\nvn  0.910 -0.301 0.285\nvn  0.854 -0.043 0.518\nvn  0.833 0.459 0.308\nvn  0.241 0.911 0.334\nvn  0.731 -0.650 -0.206\nvn  0.760 -0.585 -0.282\nvn  -0.814 0.019 0.580\nvn  -0.563 0.638 0.526\nvn  -0.925 -0.012 0.381\nvn  -0.214 0.952 0.217\nvn  0.096 0.721 0.686\nvn  -0.027 0.945 0.325\nvn  -0.555 -0.678 -0.481\nvn  0.062 0.937 -0.343\nvn  0.240 -0.291 0.926\nvn  0.184 -0.889 0.419\nvn  -0.126 -0.990 0.061\nvn  -0.889 -0.369 -0.271\nvn  -0.506 -0.832 0.229\nvn  -0.808 -0.443 0.388\nvn  -0.993 -0.084 0.087\nvn  0.350 -0.016 0.937\nvn  -0.636 0.759 -0.140\nvn  -0.771 0.626 -0.115\nvn  -0.250 0.462 -0.851\nvn  -0.192 0.568 -0.801\nvn  -0.359 0.279 0.891\nvn  -0.026 0.144 0.989\nvn  -0.398 -0.100 0.912\nvn  -0.465 0.084 0.881\nvn  -0.895 0.186 0.405\nvn  -0.947 0.184 0.264\nvn  -0.761 0.459 0.458\nvn  -0.657 0.429 0.620\nvn  -0.426 0.660 0.618\nvn  -0.505 0.610 0.611\nvn  0.223 0.536 0.814\nvn  0.285 0.393 0.874\nvn  -0.163 0.555 0.815\nvn  -0.038 0.570 0.821\nvn  -0.628 0.723 -0.288\nvn  -0.458 0.737 0.497\nvn  -0.212 0.799 0.563\nvn  -0.278 0.687 0.672\nvn  -0.380 0.657 0.651\nvn  -0.170 0.846 0.506\nvn  -0.305 0.687 0.660\nvn  -0.144 0.795 0.589\nvn  0.001 0.494 -0.870\nvn  -0.208 0.539 -0.816\nvn  -0.027 0.458 -0.888\nvn  -0.057 0.367 -0.929\nvn  -0.262 0.718 0.645\nvn  -0.054 0.163 -0.985\nvn  -0.306 0.325 -0.895\nvn  -0.643 0.181 0.744\nvn  -0.717 0.083 0.692\nvn  -0.800 0.573 -0.178\nvn  0.296 -0.070 0.953\nvn  -0.319 -0.065 0.946\n# 1258 vertex normals\n\ng head\ns 1\nf 24/1/24 25/2/25 26/3/26\nf 24/1/24 26/3/26 23/4/23\nf 28/5/28 29/6/29 30/7/30\nf 28/5/28 30/7/30 27/8/27\nf 32/9/32 33/10/33 34/11/34\nf 32/9/32 34/11/34 31/12/31\nf 36/13/36 31/12/31 34/11/34\nf 36/13/36 34/11/34 35/14/35\nf 36/13/36 35/14/35 25/2/25\nf 36/13/36 25/2/25 24/1/24\nf 38/15/38 39/16/39 40/17/40\nf 38/15/38 40/17/40 37/18/37\nf 42/19/42 23/4/23 26/3/26\nf 42/19/42 26/3/26 41/20/41\nf 40/17/40 42/19/42 41/20/41\nf 40/17/40 41/20/41 37/18/37\nf 38/15/38 43/21/43 44/22/44\nf 38/15/38 44/22/44 39/16/39\nf 32/9/32 45/23/45 46/24/46\nf 32/9/32 46/24/46 33/10/33\nf 28/5/28 44/22/44 48/25/48\nf 28/5/28 48/25/48 47/26/47\nf 50/27/50 51/28/51 52/29/52\nf 50/27/50 52/29/52 49/30/49\nf 54/31/54 55/32/55 56/33/56\nf 54/31/54 56/33/56 53/34/53\nf 58/35/58 59/36/59 60/37/60\nf 58/35/58 60/37/60 57/38/57\nf 62/39/62 63/40/63 64/41/64\nf 62/39/62 64/41/64 61/42/61\nf 66/43/66 67/44/67 68/45/68\nf 66/43/66 68/45/68 65/46/65\nf 70/47/70 71/48/71 72/49/72\nf 70/47/70 72/49/72 69/50/69\nf 67/44/67 66/43/66 74/51/74\nf 67/44/67 74/51/74 73/52/73\nf 66/43/66 51/28/51 50/27/50\nf 66/43/66 50/27/50 74/51/74\nf 76/53/76 77/54/77 78/55/78\nf 76/53/76 78/55/78 75/56/75\nf 80/57/80 81/58/81 82/59/82\nf 80/57/80 82/59/82 79/60/79\nf 84/61/84 85/62/85 86/63/86\nf 84/61/84 86/63/86 83/64/83\nf 87/65/87 88/66/88 80/57/80\nf 87/65/87 80/57/80 79/60/79\nf 90/67/90 91/68/91 92/69/92\nf 90/67/90 92/69/92 89/70/89\nf 93/71/93 94/72/94 78/55/78\nf 93/71/93 78/55/78 77/54/77\nf 87/65/87 95/73/95 96/74/96\nf 87/65/87 96/74/96 88/66/88\nf 98/75/98 99/76/99 100/77/100\nf 98/75/98 100/77/100 97/78/97\nf 100/77/100 101/79/101 102/80/102\nf 100/77/100 102/80/102 97/78/97\nf 98/75/98 103/81/103 104/82/104\nf 98/75/98 104/82/104 99/76/99\nf 106/83/106 107/84/107 108/85/108\nf 106/83/106 108/85/108 105/86/105\nf 109/87/109 110/88/110 105/86/105\nf 109/87/109 105/86/105 108/85/108\nf 101/79/101 111/89/111 112/90/112\nf 101/79/101 112/90/112 102/80/102\nf 114/91/114 115/92/115 116/93/116\nf 114/91/114 116/93/116 113/94/113\nf 118/95/118 119/96/119 120/97/120\nf 118/95/118 120/97/120 117/98/117\nf 122/99/122 123/100/123 124/101/124\nf 122/99/122 124/101/124 121/102/121\nf 126/103/126 127/104/127 128/105/128\nf 126/103/126 128/105/128 125/106/125\nf 130/107/130 131/108/131 132/109/132\nf 130/107/130 132/109/132 129/110/129\nf 125/106/125 128/105/128 134/111/134\nf 125/106/125 134/111/134 133/112/133\nf 56/33/56 55/32/55 136/113/136\nf 56/33/56 136/113/136 135/114/135\nf 37/115/37 137/116/137 138/117/138\nf 37/115/37 138/117/138 38/118/38\nf 139/119/139 43/120/43 38/118/38\nf 139/119/139 38/118/38 138/117/138\nf 140/121/140 141/122/141 142/123/142\nf 140/121/140 142/123/142 130/107/130\nf 144/124/144 129/110/129 132/109/132\nf 144/124/144 132/109/132 143/125/143\nf 146/126/146 147/127/147 148/128/148\nf 146/126/146 148/128/148 145/129/145\nf 150/130/150 151/131/151 54/31/54\nf 150/130/150 54/31/54 149/132/149\nf 54/31/54 53/34/53 152/133/152\nf 54/31/54 152/133/152 149/132/149\nf 154/134/154 155/135/155 156/136/156\nf 154/134/154 156/136/156 153/137/153\nf 158/138/158 159/139/159 160/140/160\nf 158/138/158 160/140/160 157/141/157\nf 162/142/162 163/143/163 164/144/164\nf 162/142/162 164/144/164 161/145/161\nf 129/110/129 144/124/144 157/141/157\nf 129/110/129 157/141/157 160/140/160\nf 156/136/156 155/135/155 166/146/166\nf 156/136/156 166/146/166 165/147/165\nf 168/148/168 169/149/169 170/150/170\nf 168/148/168 170/150/170 167/151/167\nf 171/152/171 172/153/172 173/154/173\nf 171/152/171 173/154/173 169/149/169\nf 175/155/175 176/156/176 171/152/171\nf 175/155/175 171/152/171 174/157/174\nf 59/36/59 177/158/177 178/159/178\nf 59/36/59 178/159/178 60/37/60\nf 180/160/180 181/161/181 49/30/49\nf 180/160/180 49/30/49 179/162/179\nf 127/104/127 52/29/52 182/163/182\nf 127/104/127 182/163/182 128/105/128\nf 134/111/134 183/164/183 184/165/184\nf 134/111/134 184/165/184 124/101/124\nf 185/166/185 121/102/121 124/101/124\nf 185/166/185 124/101/124 184/165/184\nf 187/167/187 188/168/188 189/169/189\nf 187/167/187 189/169/189 186/170/186\nf 191/171/191 192/172/192 193/173/193\nf 191/171/191 193/173/193 190/174/190\nf 76/53/76 194/175/194 193/173/193\nf 76/53/76 193/173/193 77/54/77\nf 100/77/100 99/76/99 196/176/196\nf 100/77/100 196/176/196 195/177/195\nf 176/156/176 175/155/175 198/178/198\nf 176/156/176 198/178/198 197/179/197\nf 199/180/199 200/181/200 173/154/173\nf 199/180/199 173/154/173 172/153/172\nf 196/176/196 202/182/202 203/183/203\nf 196/176/196 203/183/203 201/184/201\nf 205/185/205 206/186/206 207/187/207\nf 205/185/205 207/187/207 204/188/204\nf 208/189/208 205/185/205 204/188/204\nf 208/189/208 204/188/204 201/184/201\nf 210/190/210 97/78/97 102/80/102\nf 210/190/210 102/80/102 209/191/209\nf 79/60/79 210/190/210 209/191/209\nf 79/60/79 209/191/209 87/65/87\nf 212/192/212 213/193/213 214/194/214\nf 212/192/212 214/194/214 211/195/211\nf 216/196/216 217/197/217 218/198/218\nf 216/196/216 218/198/218 215/199/215\nf 220/200/220 216/196/216 215/199/215\nf 220/200/220 215/199/215 219/201/219\nf 222/202/222 223/203/223 218/198/218\nf 222/202/222 218/198/218 221/204/221\nf 225/205/225 226/206/226 227/207/227\nf 225/205/225 227/207/227 224/208/224\nf 222/202/222 221/204/221 229/209/229\nf 222/202/222 229/209/229 228/210/228\nf 230/211/230 231/212/231 220/200/220\nf 230/211/230 220/200/220 219/201/219\nf 227/207/227 226/206/226 231/212/231\nf 227/207/227 231/212/231 230/211/230\nf 233/213/233 234/214/234 235/215/235\nf 233/213/233 235/215/235 232/216/232\nf 186/170/186 203/183/203 202/182/202\nf 186/170/186 202/182/202 187/167/187\nf 236/217/236 237/218/237 238/219/238\nf 236/217/236 238/219/238 188/168/188\nf 240/220/240 241/221/241 242/222/242\nf 240/220/240 242/222/242 239/223/239\nf 241/221/241 243/224/243 244/225/244\nf 241/221/241 244/225/244 238/219/238\nf 245/226/245 101/79/101 100/77/100\nf 245/226/245 100/77/100 195/177/195\nf 195/177/195 204/188/204 207/187/207\nf 195/177/195 207/187/207 245/226/245\nf 111/89/111 246/227/246 247/228/247\nf 111/89/111 247/228/247 115/92/115\nf 141/122/141 140/121/140 249/229/249\nf 141/122/141 249/229/249 248/230/248\nf 251/231/251 252/232/252 253/233/253\nf 251/231/251 253/233/253 250/234/250\nf 254/235/254 118/95/118 255/236/255\nf 254/235/254 255/236/255 217/197/217\nf 257/237/257 258/238/258 259/239/259\nf 257/237/257 259/239/259 256/240/256\nf 256/240/256 259/239/259 261/241/261\nf 256/240/256 261/241/261 260/242/260\nf 260/242/260 261/241/261 30/243/30\nf 260/242/260 30/243/30 29/244/29\nf 218/198/218 217/197/217 262/245/262\nf 218/198/218 262/245/262 221/204/221\nf 259/239/259 258/238/258 264/246/264\nf 259/239/259 264/246/264 263/247/263\nf 266/248/266 30/243/30 261/241/261\nf 266/248/266 261/241/261 265/249/265\nf 253/233/253 252/232/252 268/250/268\nf 253/233/253 268/250/268 267/251/267\nf 270/252/270 200/181/200 271/253/271\nf 270/252/270 271/253/271 269/254/269\nf 199/180/199 272/255/272 271/253/271\nf 199/180/199 271/253/271 200/181/200\nf 199/180/199 273/256/273 274/257/274\nf 199/180/199 274/257/274 272/255/272\nf 276/258/276 267/251/267 268/250/268\nf 276/258/276 268/250/268 275/259/275\nf 275/259/275 268/250/268 269/254/269\nf 275/259/275 269/254/269 277/260/277\nf 93/71/93 77/54/77 193/173/193\nf 93/71/93 193/173/193 192/172/192\nf 279/261/279 280/262/280 281/263/281\nf 279/261/279 281/263/281 278/264/278\nf 278/264/278 88/66/88 96/74/96\nf 278/264/278 96/74/96 279/261/279\nf 282/265/282 283/266/283 62/39/62\nf 282/265/282 62/39/62 94/72/94\nf 281/263/281 284/267/284 285/268/285\nf 281/263/281 285/268/285 278/264/278\nf 287/269/287 288/270/288 289/271/289\nf 287/269/287 289/271/289 286/272/286\nf 63/40/63 62/39/62 283/266/283\nf 63/40/63 283/266/283 290/273/290\nf 283/266/283 291/274/291 292/275/292\nf 283/266/283 292/275/292 290/273/290\nf 293/276/293 294/277/294 68/45/68\nf 293/276/293 68/45/68 67/44/67\nf 296/278/296 297/279/297 298/280/298\nf 296/278/296 298/280/298 295/281/295\nf 300/282/300 301/283/301 302/284/302\nf 300/282/300 302/284/302 299/285/299\nf 304/286/304 305/287/305 306/288/306\nf 304/286/304 306/288/306 303/289/303\nf 138/117/138 137/116/137 308/290/308\nf 138/117/138 308/290/308 307/291/307\nf 165/147/165 310/292/310 311/293/311\nf 165/147/165 311/293/311 309/294/309\nf 312/295/312 55/32/55 54/31/54\nf 312/295/312 54/31/54 151/131/151\nf 314/296/314 151/131/151 150/130/150\nf 314/296/314 150/130/150 313/297/313\nf 315/298/315 316/299/316 227/207/227\nf 315/298/315 227/207/227 230/211/230\nf 136/113/136 317/300/317 158/138/158\nf 136/113/136 158/138/158 157/141/157\nf 319/301/319 148/128/148 147/127/147\nf 319/301/319 147/127/147 318/302/318\nf 320/303/320 321/304/321 147/127/147\nf 320/303/320 147/127/147 146/126/146\nf 323/305/323 324/306/324 325/307/325\nf 323/305/323 325/307/325 322/308/322\nf 80/57/80 88/66/88 278/264/278\nf 80/57/80 278/264/278 285/268/285\nf 327/309/327 145/129/145 148/128/148\nf 327/309/327 148/128/148 326/310/326\nf 279/261/279 286/272/286 289/271/289\nf 279/261/279 289/271/289 280/262/280\nf 329/311/329 330/312/330 331/313/331\nf 329/311/329 331/313/331 328/314/328\nf 187/167/187 202/182/202 104/82/104\nf 187/167/187 104/82/104 332/315/332\nf 236/217/236 332/315/332 191/171/191\nf 236/217/236 191/171/191 190/174/190\nf 165/147/165 166/146/166 333/316/333\nf 165/147/165 333/316/333 310/292/310\nf 139/119/139 334/317/334 48/318/48\nf 139/119/139 48/318/48 43/120/43\nf 336/319/336 337/320/337 338/321/338\nf 336/319/336 338/321/338 335/322/335\nf 51/28/51 324/306/324 182/163/182\nf 51/28/51 182/163/182 52/29/52\nf 339/323/339 126/103/126 53/34/53\nf 339/323/339 53/34/53 56/33/56\nf 340/324/340 341/325/341 149/132/149\nf 340/324/340 149/132/149 152/133/152\nf 243/224/243 343/326/343 344/327/344\nf 243/224/243 344/327/344 342/328/342\nf 346/329/346 343/326/343 240/220/240\nf 346/329/346 240/220/240 345/330/345\nf 348/331/348 349/332/349 350/333/350\nf 348/331/348 350/333/350 347/334/347\nf 351/335/351 352/336/352 213/193/213\nf 351/335/351 213/193/213 212/192/212\nf 128/105/128 182/163/182 183/164/183\nf 128/105/128 183/164/183 134/111/134\nf 103/81/103 98/75/98 354/337/354\nf 103/81/103 354/337/354 353/338/353\nf 114/91/114 113/94/113 356/339/356\nf 114/91/114 356/339/356 355/340/355\nf 358/341/358 197/179/197 198/178/198\nf 358/341/358 198/178/198 357/342/357\nf 107/84/107 359/343/359 360/344/360\nf 107/84/107 360/344/360 108/85/108\nf 348/331/348 361/345/361 362/346/362\nf 348/331/348 362/346/362 349/332/349\nf 347/334/347 363/347/363 234/214/234\nf 347/334/347 234/214/234 348/331/348\nf 220/200/220 231/212/231 167/151/167\nf 220/200/220 167/151/167 364/348/364\nf 153/137/153 366/349/366 300/282/300\nf 153/137/153 300/282/300 365/350/365\nf 295/281/295 72/49/72 71/48/71\nf 295/281/295 71/48/71 296/278/296\nf 179/162/179 339/323/339 367/351/367\nf 179/162/179 367/351/367 180/160/180\nf 368/352/368 369/353/369 158/138/158\nf 368/352/368 158/138/158 317/300/317\nf 317/300/317 136/113/136 55/32/55\nf 317/300/317 55/32/55 312/295/312\nf 371/354/371 372/355/372 373/356/373\nf 371/354/371 373/356/373 370/357/370\nf 41/358/41 26/359/26 306/288/306\nf 41/358/41 306/288/306 305/287/305\nf 305/287/305 137/116/137 37/115/37\nf 305/287/305 37/115/37 41/358/41\nf 248/230/248 374/360/374 375/361/375\nf 248/230/248 375/361/375 141/122/141\nf 66/43/66 325/307/325 324/306/324\nf 66/43/66 324/306/324 51/28/51\nf 183/164/183 323/305/323 376/362/376\nf 183/164/183 376/362/376 184/165/184\nf 378/363/378 253/233/253 267/251/267\nf 378/363/378 267/251/267 377/364/377\nf 269/254/269 271/253/271 379/365/379\nf 269/254/269 379/365/379 277/260/277\nf 381/366/381 382/367/382 383/368/383\nf 381/366/381 383/368/383 380/369/380\nf 384/370/384 385/371/385 105/86/105\nf 384/370/384 105/86/105 110/88/110\nf 105/86/105 385/371/385 386/372/386\nf 105/86/105 386/372/386 106/83/106\nf 360/344/360 387/373/387 109/87/109\nf 360/344/360 109/87/109 108/85/108\nf 181/161/181 180/160/180 164/144/164\nf 181/161/181 164/144/164 163/143/163\nf 365/350/365 388/374/388 154/134/154\nf 365/350/365 154/134/154 153/137/153\nf 168/148/168 167/151/167 231/212/231\nf 168/148/168 231/212/231 226/206/226\nf 81/58/81 291/274/291 283/266/283\nf 81/58/81 283/266/283 282/265/282\nf 272/255/272 389/375/389 379/365/379\nf 272/255/272 379/365/379 271/253/271\nf 274/257/274 390/376/390 389/375/389\nf 274/257/274 389/375/389 272/255/272\nf 139/119/139 375/361/375 374/360/374\nf 139/119/139 374/360/374 334/317/334\nf 391/377/391 366/349/366 153/137/153\nf 391/377/391 153/137/153 156/136/156\nf 392/378/392 393/379/393 366/349/366\nf 392/378/392 366/349/366 391/377/391\nf 173/154/173 200/181/200 270/252/270\nf 173/154/173 270/252/270 394/380/394\nf 301/283/301 300/282/300 366/349/366\nf 301/283/301 366/349/366 393/379/393\nf 396/381/396 397/382/397 398/383/398\nf 396/381/396 398/383/398 395/384/395\nf 399/385/399 364/348/364 167/151/167\nf 399/385/399 167/151/167 170/150/170\nf 394/380/394 251/231/251 399/385/399\nf 394/380/394 399/385/399 170/150/170\nf 270/252/270 252/232/252 251/231/251\nf 270/252/270 251/231/251 394/380/394\nf 102/80/102 112/90/112 400/386/400\nf 102/80/102 400/386/400 209/191/209\nf 131/108/131 401/387/401 372/355/372\nf 131/108/131 372/355/372 371/354/371\nf 391/377/391 156/136/156 165/147/165\nf 391/377/391 165/147/165 309/294/309\nf 403/388/403 404/389/404 405/390/405\nf 403/388/403 405/390/405 402/391/402\nf 402/391/402 392/378/392 391/377/391\nf 402/391/402 391/377/391 309/294/309\nf 35/392/35 310/292/310 333/316/333\nf 35/392/35 333/316/333 25/393/25\nf 35/392/35 34/394/34 311/293/311\nf 35/392/35 311/293/311 310/292/310\nf 34/394/34 33/395/33 403/388/403\nf 34/394/34 403/388/403 311/293/311\nf 406/396/406 262/245/262 217/197/217\nf 406/396/406 217/197/217 255/236/255\nf 377/364/377 407/397/407 408/398/408\nf 377/364/377 408/398/408 406/396/406\nf 117/98/117 378/363/378 255/236/255\nf 117/98/117 255/236/255 118/95/118\nf 270/252/270 269/254/269 268/250/268\nf 270/252/270 268/250/268 252/232/252\nf 304/286/304 303/289/303 373/356/373\nf 304/286/304 373/356/373 372/355/372\nf 362/346/362 409/399/409 410/400/410\nf 362/346/362 410/400/410 349/332/349\nf 411/401/411 412/402/412 89/70/89\nf 411/401/411 89/70/89 92/69/92\nf 414/403/414 411/401/411 415/404/415\nf 414/403/414 415/404/415 413/405/413\nf 417/406/417 336/319/336 418/407/418\nf 417/406/417 418/407/418 416/408/416\nf 337/320/337 419/409/419 69/50/69\nf 337/320/337 69/50/69 72/49/72\nf 421/410/421 422/411/422 423/412/423\nf 421/410/421 423/412/423 420/413/420\nf 421/410/421 424/414/424 425/415/425\nf 421/410/421 425/415/425 422/411/422\nf 423/412/423 422/411/422 427/416/427\nf 423/412/423 427/416/427 426/417/426\nf 239/223/239 242/222/242 428/418/428\nf 239/223/239 428/418/428 425/415/425\nf 430/419/430 73/52/73 74/51/74\nf 430/419/430 74/51/74 429/420/429\nf 70/47/70 69/50/69 419/409/419\nf 70/47/70 419/409/419 429/420/429\nf 247/228/247 431/421/431 116/93/116\nf 247/228/247 116/93/116 115/92/115\nf 346/329/346 345/330/345 433/422/433\nf 346/329/346 433/422/433 432/423/432\nf 433/422/433 421/410/421 420/413/420\nf 433/422/433 420/413/420 434/424/434\nf 436/425/436 437/426/437 438/427/438\nf 436/425/436 438/427/438 435/428/435\nf 437/426/437 381/366/381 380/369/380\nf 437/426/437 380/369/380 438/427/438\nf 178/159/178 177/158/177 440/429/440\nf 178/159/178 440/429/440 439/430/439\nf 440/429/440 441/431/441 442/432/442\nf 440/429/440 442/432/442 439/430/439\nf 444/433/444 445/434/445 446/435/446\nf 444/433/444 446/435/446 443/436/443\nf 324/306/324 323/305/323 183/164/183\nf 324/306/324 183/164/183 182/163/182\nf 213/193/213 352/336/352 357/342/357\nf 213/193/213 357/342/357 198/178/198\nf 214/194/214 175/155/175 174/157/174\nf 214/194/214 174/157/174 225/205/225\nf 448/437/448 449/438/449 450/439/450\nf 448/437/448 450/439/450 447/440/447\nf 423/412/423 426/417/426 451/441/451\nf 423/412/423 451/441/451 447/440/447\nf 75/56/75 451/441/451 426/417/426\nf 75/56/75 426/417/426 76/53/76\nf 78/55/78 94/72/94 62/39/62\nf 78/55/78 62/39/62 61/42/61\nf 286/272/286 86/63/86 85/62/85\nf 286/272/286 85/62/85 287/269/287\nf 95/73/95 87/65/87 209/191/209\nf 95/73/95 209/191/209 400/386/400\nf 237/218/237 452/442/452 428/418/428\nf 237/218/237 428/418/428 242/222/242\nf 190/174/190 193/173/193 194/175/194\nf 190/174/190 194/175/194 452/442/452\nf 237/218/237 236/217/236 190/174/190\nf 237/218/237 190/174/190 452/442/452\nf 79/60/79 82/59/82 354/337/354\nf 79/60/79 354/337/354 210/190/210\nf 286/272/286 279/261/279 96/74/96\nf 286/272/286 96/74/96 86/63/86\nf 430/419/430 417/406/417 416/408/416\nf 430/419/430 416/408/416 453/443/453\nf 338/321/338 295/281/295 298/280/298\nf 338/321/338 298/280/298 299/285/299\nf 57/38/57 60/37/60 455/444/455\nf 57/38/57 455/444/455 454/445/454\nf 212/192/212 456/446/456 457/447/457\nf 212/192/212 457/447/457 351/335/351\nf 83/64/83 355/340/355 356/339/356\nf 83/64/83 356/339/356 84/61/84\nf 142/123/142 141/122/141 375/361/375\nf 142/123/142 375/361/375 307/291/307\nf 401/387/401 142/123/142 307/291/307\nf 401/387/401 307/291/307 308/290/308\nf 459/448/459 257/237/257 256/240/256\nf 459/448/459 256/240/256 458/449/458\nf 228/210/228 264/246/264 258/238/258\nf 228/210/228 258/238/258 222/202/222\nf 256/240/256 260/242/260 460/450/460\nf 256/240/256 460/450/460 458/449/458\nf 460/450/460 260/242/260 29/244/29\nf 460/450/460 29/244/29 47/451/47\nf 263/247/263 265/249/265 261/241/261\nf 263/247/263 261/241/261 259/239/259\nf 461/452/461 462/453/462 189/169/189\nf 461/452/461 189/169/189 244/225/244\nf 227/207/227 316/299/316 463/454/463\nf 227/207/227 463/454/463 224/208/224\nf 465/455/465 466/456/466 410/400/410\nf 465/455/465 410/400/410 464/457/464\nf 90/67/90 386/372/386 385/371/385\nf 90/67/90 385/371/385 91/68/91\nf 233/213/233 361/345/361 348/331/348\nf 233/213/233 348/331/348 234/214/234\nf 235/215/235 234/214/234 363/347/363\nf 235/215/235 363/347/363 467/458/467\nf 338/321/338 337/320/337 72/49/72\nf 338/321/338 72/49/72 295/281/295\nf 338/321/338 299/285/299 302/284/302\nf 338/321/338 302/284/302 335/322/335\nf 468/459/468 469/460/469 470/461/470\nf 468/459/468 470/461/470 415/404/415\nf 347/334/347 471/462/471 472/463/472\nf 347/334/347 472/463/472 363/347/363\nf 471/462/471 347/334/347 350/333/350\nf 471/462/471 350/333/350 473/464/473\nf 465/455/465 475/465/475 476/466/476\nf 465/455/465 476/466/476 474/467/474\nf 384/370/384 110/88/110 478/468/478\nf 384/370/384 478/468/478 477/469/477\nf 414/403/414 479/470/479 412/402/412\nf 414/403/414 412/402/412 411/401/411\nf 288/270/288 287/269/287 412/402/412\nf 288/270/288 412/402/412 479/470/479\nf 85/62/85 84/61/84 90/67/90\nf 85/62/85 90/67/90 89/70/89\nf 386/372/386 356/339/356 113/94/113\nf 386/372/386 113/94/113 106/83/106\nf 232/216/232 358/341/358 357/342/357\nf 232/216/232 357/342/357 233/213/233\nf 297/279/297 296/278/296 181/161/181\nf 297/279/297 181/161/181 163/143/163\nf 419/409/419 337/320/337 336/319/336\nf 419/409/419 336/319/336 417/406/417\nf 49/30/49 52/29/52 127/104/127\nf 49/30/49 127/104/127 179/162/179\nf 26/359/26 25/393/25 333/316/333\nf 26/359/26 333/316/333 306/288/306\nf 371/354/371 370/357/370 162/142/162\nf 371/354/371 162/142/162 161/145/161\nf 258/238/258 257/237/257 223/203/223\nf 258/238/258 223/203/223 222/202/222\nf 257/237/257 459/448/459 480/471/480\nf 257/237/257 480/471/480 223/203/223\nf 211/195/211 214/194/214 225/205/225\nf 211/195/211 225/205/225 224/208/224\nf 316/299/316 481/472/481 314/296/314\nf 316/299/316 314/296/314 463/454/463\nf 171/152/171 169/149/169 168/148/168\nf 171/152/171 168/148/168 174/157/174\nf 273/256/273 199/180/199 172/153/172\nf 273/256/273 172/153/172 482/473/482\nf 168/148/168 226/206/226 225/205/225\nf 168/148/168 225/205/225 174/157/174\nf 245/226/245 246/227/246 111/89/111\nf 245/226/245 111/89/111 101/79/101\nf 114/91/114 112/90/112 111/89/111\nf 114/91/114 111/89/111 115/92/115\nf 210/190/210 354/337/354 98/75/98\nf 210/190/210 98/75/98 97/78/97\nf 431/421/431 358/341/358 232/216/232\nf 431/421/431 232/216/232 359/343/359\nf 235/215/235 360/344/360 359/343/359\nf 235/215/235 359/343/359 232/216/232\nf 360/344/360 235/215/235 467/458/467\nf 360/344/360 467/458/467 387/373/387\nf 81/58/81 282/265/282 483/474/483\nf 81/58/81 483/474/483 82/59/82\nf 485/475/485 486/476/486 487/477/487\nf 485/475/485 487/477/487 484/478/484\nf 489/479/489 68/45/68 294/277/294\nf 489/479/489 294/277/294 488/480/488\nf 491/481/491 454/445/454 455/444/455\nf 491/481/491 455/444/455 490/482/490\nf 154/134/154 370/357/370 373/356/373\nf 154/134/154 373/356/373 155/135/155\nf 491/481/491 322/308/322 325/307/325\nf 491/481/491 325/307/325 492/483/492\nf 491/481/491 490/482/490 493/484/493\nf 491/481/491 493/484/493 322/308/322\nf 436/425/436 435/428/435 446/435/446\nf 436/425/436 446/435/446 494/485/494\nf 495/486/495 496/487/496 438/427/438\nf 495/486/495 438/427/438 380/369/380\nf 496/487/496 497/488/497 435/428/435\nf 496/487/496 435/428/435 438/427/438\nf 331/313/331 330/312/330 498/489/498\nf 331/313/331 498/489/498 432/423/432\nf 499/490/499 346/329/346 432/423/432\nf 499/490/499 432/423/432 498/489/498\nf 380/369/380 383/368/383 500/491/500\nf 380/369/380 500/491/500 495/486/495\nf 501/492/501 328/314/328 331/313/331\nf 501/492/501 331/313/331 434/424/434\nf 499/490/499 344/327/344 343/326/343\nf 499/490/499 343/326/343 346/329/346\nf 492/483/492 502/493/502 454/445/454\nf 492/483/492 454/445/454 491/481/491\nf 454/445/454 502/493/502 487/477/487\nf 454/445/454 487/477/487 57/38/57\nf 486/476/486 58/35/58 57/38/57\nf 486/476/486 57/38/57 487/477/487\nf 58/35/58 486/476/486 503/494/503\nf 58/35/58 503/494/503 382/367/382\nf 383/368/383 504/495/504 505/496/505\nf 383/368/383 505/496/505 500/491/500\nf 447/440/447 450/439/450 420/413/420\nf 447/440/447 420/413/420 423/412/423\nf 329/311/329 328/314/328 445/434/445\nf 329/311/329 445/434/445 444/433/444\nf 450/439/450 449/438/449 506/497/506\nf 450/439/450 506/497/506 501/492/501\nf 507/498/507 508/499/508 451/441/451\nf 507/498/507 451/441/451 75/56/75\nf 99/76/99 104/82/104 202/182/202\nf 99/76/99 202/182/202 196/176/196\nf 509/500/509 208/189/208 201/184/201\nf 509/500/509 201/184/201 203/183/203\nf 201/184/201 204/188/204 195/177/195\nf 201/184/201 195/177/195 196/176/196\nf 462/453/462 510/501/510 186/170/186\nf 462/453/462 186/170/186 189/169/189\nf 203/183/203 186/170/186 510/501/510\nf 203/183/203 510/501/510 509/500/509\nf 148/128/148 319/301/319 341/325/341\nf 148/128/148 341/325/341 326/310/326\nf 326/310/326 341/325/341 340/324/340\nf 326/310/326 340/324/340 511/502/511\nf 123/100/123 511/502/511 340/324/340\nf 123/100/123 340/324/340 133/112/133\nf 71/48/71 49/30/49 181/161/181\nf 71/48/71 181/161/181 296/278/296\nf 154/134/154 388/374/388 162/142/162\nf 154/134/154 162/142/162 370/357/370\nf 155/135/155 373/356/373 303/289/303\nf 155/135/155 303/289/303 166/146/166\nf 166/146/166 303/289/303 306/288/306\nf 166/146/166 306/288/306 333/316/333\nf 512/503/512 320/303/320 289/271/289\nf 512/503/512 289/271/289 288/270/288\nf 479/470/479 414/403/414 514/504/514\nf 479/470/479 514/504/514 513/505/513\nf 414/403/414 413/405/413 475/465/475\nf 414/403/414 475/465/475 514/504/514\nf 513/505/513 512/503/512 288/270/288\nf 513/505/513 288/270/288 479/470/479\nf 191/171/191 103/81/103 353/338/353\nf 191/171/191 353/338/353 192/172/192\nf 332/315/332 104/82/104 103/81/103\nf 332/315/332 103/81/103 191/171/191\nf 82/59/82 483/474/483 353/338/353\nf 82/59/82 353/338/353 354/337/354\nf 83/64/83 86/63/86 96/74/96\nf 83/64/83 96/74/96 95/73/95\nf 83/64/83 95/73/95 400/386/400\nf 83/64/83 400/386/400 355/340/355\nf 355/340/355 400/386/400 112/90/112\nf 355/340/355 112/90/112 114/91/114\nf 144/124/144 135/114/135 136/113/136\nf 144/124/144 136/113/136 157/141/157\nf 298/280/298 365/350/365 300/282/300\nf 298/280/298 300/282/300 299/285/299\nf 298/280/298 297/279/297 388/374/388\nf 298/280/298 388/374/388 365/350/365\nf 367/351/367 143/125/143 164/144/164\nf 367/351/367 164/144/164 180/160/180\nf 515/506/515 516/507/516 219/201/219\nf 515/506/515 219/201/219 215/199/215\nf 254/235/254 217/197/217 216/196/216\nf 254/235/254 216/196/216 517/508/517\nf 398/383/398 364/348/364 399/385/399\nf 398/383/398 399/385/399 395/384/395\nf 398/383/398 397/382/397 517/508/517\nf 398/383/398 517/508/517 216/196/216\nf 518/509/518 519/510/519 246/227/246\nf 518/509/518 246/227/246 245/226/245\nf 319/301/319 150/130/150 149/132/149\nf 319/301/319 149/132/149 341/325/341\nf 429/420/429 419/409/419 417/406/417\nf 429/420/429 417/406/417 430/419/430\nf 33/395/33 46/511/46 404/389/404\nf 33/395/33 404/389/404 403/388/403\nf 403/388/403 402/391/402 309/294/309\nf 403/388/403 309/294/309 311/293/311\nf 393/379/393 520/512/520 521/513/521\nf 393/379/393 521/513/521 301/283/301\nf 522/514/522 520/512/520 393/379/393\nf 522/514/522 393/379/393 392/378/392\nf 302/284/302 301/283/301 521/513/521\nf 302/284/302 521/513/521 523/515/523\nf 302/284/302 523/515/523 524/516/524\nf 302/284/302 524/516/524 335/322/335\nf 321/304/321 456/446/456 318/302/318\nf 321/304/321 318/302/318 147/127/147\nf 456/446/456 321/304/321 525/517/525\nf 456/446/456 525/517/525 457/447/457\nf 410/400/410 409/399/409 526/518/526\nf 410/400/410 526/518/526 464/457/464\nf 410/400/410 466/456/466 350/333/350\nf 410/400/410 350/333/350 349/332/349\nf 456/446/456 212/192/212 211/195/211\nf 456/446/456 211/195/211 527/519/527\nf 211/195/211 224/208/224 463/454/463\nf 211/195/211 463/454/463 527/519/527\nf 407/397/407 377/364/377 267/251/267\nf 407/397/407 267/251/267 276/258/276\nf 378/363/378 377/364/377 406/396/406\nf 378/363/378 406/396/406 255/236/255\nf 175/155/175 214/194/214 213/193/213\nf 175/155/175 213/193/213 198/178/198\nf 386/372/386 90/67/90 84/61/84\nf 386/372/386 84/61/84 356/339/356\nf 409/399/409 362/346/362 351/335/351\nf 409/399/409 351/335/351 457/447/457\nf 85/62/85 89/70/89 412/402/412\nf 85/62/85 412/402/412 287/269/287\nf 361/345/361 233/213/233 357/342/357\nf 361/345/361 357/342/357 352/336/352\nf 116/93/116 431/421/431 359/343/359\nf 116/93/116 359/343/359 107/84/107\nf 116/93/116 107/84/107 106/83/106\nf 116/93/116 106/83/106 113/94/113\nf 352/336/352 351/335/351 362/346/362\nf 352/336/352 362/346/362 361/345/361\nf 513/505/513 514/504/514 464/457/464\nf 513/505/513 464/457/464 526/518/526\nf 526/518/526 409/399/409 457/447/457\nf 526/518/526 457/447/457 525/517/525\nf 514/504/514 475/465/475 465/455/465\nf 514/504/514 465/455/465 464/457/464\nf 358/341/358 431/421/431 247/228/247\nf 358/341/358 247/228/247 197/179/197\nf 176/156/176 482/473/482 172/153/172\nf 176/156/176 172/153/172 171/152/171\nf 396/381/396 395/384/395 250/234/250\nf 396/381/396 250/234/250 119/96/119\nf 395/384/395 399/385/399 251/231/251\nf 395/384/395 251/231/251 250/234/250\nf 291/274/291 81/58/81 80/57/80\nf 291/274/291 80/57/80 285/268/285\nf 284/267/284 292/275/292 291/274/291\nf 284/267/284 291/274/291 285/268/285\nf 528/520/528 327/309/327 326/310/326\nf 528/520/528 326/310/326 511/502/511\nf 126/103/126 125/106/125 152/133/152\nf 126/103/126 152/133/152 53/34/53\nf 152/133/152 125/106/125 133/112/133\nf 152/133/152 133/112/133 340/324/340\nf 127/104/127 126/103/126 339/323/339\nf 127/104/127 339/323/339 179/162/179\nf 56/33/56 135/114/135 367/351/367\nf 56/33/56 367/351/367 339/323/339\nf 124/101/124 123/100/123 133/112/133\nf 124/101/124 133/112/133 134/111/134\nf 143/125/143 367/351/367 135/114/135\nf 143/125/143 135/114/135 144/124/144\nf 164/144/164 143/125/143 132/109/132\nf 164/144/164 132/109/132 161/145/161\nf 401/387/401 131/108/131 130/107/130\nf 401/387/401 130/107/130 142/123/142\nf 292/275/292 528/520/528 122/99/122\nf 292/275/292 122/99/122 290/273/290\nf 61/42/61 507/498/507 75/56/75\nf 61/42/61 75/56/75 78/55/78\nf 320/303/320 512/503/512 525/517/525\nf 320/303/320 525/517/525 321/304/321\nf 512/503/512 513/505/513 526/518/526\nf 512/503/512 526/518/526 525/517/525\nf 123/100/123 122/99/122 528/520/528\nf 123/100/123 528/520/528 511/502/511\nf 262/245/262 529/521/529 229/209/229\nf 262/245/262 229/209/229 221/204/221\nf 316/299/316 315/298/315 368/352/368\nf 316/299/316 368/352/368 481/472/481\nf 516/507/516 315/298/315 230/211/230\nf 516/507/516 230/211/230 219/201/219\nf 515/506/515 530/522/530 369/353/369\nf 515/506/515 369/353/369 516/507/516\nf 530/522/530 515/506/515 223/203/223\nf 530/522/530 223/203/223 480/471/480\nf 215/199/215 218/198/218 223/203/223\nf 215/199/215 223/203/223 515/506/515\nf 459/448/459 458/449/458 374/360/374\nf 459/448/459 374/360/374 248/230/248\nf 458/449/458 460/450/460 334/317/334\nf 458/449/458 334/317/334 374/360/374\nf 334/317/334 460/450/460 47/451/47\nf 334/317/334 47/451/47 48/318/48\nf 459/448/459 248/230/248 249/229/249\nf 459/448/459 249/229/249 480/471/480\nf 253/233/253 120/97/120 119/96/119\nf 253/233/253 119/96/119 250/234/250\nf 394/380/394 170/150/170 169/149/169\nf 394/380/394 169/149/169 173/154/173\nf 519/510/519 482/473/482 176/156/176\nf 519/510/519 176/156/176 197/179/197\nf 518/509/518 273/256/273 482/473/482\nf 518/509/518 482/473/482 519/510/519\nf 531/523/531 274/257/274 273/256/273\nf 531/523/531 273/256/273 518/509/518\nf 532/524/532 390/376/390 274/257/274\nf 532/524/532 274/257/274 531/523/531\nf 343/326/343 243/224/243 241/221/241\nf 343/326/343 241/221/241 240/220/240\nf 188/168/188 238/219/238 244/225/244\nf 188/168/188 244/225/244 189/169/189\nf 187/167/187 332/315/332 236/217/236\nf 187/167/187 236/217/236 188/168/188\nf 447/440/447 451/441/451 508/499/508\nf 447/440/447 508/499/508 448/437/448\nf 162/142/162 388/374/388 297/279/297\nf 162/142/162 297/279/297 163/143/163\nf 392/378/392 402/391/402 405/390/405\nf 392/378/392 405/390/405 522/514/522\nf 533/525/533 413/405/413 415/404/415\nf 533/525/533 415/404/415 470/461/470\nf 534/526/534 65/46/65 68/45/68\nf 534/526/534 68/45/68 489/479/489\nf 502/493/502 535/527/535 484/478/484\nf 502/493/502 484/478/484 487/477/487\nf 503/494/503 536/528/536 537/529/537\nf 503/494/503 537/529/537 504/495/504\nf 492/483/492 538/530/538 535/527/535\nf 492/483/492 535/527/535 502/493/502\nf 492/483/492 325/307/325 66/43/66\nf 492/483/492 66/43/66 65/46/65\nf 504/495/504 537/529/537 539/531/539\nf 504/495/504 539/531/539 505/496/505\nf 239/223/239 424/414/424 345/330/345\nf 239/223/239 345/330/345 240/220/240\nf 59/36/59 58/35/58 382/367/382\nf 59/36/59 382/367/382 381/366/381\nf 432/423/432 433/422/433 434/424/434\nf 432/423/432 434/424/434 331/313/331\nf 437/426/437 436/425/436 440/429/440\nf 437/426/437 440/429/440 177/158/177\nf 381/366/381 437/426/437 177/158/177\nf 381/366/381 177/158/177 59/36/59\nf 449/438/449 441/431/441 494/485/494\nf 449/438/449 494/485/494 506/497/506\nf 450/439/450 501/492/501 434/424/434\nf 450/439/450 434/424/434 420/413/420\nf 382/367/382 503/494/503 504/495/504\nf 382/367/382 504/495/504 383/368/383\nf 501/492/501 506/497/506 445/434/445\nf 501/492/501 445/434/445 328/314/328\nf 536/528/536 503/494/503 486/476/486\nf 536/528/536 486/476/486 485/475/485\nf 313/297/313 150/130/150 319/301/319\nf 313/297/313 319/301/319 318/302/318\nf 327/309/327 284/267/284 281/263/281\nf 327/309/327 281/263/281 145/129/145\nf 483/474/483 93/71/93 192/172/192\nf 483/474/483 192/172/192 353/338/353\nf 483/474/483 282/265/282 94/72/94\nf 483/474/483 94/72/94 93/71/93\nf 422/411/422 425/415/425 428/418/428\nf 422/411/422 428/418/428 427/416/427\nf 421/410/421 433/422/433 345/330/345\nf 421/410/421 345/330/345 424/414/424\nf 463/454/463 314/296/314 313/297/313\nf 463/454/463 313/297/313 527/519/527\nf 315/298/315 516/507/516 369/353/369\nf 315/298/315 369/353/369 368/352/368\nf 314/296/314 481/472/481 312/295/312\nf 314/296/314 312/295/312 151/131/151\nf 368/352/368 317/300/317 312/295/312\nf 368/352/368 312/295/312 481/472/481\nf 369/353/369 530/522/530 159/139/159\nf 369/353/369 159/139/159 158/138/158\nf 480/471/480 249/229/249 159/139/159\nf 480/471/480 159/139/159 530/522/530\nf 262/245/262 406/396/406 408/398/408\nf 262/245/262 408/398/408 529/521/529\nf 398/383/398 216/196/216 220/200/220\nf 398/383/398 220/200/220 364/348/364\nf 541/532/541 542/533/542 543/534/543\nf 541/532/541 543/534/543 540/535/540\nf 545/536/545 543/534/543 542/533/542\nf 545/536/545 542/533/542 544/537/544\nf 547/538/547 545/536/545 544/537/544\nf 547/538/547 544/537/544 546/539/546\nf 549/540/549 547/538/547 546/539/546\nf 549/540/549 546/539/546 548/541/548\nf 551/542/551 549/540/549 548/541/548\nf 551/542/551 548/541/548 550/543/550\nf 553/544/553 551/542/551 550/543/550\nf 553/544/553 550/543/550 552/545/552\nf 555/546/555 553/544/553 552/545/552\nf 555/546/555 552/545/552 554/547/554\nf 557/548/557 558/549/558 559/550/559\nf 557/548/557 559/550/559 556/551/556\nf 561/552/561 557/548/557 556/551/556\nf 561/552/561 556/551/556 560/553/560\nf 563/554/563 546/539/546 544/537/544\nf 563/554/563 544/537/544 562/555/562\nf 564/556/564 548/541/548 546/539/546\nf 564/556/564 546/539/546 563/554/563\nf 565/557/565 550/543/550 548/541/548\nf 565/557/565 548/541/548 564/556/564\nf 566/558/566 552/545/552 550/543/550\nf 566/558/566 550/543/550 565/557/565\nf 552/545/552 566/558/566 567/559/567\nf 552/545/552 567/559/567 554/547/554\nf 559/550/559 568/560/568 569/561/569\nf 559/550/559 569/561/569 556/551/556\nf 570/562/570 560/553/560 556/551/556\nf 570/562/570 556/551/556 569/561/569\nf 571/563/571 572/564/572 560/553/560\nf 571/563/571 560/553/560 570/562/570\nf 574/565/574 540/535/540 575/566/575\nf 574/565/574 575/566/575 573/567/573\nf 577/568/577 543/534/543 545/536/545\nf 577/568/577 545/536/545 576/569/576\nf 545/536/545 547/538/547 578/570/578\nf 545/536/545 578/570/578 576/569/576\nf 579/571/579 578/570/578 547/538/547\nf 579/571/579 547/538/547 549/540/549\nf 580/572/580 579/571/579 551/542/551\nf 580/572/580 551/542/551 553/544/553\nf 580/572/580 553/544/553 555/546/555\nf 580/572/580 555/546/555 581/573/581\nf 558/549/558 557/548/557 583/574/583\nf 558/549/558 583/574/583 582/575/582\nf 561/552/561 584/576/584 583/574/583\nf 561/552/561 583/574/583 557/548/557\nf 561/552/561 572/564/572 585/577/585\nf 561/552/561 585/577/585 584/576/584\nf 571/563/571 586/578/586 585/577/585\nf 571/563/571 585/577/585 572/564/572\nf 544/537/544 542/533/542 541/532/541\nf 544/537/544 541/532/541 562/555/562\nf 574/565/574 588/579/588 589/580/589\nf 574/565/574 589/580/589 587/581/587\nf 574/565/574 573/567/573 590/582/590\nf 574/565/574 590/582/590 588/579/588\nf 590/582/590 573/567/573 575/566/575\nf 590/582/590 575/566/575 591/583/591\nf 575/566/575 540/535/540 543/534/543\nf 575/566/575 543/534/543 591/583/591\nf 564/556/564 592/584/592 566/558/566\nf 564/556/564 566/558/566 565/557/565\nf 592/584/592 593/585/593 567/559/567\nf 592/584/592 567/559/567 566/558/566\nf 568/560/568 559/550/559 554/547/554\nf 568/560/568 554/547/554 567/559/567\nf 554/547/554 559/550/559 558/549/558\nf 554/547/554 558/549/558 555/546/555\nf 582/575/582 581/573/581 555/546/555\nf 582/575/582 555/546/555 558/549/558\nf 592/584/592 564/556/564 563/554/563\nf 592/584/592 563/554/563 562/555/562\nf 589/580/589 568/560/568 567/559/567\nf 589/580/589 567/559/567 593/585/593\nf 540/535/540 574/565/574 587/581/587\nf 540/535/540 587/581/587 541/532/541\nf 571/563/571 570/562/570 590/582/590\nf 571/563/571 590/582/590 591/583/591\nf 589/580/589 588/579/588 569/561/569\nf 589/580/589 569/561/569 568/560/568\nf 543/534/543 577/568/577 594/586/594\nf 543/534/543 594/586/594 591/583/591\nf 594/586/594 586/578/586 571/563/571\nf 594/586/594 571/563/571 591/583/591\nf 596/587/596 581/573/581 582/575/582\nf 596/587/596 582/575/582 595/588/595\nf 596/587/596 597/589/597 580/572/580\nf 596/587/596 580/572/580 581/573/581\nf 583/574/583 490/482/490 455/444/455\nf 583/574/583 455/444/455 595/588/595\nf 583/574/583 584/576/584 493/484/493\nf 583/574/583 493/484/493 490/482/490\nf 597/589/597 508/499/508 579/571/579\nf 597/589/597 579/571/579 580/572/580\nf 442/432/442 448/437/448 508/499/508\nf 442/432/442 508/499/508 597/589/597\nf 60/37/60 178/159/178 595/588/595\nf 60/37/60 595/588/595 455/444/455\nf 178/159/178 439/430/439 596/587/596\nf 178/159/178 596/587/596 595/588/595\nf 577/568/577 64/41/64 185/166/185\nf 577/568/577 185/166/185 594/586/594\nf 586/578/586 184/165/184 376/362/376\nf 586/578/586 376/362/376 585/577/585\nf 590/582/590 570/562/570 569/561/569\nf 590/582/590 569/561/569 588/579/588\nf 61/42/61 576/569/576 578/570/578\nf 61/42/61 578/570/578 507/498/507\nf 585/577/585 376/362/376 493/484/493\nf 585/577/585 493/484/493 584/576/584\nf 453/443/453 598/590/598 73/52/73\nf 453/443/453 73/52/73 430/419/430\nf 519/510/519 197/179/197 247/228/247\nf 519/510/519 247/228/247 246/227/246\nf 281/263/281 280/262/280 146/126/146\nf 281/263/281 146/126/146 145/129/145\nf 64/41/64 63/40/63 121/102/121\nf 64/41/64 121/102/121 185/166/185\nf 284/267/284 327/309/327 528/520/528\nf 284/267/284 528/520/528 292/275/292\nf 290/273/290 122/99/122 121/102/121\nf 290/273/290 121/102/121 63/40/63\nf 280/262/280 289/271/289 320/303/320\nf 280/262/280 320/303/320 146/126/146\nf 184/165/184 586/578/586 594/586/594\nf 184/165/184 594/586/594 185/166/185\nf 253/233/253 378/363/378 117/98/117\nf 253/233/253 117/98/117 120/97/120\nf 249/229/249 140/121/140 160/140/160\nf 249/229/249 160/140/160 159/139/159\nf 129/110/129 160/140/160 140/121/140\nf 129/110/129 140/121/140 130/107/130\nf 161/145/161 132/109/132 131/108/131\nf 161/145/161 131/108/131 371/354/371\nf 313/297/313 318/302/318 456/446/456\nf 313/297/313 456/446/456 527/519/527\nf 492/483/492 65/46/65 534/526/534\nf 492/483/492 534/526/534 538/530/538\nf 441/431/441 449/438/449 448/437/448\nf 441/431/441 448/437/448 442/432/442\nf 443/436/443 446/435/446 435/428/435\nf 443/436/443 435/428/435 497/488/497\nf 446/435/446 445/434/445 506/497/506\nf 446/435/446 506/497/506 494/485/494\nf 441/431/441 440/429/440 436/425/436\nf 441/431/441 436/425/436 494/485/494\nf 596/587/596 439/430/439 442/432/442\nf 596/587/596 442/432/442 597/589/597\nf 577/568/577 576/569/576 61/42/61\nf 577/568/577 61/42/61 64/41/64\nf 238/219/238 237/218/237 242/222/242\nf 238/219/238 242/222/242 241/221/241\nf 194/175/194 76/53/76 426/417/426\nf 194/175/194 426/417/426 427/416/427\nf 452/442/452 194/175/194 427/416/427\nf 452/442/452 427/416/427 428/418/428\nf 461/452/461 244/225/244 243/224/243\nf 461/452/461 243/224/243 342/328/342\nf 508/499/508 507/498/507 578/570/578\nf 508/499/508 578/570/578 579/571/579\nf 245/226/245 207/187/207 531/523/531\nf 245/226/245 531/523/531 518/509/518\nf 206/186/206 532/524/532 531/523/531\nf 206/186/206 531/523/531 207/187/207\nf 32/9/32 31/12/31 600/591/600\nf 32/9/32 600/591/600 599/592/599\nf 601/593/601 600/591/600 36/13/36\nf 601/593/601 36/13/36 24/1/24\nf 602/594/602 601/593/601 24/1/24\nf 602/594/602 24/1/24 23/4/23\nf 40/17/40 602/594/602 23/4/23\nf 40/17/40 23/4/23 42/19/42\nf 44/22/44 604/595/604 605/596/605\nf 44/22/44 605/596/605 603/597/603\nf 39/16/39 603/597/603 602/594/602\nf 39/16/39 602/594/602 40/17/40\nf 601/593/601 606/598/606 607/599/607\nf 601/593/601 607/599/607 600/591/600\nf 468/459/468 608/600/608 609/601/609\nf 468/459/468 609/601/609 469/460/469\nf 477/469/477 609/601/609 608/600/608\nf 477/469/477 608/600/608 384/370/384\nf 610/602/610 611/603/611 612/604/612\nf 610/602/610 612/604/612 472/605/472\nf 610/602/610 472/605/472 471/606/471\nf 610/602/610 471/606/471 613/607/613\nf 476/608/476 614/609/614 615/610/615\nf 476/608/476 615/610/615 474/611/474\nf 478/468/478 110/88/110 109/87/109\nf 478/468/478 109/87/109 616/612/616\nf 466/456/466 465/455/465 474/467/474\nf 466/456/466 474/467/474 617/613/617\nf 466/456/466 617/613/617 473/464/473\nf 466/456/466 473/464/473 350/333/350\nf 614/609/614 533/614/533 470/615/470\nf 614/609/614 470/615/470 618/616/618\nf 475/465/475 413/405/413 533/525/533\nf 475/465/475 533/525/533 476/466/476\nf 618/616/618 469/617/469 609/618/609\nf 618/616/618 609/618/609 619/619/619\nf 619/619/619 609/618/609 477/620/477\nf 619/619/619 477/620/477 620/621/620\nf 387/373/387 621/622/621 616/612/616\nf 387/373/387 616/612/616 109/87/109\nf 616/623/616 622/624/622 620/621/620\nf 616/623/616 620/621/620 478/625/478\nf 473/626/473 617/627/617 615/610/615\nf 473/626/473 615/610/615 613/607/613\nf 621/628/621 623/629/623 622/624/622\nf 621/628/621 622/624/622 616/623/616\nf 624/630/624 612/604/612 611/603/611\nf 624/630/624 611/603/611 623/629/623\nf 49/30/49 71/48/71 70/47/70\nf 49/30/49 70/47/70 50/27/50\nf 336/319/336 335/322/335 524/516/524\nf 336/319/336 524/516/524 418/407/418\nf 598/590/598 293/276/293 67/44/67\nf 598/590/598 67/44/67 73/52/73\nf 50/27/50 70/47/70 429/420/429\nf 50/27/50 429/420/429 74/51/74\nf 322/308/322 493/484/493 376/362/376\nf 322/308/322 376/362/376 323/305/323\nf 589/580/589 593/585/593 592/584/592\nf 589/580/589 592/584/592 587/581/587\nf 396/381/396 119/96/119 118/95/118\nf 396/381/396 118/95/118 254/235/254\nf 517/508/517 397/382/397 396/381/396\nf 517/508/517 396/381/396 254/235/254\nf 28/5/28 27/8/27 625/631/625\nf 28/5/28 625/631/625 604/595/604\nf 600/591/600 607/599/607 626/632/626\nf 600/591/600 626/632/626 599/592/599\nf 607/599/607 627/633/627 628/634/628\nf 607/599/607 628/634/628 626/632/626\nf 604/595/604 625/631/625 628/634/628\nf 604/595/604 628/634/628 627/633/627\nf 630/635/630 631/636/631 632/637/632\nf 630/635/630 632/637/632 629/638/629\nf 634/639/634 635/640/635 636/641/636\nf 634/639/634 636/641/636 633/642/633\nf 638/643/638 639/644/639 640/645/640\nf 638/643/638 640/645/640 637/646/637\nf 641/647/641 642/648/642 637/646/637\nf 641/647/641 637/646/637 640/645/640\nf 644/649/644 645/650/645 646/651/646\nf 644/649/644 646/651/646 643/652/643\nf 631/636/631 642/648/642 648/653/648\nf 631/636/631 648/653/648 647/654/647\nf 650/655/650 651/656/651 652/657/652\nf 650/655/650 652/657/652 649/658/649\nf 643/652/643 646/651/646 654/659/654\nf 643/652/643 654/659/654 653/660/653\nf 654/659/654 651/656/651 650/655/650\nf 654/659/654 650/655/650 653/660/653\nf 655/661/655 656/662/656 657/663/657\nf 655/661/655 657/663/657 632/637/632\nf 657/663/657 659/664/659 660/665/660\nf 657/663/657 660/665/660 658/666/658\nf 661/667/661 659/664/659 657/663/657\nf 661/667/661 657/663/657 656/662/656\nf 631/636/631 647/654/647 655/661/655\nf 631/636/631 655/661/655 632/637/632\nf 637/646/637 642/648/642 631/636/631\nf 637/646/637 631/636/631 630/635/630\nf 640/645/640 650/655/650 649/658/649\nf 640/645/640 649/658/649 641/647/641\nf 652/657/652 662/668/662 641/647/641\nf 652/657/652 641/647/641 649/658/649\nf 648/653/648 642/648/642 641/647/641\nf 648/653/648 641/647/641 662/668/662\nf 663/669/663 664/670/664 537/529/537\nf 663/669/663 537/529/537 536/528/536\nf 666/671/666 640/645/640 639/644/639\nf 666/671/666 639/644/639 665/672/665\nf 666/671/666 665/672/665 636/641/636\nf 666/671/666 636/641/636 635/640/635\nf 667/673/667 539/531/539 537/529/537\nf 667/673/667 537/529/537 664/670/664\nf 634/639/634 644/649/644 643/652/643\nf 634/639/634 643/652/643 635/640/635\nf 653/660/653 650/655/650 640/645/640\nf 653/660/653 640/645/640 666/671/666\nf 666/671/666 635/640/635 643/652/643\nf 666/671/666 643/652/643 653/660/653\nf 669/674/669 644/649/644 634/639/634\nf 669/674/669 634/639/634 668/675/668\nf 638/643/638 637/646/637 630/635/630\nf 638/643/638 630/635/630 670/676/670\nf 645/650/645 644/649/644 669/674/669\nf 645/650/645 669/674/669 671/677/671\nf 638/643/638 670/676/670 485/475/485\nf 638/643/638 485/475/485 484/478/484\nf 672/678/672 633/642/633 489/479/489\nf 672/678/672 489/479/489 488/480/488\nf 632/637/632 657/663/657 658/666/658\nf 632/637/632 658/666/658 629/638/629\nf 670/676/670 663/669/663 536/528/536\nf 670/676/670 536/528/536 485/475/485\nf 633/642/633 636/641/636 534/526/534\nf 633/642/633 534/526/534 489/479/489\nf 484/478/484 535/527/535 639/644/639\nf 484/478/484 639/644/639 638/643/638\nf 629/638/629 658/666/658 664/670/664\nf 629/638/629 664/670/664 663/669/663\nf 665/672/665 639/644/639 535/527/535\nf 665/672/665 535/527/535 538/530/538\nf 636/641/636 665/672/665 538/530/538\nf 636/641/636 538/530/538 534/526/534\nf 660/665/660 667/673/667 664/670/664\nf 660/665/660 664/670/664 658/666/658\nf 668/675/668 634/639/634 633/642/633\nf 668/675/668 633/642/633 672/678/672\nf 630/635/630 629/638/629 663/669/663\nf 630/635/630 663/669/663 670/676/670\nf 1/679/1 661/667/661 656/662/656\nf 1/679/1 656/662/656 22/680/22\nf 20/681/20 647/654/647 648/653/648\nf 20/681/20 648/653/648 18/682/18\nf 647/654/647 20/681/20 21/683/21\nf 647/654/647 21/683/21 655/661/655\nf 15/684/15 646/651/646 645/650/645\nf 15/684/15 645/650/645 13/685/13\nf 19/686/19 651/656/651 654/659/654\nf 19/686/19 654/659/654 14/687/14\nf 648/653/648 662/668/662 16/688/16\nf 648/653/648 16/688/16 18/682/18\nf 17/689/17 652/657/652 651/656/651\nf 17/689/17 651/656/651 19/686/19\nf 21/683/21 22/680/22 656/662/656\nf 21/683/21 656/662/656 655/661/655\nf 13/685/13 645/650/645 671/677/671\nf 13/685/13 671/677/671 2/690/2\nf 646/651/646 15/684/15 14/687/14\nf 646/651/646 14/687/14 654/659/654\nf 17/689/17 16/688/16 662/668/662\nf 17/689/17 662/668/662 652/657/652\nf 608/600/608 91/68/91 385/371/385\nf 608/600/608 385/371/385 384/370/384\nf 304/286/304 372/355/372 401/387/401\nf 304/286/304 401/387/401 308/290/308\nf 468/459/468 415/404/415 411/401/411\nf 468/459/468 411/401/411 92/69/92\nf 602/594/602 603/597/603 606/598/606\nf 602/594/602 606/598/606 601/593/601\nf 608/600/608 468/459/468 92/69/92\nf 608/600/608 92/69/92 91/68/91\nf 305/287/305 304/286/304 308/290/308\nf 305/287/305 308/290/308 137/116/137\nf 139/119/139 138/117/138 307/291/307\nf 139/119/139 307/291/307 375/361/375\nf 674/691/674 675/692/675 676/693/676\nf 674/691/674 676/693/676 673/694/673\nf 678/695/678 27/8/27 679/696/679\nf 678/695/678 679/696/679 677/697/677\nf 681/698/681 682/699/682 683/700/683\nf 681/698/681 683/700/683 680/701/680\nf 684/702/684 685/703/685 683/700/683\nf 684/702/684 683/700/683 682/699/682\nf 684/702/684 674/691/674 673/694/673\nf 684/702/684 673/694/673 685/703/685\nf 687/704/687 688/705/688 689/706/689\nf 687/704/687 689/706/689 686/707/686\nf 690/708/690 691/709/691 676/693/676\nf 690/708/690 676/693/676 675/692/675\nf 689/706/689 688/705/688 691/709/691\nf 689/706/689 691/709/691 690/708/690\nf 687/704/687 686/707/686 693/710/693\nf 687/704/687 693/710/693 692/711/692\nf 681/698/681 680/701/680 46/24/46\nf 681/698/681 46/24/46 45/23/45\nf 678/695/678 694/712/694 695/713/695\nf 678/695/678 695/713/695 693/710/693\nf 697/714/697 698/715/698 699/716/699\nf 697/714/697 699/716/699 696/717/696\nf 701/718/701 702/719/702 703/720/703\nf 701/718/701 703/720/703 700/721/700\nf 705/722/705 706/723/706 707/724/707\nf 705/722/705 707/724/707 704/725/704\nf 709/726/709 710/727/710 711/728/711\nf 709/726/709 711/728/711 708/729/708\nf 713/730/713 714/731/714 715/732/715\nf 713/730/713 715/732/715 712/733/712\nf 717/734/717 718/735/718 719/736/719\nf 717/734/717 719/736/719 716/737/716\nf 712/733/712 720/738/720 721/739/721\nf 712/733/712 721/739/721 713/730/713\nf 713/730/713 721/739/721 697/714/697\nf 713/730/713 697/714/697 696/717/696\nf 723/740/723 724/741/724 725/742/725\nf 723/740/723 725/742/725 722/743/722\nf 727/744/727 728/745/728 729/746/729\nf 727/744/727 729/746/729 726/747/726\nf 731/748/731 732/749/732 733/750/733\nf 731/748/731 733/750/733 730/751/730\nf 735/752/735 728/745/728 727/744/727\nf 735/752/735 727/744/727 734/753/734\nf 737/754/737 738/755/738 739/756/739\nf 737/754/737 739/756/739 736/757/736\nf 741/758/741 722/743/722 725/742/725\nf 741/758/741 725/742/725 740/759/740\nf 735/752/735 734/753/734 743/760/743\nf 735/752/735 743/760/743 742/761/742\nf 745/762/745 746/763/746 747/764/747\nf 745/762/745 747/764/747 744/765/744\nf 747/764/747 746/763/746 749/766/749\nf 747/764/747 749/766/749 748/767/748\nf 745/762/745 744/765/744 751/768/751\nf 745/762/745 751/768/751 750/769/750\nf 753/770/753 754/771/754 755/772/755\nf 753/770/753 755/772/755 752/773/752\nf 757/774/757 755/772/755 754/771/754\nf 757/774/757 754/771/754 756/775/756\nf 748/767/748 749/766/749 759/776/759\nf 748/767/748 759/776/759 758/777/758\nf 761/778/761 762/779/762 763/780/763\nf 761/778/761 763/780/763 760/781/760\nf 765/782/765 766/783/766 767/784/767\nf 765/782/765 767/784/767 764/785/764\nf 769/786/769 770/787/770 771/788/771\nf 769/786/769 771/788/771 768/789/768\nf 773/790/773 774/791/774 775/792/775\nf 773/790/773 775/792/775 772/793/772\nf 777/794/777 778/795/778 779/796/779\nf 777/794/777 779/796/779 776/797/776\nf 774/791/774 780/798/780 781/799/781\nf 774/791/774 781/799/781 775/792/775\nf 703/720/703 782/800/782 783/801/783\nf 703/720/703 783/801/783 700/721/700\nf 688/802/688 687/803/687 785/804/785\nf 688/802/688 785/804/785 784/805/784\nf 786/806/786 785/804/785 687/803/687\nf 786/806/786 687/803/687 692/807/692\nf 788/808/788 777/794/777 789/809/789\nf 788/808/788 789/809/789 787/810/787\nf 790/811/790 791/812/791 779/796/779\nf 790/811/790 779/796/779 778/795/778\nf 793/813/793 794/814/794 795/815/795\nf 793/813/793 795/815/795 792/816/792\nf 797/817/797 798/818/798 701/718/701\nf 797/817/797 701/718/701 796/819/796\nf 701/718/701 798/818/798 799/820/799\nf 701/718/701 799/820/799 702/719/702\nf 801/821/801 802/822/802 803/823/803\nf 801/821/801 803/823/803 800/824/800\nf 805/825/805 806/826/806 807/827/807\nf 805/825/805 807/827/807 804/828/804\nf 809/829/809 810/830/810 811/831/811\nf 809/829/809 811/831/811 808/832/808\nf 778/795/778 807/827/807 806/826/806\nf 778/795/778 806/826/806 790/811/790\nf 803/823/803 812/833/812 813/834/813\nf 803/823/803 813/834/813 800/824/800\nf 815/835/815 816/836/816 817/837/817\nf 815/835/815 817/837/817 814/838/814\nf 819/839/819 814/838/814 820/840/820\nf 819/839/819 820/840/820 818/841/818\nf 822/842/822 823/843/823 819/839/819\nf 822/842/822 819/839/819 821/844/821\nf 704/725/704 707/724/707 825/845/825\nf 704/725/704 825/845/825 824/846/824\nf 827/847/827 828/848/828 698/715/698\nf 827/847/827 698/715/698 826/849/826\nf 772/793/772 775/792/775 829/850/829\nf 772/793/772 829/850/829 699/716/699\nf 781/799/781 771/788/771 831/851/831\nf 781/799/781 831/851/831 830/852/830\nf 832/853/832 831/851/831 771/788/771\nf 832/853/832 771/788/771 770/787/770\nf 834/854/834 835/855/835 836/856/836\nf 834/854/834 836/856/836 833/857/833\nf 838/858/838 839/859/839 840/860/840\nf 838/858/838 840/860/840 837/861/837\nf 723/740/723 722/743/722 840/860/840\nf 723/740/723 840/860/840 841/862/841\nf 747/764/747 842/863/842 843/864/843\nf 747/764/747 843/864/843 744/765/744\nf 821/844/821 844/865/844 845/866/845\nf 821/844/821 845/866/845 822/842/822\nf 847/867/847 818/841/818 820/840/820\nf 847/867/847 820/840/820 846/868/846\nf 843/864/843 849/869/849 850/870/850\nf 843/864/843 850/870/850 848/871/848\nf 205/185/205 851/872/851 852/873/852\nf 205/185/205 852/873/852 206/186/206\nf 208/189/208 849/869/849 851/872/851\nf 208/189/208 851/872/851 205/185/205\nf 853/874/853 854/875/854 749/766/749\nf 853/874/853 749/766/749 746/763/746\nf 728/745/728 735/752/735 854/875/854\nf 728/745/728 854/875/854 853/874/853\nf 856/876/856 857/877/857 858/878/858\nf 856/876/856 858/878/858 855/879/855\nf 860/880/860 861/881/861 862/882/862\nf 860/880/860 862/882/862 859/883/859\nf 863/884/863 864/885/864 861/881/861\nf 863/884/863 861/881/861 860/880/860\nf 866/886/866 867/887/867 862/882/862\nf 866/886/866 862/882/862 865/888/865\nf 869/889/869 870/890/870 871/891/871\nf 869/889/869 871/891/871 868/892/868\nf 866/886/866 228/210/228 229/209/229\nf 866/886/866 229/209/229 867/887/867\nf 873/893/873 864/885/864 863/884/863\nf 873/893/873 863/884/863 872/894/872\nf 871/891/871 873/893/873 872/894/872\nf 871/891/871 872/894/872 868/892/868\nf 875/895/875 876/896/876 877/897/877\nf 875/895/875 877/897/877 874/898/874\nf 835/855/835 834/854/834 848/871/848\nf 835/855/835 848/871/848 850/870/850\nf 879/899/879 833/857/833 880/900/880\nf 879/899/879 880/900/880 878/901/878\nf 882/902/882 883/903/883 884/904/884\nf 882/902/882 884/904/884 881/905/881\nf 881/905/881 880/900/880 886/906/886\nf 881/905/881 886/906/886 885/907/885\nf 887/908/887 842/863/842 747/764/747\nf 887/908/887 747/764/747 748/767/748\nf 842/863/842 887/908/887 852/873/852\nf 842/863/842 852/873/852 851/872/851\nf 758/777/758 760/781/760 889/909/889\nf 758/777/758 889/909/889 888/910/888\nf 787/810/787 890/911/890 891/912/891\nf 787/810/787 891/912/891 788/808/788\nf 893/913/893 894/914/894 895/915/895\nf 893/913/893 895/915/895 892/916/892\nf 896/917/896 859/883/859 897/918/897\nf 896/917/896 897/918/897 765/782/765\nf 899/919/899 900/920/900 901/921/901\nf 899/919/899 901/921/901 898/922/898\nf 900/920/900 902/923/902 903/924/903\nf 900/920/900 903/924/903 901/921/901\nf 902/923/902 677/925/677 679/926/679\nf 902/923/902 679/926/679 903/924/903\nf 862/882/862 867/887/867 904/927/904\nf 862/882/862 904/927/904 859/883/859\nf 901/921/901 263/247/263 264/246/264\nf 901/921/901 264/246/264 898/922/898\nf 266/248/266 265/249/265 903/924/903\nf 266/248/266 903/924/903 679/926/679\nf 895/915/895 905/928/905 906/929/906\nf 895/915/895 906/929/906 892/916/892\nf 907/930/907 908/931/908 909/932/909\nf 907/930/907 909/932/909 846/868/846\nf 847/867/847 846/868/846 909/932/909\nf 847/867/847 909/932/909 910/933/910\nf 847/867/847 910/933/910 912/934/912\nf 847/867/847 912/934/912 911/935/911\nf 276/258/276 275/259/275 906/929/906\nf 276/258/276 906/929/906 905/928/905\nf 275/259/275 277/260/277 908/931/908\nf 275/259/275 908/931/908 906/929/906\nf 741/758/741 837/861/837 840/860/840\nf 741/758/741 840/860/840 722/743/722\nf 914/936/914 915/937/915 916/938/916\nf 914/936/914 916/938/916 913/939/913\nf 915/937/915 914/936/914 743/760/743\nf 915/937/915 743/760/743 734/753/734\nf 918/940/918 740/759/740 709/726/709\nf 918/940/918 709/726/709 917/941/917\nf 916/938/916 915/937/915 920/942/920\nf 916/938/916 920/942/920 919/943/919\nf 922/944/922 923/945/923 924/946/924\nf 922/944/922 924/946/924 921/947/921\nf 708/729/708 925/948/925 917/941/917\nf 708/729/708 917/941/917 709/726/709\nf 917/941/917 925/948/925 927/949/927\nf 917/941/917 927/949/927 926/950/926\nf 293/276/293 712/733/712 715/732/715\nf 293/276/293 715/732/715 294/277/294\nf 929/951/929 930/952/930 931/953/931\nf 929/951/929 931/953/931 928/954/928\nf 933/955/933 934/956/934 935/957/935\nf 933/955/933 935/957/935 932/958/932\nf 937/959/937 938/960/938 939/961/939\nf 937/959/937 939/961/939 936/962/936\nf 785/804/785 940/963/940 941/964/941\nf 785/804/785 941/964/941 784/805/784\nf 812/833/812 943/965/943 944/966/944\nf 812/833/812 944/966/944 942/967/942\nf 945/968/945 796/819/796 701/718/701\nf 945/968/945 701/718/701 700/721/700\nf 946/969/946 947/970/947 797/817/797\nf 946/969/946 797/817/797 796/819/796\nf 949/971/949 873/893/873 871/891/871\nf 949/971/949 871/891/871 948/972/948\nf 783/801/783 806/826/806 805/825/805\nf 783/801/783 805/825/805 950/973/950\nf 951/974/951 952/975/952 792/816/792\nf 951/974/951 792/816/792 795/815/795\nf 954/976/954 793/813/793 792/816/792\nf 954/976/954 792/816/792 953/977/953\nf 956/978/956 957/979/957 958/980/958\nf 956/978/956 958/980/958 955/981/955\nf 727/744/727 920/942/920 915/937/915\nf 727/744/727 915/937/915 734/753/734\nf 959/982/959 960/983/960 795/815/795\nf 959/982/959 795/815/795 794/814/794\nf 914/936/914 913/939/913 924/946/924\nf 914/936/914 924/946/924 923/945/923\nf 329/984/329 961/985/961 962/986/962\nf 329/984/329 962/986/962 330/987/330\nf 834/854/834 963/988/963 751/768/751\nf 834/854/834 751/768/751 848/871/848\nf 879/899/879 839/859/839 838/858/838\nf 879/899/879 838/858/838 963/988/963\nf 812/833/812 942/967/942 964/989/964\nf 812/833/812 964/989/964 813/834/813\nf 786/806/786 692/807/692 695/990/695\nf 786/806/786 695/990/695 965/991/965\nf 967/992/967 968/993/968 969/994/969\nf 967/992/967 969/994/969 966/995/966\nf 696/717/696 699/716/699 829/850/829\nf 696/717/696 829/850/829 955/981/955\nf 970/996/970 703/720/703 702/719/702\nf 970/996/970 702/719/702 773/790/773\nf 972/997/972 799/820/799 798/818/798\nf 972/997/972 798/818/798 971/998/971\nf 885/907/885 342/999/342 344/1000/344\nf 885/907/885 344/1000/344 973/1001/973\nf 974/1002/974 975/1003/975 882/902/882\nf 974/1002/974 882/902/882 973/1001/973\nf 977/1004/977 978/1005/978 979/1006/979\nf 977/1004/977 979/1006/979 976/1007/976\nf 981/1008/981 856/876/856 855/879/855\nf 981/1008/981 855/879/855 980/1009/980\nf 775/792/775 781/799/781 830/852/830\nf 775/792/775 830/852/830 829/850/829\nf 750/769/750 982/1010/982 983/1011/983\nf 750/769/750 983/1011/983 745/762/745\nf 761/778/761 984/1012/984 985/1013/985\nf 761/778/761 985/1013/985 762/779/762\nf 986/1014/986 987/1015/987 845/866/845\nf 986/1014/986 845/866/845 844/865/844\nf 752/773/752 755/772/755 989/1016/989\nf 752/773/752 989/1016/989 988/1017/988\nf 977/1004/977 976/1007/976 991/1018/991\nf 977/1004/977 991/1018/991 990/1019/990\nf 978/1005/978 977/1004/977 874/898/874\nf 978/1005/978 874/898/874 992/1020/992\nf 863/884/863 993/1021/993 816/836/816\nf 863/884/863 816/836/816 872/894/872\nf 802/822/802 995/1022/995 933/955/933\nf 802/822/802 933/955/933 994/1023/994\nf 930/952/930 929/951/929 716/737/716\nf 930/952/930 716/737/716 719/736/719\nf 828/848/828 827/847/827 996/1024/996\nf 828/848/828 996/1024/996 970/996/970\nf 998/1025/998 950/973/950 805/825/805\nf 998/1025/998 805/825/805 997/1026/997\nf 950/973/950 945/968/945 700/721/700\nf 950/973/950 700/721/700 783/801/783\nf 1000/1027/1000 1001/1028/1001 1002/1029/1002\nf 1000/1027/1000 1002/1029/1002 999/1030/999\nf 691/1031/691 936/962/936 939/961/939\nf 691/1031/691 939/961/939 676/1032/676\nf 936/962/936 691/1031/691 688/802/688\nf 936/962/936 688/802/688 784/805/784\nf 890/911/890 787/810/787 1004/1033/1004\nf 890/911/890 1004/1033/1004 1003/1034/1003\nf 713/730/713 696/717/696 955/981/955\nf 713/730/713 955/981/955 958/980/958\nf 830/852/830 831/851/831 1005/1035/1005\nf 830/852/830 1005/1035/1005 956/978/956\nf 1006/1036/1006 1007/1037/1007 905/928/905\nf 1006/1036/1006 905/928/905 895/915/895\nf 908/931/908 277/260/277 379/365/379\nf 908/931/908 379/365/379 909/932/909\nf 1009/1038/1009 1010/1039/1010 1011/1040/1011\nf 1009/1038/1009 1011/1040/1011 1008/1041/1008\nf 1013/1042/1013 756/775/756 754/771/754\nf 1013/1042/1013 754/771/754 1012/1043/1012\nf 754/771/754 753/770/753 1014/1044/1014\nf 754/771/754 1014/1044/1014 1012/1043/1012\nf 989/1016/989 755/772/755 757/774/757\nf 989/1016/989 757/774/757 1015/1045/1015\nf 826/849/826 808/832/808 811/831/811\nf 826/849/826 811/831/811 827/847/827\nf 995/1022/995 802/822/802 801/821/801\nf 995/1022/995 801/821/801 1016/1046/1016\nf 815/835/815 868/892/868 872/894/872\nf 815/835/815 872/894/872 816/836/816\nf 726/747/726 918/940/918 917/941/917\nf 726/747/726 917/941/917 926/950/926\nf 910/933/910 909/932/909 379/365/379\nf 910/933/910 379/365/379 389/375/389\nf 912/934/912 910/933/910 389/375/389\nf 912/934/912 389/375/389 390/376/390\nf 786/806/786 965/991/965 1003/1034/1003\nf 786/806/786 1003/1034/1003 1004/1033/1004\nf 1017/1047/1017 803/823/803 802/822/802\nf 1017/1047/1017 802/822/802 994/1023/994\nf 1019/1048/1019 1017/1047/1017 994/1023/994\nf 1019/1048/1019 994/1023/994 1018/1049/1018\nf 820/840/820 1020/1050/1020 907/930/907\nf 820/840/820 907/930/907 846/868/846\nf 932/958/932 1018/1049/1018 994/1023/994\nf 932/958/932 994/1023/994 933/955/933\nf 1022/1051/1022 1023/1052/1023 1024/1053/1024\nf 1022/1051/1022 1024/1053/1024 1021/1054/1021\nf 1025/1055/1025 817/837/817 816/836/816\nf 1025/1055/1025 816/836/816 993/1021/993\nf 1020/1050/1020 817/837/817 1025/1055/1025\nf 1020/1050/1020 1025/1055/1025 893/913/893\nf 907/930/907 1020/1050/1020 893/913/893\nf 907/930/907 893/913/893 892/916/892\nf 749/766/749 854/875/854 1026/1056/1026\nf 749/766/749 1026/1056/1026 759/776/759\nf 776/797/776 1000/1027/1000 999/1030/999\nf 776/797/776 999/1030/999 1027/1057/1027\nf 1017/1047/1017 943/965/943 812/833/812\nf 1017/1047/1017 812/833/812 803/823/803\nf 1028/1058/1028 1029/1059/1029 405/390/405\nf 1028/1058/1028 405/390/405 404/389/404\nf 1029/1059/1029 943/965/943 1017/1047/1017\nf 1029/1059/1029 1017/1047/1017 1019/1048/1019\nf 685/1060/685 673/1061/673 964/989/964\nf 685/1060/685 964/989/964 942/967/942\nf 685/1060/685 942/967/942 944/966/944\nf 685/1060/685 944/966/944 683/1062/683\nf 683/1062/683 944/966/944 1028/1058/1028\nf 683/1062/683 1028/1058/1028 680/1063/680\nf 1030/1064/1030 897/918/897 859/883/859\nf 1030/1064/1030 859/883/859 904/927/904\nf 1007/1037/1007 1030/1064/1030 408/398/408\nf 1007/1037/1007 408/398/408 407/397/407\nf 766/783/766 765/782/765 897/918/897\nf 766/783/766 897/918/897 1006/1036/1006\nf 907/930/907 892/916/892 906/929/906\nf 907/930/907 906/929/906 908/931/908\nf 937/959/937 999/1030/999 1002/1029/1002\nf 937/959/937 1002/1029/1002 938/960/938\nf 991/1018/991 976/1007/976 1032/1065/1032\nf 991/1018/991 1032/1065/1032 1031/1066/1031\nf 1034/1067/1034 739/756/739 738/755/738\nf 1034/1067/1034 738/755/738 1033/1068/1033\nf 1035/1069/1035 1036/1070/1036 1037/1071/1037\nf 1035/1069/1035 1037/1071/1037 1034/1067/1034\nf 1038/1072/1038 416/408/416 418/407/418\nf 1038/1072/1038 418/407/418 967/992/967\nf 966/995/966 719/736/719 718/735/718\nf 966/995/966 718/735/718 1039/1073/1039\nf 1041/1074/1041 1042/1075/1042 1043/1076/1043\nf 1041/1074/1041 1043/1076/1043 1040/1077/1040\nf 1041/1074/1041 1040/1077/1040 1045/1078/1045\nf 1041/1074/1041 1045/1078/1045 1044/1079/1044\nf 1043/1076/1043 1046/1080/1046 1047/1081/1047\nf 1043/1076/1043 1047/1081/1047 1040/1077/1040\nf 883/903/883 1045/1078/1045 1048/1082/1048\nf 883/903/883 1048/1082/1048 884/904/884\nf 1049/1083/1049 1050/1084/1050 721/739/721\nf 1049/1083/1049 721/739/721 720/738/720\nf 717/734/717 1050/1084/1050 1039/1073/1039\nf 717/734/717 1039/1073/1039 718/735/718\nf 889/909/889 760/781/760 763/780/763\nf 889/909/889 763/780/763 1051/1085/1051\nf 974/1002/974 1052/1086/1052 1053/1087/1053\nf 974/1002/974 1053/1087/1053 975/1003/975\nf 1053/1087/1053 1054/1088/1054 1042/1075/1042\nf 1053/1087/1053 1042/1075/1042 1041/1074/1041\nf 1056/1089/1056 1057/1090/1057 1058/1091/1058\nf 1056/1089/1056 1058/1091/1058 1055/1092/1055\nf 1055/1092/1055 1058/1091/1058 1010/1039/1010\nf 1055/1092/1055 1010/1039/1010 1009/1038/1009\nf 825/845/825 1059/1093/1059 1060/1094/1060\nf 825/845/825 1060/1094/1060 824/846/824\nf 1060/1094/1060 1059/1093/1059 1062/1095/1062\nf 1060/1094/1060 1062/1095/1062 1061/1096/1061\nf 444/1097/444 443/1098/443 1064/1099/1064\nf 444/1097/444 1064/1099/1064 1063/1100/1063\nf 955/981/955 829/850/829 830/852/830\nf 955/981/955 830/852/830 956/978/956\nf 855/879/855 845/866/845 987/1015/987\nf 855/879/855 987/1015/987 980/1009/980\nf 858/878/858 869/889/869 823/843/823\nf 858/878/858 823/843/823 822/842/822\nf 1066/1101/1066 1067/1102/1067 1068/1103/1068\nf 1066/1101/1066 1068/1103/1068 1065/1104/1065\nf 1043/1076/1043 1067/1102/1067 1069/1105/1069\nf 1043/1076/1043 1069/1105/1069 1046/1080/1046\nf 724/741/724 723/740/723 1046/1080/1046\nf 724/741/724 1046/1080/1046 1069/1105/1069\nf 725/742/725 710/727/710 709/726/709\nf 725/742/725 709/726/709 740/759/740\nf 923/945/923 922/944/922 730/751/730\nf 923/945/923 730/751/730 733/750/733\nf 742/761/742 1026/1056/1026 854/875/854\nf 742/761/742 854/875/854 735/752/735\nf 878/901/878 884/904/884 1048/1082/1048\nf 878/901/878 1048/1082/1048 1070/1106/1070\nf 839/859/839 1070/1106/1070 841/862/841\nf 839/859/839 841/862/841 840/860/840\nf 878/901/878 1070/1106/1070 839/859/839\nf 878/901/878 839/859/839 879/899/879\nf 728/745/728 853/874/853 983/1011/983\nf 728/745/728 983/1011/983 729/746/729\nf 923/945/923 733/750/733 743/760/743\nf 923/945/923 743/760/743 914/936/914\nf 1049/1083/1049 453/443/453 416/408/416\nf 1049/1083/1049 416/408/416 1038/1072/1038\nf 969/994/969 934/956/934 931/953/931\nf 969/994/969 931/953/931 930/952/930\nf 706/723/706 1071/1107/1071 1072/1108/1072\nf 706/723/706 1072/1108/1072 707/724/707\nf 856/876/856 981/1008/981 1074/1109/1074\nf 856/876/856 1074/1109/1074 1073/1110/1073\nf 732/749/732 731/748/731 985/1013/985\nf 732/749/732 985/1013/985 984/1012/984\nf 789/809/789 940/963/940 1004/1033/1004\nf 789/809/789 1004/1033/1004 787/810/787\nf 1027/1057/1027 941/964/941 940/963/940\nf 1027/1057/1027 940/963/940 789/809/789\nf 1075/1111/1075 1076/1112/1076 900/920/900\nf 1075/1111/1075 900/920/900 899/919/899\nf 228/210/228 866/886/866 898/922/898\nf 228/210/228 898/922/898 264/246/264\nf 900/920/900 1076/1112/1076 1077/1113/1077\nf 900/920/900 1077/1113/1077 902/923/902\nf 1077/1113/1077 694/1114/694 677/925/677\nf 1077/1113/1077 677/925/677 902/923/902\nf 263/247/263 901/921/901 903/924/903\nf 263/247/263 903/924/903 265/249/265\nf 461/1115/461 886/906/886 836/856/836\nf 461/1115/461 836/856/836 462/1116/462\nf 871/891/871 870/890/870 1078/1117/1078\nf 871/891/871 1078/1117/1078 948/972/948\nf 1080/1118/1080 1081/1119/1081 1032/1065/1032\nf 1080/1118/1080 1032/1065/1032 1079/1120/1079\nf 737/754/737 736/757/736 1012/1043/1012\nf 737/754/737 1012/1043/1012 1014/1044/1014\nf 875/895/875 874/898/874 977/1004/977\nf 875/895/875 977/1004/977 990/1019/990\nf 877/897/877 1082/1121/1082 992/1020/992\nf 877/897/877 992/1020/992 874/898/874\nf 969/994/969 930/952/930 719/736/719\nf 969/994/969 719/736/719 966/995/966\nf 969/994/969 968/993/968 935/957/935\nf 969/994/969 935/957/935 934/956/934\nf 1084/1122/1084 1037/1071/1037 1085/1123/1085\nf 1084/1122/1084 1085/1123/1085 1083/1124/1083\nf 978/1005/978 992/1020/992 1087/1125/1087\nf 978/1005/978 1087/1125/1087 1086/1126/1086\nf 1086/1126/1086 1088/1127/1088 979/1006/979\nf 1086/1126/1086 979/1006/979 978/1005/978\nf 1080/1118/1080 1090/1128/1090 1091/1129/1091\nf 1080/1118/1080 1091/1129/1091 1089/1130/1089\nf 1013/1042/1013 1092/1131/1092 1093/1132/1093\nf 1013/1042/1013 1093/1132/1093 756/775/756\nf 1035/1069/1035 1034/1067/1034 1033/1068/1033\nf 1035/1069/1035 1033/1068/1033 1094/1133/1094\nf 921/947/921 1094/1133/1094 1033/1068/1033\nf 921/947/921 1033/1068/1033 922/944/922\nf 730/751/730 738/755/738 737/754/737\nf 730/751/730 737/754/737 731/748/731\nf 1014/1044/1014 753/770/753 762/779/762\nf 1014/1044/1014 762/779/762 985/1013/985\nf 876/896/876 875/895/875 987/1015/987\nf 876/896/876 987/1015/987 986/1014/986\nf 928/954/928 808/832/808 826/849/826\nf 928/954/928 826/849/826 929/951/929\nf 1039/1073/1039 1038/1072/1038 967/992/967\nf 1039/1073/1039 967/992/967 966/995/966\nf 698/715/698 828/848/828 772/793/772\nf 698/715/698 772/793/772 699/716/699\nf 676/1032/676 939/961/939 964/989/964\nf 676/1032/676 964/989/964 673/1061/673\nf 1000/1027/1000 810/830/810 809/829/809\nf 1000/1027/1000 809/829/809 1001/1028/1001\nf 898/922/898 866/886/866 865/888/865\nf 898/922/898 865/888/865 899/919/899\nf 899/919/899 865/888/865 1095/1134/1095\nf 899/919/899 1095/1134/1095 1075/1111/1075\nf 857/877/857 870/890/870 869/889/869\nf 857/877/857 869/889/869 858/878/858\nf 948/972/948 1078/1117/1078 946/969/946\nf 948/972/948 946/969/946 1096/1135/1096\nf 819/839/819 823/843/823 815/835/815\nf 819/839/819 815/835/815 814/838/814\nf 911/935/911 1097/1136/1097 818/841/818\nf 911/935/911 818/841/818 847/867/847\nf 815/835/815 823/843/823 869/889/869\nf 815/835/815 869/889/869 868/892/868\nf 887/908/887 748/767/748 758/777/758\nf 887/908/887 758/777/758 888/910/888\nf 761/778/761 760/781/760 758/777/758\nf 761/778/761 758/777/758 759/776/759\nf 853/874/853 746/763/746 745/762/745\nf 853/874/853 745/762/745 983/1011/983\nf 1051/1085/1051 988/1017/988 876/896/876\nf 1051/1085/1051 876/896/876 986/1014/986\nf 877/897/877 876/896/876 988/1017/988\nf 877/897/877 988/1017/988 989/1016/989\nf 989/1016/989 1015/1045/1015 1082/1121/1082\nf 989/1016/989 1082/1121/1082 877/897/877\nf 726/747/726 729/746/729 1098/1137/1098\nf 726/747/726 1098/1137/1098 918/940/918\nf 1100/1138/1100 1101/1139/1101 1102/1140/1102\nf 1100/1138/1100 1102/1140/1102 1099/1141/1099\nf 1103/1142/1103 488/480/488 294/277/294\nf 1103/1142/1103 294/277/294 715/732/715\nf 1104/1143/1104 1105/1144/1105 1072/1108/1072\nf 1104/1143/1104 1072/1108/1072 1071/1107/1071\nf 801/821/801 800/824/800 1002/1029/1002\nf 801/821/801 1002/1029/1002 1001/1028/1001\nf 1104/1143/1104 1106/1145/1106 958/980/958\nf 1104/1143/1104 958/980/958 957/979/957\nf 1104/1143/1104 957/979/957 1107/1146/1107\nf 1104/1143/1104 1107/1146/1107 1105/1144/1105\nf 1056/1089/1056 1108/1147/1108 1064/1099/1064\nf 1056/1089/1056 1064/1099/1064 1057/1090/1057\nf 495/1148/495 1010/1039/1010 1058/1091/1058\nf 495/1148/495 1058/1091/1058 496/1149/496\nf 496/1149/496 1058/1091/1058 1057/1090/1057\nf 496/1149/496 1057/1090/1057 497/1150/497\nf 962/986/962 1052/1086/1052 498/1151/498\nf 962/986/962 498/1151/498 330/987/330\nf 499/1152/499 498/1151/498 1052/1086/1052\nf 499/1152/499 1052/1086/1052 974/1002/974\nf 1010/1039/1010 495/1148/495 500/1153/500\nf 1010/1039/1010 500/1153/500 1011/1040/1011\nf 1109/1154/1109 1054/1088/1054 962/986/962\nf 1109/1154/1109 962/986/962 961/985/961\nf 499/1152/499 974/1002/974 973/1001/973\nf 499/1152/499 973/1001/973 344/1000/344\nf 1106/1145/1106 1104/1143/1104 1071/1107/1071\nf 1106/1145/1106 1071/1107/1071 1110/1155/1110\nf 1071/1107/1071 706/723/706 1102/1140/1102\nf 1071/1107/1071 1102/1140/1102 1110/1155/1110\nf 1099/1141/1099 1102/1140/1102 706/723/706\nf 1099/1141/1099 706/723/706 705/722/705\nf 705/722/705 1008/1041/1008 1111/1156/1111\nf 705/722/705 1111/1156/1111 1099/1141/1099\nf 1011/1040/1011 500/1153/500 505/1157/505\nf 1011/1040/1011 505/1157/505 1112/1158/1112\nf 1067/1102/1067 1043/1076/1043 1042/1075/1042\nf 1067/1102/1067 1042/1075/1042 1068/1103/1068\nf 329/984/329 444/1097/444 1063/1100/1063\nf 329/984/329 1063/1100/1063 961/985/961\nf 1068/1103/1068 1109/1154/1109 1113/1159/1113\nf 1068/1103/1068 1113/1159/1113 1065/1104/1065\nf 1115/1160/1115 724/741/724 1069/1105/1069\nf 1115/1160/1115 1069/1105/1069 1114/1161/1114\nf 744/765/744 843/864/843 848/871/848\nf 744/765/744 848/871/848 751/768/751\nf 509/500/509 850/870/850 849/869/849\nf 509/500/509 849/869/849 208/189/208\nf 849/869/849 843/864/843 842/863/842\nf 849/869/849 842/863/842 851/872/851\nf 462/1116/462 836/856/836 835/855/835\nf 462/1116/462 835/855/835 510/501/510\nf 850/870/850 509/500/509 510/501/510\nf 850/870/850 510/501/510 835/855/835\nf 795/815/795 960/983/960 971/998/971\nf 795/815/795 971/998/971 951/974/951\nf 960/983/960 1116/1162/1116 972/997/972\nf 960/983/960 972/997/972 971/998/971\nf 768/789/768 780/798/780 972/997/972\nf 768/789/768 972/997/972 1116/1162/1116\nf 716/737/716 929/951/929 826/849/826\nf 716/737/716 826/849/826 698/715/698\nf 801/821/801 1001/1028/1001 809/829/809\nf 801/821/801 809/829/809 1016/1046/1016\nf 800/824/800 813/834/813 938/960/938\nf 800/824/800 938/960/938 1002/1029/1002\nf 813/834/813 964/989/964 939/961/939\nf 813/834/813 939/961/939 938/960/938\nf 1117/1163/1117 921/947/921 924/946/924\nf 1117/1163/1117 924/946/924 954/976/954\nf 1094/1133/1094 1118/1164/1118 1119/1165/1119\nf 1094/1133/1094 1119/1165/1119 1035/1069/1035\nf 1035/1069/1035 1119/1165/1119 1089/1130/1089\nf 1035/1069/1035 1089/1130/1089 1036/1070/1036\nf 1118/1164/1118 1094/1133/1094 921/947/921\nf 1118/1164/1118 921/947/921 1117/1163/1117\nf 838/858/838 837/861/837 982/1010/982\nf 838/858/838 982/1010/982 750/769/750\nf 963/988/963 838/858/838 750/769/750\nf 963/988/963 750/769/750 751/768/751\nf 729/746/729 983/1011/983 982/1010/982\nf 729/746/729 982/1010/982 1098/1137/1098\nf 732/749/732 742/761/742 743/760/743\nf 732/749/732 743/760/743 733/750/733\nf 732/749/732 984/1012/984 1026/1056/1026\nf 732/749/732 1026/1056/1026 742/761/742\nf 984/1012/984 761/778/761 759/776/759\nf 984/1012/984 759/776/759 1026/1056/1026\nf 790/811/790 806/826/806 783/801/783\nf 790/811/790 783/801/783 782/800/782\nf 931/953/931 934/956/934 933/955/933\nf 931/953/931 933/955/933 995/1022/995\nf 931/953/931 995/1022/995 1016/1046/1016\nf 931/953/931 1016/1046/1016 928/954/928\nf 996/1024/996 827/847/827 811/831/811\nf 996/1024/996 811/831/811 791/812/791\nf 1121/1166/1121 861/881/861 864/885/864\nf 1121/1166/1121 864/885/864 1120/1167/1120\nf 896/917/896 1122/1168/1122 860/880/860\nf 896/917/896 860/880/860 859/883/859\nf 1024/1053/1024 1023/1052/1023 1025/1055/1025\nf 1024/1053/1024 1025/1055/1025 993/1021/993\nf 1024/1053/1024 860/880/860 1122/1168/1122\nf 1024/1053/1024 1122/1168/1122 1021/1054/1021\nf 1124/1169/1124 887/908/887 888/910/888\nf 1124/1169/1124 888/910/888 1123/1170/1123\nf 951/974/951 971/998/971 798/818/798\nf 951/974/951 798/818/798 797/817/797\nf 1050/1084/1050 1049/1083/1049 1038/1072/1038\nf 1050/1084/1050 1038/1072/1038 1039/1073/1039\nf 680/1063/680 1028/1058/1028 404/389/404\nf 680/1063/680 404/389/404 46/511/46\nf 1028/1058/1028 944/966/944 943/965/943\nf 1028/1058/1028 943/965/943 1029/1059/1029\nf 1018/1049/1018 932/958/932 521/513/521\nf 1018/1049/1018 521/513/521 520/512/520\nf 522/514/522 1019/1048/1019 1018/1049/1018\nf 522/514/522 1018/1049/1018 520/512/520\nf 935/957/935 523/515/523 521/513/521\nf 935/957/935 521/513/521 932/958/932\nf 935/957/935 968/993/968 524/516/524\nf 935/957/935 524/516/524 523/515/523\nf 953/977/953 792/816/792 952/975/952\nf 953/977/953 952/975/952 1073/1110/1073\nf 1073/1110/1073 1074/1109/1074 1125/1171/1125\nf 1073/1110/1073 1125/1171/1125 953/977/953\nf 1032/1065/1032 1081/1119/1081 1126/1172/1126\nf 1032/1065/1032 1126/1172/1126 1031/1066/1031\nf 1032/1065/1032 976/1007/976 979/1006/979\nf 1032/1065/1032 979/1006/979 1079/1120/1079\nf 1073/1110/1073 1127/1173/1127 857/877/857\nf 1073/1110/1073 857/877/857 856/876/856\nf 857/877/857 1127/1173/1127 1078/1117/1078\nf 857/877/857 1078/1117/1078 870/890/870\nf 407/397/407 276/258/276 905/928/905\nf 407/397/407 905/928/905 1007/1037/1007\nf 1006/1036/1006 897/918/897 1030/1064/1030\nf 1006/1036/1006 1030/1064/1030 1007/1037/1007\nf 822/842/822 845/866/845 855/879/855\nf 822/842/822 855/879/855 858/878/858\nf 1014/1044/1014 985/1013/985 731/748/731\nf 1014/1044/1014 731/748/731 737/754/737\nf 1031/1066/1031 1074/1109/1074 981/1008/981\nf 1031/1066/1031 981/1008/981 991/1018/991\nf 730/751/730 922/944/922 1033/1068/1033\nf 730/751/730 1033/1068/1033 738/755/738\nf 990/1019/990 980/1009/980 987/1015/987\nf 990/1019/990 987/1015/987 875/895/875\nf 763/780/763 752/773/752 988/1017/988\nf 763/780/763 988/1017/988 1051/1085/1051\nf 763/780/763 762/779/762 753/770/753\nf 763/780/763 753/770/753 752/773/752\nf 980/1009/980 990/1019/990 991/1018/991\nf 980/1009/980 991/1018/991 981/1008/981\nf 1118/1164/1118 1126/1172/1126 1081/1119/1081\nf 1118/1164/1118 1081/1119/1081 1119/1165/1119\nf 1126/1172/1126 1125/1171/1125 1074/1109/1074\nf 1126/1172/1126 1074/1109/1074 1031/1066/1031\nf 1119/1165/1119 1081/1119/1081 1080/1118/1080\nf 1119/1165/1119 1080/1118/1080 1089/1130/1089\nf 986/1014/986 844/865/844 889/909/889\nf 986/1014/986 889/909/889 1051/1085/1051\nf 821/844/821 819/839/819 818/841/818\nf 821/844/821 818/841/818 1097/1136/1097\nf 1022/1051/1022 764/785/764 894/914/894\nf 1022/1051/1022 894/914/894 1023/1052/1023\nf 1023/1052/1023 894/914/894 893/913/893\nf 1023/1052/1023 893/913/893 1025/1055/1025\nf 926/950/926 920/942/920 727/744/727\nf 926/950/926 727/744/727 726/747/726\nf 919/943/919 920/942/920 926/950/926\nf 919/943/919 926/950/926 927/949/927\nf 1128/1174/1128 1116/1162/1116 960/983/960\nf 1128/1174/1128 960/983/960 959/982/959\nf 773/790/773 702/719/702 799/820/799\nf 773/790/773 799/820/799 774/791/774\nf 799/820/799 972/997/972 780/798/780\nf 799/820/799 780/798/780 774/791/774\nf 772/793/772 828/848/828 970/996/970\nf 772/793/772 970/996/970 773/790/773\nf 703/720/703 970/996/970 996/1024/996\nf 703/720/703 996/1024/996 782/800/782\nf 771/788/771 781/799/781 780/798/780\nf 771/788/771 780/798/780 768/789/768\nf 791/812/791 790/811/790 782/800/782\nf 791/812/791 782/800/782 996/1024/996\nf 811/831/811 810/830/810 779/796/779\nf 811/831/811 779/796/779 791/812/791\nf 1027/1057/1027 789/809/789 777/794/777\nf 1027/1057/1027 777/794/777 776/797/776\nf 927/949/927 925/948/925 769/786/769\nf 927/949/927 769/786/769 1128/1174/1128\nf 710/727/710 725/742/725 724/741/724\nf 710/727/710 724/741/724 1115/1160/1115\nf 954/976/954 953/977/953 1125/1171/1125\nf 954/976/954 1125/1171/1125 1117/1163/1117\nf 1117/1163/1117 1125/1171/1125 1126/1172/1126\nf 1117/1163/1117 1126/1172/1126 1118/1164/1118\nf 768/789/768 1116/1162/1116 1128/1174/1128\nf 768/789/768 1128/1174/1128 769/786/769\nf 904/927/904 867/887/867 229/209/229\nf 904/927/904 229/209/229 529/521/529\nf 948/972/948 1096/1135/1096 998/1025/998\nf 948/972/948 998/1025/998 949/971/949\nf 1120/1167/1120 864/885/864 873/893/873\nf 1120/1167/1120 873/893/873 949/971/949\nf 1121/1166/1121 1120/1167/1120 997/1026/997\nf 1121/1166/1121 997/1026/997 1129/1175/1129\nf 1129/1175/1129 1095/1134/1095 865/888/865\nf 1129/1175/1129 865/888/865 1121/1166/1121\nf 861/881/861 1121/1166/1121 865/888/865\nf 861/881/861 865/888/865 862/882/862\nf 1075/1111/1075 890/911/890 1003/1034/1003\nf 1075/1111/1075 1003/1034/1003 1076/1112/1076\nf 1076/1112/1076 1003/1034/1003 965/991/965\nf 1076/1112/1076 965/991/965 1077/1113/1077\nf 965/991/965 695/990/695 694/1114/694\nf 965/991/965 694/1114/694 1077/1113/1077\nf 1075/1111/1075 1095/1134/1095 891/912/891\nf 1075/1111/1075 891/912/891 890/911/890\nf 895/915/895 894/914/894 764/785/764\nf 895/915/895 764/785/764 767/784/767\nf 1020/1050/1020 820/840/820 814/838/814\nf 1020/1050/1020 814/838/814 817/837/817\nf 1123/1170/1123 844/865/844 821/844/821\nf 1123/1170/1123 821/844/821 1097/1136/1097\nf 1124/1169/1124 1123/1170/1123 1097/1136/1097\nf 1124/1169/1124 1097/1136/1097 911/935/911\nf 1130/1176/1130 1124/1169/1124 911/935/911\nf 1130/1176/1130 911/935/911 912/934/912\nf 532/524/532 1130/1176/1130 912/934/912\nf 532/524/532 912/934/912 390/376/390\nf 973/1001/973 882/902/882 881/905/881\nf 973/1001/973 881/905/881 885/907/885\nf 833/857/833 836/856/836 886/906/886\nf 833/857/833 886/906/886 880/900/880\nf 834/854/834 833/857/833 879/899/879\nf 834/854/834 879/899/879 963/988/963\nf 1067/1102/1067 1066/1101/1066 1114/1161/1114\nf 1067/1102/1067 1114/1161/1114 1069/1105/1069\nf 809/829/809 808/832/808 928/954/928\nf 809/829/809 928/954/928 1016/1046/1016\nf 1019/1048/1019 522/514/522 405/390/405\nf 1019/1048/1019 405/390/405 1029/1059/1029\nf 1131/1177/1131 1085/1123/1085 1037/1071/1037\nf 1131/1177/1131 1037/1071/1037 1036/1070/1036\nf 1132/1178/1132 1103/1142/1103 715/732/715\nf 1132/1178/1132 715/732/715 714/731/714\nf 1110/1155/1110 1102/1140/1102 1101/1139/1101\nf 1110/1155/1110 1101/1139/1101 1133/1179/1133\nf 1111/1156/1111 1112/1158/1112 1135/1180/1135\nf 1111/1156/1111 1135/1180/1135 1134/1181/1134\nf 1106/1145/1106 1110/1155/1110 1133/1179/1133\nf 1106/1145/1106 1133/1179/1133 1136/1182/1136\nf 1106/1145/1106 714/731/714 713/730/713\nf 1106/1145/1106 713/730/713 958/980/958\nf 1112/1158/1112 505/1157/505 539/1183/539\nf 1112/1158/1112 539/1183/539 1135/1180/1135\nf 883/903/883 882/902/882 975/1003/975\nf 883/903/883 975/1003/975 1044/1079/1044\nf 704/725/704 1009/1038/1009 1008/1041/1008\nf 704/725/704 1008/1041/1008 705/722/705\nf 1052/1086/1052 962/986/962 1054/1088/1054\nf 1052/1086/1052 1054/1088/1054 1053/1087/1053\nf 1055/1092/1055 824/846/824 1060/1094/1060\nf 1055/1092/1055 1060/1094/1060 1056/1089/1056\nf 1009/1038/1009 704/725/704 824/846/824\nf 1009/1038/1009 824/846/824 1055/1092/1055\nf 1065/1104/1065 1113/1159/1113 1108/1147/1108\nf 1065/1104/1065 1108/1147/1108 1061/1096/1061\nf 1068/1103/1068 1042/1075/1042 1054/1088/1054\nf 1068/1103/1068 1054/1088/1054 1109/1154/1109\nf 1008/1041/1008 1011/1040/1011 1112/1158/1112\nf 1008/1041/1008 1112/1158/1112 1111/1156/1111\nf 1109/1154/1109 961/985/961 1063/1100/1063\nf 1109/1154/1109 1063/1100/1063 1113/1159/1113\nf 1134/1181/1134 1100/1138/1100 1099/1141/1099\nf 1134/1181/1134 1099/1141/1099 1111/1156/1111\nf 947/970/947 952/975/952 951/974/951\nf 947/970/947 951/974/951 797/817/797\nf 959/982/959 794/814/794 916/938/916\nf 959/982/959 916/938/916 919/943/919\nf 1098/1137/1098 982/1010/982 837/861/837\nf 1098/1137/1098 837/861/837 741/758/741\nf 1098/1137/1098 741/758/741 740/759/740\nf 1098/1137/1098 740/759/740 918/940/918\nf 1040/1077/1040 1047/1081/1047 1048/1082/1048\nf 1040/1077/1040 1048/1082/1048 1045/1078/1045\nf 1041/1074/1041 1044/1079/1044 975/1003/975\nf 1041/1074/1041 975/1003/975 1053/1087/1053\nf 1078/1117/1078 1127/1173/1127 947/970/947\nf 1078/1117/1078 947/970/947 946/969/946\nf 949/971/949 998/1025/998 997/1026/997\nf 949/971/949 997/1026/997 1120/1167/1120\nf 946/969/946 796/819/796 945/968/945\nf 946/969/946 945/968/945 1096/1135/1096\nf 998/1025/998 1096/1135/1096 945/968/945\nf 998/1025/998 945/968/945 950/973/950\nf 997/1026/997 805/825/805 804/828/804\nf 997/1026/997 804/828/804 1129/1175/1129\nf 1095/1134/1095 1129/1175/1129 804/828/804\nf 1095/1134/1095 804/828/804 891/912/891\nf 904/927/904 529/521/529 408/398/408\nf 904/927/904 408/398/408 1030/1064/1030\nf 1024/1053/1024 993/1021/993 863/884/863\nf 1024/1053/1024 863/884/863 860/880/860\nf 1138/1184/1138 1139/1185/1139 1140/1186/1140\nf 1138/1184/1138 1140/1186/1140 1137/1187/1137\nf 1141/1188/1141 1142/1189/1142 1137/1187/1137\nf 1141/1188/1141 1137/1187/1137 1140/1186/1140\nf 1143/1190/1143 1144/1191/1144 1142/1189/1142\nf 1143/1190/1143 1142/1189/1142 1141/1188/1141\nf 1145/1192/1145 1146/1193/1146 1144/1191/1144\nf 1145/1192/1145 1144/1191/1144 1143/1190/1143\nf 1147/1194/1147 1148/1195/1148 1146/1193/1146\nf 1147/1194/1147 1146/1193/1146 1145/1192/1145\nf 1149/1196/1149 1150/1197/1150 1148/1195/1148\nf 1149/1196/1149 1148/1195/1148 1147/1194/1147\nf 1151/1198/1151 1152/1199/1152 1150/1197/1150\nf 1151/1198/1151 1150/1197/1150 1149/1196/1149\nf 1154/1200/1154 1155/1201/1155 1156/1202/1156\nf 1154/1200/1154 1156/1202/1156 1153/1203/1153\nf 1157/1204/1157 1158/1205/1158 1155/1201/1155\nf 1157/1204/1157 1155/1201/1155 1154/1200/1154\nf 1159/1206/1159 1160/1207/1160 1142/1189/1142\nf 1159/1206/1159 1142/1189/1142 1144/1191/1144\nf 1161/1208/1161 1159/1206/1159 1144/1191/1144\nf 1161/1208/1161 1144/1191/1144 1146/1193/1146\nf 1162/1209/1162 1161/1208/1161 1146/1193/1146\nf 1162/1209/1162 1146/1193/1146 1148/1195/1148\nf 1163/1210/1163 1162/1209/1162 1148/1195/1148\nf 1163/1210/1163 1148/1195/1148 1150/1197/1150\nf 1150/1197/1150 1152/1199/1152 1164/1211/1164\nf 1150/1197/1150 1164/1211/1164 1163/1210/1163\nf 1156/1202/1156 1155/1201/1155 1166/1212/1166\nf 1156/1202/1156 1166/1212/1166 1165/1213/1165\nf 1167/1214/1167 1166/1212/1166 1155/1201/1155\nf 1167/1214/1167 1155/1201/1155 1158/1205/1158\nf 1169/1215/1169 1167/1214/1167 1158/1205/1158\nf 1169/1215/1169 1158/1205/1158 1168/1216/1168\nf 1170/1217/1170 1171/1218/1171 1172/1219/1172\nf 1170/1217/1170 1172/1219/1172 1139/1185/1139\nf 1173/1220/1173 1174/1221/1174 1141/1188/1141\nf 1173/1220/1173 1141/1188/1141 1140/1186/1140\nf 1141/1188/1141 1174/1221/1174 1175/1222/1175\nf 1141/1188/1141 1175/1222/1175 1143/1190/1143\nf 1176/1223/1176 1145/1192/1145 1143/1190/1143\nf 1176/1223/1176 1143/1190/1143 1175/1222/1175\nf 1177/1224/1177 1149/1196/1149 1147/1194/1147\nf 1177/1224/1177 1147/1194/1147 1176/1223/1176\nf 1177/1224/1177 1178/1225/1178 1151/1198/1151\nf 1177/1224/1177 1151/1198/1151 1149/1196/1149\nf 1153/1203/1153 1179/1226/1179 1180/1227/1180\nf 1153/1203/1153 1180/1227/1180 1154/1200/1154\nf 1157/1204/1157 1154/1200/1154 1180/1227/1180\nf 1157/1204/1157 1180/1227/1180 1181/1228/1181\nf 1157/1204/1157 1181/1228/1181 1182/1229/1182\nf 1157/1204/1157 1182/1229/1182 1168/1216/1168\nf 1169/1215/1169 1168/1216/1168 1182/1229/1182\nf 1169/1215/1169 1182/1229/1182 1183/1230/1183\nf 1142/1189/1142 1160/1207/1160 1138/1184/1138\nf 1142/1189/1142 1138/1184/1138 1137/1187/1137\nf 1170/1217/1170 1185/1231/1185 1186/1232/1186\nf 1170/1217/1170 1186/1232/1186 1184/1233/1184\nf 1170/1217/1170 1184/1233/1184 1187/1234/1187\nf 1170/1217/1170 1187/1234/1187 1171/1218/1171\nf 1187/1234/1187 1188/1235/1188 1172/1219/1172\nf 1187/1234/1187 1172/1219/1172 1171/1218/1171\nf 1172/1219/1172 1188/1235/1188 1140/1186/1140\nf 1172/1219/1172 1140/1186/1140 1139/1185/1139\nf 1161/1208/1161 1162/1209/1162 1163/1210/1163\nf 1161/1208/1161 1163/1210/1163 1189/1236/1189\nf 1189/1236/1189 1163/1210/1163 1164/1211/1164\nf 1189/1236/1189 1164/1211/1164 1190/1237/1190\nf 1165/1213/1165 1164/1211/1164 1152/1199/1152\nf 1165/1213/1165 1152/1199/1152 1156/1202/1156\nf 1152/1199/1152 1151/1198/1151 1153/1203/1153\nf 1152/1199/1152 1153/1203/1153 1156/1202/1156\nf 1179/1226/1179 1153/1203/1153 1151/1198/1151\nf 1179/1226/1179 1151/1198/1151 1178/1225/1178\nf 1189/1236/1189 1160/1207/1160 1159/1206/1159\nf 1189/1236/1189 1159/1206/1159 1161/1208/1161\nf 1186/1232/1186 1190/1237/1190 1164/1211/1164\nf 1186/1232/1186 1164/1211/1164 1165/1213/1165\nf 1139/1185/1139 1138/1184/1138 1185/1231/1185\nf 1139/1185/1139 1185/1231/1185 1170/1217/1170\nf 1169/1215/1169 1188/1235/1188 1187/1234/1187\nf 1169/1215/1169 1187/1234/1187 1167/1214/1167\nf 1186/1232/1186 1165/1213/1165 1166/1212/1166\nf 1186/1232/1186 1166/1212/1166 1184/1233/1184\nf 1140/1186/1140 1188/1235/1188 1191/1238/1191\nf 1140/1186/1140 1191/1238/1191 1173/1220/1173\nf 1191/1238/1191 1188/1235/1188 1169/1215/1169\nf 1191/1238/1191 1169/1215/1169 1183/1230/1183\nf 1192/1239/1192 1193/1240/1193 1179/1226/1179\nf 1192/1239/1192 1179/1226/1179 1178/1225/1178\nf 1192/1239/1192 1178/1225/1178 1177/1224/1177\nf 1192/1239/1192 1177/1224/1177 1194/1241/1194\nf 1180/1227/1180 1193/1240/1193 1072/1108/1072\nf 1180/1227/1180 1072/1108/1072 1105/1144/1105\nf 1180/1227/1180 1105/1144/1105 1107/1146/1107\nf 1180/1227/1180 1107/1146/1107 1181/1228/1181\nf 1194/1241/1194 1177/1224/1177 1176/1223/1176\nf 1194/1241/1194 1176/1223/1176 1114/1161/1114\nf 1062/1095/1062 1194/1241/1194 1114/1161/1114\nf 1062/1095/1062 1114/1161/1114 1066/1101/1066\nf 707/724/707 1072/1108/1072 1193/1240/1193\nf 707/724/707 1193/1240/1193 825/845/825\nf 825/845/825 1193/1240/1193 1192/1239/1192\nf 825/845/825 1192/1239/1192 1059/1093/1059\nf 1173/1220/1173 1191/1238/1191 832/853/832\nf 1173/1220/1173 832/853/832 711/728/711\nf 1183/1230/1183 1182/1229/1182 1005/1035/1005\nf 1183/1230/1183 1005/1035/1005 831/851/831\nf 1187/1234/1187 1184/1233/1184 1166/1212/1166\nf 1187/1234/1187 1166/1212/1166 1167/1214/1167\nf 710/727/710 1115/1160/1115 1175/1222/1175\nf 710/727/710 1175/1222/1175 1174/1221/1174\nf 1182/1229/1182 1181/1228/1181 1107/1146/1107\nf 1182/1229/1182 1107/1146/1107 1005/1035/1005\nf 453/443/453 1049/1083/1049 720/738/720\nf 453/443/453 720/738/720 598/590/598\nf 1123/1170/1123 888/910/888 889/909/889\nf 1123/1170/1123 889/909/889 844/865/844\nf 916/938/916 794/814/794 793/813/793\nf 916/938/916 793/813/793 913/939/913\nf 711/728/711 832/853/832 770/787/770\nf 711/728/711 770/787/770 708/729/708\nf 919/943/919 927/949/927 1128/1174/1128\nf 919/943/919 1128/1174/1128 959/982/959\nf 925/948/925 708/729/708 770/787/770\nf 925/948/925 770/787/770 769/786/769\nf 913/939/913 793/813/793 954/976/954\nf 913/939/913 954/976/954 924/946/924\nf 831/851/831 832/853/832 1191/1238/1191\nf 831/851/831 1191/1238/1191 1183/1230/1183\nf 895/915/895 767/784/767 766/783/766\nf 895/915/895 766/783/766 1006/1036/1006\nf 891/912/891 804/828/804 807/827/807\nf 891/912/891 807/827/807 788/808/788\nf 778/795/778 777/794/777 788/808/788\nf 778/795/778 788/808/788 807/827/807\nf 810/830/810 1000/1027/1000 776/797/776\nf 810/830/810 776/797/776 779/796/779\nf 947/970/947 1127/1173/1127 1073/1110/1073\nf 947/970/947 1073/1110/1073 952/975/952\nf 1106/1145/1106 1136/1182/1136 1132/1178/1132\nf 1106/1145/1106 1132/1178/1132 714/731/714\nf 1061/1096/1061 1062/1095/1062 1066/1101/1066\nf 1061/1096/1061 1066/1101/1066 1065/1104/1065\nf 443/1098/443 497/1150/497 1057/1090/1057\nf 443/1098/443 1057/1090/1057 1064/1099/1064\nf 1064/1099/1064 1108/1147/1108 1113/1159/1113\nf 1064/1099/1064 1113/1159/1113 1063/1100/1063\nf 1061/1096/1061 1108/1147/1108 1056/1089/1056\nf 1061/1096/1061 1056/1089/1056 1060/1094/1060\nf 1192/1239/1192 1194/1241/1194 1062/1095/1062\nf 1192/1239/1192 1062/1095/1062 1059/1093/1059\nf 1173/1220/1173 711/728/711 710/727/710\nf 1173/1220/1173 710/727/710 1174/1221/1174\nf 880/900/880 881/905/881 884/904/884\nf 880/900/880 884/904/884 878/901/878\nf 841/862/841 1047/1081/1047 1046/1080/1046\nf 841/862/841 1046/1080/1046 723/740/723\nf 1070/1106/1070 1048/1082/1048 1047/1081/1047\nf 1070/1106/1070 1047/1081/1047 841/862/841\nf 461/1115/461 342/999/342 885/907/885\nf 461/1115/461 885/907/885 886/906/886\nf 1114/1161/1114 1176/1223/1176 1175/1222/1175\nf 1114/1161/1114 1175/1222/1175 1115/1160/1115\nf 887/908/887 1124/1169/1124 1130/1176/1130\nf 887/908/887 1130/1176/1130 852/873/852\nf 206/186/206 852/873/852 1130/1176/1130\nf 206/186/206 1130/1176/1130 532/524/532\nf 681/698/681 599/592/599 1195/1242/1195\nf 681/698/681 1195/1242/1195 682/699/682\nf 1196/1243/1196 674/691/674 684/702/684\nf 1196/1243/1196 684/702/684 1195/1242/1195\nf 1197/1244/1197 675/692/675 674/691/674\nf 1197/1244/1197 674/691/674 1196/1243/1196\nf 689/706/689 690/708/690 675/692/675\nf 689/706/689 675/692/675 1197/1244/1197\nf 693/710/693 1199/1245/1199 1200/1246/1200\nf 693/710/693 1200/1246/1200 1198/1247/1198\nf 686/707/686 689/706/689 1197/1244/1197\nf 686/707/686 1197/1244/1197 1199/1245/1199\nf 1196/1243/1196 1195/1242/1195 1202/1248/1202\nf 1196/1243/1196 1202/1248/1202 1201/1249/1201\nf 1084/1122/1084 1083/1124/1083 1204/1250/1204\nf 1084/1122/1084 1204/1250/1204 1203/1251/1203\nf 1092/1131/1092 1013/1042/1013 1203/1251/1203\nf 1092/1131/1092 1203/1251/1203 1204/1250/1204\nf 1206/1252/1206 1087/1253/1087 1207/1254/1207\nf 1206/1252/1206 1207/1254/1207 1205/1255/1205\nf 1206/1252/1206 1208/1256/1208 1086/1257/1086\nf 1206/1252/1206 1086/1257/1086 1087/1253/1087\nf 1091/1258/1091 1090/1259/1090 1210/1260/1210\nf 1091/1258/1091 1210/1260/1210 1209/1261/1209\nf 1093/1132/1093 1211/1262/1211 757/774/757\nf 1093/1132/1093 757/774/757 756/775/756\nf 1079/1120/1079 1212/1263/1212 1090/1128/1090\nf 1079/1120/1079 1090/1128/1090 1080/1118/1080\nf 1079/1120/1079 979/1006/979 1088/1127/1088\nf 1079/1120/1079 1088/1127/1088 1212/1263/1212\nf 1209/1261/1209 1213/1264/1213 1085/1265/1085\nf 1209/1261/1209 1085/1265/1085 1131/1266/1131\nf 1089/1130/1089 1091/1129/1091 1131/1177/1131\nf 1089/1130/1089 1131/1177/1131 1036/1070/1036\nf 1213/1264/1213 1214/1267/1214 1204/1268/1204\nf 1213/1264/1213 1204/1268/1204 1083/1269/1083\nf 1214/1267/1214 1215/1270/1215 1092/1271/1092\nf 1214/1267/1214 1092/1271/1092 1204/1268/1204\nf 1015/1045/1015 757/774/757 1211/1262/1211\nf 1015/1045/1015 1211/1262/1211 1216/1272/1216\nf 1211/1273/1211 1093/1274/1093 1215/1270/1215\nf 1211/1273/1211 1215/1270/1215 1217/1275/1217\nf 1088/1276/1088 1208/1256/1208 1210/1260/1210\nf 1088/1276/1088 1210/1260/1210 1212/1277/1212\nf 1216/1278/1216 1211/1273/1211 1217/1275/1217\nf 1216/1278/1216 1217/1275/1217 1218/1279/1218\nf 1219/1280/1219 1218/1279/1218 1205/1255/1205\nf 1219/1280/1219 1205/1255/1205 1207/1254/1207\nf 698/715/698 697/714/697 717/734/717\nf 698/715/698 717/734/717 716/737/716\nf 967/992/967 418/407/418 524/516/524\nf 967/992/967 524/516/524 968/993/968\nf 598/590/598 720/738/720 712/733/712\nf 598/590/598 712/733/712 293/276/293\nf 697/714/697 721/739/721 1050/1084/1050\nf 697/714/697 1050/1084/1050 717/734/717\nf 957/979/957 956/978/956 1005/1035/1005\nf 957/979/957 1005/1035/1005 1107/1146/1107\nf 1186/1232/1186 1185/1231/1185 1189/1236/1189\nf 1186/1232/1186 1189/1236/1189 1190/1237/1190\nf 1022/1051/1022 896/917/896 765/782/765\nf 1022/1051/1022 765/782/765 764/785/764\nf 1122/1168/1122 896/917/896 1022/1051/1022\nf 1122/1168/1122 1022/1051/1022 1021/1054/1021\nf 678/695/678 1198/1247/1198 625/631/625\nf 678/695/678 625/631/625 27/8/27\nf 1195/1242/1195 599/592/599 626/632/626\nf 1195/1242/1195 626/632/626 1202/1248/1202\nf 1202/1248/1202 626/632/626 628/634/628\nf 1202/1248/1202 628/634/628 1220/1281/1220\nf 1198/1247/1198 1220/1281/1220 628/634/628\nf 1198/1247/1198 628/634/628 625/631/625\nf 1222/1282/1222 1223/1283/1223 1224/1284/1224\nf 1222/1282/1222 1224/1284/1224 1221/1285/1221\nf 1226/1286/1226 1227/1287/1227 1228/1288/1228\nf 1226/1286/1226 1228/1288/1228 1225/1289/1225\nf 1230/1290/1230 1231/1291/1231 1232/1292/1232\nf 1230/1290/1230 1232/1292/1232 1229/1293/1229\nf 1234/1294/1234 1232/1292/1232 1231/1291/1231\nf 1234/1294/1234 1231/1291/1231 1233/1295/1233\nf 1236/1296/1236 1237/1297/1237 1238/1298/1238\nf 1236/1296/1236 1238/1298/1238 1235/1299/1235\nf 1221/1285/1221 1239/1300/1239 1240/1301/1240\nf 1221/1285/1221 1240/1301/1240 1233/1295/1233\nf 1242/1302/1242 1243/1303/1243 1244/1304/1244\nf 1242/1302/1242 1244/1304/1244 1241/1305/1241\nf 1237/1297/1237 1245/1306/1245 1246/1307/1246\nf 1237/1297/1237 1246/1307/1246 1238/1298/1238\nf 1246/1307/1246 1245/1306/1245 1242/1302/1242\nf 1246/1307/1246 1242/1302/1242 1241/1305/1241\nf 1248/1308/1248 1224/1284/1224 1249/1309/1249\nf 1248/1308/1248 1249/1309/1249 1247/1310/1247\nf 1249/1309/1249 1250/1311/1250 660/1312/660\nf 1249/1309/1249 660/1312/660 659/1313/659\nf 661/1314/661 1247/1310/1247 1249/1309/1249\nf 661/1314/661 1249/1309/1249 659/1313/659\nf 1221/1285/1221 1224/1284/1224 1248/1308/1248\nf 1221/1285/1221 1248/1308/1248 1239/1300/1239\nf 1231/1291/1231 1222/1282/1222 1221/1285/1221\nf 1231/1291/1231 1221/1285/1221 1233/1295/1233\nf 1232/1292/1232 1234/1294/1234 1243/1303/1243\nf 1232/1292/1232 1243/1303/1243 1242/1302/1242\nf 1244/1304/1244 1243/1303/1243 1234/1294/1234\nf 1244/1304/1244 1234/1294/1234 1251/1315/1251\nf 1240/1301/1240 1251/1315/1251 1234/1294/1234\nf 1240/1301/1240 1234/1294/1234 1233/1295/1233\nf 1253/1316/1253 1134/1181/1134 1135/1180/1135\nf 1253/1316/1253 1135/1180/1135 1252/1317/1252\nf 1254/1318/1254 1255/1319/1255 1229/1293/1229\nf 1254/1318/1254 1229/1293/1229 1232/1292/1232\nf 1254/1318/1254 1225/1289/1225 1228/1288/1228\nf 1254/1318/1254 1228/1288/1228 1255/1319/1255\nf 667/1320/667 1252/1317/1252 1135/1180/1135\nf 667/1320/667 1135/1180/1135 539/1183/539\nf 1226/1286/1226 1225/1289/1225 1237/1297/1237\nf 1226/1286/1226 1237/1297/1237 1236/1296/1236\nf 1245/1306/1245 1254/1318/1254 1232/1292/1232\nf 1245/1306/1245 1232/1292/1232 1242/1302/1242\nf 1254/1318/1254 1245/1306/1245 1237/1297/1237\nf 1254/1318/1254 1237/1297/1237 1225/1289/1225\nf 669/674/669 668/675/668 1226/1286/1226\nf 669/674/669 1226/1286/1226 1236/1296/1236\nf 1230/1290/1230 1256/1321/1256 1222/1282/1222\nf 1230/1290/1230 1222/1282/1222 1231/1291/1231\nf 1235/1299/1235 671/677/671 669/674/669\nf 1235/1299/1235 669/674/669 1236/1296/1236\nf 1230/1290/1230 1101/1139/1101 1100/1138/1100\nf 1230/1290/1230 1100/1138/1100 1256/1321/1256\nf 672/678/672 488/480/488 1103/1142/1103\nf 672/678/672 1103/1142/1103 1227/1287/1227\nf 1224/1284/1224 1223/1283/1223 1250/1311/1250\nf 1224/1284/1224 1250/1311/1250 1249/1309/1249\nf 1256/1321/1256 1100/1138/1100 1134/1181/1134\nf 1256/1321/1256 1134/1181/1134 1253/1316/1253\nf 1227/1287/1227 1103/1142/1103 1132/1178/1132\nf 1227/1287/1227 1132/1178/1132 1228/1288/1228\nf 1101/1139/1101 1230/1290/1230 1229/1293/1229\nf 1101/1139/1101 1229/1293/1229 1133/1179/1133\nf 1223/1283/1223 1253/1316/1253 1252/1317/1252\nf 1223/1283/1223 1252/1317/1252 1250/1311/1250\nf 1255/1319/1255 1136/1182/1136 1133/1179/1133\nf 1255/1319/1255 1133/1179/1133 1229/1293/1229\nf 1228/1288/1228 1132/1178/1132 1136/1182/1136\nf 1228/1288/1228 1136/1182/1136 1255/1319/1255\nf 660/1312/660 1250/1311/1250 1252/1317/1252\nf 660/1312/660 1252/1317/1252 667/1320/667\nf 668/675/668 672/678/672 1227/1287/1227\nf 668/675/668 1227/1287/1227 1226/1286/1226\nf 1222/1282/1222 1256/1321/1256 1253/1316/1253\nf 1222/1282/1222 1253/1316/1253 1223/1283/1223\nf 1/1322/1 12/1323/12 1247/1310/1247\nf 1/1322/1 1247/1310/1247 661/1314/661\nf 10/1324/10 8/1325/8 1240/1301/1240\nf 10/1324/10 1240/1301/1240 1239/1300/1239\nf 1239/1300/1239 1248/1308/1248 11/1326/11\nf 1239/1300/1239 11/1326/11 10/1324/10\nf 5/1327/5 3/1328/3 1235/1299/1235\nf 5/1327/5 1235/1299/1235 1238/1298/1238\nf 9/1329/9 4/1330/4 1246/1307/1246\nf 9/1329/9 1246/1307/1246 1241/1305/1241\nf 1240/1301/1240 8/1325/8 6/1331/6\nf 1240/1301/1240 6/1331/6 1251/1315/1251\nf 7/1332/7 9/1329/9 1241/1305/1241\nf 7/1332/7 1241/1305/1241 1244/1304/1244\nf 11/1326/11 1248/1308/1248 1247/1310/1247\nf 11/1326/11 1247/1310/1247 12/1323/12\nf 3/1328/3 2/690/2 671/677/671\nf 3/1328/3 671/677/671 1235/1299/1235\nf 1238/1298/1238 1246/1307/1246 4/1330/4\nf 1238/1298/1238 4/1330/4 5/1327/5\nf 7/1332/7 1244/1304/1244 1251/1315/1251\nf 7/1332/7 1251/1315/1251 6/1331/6\nf 1203/1251/1203 1013/1042/1013 1012/1043/1012\nf 1203/1251/1203 1012/1043/1012 736/757/736\nf 937/959/937 941/964/941 1027/1057/1027\nf 937/959/937 1027/1057/1027 999/1030/999\nf 1084/1122/1084 739/756/739 1034/1067/1034\nf 1084/1122/1084 1034/1067/1034 1037/1071/1037\nf 1197/1244/1197 1196/1243/1196 1201/1249/1201\nf 1197/1244/1197 1201/1249/1201 1199/1245/1199\nf 1203/1251/1203 736/757/736 739/756/739\nf 1203/1251/1203 739/756/739 1084/1122/1084\nf 936/962/936 784/805/784 941/964/941\nf 936/962/936 941/964/941 937/959/937\nf 786/806/786 1004/1033/1004 940/963/940\nf 786/806/786 940/963/940 785/804/785\nf 467/1333/467 612/604/612 387/1334/387\nf 612/604/612 624/630/624 387/1334/387\nf 621/628/621 387/1334/387 624/630/624\nf 604/595/604 44/22/44 28/5/28\nf 472/605/472 612/604/612 467/1333/467\nf 29/6/29 28/5/28 47/26/47\nf 43/21/43 48/25/48 44/22/44\nf 30/7/30 266/1335/266 27/8/27\nf 424/414/424 239/223/239 425/415/425\nf 467/458/467 363/347/363 472/463/472\nf 561/552/561 560/553/560 572/564/572\nf 549/540/549 551/542/551 579/571/579\nf 583/574/583 595/588/595 582/575/582\nf 31/12/31 36/13/36 600/591/600\nf 39/16/39 44/22/44 603/597/603\nf 32/9/32 599/592/599 45/23/45\nf 473/626/473 613/607/613 471/606/471\nf 477/620/477 478/625/478 620/621/620\nf 474/611/474 615/610/615 617/627/617\nf 1257/1336/1257 614/609/614 618/616/618\nf 1257/1336/1257 620/621/620 622/624/622\nf 1257/1336/1257 618/616/618 619/619/619\nf 1257/1336/1257 613/607/613 615/610/615\nf 614/609/614 1257/1336/1257 615/610/615\nf 622/624/622 623/629/623 1257/1336/1257\nf 1257/1336/1257 623/629/623 611/603/611\nf 624/630/624 623/629/623 621/628/621\nf 469/617/469 618/616/618 470/615/470\nf 614/609/614 476/608/476 533/614/533\nf 610/602/610 1257/1336/1257 611/603/611\nf 613/607/613 1257/1336/1257 610/602/610\nf 620/621/620 1257/1336/1257 619/619/619\nf 541/532/541 592/584/592 562/555/562\nf 541/532/541 587/581/587 592/584/592\nf 627/633/627 607/599/607 605/596/605\nf 627/633/627 605/596/605 604/595/604\nf 605/596/605 606/598/606 603/597/603\nf 607/599/607 606/598/606 605/596/605\nf 1207/1254/1207 1082/1337/1082 1015/1338/1015\nf 1219/1280/1219 1207/1254/1207 1015/1338/1015\nf 1015/1338/1015 1216/1278/1216 1219/1280/1219\nf 693/710/693 1198/1247/1198 678/695/678\nf 1207/1254/1207 1087/1253/1087 1082/1337/1082\nf 678/695/678 677/697/677 694/712/694\nf 695/713/695 692/711/692 693/710/693\nf 266/1335/266 679/696/679 27/8/27\nf 883/903/883 1044/1079/1044 1045/1078/1045\nf 992/1020/992 1082/1121/1082 1087/1125/1087\nf 1158/1205/1158 1157/1204/1157 1168/1216/1168\nf 1147/1194/1147 1145/1192/1145 1176/1223/1176\nf 1193/1240/1193 1180/1227/1180 1179/1226/1179\nf 684/702/684 682/699/682 1195/1242/1195\nf 693/710/693 686/707/686 1199/1245/1199\nf 599/592/599 681/698/681 45/23/45\nf 1208/1256/1208 1088/1276/1088 1086/1257/1086\nf 1093/1274/1093 1092/1271/1092 1215/1270/1215\nf 1210/1260/1210 1090/1259/1090 1212/1277/1212\nf 1209/1261/1209 1258/1339/1258 1213/1264/1213\nf 1215/1270/1215 1258/1339/1258 1217/1275/1217\nf 1213/1264/1213 1258/1339/1258 1214/1267/1214\nf 1208/1256/1208 1258/1339/1258 1210/1260/1210\nf 1258/1339/1258 1209/1261/1209 1210/1260/1210\nf 1218/1279/1218 1217/1275/1217 1258/1339/1258\nf 1218/1279/1218 1258/1339/1258 1205/1255/1205\nf 1218/1279/1218 1219/1280/1219 1216/1278/1216\nf 1213/1264/1213 1083/1269/1083 1085/1265/1085\nf 1091/1258/1091 1209/1261/1209 1131/1266/1131\nf 1258/1339/1258 1206/1252/1206 1205/1255/1205\nf 1258/1339/1258 1208/1256/1208 1206/1252/1206\nf 1258/1339/1258 1215/1270/1215 1214/1267/1214\nf 1189/1236/1189 1138/1184/1138 1160/1207/1160\nf 1185/1231/1185 1138/1184/1138 1189/1236/1189\nf 1202/1248/1202 1220/1281/1220 1200/1246/1200\nf 1200/1246/1200 1220/1281/1220 1198/1247/1198\nf 1201/1249/1201 1200/1246/1200 1199/1245/1199\nf 1201/1249/1201 1202/1248/1202 1200/1246/1200\n# 2492 faces\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1]),\n\t\t\ty = float.Parse (strItems [2]),\n\t\t\tz = float.Parse (strItems [3])\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\n#load \"lesson6.csx\"\n#load \"lesson6bis.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n```\n\n# Lesson 7: Shadow mapping\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\n# **The goal**\n\nWell, we are approaching the end of your short course of CG lectures. The goal for today is to compute shadows. **Attention, we are talking about hard shadows here, soft shadows computation is another story.**\n\n# **Problem statement**\n\nUp to this moment convex objects were shaded correctly by our simple local shading. Local means computation with light direction and the normal vector. Unfortunately, it does not produce correct results for non-convex objects. Here is the image we can got during previous lesson:\n\n```csharp\nvar shader = new TangentShader (diabloModel, viewPort, projection, modelView, light_dir, diabloTexture, diabloTangentMap);\n\nvar image = Render (diabloModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\nWhy do not we see a shadow from his horns? Not good.\n\nThe idea is really simple: we will do a two-pass rendering. First time we will render the image placing the camera at the light source position. It will allow to determine what parts are lit and what parts are hidden from the light. Then in the second pass we do a render taking in account the visibility information. Almost no difficulties here. Let us use this shader:\n\n```csharp\nclass DepthShader : IShader\n{\n    const float depth = 255f;\n\n    Matrix3 varyingTri;\n\n    readonly Model model;\n    readonly Matrix4 transformation;\n\n    public DepthShader (Model model, Matrix4 transformation)\n    {\n        this.model = model;\n        this.transformation = transformation;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        varyingTri.SetColumn (nthvert, Project3D (glVertex / glVertex.h));\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var p = Mult (varyingTri, bar);\n        color = Color.White * (p.z / depth);\n        return false;\n    }\n}\n```\n\nThis shader simply copies the z-buffer into the framebuffer. Here is how it I call it:\n\n```csharp\nvar model = diabloModel;\n\nvar modelView = LookAt (eye, center, up);\nvar viewPort = Viewport (width / 8, height / 8, width * 3 / 4, height * 3 / 4);\nvar projection = Projection (-1f / (eye - center).Norm ());\n\nvar M = viewPort * Projection (0) * LookAt (light_dir, center, up);\nvar depthShader = new DepthShader (model, M);\nvar step1 = Render (model, depthShader);\nstep1.Image.VerticalFlip ();\nstep1.Image\n```\n\nI put the camera at the light source position LookAt (light_dir, center, up) and then perform the render. Note that I keep the z-buffer, it is pointed by the **step1.ZBuffer** reference. Also it is useful to note line where I keep the object-to-screen transformation matrix.\n\nThe second pass is naturally made with another shader:\n\n```csharp\nclass ShadowShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n    Matrix3 varyingTri;\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    // transform framebuffer screen coordinates to shadowbuffer screen coordinates\n    readonly Matrix4 uniformShadow;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n    readonly Image specularMap;\n\n    readonly float[] shadowbuffer;\n    readonly int width;\n\n    public ShadowShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Matrix4 uniformShadow, Vec3f lightDir, Image texture, Image normalMap, Image specularMap, float[] shadowbuffer, int width)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n        this.specularMap = specularMap;\n        this.shadowbuffer = shadowbuffer;\n        this.width = width;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n        this.uniformShadow = uniformShadow;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        varyingTri.SetColumn (nthvert, Project3D (glVertex / glVertex.h));\n\n        return glVertex; \n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // corresponding point in the shadow buffer\n        var sb_p = Mult (uniformShadow, Embed4D (Mult (varyingTri, bar)));\n        sb_p = sb_p / sb_p.h;\n        int idx = (int)sb_p.x + (int)sb_p.y * width; // index in the shadowbuffer array\n        float shadow = 0.3f + 0.7f * (shadowbuffer [idx] < sb_p.z + 3.5f ? 1f : 0f);\n\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n        var r = (n * (2 * Dot (n, l)) - l).Normalize ();\n        var diff = Math.Max (0f, Dot (n, l));\n\n        var specular = Math.Pow (Math.Max (0f, r.z), Specular (specularMap, uv) + 15);\n        color = GetColor (texture, uv);\n\n        int v = 0;\n        for (int i = 0; i < 4; i++)\n            v = (v <<= 8) | (byte)Math.Min (255, (int)(5 + color [i] * shadow * (diff + 1.3f * specular)));\n        color = new Color (v, color.format);\n\n        return false;\n    }\n}\n```\n\nIt is a copy of the final shader from the previous lesson with one exception: I declared a constant matrix `Matrix4 uniformShadow`, it allows me to transform screen coordinates of current fragment into screen coordinates inside the shadowbuffer! I'll explain how it is computed a bit later, let us see how I use it:\n\n```csharp\n/*\nvar sb_p = Mult (uniformShadow, Embed4D (Mult (varyingTri, bar)));\nsb_p = sb_p / sb_p.h;\nint idx = (int)sb_p.x + (int)sb_p.y * width; // index in the shadowbuffer array\nvar depth = 255 * shadowbuffer [idx];\nfloat shadow = 0.3f + 0.7f * ((depth < sb_p.z ? 1f : 0f));\n*/\n```\n\n`Mult (varyingTri, bar)` provides me screen coordinates of the pixel we currently draw; we augment it with 1 (recall the homogeneous coordinates stuff), then transform it with the magic matrix `uniformShadow` and ta-da! We know xyz coordinates in the shadow buffer space. Now to determine whether the current pixel is lit or no it suffices to compare its z-coordinate with the value we stored in the shadow buffer.\n\nLet me show you how I call the shader:\n\n```csharp\nvar shadowM = M * Inverse (viewPort * projection * modelView);\nvar shader = new ShadowShader (model, viewPort, projection, modelView, shadowM, light_dir,\n                                diabloTexture, diabloNormalMap, diabloSpecularMap,\n                                step1.ZBuffer, width);\nvar step2 = Render (model, shader);\nstep2.Image.VerticalFlip ();\nstep2.Image\n```\n\nNotice the `sb_p.z + 3.5`  in fragment shader? This magic coefficient needed to get rig of artifact is known as the [z-fighting](http://en.wikipedia.org/wiki/Z-fighting). Resolution of our buffers is insufficient to obtain precise results. Try to delete `+ 3.5f`  and you will notice ugly shadow rendering.\n\nI simply move a bit one z-buffer with respect to another, it is sufficient to remove the artifact. Yes, it creates other problems (can you tell which ones?), but those are generally less visible. The final render is visible in the teaser image."
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson1.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson2.csx",
    "content": "using static Geometry;\n\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\n\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n\tLine(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n\tLine(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n\tLine(image, t[0], t[1], color);\n\tLine(image, t[1], t[2], color);\n\tLine(image, t[2], t[0], color);\n}\n\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson2.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\nusing static Geometry;\n```\n\n# Lesson 2: Triangle rasterization and back face culling\n\n# Old-school method: Line sweeping\n\nThus, the task is to draw two-dimensional triangles. For motivated students it normally takes a couple of hours, even if they are bad programmers. Last time we saw Bresenham’s line drawing algorithm. Today’s task is to draw a filled triangle. Funny enough, but this task is not trivial. I don’t know why, but I know that it’s true. Most of my students struggle with this simple task. So, the initial stub will look like this:\n\n```csharp\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n    Line(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n    Line(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    Line(image, t[0], t[1], color);\n    Line(image, t[1], t[2], color);\n    Line(image, t[2], t[0], color);\n}\n\nVec2i[] t0 = {\n    new Vec2i { x = 10, y = 70 },\n    new Vec2i { x = 50, y = 160 },\n    new Vec2i { x = 70, y = 80 }\n};\nVec2i[] t1 = {\n    new Vec2i { x = 180, y = 50 },\n    new Vec2i { x = 150, y = 1 },\n    new Vec2i { x = 70, y = 180 }\n};\nVec2i[] t2 = {\n    new Vec2i { x = 180, y = 150 },\n    new Vec2i { x = 120, y = 160 },\n    new Vec2i { x = 130, y = 180 }\n};\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThe code is simple: I provide three triangles for the initial debugging of your code. If we invoke `Line` inside the triangle function, we’ll get the contour of the triangle. How to draw a filled triangle?\n\nA good method of drawing a triangle must have the following features:\n\n* It should be (surprise!) simple and fast.\n\n\n* It should be symmetrical: the picture should not depend on the order of vertices passed to the drawing function.\n\n\n* If two triangles have two common vertices, there should be no holes between them because of rasterization rounding.\n\nWe could add more requirements, but let’s do with these ones. Traditionally a line sweeping is used:\n\n1. Sort vertices of the triangle by their y-coordinates\n\n2. Rasterize simultaneously the left and the right sides of the triangle\n\n3. Draw a horizontal line segment between the left and the right boundary points\n\nAt this point my students start to lose the firm ground: which segment is the left one, which one is right? Besides, there are three segments in a triangle... Usually, after this introduction I leave my students for about an hour: once again, reading my code is much less valuable than comparing your own code with mine.\n\n`[One hour passes]`\n\nHow do I draw a triangle? Once again, if you have a better method, I’d be glad to adopt it. Let us assume that we have three points of the triangle: `t0`, `t1`, `t2`, they are sorted in ascending order by the y-coordinate. Then, the boundary A is between `t0` and `t2`, boundary B is between `t0` and `t1`, and then between `t1` and `t2`.\n\n```csharp\nvoid OrderByY (Vec2i[] t)\n{\n    if(t[0].y > t[1].y) Swap(t, 0, 1);\n    if(t[1].y > t[2].y) Swap(t, 1, 2);\n    if(t[0].y > t[1].y) Swap(t, 0, 1);   \n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    Line(image, t[0], t[1], Color.Green);\n    Line(image, t[1], t[2], Color.Green);\n    Line(image, t[2], t[0], Color.Red);    \n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\n// Here boundary A is red, and boundary B is green.\nimage.VerticalFlip ();\nimage\n```\n\nUnfortunately, boundary B is made of two parts. Let us draw the bottom half of the triangle by cutting it horizontally:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        image[A.x, y] = Color.Red; \n        image[B.x, y] = Color.Green; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNote that the segments are not continuous. Last time when we drew straight lines we struggled to get continuous segments and here I did not bother with rotating the image (remember the xy swapping?). Why? We fill the triangles aftewards, that’s why. If we connect the corresponding pairs of points by horizontal lines, the gaps disappear:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        Line(image, A, B, Color.White);\n        image[B.x, y] = Color.Green; \n        image[A.x, y] = Color.Red; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNow, let us draw the second (upper) half of the triangle. We can do this by adding a second loop:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    \n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n    \n    float height_21 = t[2].y - t[1].y;\n    for(int y=t[1].y; y<=t[2].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[1].y) / height_21; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[1].x + (int)((t[2].x-t[1].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThis could be enough, but I dislike to see the same code twice. That is why we will make it a bit less readable, but more handy for modifications/maintaining:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    // I dont care about degenerate triangles\n    if(t[0].y == t[1].y && t[1].y == t[2].y)\n        return;\n\n    OrderByY(t);\n\n    float height_10 = t[1].y - t[0].y;\n    float total_height = t[2].y - t[0].y;\n    for(int i=0; i<total_height; i++) {\n        bool second_half = i > t[1].y - t[0].y || t[1].y == t[0].y;\n        float segment_height = second_half ? t[2].y-t[1].y : t[1].y-t[0].y;\n        var alpha = i / total_height;\n        // be careful with divisions by zero\n        var beta = (i - (second_half ? t[1].y-t[0].y : 0)) / segment_height;\n        Vec2i A = new Vec2i {\n            x = t[0].x + (int)((t[2].x-t[0].x)*alpha),\n            y = t[0].y + i\n        };\n        Vec2i B = new Vec2i {\n            x = second_half ? t[1].x + (int)((t[2].x-t[1].x)*beta) : t[0].x + (int)((t[1].x-t[0].x)*beta),\n            y = t[0].y + i\n        };\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, t[0].y + i] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\n# The method I adopt for my code\n\nWhile not being really complicated, the source code for the line sweeping is a bit messy. Moreover, it is really an old-school approach designed for mono-thread CPU programming. Let us take a look at the following pseudo-code:\n\n```csharp\n// triangle(Vec2i[] points) { \n//     Vec2i bbox[2] = find_bounding_box(points); \n//     for (each pixel in the bounding box) { \n//         if (inside(points, pixel)) { \n//             put_pixel(pixel); \n//         } \n//     } \n// }\n```\n\nDo you like it? I do. It is really easy to find a bounding box. It is certainly no problem to check whether a point belongs a 2D triangle (or any convex polygon).\n\n*Off Topic: if I have to implement some code to check whether a point belongs to a polygon, and this program will run on a plane, I will never get on this plane. Turns out, it is a surprisingly difficult task to solve this problem reliably. But here we just painting pixels. I am okay with that.*\n\nThere is another thing I like about this pseudocode: a neophyte in programming accepts it with enthusiasm, more experienced programmers often chuckle: “*What an idiot wrote it?*”. And an expert in computer graphics programming will shrug his shoulders and say: “*Well, that’s how it works in real life*”. Massively parallel computations in thousands of threads (i’m talking about regular consumer computers here) change the way of thinking.\n\nOkay, let us start: first of all we need to know what the [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) are. Given a 2D triangle ABC and a point P, all in old good Cartesian coordinates `(xy)`. Our goal is to find barycentric coordinates of the point P with respect to the triangle ABC. It means that we look for three numbers `(1 − u − v,u,v)` such that we can find the point P as follows:\n\n![ ](./img/lesson2_f1.png)\n\nWhile being a bit frightening at the first glance, it is really simple: imagine that we put three weights `(1−u−v,u,v)` at the vertices A, B and C, respectively. Then the barycenter of the system is exactly in the point P. We can say the same thing with other words: the point P has coordinates `(u,v)` in the (oblique) basis (A,![](./img/lesson2_ab.png),![](./img/lesson2_ac.png)):\n\n![ ](./img/lesson2_f2.png)\n\nSo, we have vectors ![](./img/lesson2_ab.png)￼, ![](./img/lesson2_ac.png)￼ and ![￼](./img/lesson2_ap.png), we need to find two real numbers u and v respecting the following constraint:\n\n![ ](./img/lesson2_f3.png)\n\nIt is a simple vector equation, or a linear system of two equations with two variables:\n\n![ ](./img/lesson2_f4.png)\n\nI am lazy and do not want to solve linear systems in a scholar way. Let us write it in matrix form:\n\n![ ](./img/lesson2_f5.png)\n\nIt means that we are looking for a vector `(u,v,1)` that is orthogonal to `(￼ABx,AC￼x,￼PAx)` and `(￼ABy,AC￼y,PA￼y)` *at the same time*! I hope you see [where I am heading](https://en.wikipedia.org/wiki/Cross_product). That is a small hint: to find an intersection of two straight lines in a plane (that is exactly what we did here), it is sufficient to compute one cross product. By the way, test yourself: how do we find an equation of a line passing through two given points?\n\nSo, let us program our new rasterization routine: we iterate through all pixels of a bounding box for a given triangle. For each pixel we compute its barycentric coordinates. If it has at least one negative component, then the pixel is outside of the triangle. Probably it is more clear to see the program directly:\n\n```csharp\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}\n```\n\n# Flat shading render\n\nWe already know how to draw a model with empty triangles. Let us fill them with a random color. This will help us to see how well we have encoded filling of triangles. Here is the code:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\n// Map world coordinates [-1..-1] to screen coordinates [0..width]\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*image.Width/2),\n    y = (int)((v.y+1)*image.Height/2)\n};\n\nvar rnd = new Random();\nFunc<byte> rndByte = () => (byte)rnd.Next(255);\nFunc<Color> rndColor = () => new Color(rndByte(), rndByte(), rndByte()); \n\nvar coordinates = new Vec3f[3];\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        var v = headModel.Vertices[vIndex];\n        coordinates[i] = map(v);\n    }    \n    Triangle(image, coordinates, rndColor());\n}\n\nimage.VerticalFlip ();\nimage\n```\n\nLet us get rid of these clown-colors and put some lighting. Captain Obvious: ”*At the same light intensity, the polygon is illuminated most brightly when it is orthogonal to the light direction.*”\n\nLet us compare:\n\n![ ](./img/lesson2_light1.jpeg)\n\n![](./img/lesson2_light2.jpeg)\n\nWe get zero illumination if the polygon is parallel to the vector of light. To paraphrase: the intensity of illumination is equal to the scalar product of the light vector and the normal to the given triangle. The normal to the triangle can be calculated simply as the [cross product](https://en.wikipedia.org/wiki/Cross_product) of its two sides.\n\nAs a side note, at this course we will perform linear computations on the colors. However `(128,128,128)` color is not half as bright as `(255, 255, 255)`. We are going to ignore gamma correction and tolerate the incorrectness of the brightness of our colors.\n\n```csharp\nvar image = new Image (width, height, Format.BGR);\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\nforeach (var face in headModel.Faces) {\n    for (int i = 0; i < 3; i++) {\n        var vIndex = face.Vertices [i];\n        world [i] = headModel.Vertices [vIndex];\n        screen [i] = map (world [i]);\n    }\n\n    var n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n    var intensivity = Dot (n, light_dir);\n    if (intensivity > 0)\n        Triangle (image, screen, Color.White * intensivity);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson3.csx",
    "content": "using static Geometry;\n\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nfloat [] InitZBuffer (Image image)\n{\n\tvar zbuffer = new float [image.Width * image.Height];\n\tfor (int idx = 0; idx < zbuffer.Length; idx++)\n\t\tzbuffer [idx] = float.NegativeInfinity;\n\treturn zbuffer;\n}\n\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n\tvar ab = b - a;\n\tvar ac = c - a;\n\tvar pa = a - p;\n\n\tvar r = Cross (new Vec3f {\n\t\tx = ab.x,\n\t\ty = ac.x,\n\t\tz = pa.x\n\t}, new Vec3f {\n\t\tx = ab.y,\n\t\ty = ac.y,\n\t\tz = pa.y\n\t});\n\n\t// triangle is degenerate, in this case return smth with negative coordinates\n\t// dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n\tif ((int)r.z == 0)\n\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\treturn new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n\tVec3f t0 = coordinates [0];\n\tVec3f t1 = coordinates [1];\n\tVec3f t2 = coordinates [2];\n\n\tvar pMax = new Vec2i {\n\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t};\n\tvar pMin = new Vec2i {\n\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t};\n\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\tx = x + 0.5f,\n\t\t\t\ty = y + 0.5f\n\t\t\t};\n\t\t\tvar bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\tcontinue;\n\n\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\tvar u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n\t\t\tvar v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\tzbuffer [idx] = z;\n\n\t\t\t\tvar color = texture [u, v];\n\t\t\t\timage [x, y] = color * intensivity;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson3.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\nusing static Geometry;\n```\n\n# **Lesson 3: Hidden faces removal (z buffer)**\n\n# Introduction\n\nHello, let me introduce you my friend z-buffer of a black guy. He will help us get rid of the visual artifacts of the hidden faces removal we had during the last lesson.\n\n![](./img/lesson3_face1.png)\n\nBy the way, i'd like to mention that this model i use heavily in the course is created by [Vidar Rapp](https://se.linkedin.com/in/vidarrapp). He kindely granted me a permission to use it for teaching rendering basics and i vandalized it, but i promise you to give back the eyes to the guy.\n\nWell, back to the topic, in theory we could just draw all the triangles without discarding any. If we do it properly starting rear-to-front, the front facets will erase the back ones. It is called the [painter's algorithm](http://en.wikipedia.org/wiki/Painter%27s_algorithm). Unfortunately, it comes along with a high computational cost: for each camera movement we need to re-sort all the scene. And then there are dynamic scenes... And this is not even the main problem. The main problem is it is not always possible to determine the correct order.\n\n# **Let us try to render a simple scene**\n\nImagine a simple scene made of three triangles: the camera looks up-to-down, we project the colored triangles onto the white screen:\n\n![ ](./img/lesson3_scene1.png)\n\nThe render should look like this:\n\n![ ](./img/lesson3_scene2.png)\n\nBlue facet - is it behind or in front of the red one? The painter's algorithm does not work here. It is possible to split blue facet in two (one in front of the red facet and one behind). And then the one in front of the red one is to be split in two - one in front of the green triangle and one behind... I think you get the problem: in scenes with millions of triangles it is really expensive to compute. It is possible to use [BSP trees](https://en.wikipedia.org/wiki/Binary_space_partitioning) to get it done. By the way, this data structure is constant for moving camera, but it is really messy. And the life is too short to get it messy.\n\n# **Even simpler: let us lose a dimension. Y-buffer!**\n\nLet us lose a dimension for a while and to cut the above scene along the yellow plane:\n\n![ ](./img/lesson3_scene3.png)\n\nI mean, now our scene is made of three line segments (intersection of the yellow plane and each of the triangles), and the final render has a normal width but 1 pixel height:\n\n![ ](./img/lesson3_scene4.png)\n\nOur scene is two-dimensional, so it is easy to draw it using the line() function we programmed in the very first lesson.\n\n```csharp\nvar scene = new Image (800, 500, Format.BGR);\n\n// scene \"2d mesh\"\nLine(scene, new Vec2i {x=20, y=34}, new Vec2i {x=744, y=400}, Color.Red);\nLine(scene, new Vec2i {x=120, y=434}, new Vec2i {x=444, y=400}, Color.Green);\nLine(scene, new Vec2i {x=330, y=463}, new Vec2i {x=594, y=200}, Color.Blue);\n\n// screen line\nLine(scene, new Vec2i {x=10, y=10}, new Vec2i{x=790, y=10}, Color.White);\n\nscene.VerticalFlip(); // I want to have the origin at the left bottom corner of the image\nscene // This is how our 2D scene looks like if we look at it sideways:\n```\n\nLet us render it. Recall that the render is 1 pixel height. In my source code I create images 16 pixels height for the ease of reading on high resolution screens. `Rasterize()` function writes only in the first line of the image `render`\n\n```csharp\nvoid Rasterize(Image image, Vec2i p0, Vec2i p1, int[] ybuffer, Color color)\n{\n    if (p0.x>p1.x)\n        Swap(ref p0, ref p1);\n    \n    for (int x=p0.x; x<=p1.x; x++) {\n        float t = (x-p0.x)/(float)(p1.x-p0.x);\n        var y = (int)(p0.y*(1-t) + p1.y*t);\n        if (ybuffer[x] < y) {\n            ybuffer[x] = y;\n            image[x, 0] = color;\n        }\n    }\n}\n\nvar ybuffer = new int [width];\nfor (int i = 0; i < width; i++)\n    ybuffer[i] = int.MinValue;\n\nvar render = new Image (width, 16, Format.BGR);\nRasterize(render, new Vec2i{x=20,y=34}, new Vec2i{x=744, y=400}, ybuffer, Color.Red);\nRasterize(render, new Vec2i{x=120, y=434}, new Vec2i{x=444,y=400}, ybuffer, Color.Green);\nRasterize(render, new Vec2i{x=330, y=463}, new Vec2i{x=594,y=200}, ybuffer, Color.Blue);\n\nrender\n```\n\nIt is really-really simple: I iterate through all x-coordinates between `p0.x` and `p1.x` and compute the corresponding y-coordinate of the segment. Then I check what we got in our array `ybuffer` with current `x` index. If the current `y`-value is closer to the camera than the value in the `ybuffer`, then I draw it on the screen and update the `ybuffer`.\n\nLet us see it step-by-step. After calling `Rasterize()` on the first (red) segment this is our memory:\n\nscreen:![](./img/lesson3_rasterize1.png)\n\nybuffer: ![ ](./img/lesson3_rasterize2.png)\n\nHere the magenta color indicates the minus infinity, those are places corresponding to the screen we did not touch. All the rest is shown in the shades of gray: clear colors are close to the camera, dark colors far from the camera.\n\nThen we draw the green segment.\n\nscreen:![ ](./img/lesson3_rasterize3.png)\n\nybuffer:![ ](./img/lesson3_rasterize4.png)\n\nAnd finally the blue one.\n\nscreen:![ ](./img/lesson3_rasterize5.png)\n\nybuffer:![ ](./img/lesson3_rasterize6.png)\n\nCongratulations, we just drew a 2D scene on a 1D screen! Let us admire once again the render: ![ ](./img/lesson3_rasterize7.png)\n\n# Back to 3D\n\nSo, for drawing on a 2D screen the z-buffer must be two-dimensional:\n\n`var zbuffer = new int[width * height];`\n\nPersonally I pack a two-dimensional buffer into a one-dimensional, the conversion is trivial:\n\n`var idx = x + y* width;`\n\nand the back one:\n\n`var x = idx % width;`\\\n`var y = idx % width;`\n\nThen in the code I simply iterate through all the triangles and call the rasterizer function with current triangle and a reference to the z-buffer.\n\nThe only difficulty is how to compute the z-value of a pixel we want to draw. Let us recall how we computed the y-value in the y-buffer example:\n\n`int y = p0.y*(1-t) + p1.y*t;`\n\nWhat is the nature of the `t` variable? It turns out that `(1-t, t)` are barycentric coordinates of the point `(x,y)` with respect to the segment `p0, p1: (x,y) = p0*(1-t) + p1*t`. So the idea is to take the barycentric coordinates version of triangle rasterization, and for every pixel we want to draw simply to multiply its barycentric coordinates by the z-values of the vertices of the triangle we rasterize:\n\n```csharp\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - p;\n\n    var r = Cross (new Vec3f {\n        x = ab.x,\n        y = ac.x,\n        z = pa.x\n    }, new Vec3f {\n        x = ab.y,\n        y = ac.y,\n        z = pa.y\n    });\n\n    // triangle is degenerate, in this case return smth with negative coordinates\n    // dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n    if ((int)r.z == 0)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n    return new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D (t0), Project2D (t1), Project2D (t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n\nfloat [] InitZBuffer (Image image)\n{\n    var zbuffer = new float [image.Width * image.Height];\n    for (int idx = 0; idx < zbuffer.Length; idx++)\n        zbuffer [idx] = float.NegativeInfinity;\n    return zbuffer;\n}\n\nvar image = new Image(width, height, Format.BGR);\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*(image.Width-1)/2 + 0.5f),\n    y = (int)((v.y+1)*(image.Height-1)/2 + 0.5f),\n    z = v.z\n};\n\nvar zbuffer = InitZBuffer(image);\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = headModel.Vertices[vIndex];\n        screen[i] = map(world[i]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, Color.White * intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Okay, we just interpolated the z-values. What else can we do?\n\nTexture!\n\nIn the `.obj` file we have lines starting with `vt u v`, they give an array of texture coordinates. The number in the middle (between the slashes) in the facet lines\\\n`f x/x/x x/x/x x/x/x` are the texture coordinates of this vertex of this triangle. Interpolate it inside the triangle, multiply by the width-height of the texture image and you will get the color to put in your render.\n\n```csharp\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n            var v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n\n                var color = texture [u, v];\n                image [x, y] = color * intensivity;\n            }\n        }\n    }\n}\n\nvar image = new Image(width, height, Format.BGR);\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nFunc<Vec3f, Vec2f> uvMap = v => new Vec2f {\n    x = v.x * (headTexture.Width - 1),\n    y = v.y * (headTexture.Height - 1)\n}; \n\nvar zbuffer = InitZBuffer(image);\nvar uv = new Vec2f[3];\nvar model = headModel;\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson4.csx",
    "content": "Vec2f[] uv = new Vec2f [3];\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n\tx = v.x * (texture.Width - 1),\n\ty = v.y * (texture.Height - 1)\n};\n\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n\tvar depth = 255f;\n\n\tvar m = Matrix4.Identity ();\n\tm [0, 3] = x + w / 2f;\n\tm [1, 3] = y + h / 2f;\n\tm [2, 3] = depth / 2f;\n\n\tm [0, 0] = w / 2f;\n\tm [1, 1] = h / 2f;\n\tm [2, 2] = depth / 2f;\n\treturn m;\n}\n\nMatrix4 Projection (float coeff)\n{\n\tvar projection = Matrix4.Identity ();\n\tprojection [3, 2] = coeff;\n\treturn projection;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson4.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 4: Perspective projection**\n\n# The goal\n\nIn previous lessons we rendered our model in orthographic projection by simply forgetting the z-coordinate. The goal for today is to learn how to draw in perspective:\n\n![  ](./img/lesson4_the_goal.png)\n\n# 2D geometry: Linear transformations\n\nA linear transformation on a plane can be represented by a corresponding matrix. If we take a point `(x,y)` then its transformation can be written as follows:\n\n![  ](./img/lesson4_formula1.svg)\n\nThe simplest (not degenerate) transformation is the identity, it does not move any point:\n\n![  ](./img/lesson4_formula_2d_identity.svg)\n\nDiagonal coefficients of the matrix give scaling along coordinate axes. Let us illustrate it, if we take the following transformation:\n\n![  ](./img/lesson4_formula_2d_scale.svg)\n\nThen the white object (the white square with one corner chopped) will be transformed into the yellow one. Red and green line segments give unit length vectors aligned with `x` and `y`, respectively. All the images for this article were generated using this code:\n\n```csharp\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n\nMatrix4 Projection (float coeff)\n{\n    var projection = Matrix4.Identity ();\n    projection [3, 2] = coeff;\n    return projection;\n}\n\nVec4f Embed4D (Vec3f v, float fill = 1)\n{\n    return new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n}\n\nVec3f Project3D (Vec4f v)\n{\n    return new Vec3f { x = v.x, y = v.y, z = v.z };\n}\n\nFunc<Vec4f, Vec3f> map = v => Project3D(v/v.h);\nvoid RenderAxes (Image image)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n\n    // draw the axes\n    var x = new Vec3f { x = 1 };\n    var y = new Vec3f { y = 1 };\n    var o = new Vec3f ();\n    o = map(Mult(vp, Embed4D(o)));\n    x = map(Mult(vp, Embed4D(x)));\n    y = map(Mult(vp, Embed4D(y)));\n    Line(image, o, x, Color.Red);\n    Line(image, o, y, Color.Green);\n}\n\nvar cube = Model.FromFile(\"obj/cube.obj\");\nvoid RenderCube(Image image, Matrix4 deformation, Color color)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n    var face = cube.Faces[0];\n    var faceLen = face.Vertices.Length;\n\n    for(int j=0; j<faceLen; j++) {\n        var wp0 = cube.Vertices[face.Vertices [j]];\n        var wp1 = cube.Vertices[face.Vertices [(j+1) % faceLen]];\n\n        var sp0 = map(Mult(vp*deformation, Embed4D(wp0)));\n        var sp1 = map(Mult(vp*deformation, Embed4D(wp1)));\n        Line(image, sp0, sp1, color);\n    }\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Zoom(1f), color: Color.White);\n// draw the deformed model\nRenderCube(image, deformation: Matrix4.Zoom(1.5f), color: Color.Yellow); \n\nimage.VerticalFlip ();\nimage\n```\n\nWhy do we bother with matrices? Because it is handy. First of all, in matrix form we can express a transformation of the entire object like this:\n\n![  ](img/lesson4_formula_2d_scale32.svg)\n\nIn this expression the transformation matrix is the same as in the previous one, but the 2x5 matrix is nothing else but the vertices of our squarish object. We simply took all the vertices in an array, multiplied it by the transformation matrix and obtained the transformed object. Cool, is not it?\n\nWell, the true reason hides here: very, very often we wish to transform our object with many transformations in a row. Imagine that in your source code you write transformation functions like:\n\n```csharp\n// vec2 foo(vec2 p) return vec2(ax+by, cx+dy);\n// vec2 bar(vec2 p) return vec2(ex+fy, gx+hy);\n// [..]\n// for (each p in object) {\n//     p = foo(bar(p));\n// }\n```\n\nThis code performs two linear transformations for each vertex of our object, and often we count those vertices in millions. And tens of transformations in a row is not a rare case, resulting in tens millions of operations, really expensive. In matrix form we can pre-multiply all the transformation matrices and to transform our object one time. For an expression with multiplications only we can put parentheses where we want, can we?\n\nOkay, let us continue. We know that diagonal coefficients of the matrix scale our world along the coordinate axes. What other coefficients are responsible for? Let us consider the following transformation:\n\n![  ](./img/lesson4_formula_2d_tr_example1.svg)\n\nHere is its action on our object:\n\n```csharp\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Identity(), color: Color.White);\n\nvar deformation = Matrix4.Identity ();\ndeformation[0, 1] = 1/3f;\nRenderCube(image, deformation, Color.Yellow); // draw the deformed model\n\nimage.VerticalFlip();\nimage\n```\n\nIt is a simple shearing along the x-axis. Another anti-diagonal element shears our space along the y-axis. Thus, there are two base linear transformations on a plane: scaling and shearing. Many readers react: wait, what about rotations?!\n\nIt turns out that any rotation (around the origin) can be represented as a composite action of three shears, here the white object is transformed to the red one, then to the green one and finally to the blue:\n\n![](./img/lesson4_formula_rotation.png)\n\nBut those are intricate details, to keep the things simple, a rotation matrix can be written directly (do you remember the pre-multiplication trick?):\n\n![  ](img/lesson4_formula_rotation.svg)\n\nWe can multiply the matrices in any order, but let us remember that the multiplication for matrices is not commutative:\n\n![  ](img/lesson4_formula_noncomutative.svg)\n\nIt makes sense: to shear an object and then to rotate it is not the same as to rotate it and then to shear it!\n\n```csharp\nfloat DegToRad (float degAngle)\n{\n    return degAngle * (float)Math.PI / 180;\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nvar angle = DegToRad(30);\n\nvar rotation = Matrix4.RotationZ(angle);\nvar shear = Matrix4.Identity ();\nshear[0, 1] = 1/3f;\n\nRenderCube(image, deformation: rotation * shear, color: Color.Green);\nRenderCube(image, deformation: shear * rotation, color: Color.Red);\n\nimage.VerticalFlip();\nimage\n```\n\n# 2D affine transformations\n\nSo, any linear transformation on a plane is a composition of scale and shear transformations. And it means that we can do any linear transformation we want, the origin wont ever move! Those possibilities are great, but if we can not perform simple translations, our life will be miserable. Can we? Okay, translations are not linear, no problem, let us try to append translations after performing the linear part:\n\n![  ](./img/lesson4_formula_translation.svg)\n\nThis expression is really cool, we can rotate, we can scale, shear and translate. However. Let us recall that we are interested in composing multiple transformation, here is what a composition of two transformations look like (remember, we need to compose dozes of those?):\n\n![  ](./img/lesson4_formula_composition.svg)\n\nIt is starting to look ugly even for a single composition, add more and things get even worse.\n\n# Homogeneous coordinates\n\nOkay, now it is the time for the black magic. Imagine that i add one column and one row to our transformation matrix (thus making it 3x3) and append one coordinate always equal to 1 to our vector to be transformed:\n\n![  ](./img/lesson4_formula_3d.svg)\n\nIf we multiply this matrix and the vector augmented by 1 we get another vector with 1 in the last component, but the other two components have exactly the shape we would like! Magic.\n\nIn fact, the idea is really simple. Parallel translations are not linear in the 2D space. So we embed our 2D into 3D space (by simply adding 1 for the 3rd component). It means that our 2D space is the plane z=1 in the 3D space. Then we perform a linear 3D transformation and project the result onto our 2D physical plane. Parallel translations have not become linear, but the pipeline is simple.\n\nHow do we project 3D back onto the 2D plane? Simply by dividing by the 3d component:\n\n![  ](./img/lesson4_formula_project.svg)\n\n## Wait a second, it is forbidden to divide by zero!\n\nWho said this? \\[Shoots\\] Let us recall the pipeline:\n\n* We embed 2D into 3D by putting it inside the plane z=3\n\n* We do whatever we want in 3d\n\n* For every point we want to project from 3D into 2D we draw a straight line between the origin and the point to project and then we find its intersection with the plane z=1.\n\nIn this image our 2D plane is in magenta, the point `(x,y,z)` is projected onto `(x/z, y/z)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nLet us imagine a vertical rail through the point `(x,y,1)`. Where will be projected the point `(x,y,1)`? Doh, onto `(x,y)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nNow let us descend on the rail, for example, the point `(x,y,1/2)` is projected onto `(2x, 2y)`:\n\n![](./img/lesson4_sketch3.png)\n\nLet us continue, point `(x,y,1/4)` becomes `(4x, 4y)`:\n\n![](./img/lesson4_sketch4.png)\n\nIf we continue the process, approaching to `z=0`, then the projection goes farther from the origin in the direction `(x,y)`. In other words, point `(x,y,0)` is projected onto an infinitely far point in the direction `(x,y)`. What is it? Right, it is simply a vector!\n\nHomogeneous coordinates allow to distinguish between a vector and a point. If a programmer writes `vec2(x,y)`, is it a vector or a point? Hard to say. In homogeneous coordinates all things with `z=0` are vectors, all the rest are points. Look: `vector + vector = vector`. `vector - vector = vector`. `point + vector = point`. Great, is not it?\n\n## A composite transformation\n\nAs i said before, we should be able to accumulate dozens of transformations. Why? Let us imagine we need to rotate an object (2D) around a point `(x0,y0)`. How to do it? Well, we could look up for formulas somewhere, or we can do it by hand, we have all the tools we need!\n\nWe know to rotate around the origin, we know how to translate. It is all we need: translate `(x0,y0)` into the origin, rotate, un-translate, done:\n\n![  ](img/lesson4_formula_rotate_xy.svg)\n\nIn 3D sequences of actions will be a bit longer, but the idea is the same: we need to know few basic transformations and with their aid we can represent any composed action.\n\n# Wait a minute, may I touch this magical bottom row of the 3x3 matrix?\n\nSure thing! Let us apply the following transformation to our standard squarish object:\n\n![  ](./img/lesson4_matrix_third_line.svg)\n\nRecall that the original object is in white, unit axis vectors are in red and green:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nimage.VerticalFlip ();\nimage\n```\n\nHere is the transformed object:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\n\nvar deformation = Matrix4.Identity ();\ndeformation[3, 0] = -1/5f;\nRenderCube(image, deformation, color: Color.Red);\n\nimage.VerticalFlip ();\nimage\n```\n\nAnd here another kind of magic (white!) happens. Do you remember our y-buffer exercise? Here we will do the same: we project our 2D object onto the vertical line `x=0`. Let us harden the rules a bit: we have to use a central projection, our camera is in the point `(5,0)` and is pointed onto the origin. To find the projection we need to trace straight lines between the camera and the points to be projected (yellow) and to find the intersection with the screen line (white vertical).\n\n![  ](./img/lesson4_sketch5.png)\n\nNow i replace the original object with the transformed one, but i do not touch the yellow lines we drew before:\n\n![  ](./img/lesson4_sketch6.png)\n\nIf we project the red object onto the screen using **standard orthogonal projection**, then we find exactly the same points! Let us look closely how the transformation works: all vertical segments are transformed into vertical segments, but those close to the camera are stretched and those far from the camera are shrunk. If we choose the coefficient correctly (in our transformation matrix it is the -1/5 coefficient), we obtain an image in perspective (central) projection!\n\n# Time to work in full 3D\n\nLet us explain the magic. As for 2D affine transformations, for 3D affine transformations we will use homogeneous coordinates: a point `(x,y,z)` is augmented with 1`(x,y,z,1)`, then we transform it in 4D and project back to 3D. For example, if we take the following transformation:\n\n![  ](./img/lesson4_formula_4d_1.svg)\n\nThe retro-projection gives us the following 3D coordinages:\n\n![  ](./img/lesson4_formula_central_project.svg)\n\nLet us remember this result, but put it aside for a while. Let us return to the standard definition of the central projection, without any fancy stuff as 4D transformations. Given a point `P=(x,y,z)` we want to project it onto the plane z=0, the camera is on the z-axis in the point `(0,0,c)`:\n\n![](./img/lesson4_sketch7.png)\n\nTriangles ABC and ODC are similar. It means that we can write the following: |AB|/|AC|=|OD|/|OC| => x/(c-z) = x'/c. In other words:\n\n![ ](./img/lesson4_formula_x.svg)\n\nBy doing the same reasoning for triangles CPB and CP'D, it is easy to find the following expression:\n\n![](./img/lesson4_formula_y.svg)\n\nIt is really similar to the result we put aside few moments ago, but there we got the result by a single matrix multiplication. We got the law for the coefficient: `r = -1/c`\n\n# Let us sum up: the main formula for today\n\n*If you simply copy-paste this formula without understanding the above material, I hate you.*\n\nSo, if we want to compute a central projection with a camera **(important!) camera located on the z-axis with distance c from the origin**, then we embed the point into 4D by augmenting it with 1, then we multiply it with the following matrix, and retro-project it into 3D.\n\n![  ](./img/lesson4_formula_last.svg)\n\nWe deformed our object in a way, that simply forgetting its z-coordinate we will get a drawing in a perspective. If we want to use the z-buffer, then, naturally, do not forget the z:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\nvar camera = new Vec3f { z = 3 };\nvar projection = Projection(-1/camera.z);\nvar viewPort   = Viewport(width/8, height/8, width*3/4, height*3/4);\n\nFunc<Vec3f, Vec3f> map = v => {\n    var r4 = Mult (viewPort * projection, Embed4D (v));\n    var r = Project3D (r4 / r4.h);\n    r.x = (int)(r.x + 0.5f);\n    r.y = (int)(r.y + 0.5f);\n    return r;\n};\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n    x = v.x * (texture.Width - 1),\n    y = v.y * (texture.Height - 1)\n};\n\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nVec2f[] uv = new Vec2f [3];\n\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson5.csx",
    "content": "using static Geometry;\n\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n\tvar z = (eye - center).Normalize ();\n\tvar x = Cross (up, z).Normalize ();\n\tvar y = Cross (z, x).Normalize ();\n\n\tvar Minv = Matrix4.Identity ();\n\tMinv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n\tMinv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n\tMinv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n\tvar Tr = Matrix4.Identity ();\n\tTr [0, 3] = -center.x;\n\tTr [1, 3] = -center.y;\n\tTr [2, 3] = -center.y;\n\n\treturn Minv * Tr;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson5.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# Lesson 5: Moving the camera\n\n# Change of basis in 3D space\n\nIn Euclidean space coordinates can be given by a point (the origin) and a basis. What does it mean that point P has coordinates `(x,y,z)` in the frame `(O, i,j,k)`? It means that the vector OP can be expressed as follows:\n\n![  ](./img/lesson5_basis.svg)\n\nNow image that we have another frame `(O', i',j',k')`. How do we transform coordinates given in one frame to another? First of all let us note that since `(i,j,k)` and `(i',j',k')` are bases of 3D, there exists a (non degenerate) matrix M such that:\n\n![  ](./img/lesson5_new_basis.svg)\n\nLet us draw an illustration:\n\n![](./img/lesson5_sketch1.png)\n\nThen let us re-express the vector OP:\n\n![  ](./img/lesson5_change_basis1.svg)\n\nNow let us substitute `(i',j',k')` in the right part with the change of basis matrix:\n\n![  ](./img/lesson5_change_basis2.svg)\n\nAnd it gives us the formula to transform coordinates from one frame to another:\n\n![  ](./img/lesson5_change_basis3.svg)\n\n# Let us create our own gluLookAt\n\nOpenGL and, as a consequence, our tiny renderer are able to draw scenes **only with the camera located on the z-axis.** If we want to move the camera, no problem, we can move all the scene, leaving the camera immobile.\n\nLet us put the problem this way: we want to draw a scene with a camera situated in point **e**(eye), the camera should be pointed to the point **c** (center) in such way that a given vector **u**(up) is to be vertical in the final render.\n\nHere is an illustration:\n\n![  ](./img/lesson5_change_basis4.png)\n\n```csharp\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n    var z = (eye - center).Normalize ();\n    var x = Cross (up, z).Normalize ();\n    var y = Cross (z, x).Normalize ();\n\n    var Minv = Matrix4.Identity ();\n    Minv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n    Minv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n    Minv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n    var Tr = Matrix4.Identity ();\n    Tr [0, 3] = -center.x;\n    Tr [1, 3] = -center.y;\n    Tr [2, 3] = -center.y;\n\n    return Minv * Tr;\n}\n```\n\nNote that `z'` is given by the vector **`ce`** (do not forget to normalize it, it helps later). How do we compute `x'`? Simply by a cross product between **`u`** and **`z'`**. Then we compute `y'`, such that it is orthogonal to already calculated `x'` and `z'` (let me remind you that in our problem settings \\*\\*`ce` \\*\\*and **`u`** are not necessarily orthogonal). The very last step is a translation of the origin to the center **c** and our transformation matrix is ready. Now it suffices to get any point with coordinates `(x,y,z,1)` in the model frame, multiply it by the matrix ModelView and we get the coordinates in the camera frame! By the way, the name ModelView comes from OpenGL terminology.\n\n# Viewport\n\nIf you followed this course from the beginning, you should remember strange lines like this one:\n\n```csharp\n// x = (v.x+1)*(width-1)/2\n// y = (v.y+1)*(height-1)/2\n```\n\nWhat does it mean? It means that i have a point Vec2f v, it belongs to the square \\[-1,1\\]\\*\\[-1,1\\]. I want to draw it in the image of (width, height) dimensions. Value (v.x\\+1) is varying between 0 and 2, (v.x\\+1)/2 between 0 and 1, and (v.x\\+1)\\*width/2 sweeps all the image. Thus we effectively mapped the bi-unit square onto the image.\n\nBut now we are getting rid of these ugly constructs, and i want to rewrite all the computiations in the matrix form. Let us consider the following C# code:\n\n```csharp\n/*\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n*/\n```\n\nThis code creates this matrix:\n\n![  ](./img/lesson5_viewport.svg)\n\nIt means that the bi-unit cube \\[-1,1\\]*\\[-1,1\\]*\\[-1,1\\] is mapped onto the screen cube \\[0,w\\]*\\[0,h\\]*\\[0,d\\]. Right, cube, and not a rectangle, this is because of the depth computations with the z-buffer. Here d is the resolution of the z-buffer. I like to have it equal to 255 because of simplicity of dumping black-and-white images of the z-buffer for debugging.\n\nIn the OpenGL terminology this matrix is called viewport matrix.\n\n# Chain of coordinate transformations\n\nSo, let us sum up. Our models (characters, for example) are created in their own local frame (**object coordinates**). They are inserted into a scene expressed in **world coordinates**. The transformation from one to another is made with matrix **Model**. Then, we want to express it in the camera frame (**eye coordinates**), the transformation is called **View**. Then, we deform the scene to create a perspective deformation with **Projection** matrix (lesson 4), this matrix transforms the scene to so-called **clip coordinates**. Finally, we draw the scene, and the matrix transforming clip coordinates to the **screen coordinates** is called **Viewport**.\n\nAgain, if we read a point **v** from the .obj file, then to draw it on the screen it undergoes the following chain of transformations:\n\nViewport \\* Projection \\* View \\* Model \\* v\n\nAs i draw a single object only, the matrix Model is equal to identity, and i merged it with the matrix View:\n\n```csharp\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n// draw the model\nvar modelView  = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1/(eye-center).Norm());\n\nFunc<Vec3f, Vec3f> map = v => {\n\tvar r4 = Mult (viewPort * projection * modelView, Embed4D (v));\n\tvar r = Project3D (r4 / r4.h);\n\tr.x = (int)(r.x + 0.5f);\n\tr.y = (int)(r.y + 0.5f);\n\treturn r;\n};\n\nvar image = new Image(width, height, Format.BGR);\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Transformation of normal vectors\n\nThere is a widely-known fact:\n\n* If we have a model and its normal vectors are given by the artist AND this model is transformed with an affine mapping, then normal vectors are to be transformed with a mapping, equal to the transposition of the inverse matrix of the original mapping matrix\n\nWhat-what-what?! I met quite a few programmers who know this fact, but it remains a black magic for them. In fact, it is not so complicated. Take a pencil and draw a 2D triangle `(0,0)`, `(0,1)`, `(1,0)` and a vector **n**, normal to the hypothenuse. Naturally, **n** is equal to `(1,1)`. Then let us stretch all the y-coordinates by a factor of 2, leaving x-coordinates intact. Thus, our triangle becomes `(0,0)`, `(0,2)`, `(1,0)`. If we transform the vector **n** in the same way, it becomes `(1, 2)` and it is no longer orthogonal to the transformed edge of the triangle.\n\nThus, to remove all the black magic fog, we need to understand one simple thing: **we do not need to simply transform normal vectors (as they can become not normal anymore), we need to compute (new) normal vectors to the transformed model.**\n\nBack to 3D, we have a vector **n** = (A,B,C). We know that the plane passing through the origin and having **n** for its normal, has an equation `Ax+By+Cz=0`. Let us write it in the matrix form (i do it in homogeneous coordinates from the beginning):\n\n![  ](./img/lesson5_transform_normal1.png)\n\nRecall that `(A,B,C)` - is a vector, so we augment it with 0 when embedding into the 4D, and `(x,y,z)` is augmented with 1 since it is a point.\n\nLet us insert an identity matrix in between (inverse to M multiplied by M is equal to identity):\n\n![  ](./img/lesson5_transform_normal2.png)\n\nThe expression in right parentheses - are for the transformed points of the object. In the left - are for normal vectors to the transformed object! In standard convention we usually write coordinates as columns (please let us not raise all the stuff about contra- and co-variant vectors), so we can rewrite the previous expression as follows:\n\n![  ](./img/lesson5_transform_normal2.png)\n\nAnd the left parentheses tell us that a normal to the transformed object can be computed from the old normal by applying the inverse transpose matrix of the affine mapping.\n\nPlease note that if our transformation matrix M is a composition of uniform scalings, rotations and translations, then M is equal to its inverse transpose, since inverse and transpose are cancelling each other in this case. But since our matrices include perspective deformations, usually this trick does not help.\n\nIn the current code we do not use the transformation of normal vectors, but in the next lesson it will be very, very handy.\n\nHappy coding!\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson6.csx",
    "content": "using static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n\nvar diabloModel = Model.FromFile (\"obj/diablo3_pose.obj\");\nvar diabloTexture = Image.Load (\"obj/diablo3_pose_diffuse.tga\");\nvar diabloNormalMap = Image.Load (\"obj/diablo3_pose_nm.tga\");\nvar diabloTangentMap = Image.Load (\"obj/diablo3_pose_nm_tangent.tga\");\nvar diabloSpecularMap = Image.Load (\"obj/diablo3_pose_spec.tga\");\ndiabloTexture.VerticalFlip ();\ndiabloNormalMap.VerticalFlip ();\ndiabloTangentMap.VerticalFlip ();\ndiabloSpecularMap.VerticalFlip ();\n\nlight_dir = new Vec3f { x = 1, y = 1, z = 1 };\neye = new Vec3f { x = 1, y = 1, z = 3 };\ncenter = new Vec3f { x = 0, y = 0, z = 0 };\nup = new Vec3f { x = 0, y = 1, z = 0 };\n\nvar modelView = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1f/(eye-center).Norm());\n\ninterface IShader\n{\n\tVec4f Vertex (Face face, int nthvert);\n\tbool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n};\n\nclass RenderResult\n{\n\tpublic Image Image { get; set; }\n\tpublic float [] ZBuffer { get; set; }\n}\n\nRenderResult Render (Model model, IShader shader)\n{\n\tvar image = new Image (width, height, Format.BGR);\n\tvar zbuffer = InitZBuffer (image);\n\tvar screen_coords = new Vec4f [3];\n\n\tforeach (var face in model.Faces) {\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tscreen_coords [i] = shader.Vertex (face, i);\n\t\tTriangle (image, screen_coords, shader, zbuffer);\n\t}\n\n\treturn new RenderResult {\n\t\tImage = image,\n\t\tZBuffer = zbuffer\n\t};\n}\n\nvoid Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n{\n\tpMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n\tpMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n\tfor (int i = 0; i < 3; i++) {\n\t\tpMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n\t\tpMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n\t\tpMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n\t\tpMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n\t}\n}\n\nvoid Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n{\n\tVec2i pMin, pMax;\n\tBox (pts, out pMin, out pMax);\n\n\tColor color;\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n\t\t\tvar bc = Barycentric (Project2D (pts [0] / pts [0].h),\n\t\t\t\t\t\t\t\t  Project2D (pts [1] / pts [1].h),\n\t\t\t\t\t\t\t\t  Project2D (pts [2] / pts [2].h),\n\t\t\t\t\t\t\t\t  pixelCenter);\n\n\t\t\tvar z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n\t\t\tvar w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n\t\t\tvar frag_depth = z / w;\n\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n\t\t\t\tcontinue;\n\n\n\t\t\tvar fragment = new Vec3f { x = x, y = y, z = frag_depth };\n\t\t\tvar discard = shader.Fragment (fragment, bc, out color);\n\t\t\tif (!discard) {\n\t\t\t\tzbuffer [idx] = frag_depth;\n\t\t\t\timage [x, y] = color;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic class ShaderUtils\n{\n    public static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n    {\n        var v = model.Vertex (face, nthvert); // read the vertex from model\n        var glVertex = Embed4D (v);\n        return Mult (t, glVertex); // transform it to screen coordinates\n    }\n\n    public static void UpdateVarayingUV (Model model, Face face, int nthvert,\n                                         ref Vec3f varyingU, ref Vec3f varyingV)\n    {\n        var vt = model.GetUV (face, nthvert);\n        varyingU [nthvert] = vt.x;\n        varyingV [nthvert] = vt.y;\n    }\n\n    public static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n    {\n        return new Vec2f {\n            x = Dot (varU, bar),\n            y = Dot (varV, bar)\n        };\n    }\n\n    public static Color GetColor (Image texture, Vec2f uvf)\n    {\n        var uvi = CalcXY(texture, uvf);\n        return texture [uvi.x, uvi.y];\n    }\n\n    public static Vec3f Transform (Matrix4 t, Vec3f v)\n    {\n        var v4d = Mult (t, Embed4D (v));\n        return Project3D (v4d);\n    }\n\n    public static Vec3f Normal (Image normalMap, Vec2f uvf)\n    {\n        // RGB values as xyz. But Color stores data as BGR (zyx)\n        var c = GetColor (normalMap, uvf);\n\n        return new Vec3f {\n            x = (c [2] / 255f) * 2 - 1,\n            y = (c [1] / 255f) * 2 - 1,\n            z = (c [0] / 255f) * 2 - 1\n        };\n    }\n\n    public static float Specular (Image specularMap, Vec2f uvf)\n    {\n        var uvi = CalcXY (specularMap, uvf);\n        var color = specularMap [uvi.x, uvi.y];\n        return color[0];\n    }\n\n    public static Vec2i CalcXY (Image texture, Vec2f uvf)\n    {\n        return new Vec2i {\n            x = (int)(uvf.x * texture.Width),\n            y = (int)(uvf.y * texture.Height)\n        };\n    }\n}\n\nclass TextureShader : IShader\n{\n\treadonly Model model;\n\treadonly Vec3f lightDir;\n\treadonly Matrix4 transformation;\n\treadonly Image texture;\n\n\t// written by vertex shader, read by fragment shader\n\tVec3f varyingIntensity = new Vec3f ();\n\tVec3f varyingU = new Vec3f ();\n\tVec3f varyingV = new Vec3f ();\n\n\tpublic TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n\t{\n\t\tthis.model = model;\n\t\ttransformation = viewPort * projection * modelView;\n\t\tthis.lightDir = lightDir.Normalize ();\n\t\tthis.texture = texture;\n\t}\n\n\tpublic Vec4f Vertex (Face face, int nthvert)\n\t{\n\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n\t\tvar n = model.Normal (face, nthvert).Normalize ();\n\t\tvaryingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n\t\treturn TransformFace (model, face, nthvert, transformation);\n\t}\n\n\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t{\n\t\t// interpolate intensity for the current pixel\n\t\tvar intensity = Dot (varyingIntensity, bar);\n\n\t\t// interpolate uv for the current pixel\n\t\tvar uvf = CalcUV (varyingU, varyingV, bar);\n\n\t\tcolor = GetColor (texture, uvf) * intensity;\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson6.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 6: Shaders for the software renderer**\n\nRefactoring the source code. IShader.\n\n```csharp\ninterface IShader\n{\n    Vec4f Vertex (Face face, int nthvert);\n    bool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n};\n\nclass RenderResult\n{\n    public Image Image { get; set; }\n    public float [] ZBuffer { get; set; }\n}\n\nRenderResult Render (Model model, IShader shader)\n{\n    var image = new Image (width, height, Format.BGR);\n    var zbuffer = InitZBuffer (image);\n    var screen_coords = new Vec4f [3];\n\n    foreach (var face in model.Faces) {\n        for (int i = 0; i < 3; i++)\n            screen_coords [i] = shader.Vertex (face, i);\n        Triangle (image, screen_coords, shader, zbuffer);\n    }\n\n    return new RenderResult {\n        Image = image,\n        ZBuffer = zbuffer\n    };\n}\n\nvoid Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n{\n    pMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n    pMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n    for (int i = 0; i < 3; i++) {\n        pMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n        pMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n        pMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n        pMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n    }\n}\n\nvoid Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n{\n    Vec2i pMin, pMax;\n    Box (pts, out pMin, out pMax);\n\n    Color color;\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n            var bc = Barycentric (Project2D (pts [0] / pts [0].h),\n                                    Project2D (pts [1] / pts [1].h),\n                                    Project2D (pts [2] / pts [2].h),\n                                    pixelCenter);\n\n            var z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n            var w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n            var frag_depth = z / w;\n\n            var idx = x + y * image.Width;\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n                continue;\n\n\n            var fragment = new Vec3f { x = x, y = y, z = frag_depth };\n            var discard = shader.Fragment (fragment, bc, out color);\n            if (!discard) {\n                zbuffer [idx] = frag_depth;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n```\n\nLet us see how it works. The actual render code:\n\n* Parsing the .obj file\n\n* Iteration through all triangles of the model and rasterization of each triangle.\n\nThe last step is the most interesting. Outer loop iterates through all the triangles. Inner loop iterates through all the vertices of the current triangle and calls a vertex shader for each vertex.\n\n**The main goal of the vertex shader is to transform the coordinates of the vertices. The secondary goal is to prepare data for the fragment shader.**\n\nWhat happens after that? We call the rasterization routine. What happens inside the rasterizer we do not know (well, okay, we do know since we programmed it!) with one exception. We know that the rasterizer calls **our** routine for each pixel, namely, the fragment shader. Again, for each pixel inside the triangle the rasterizer calls our own callback, the fragment shader.\n\n**The main goal of the fragment shader - is to determine the color of the current pixel. Secondary goal - we can discard current pixel by returning true.**\n\nThe rendering pipeline for the OpenGL 2 can be represented as follows (in fact, it is more or less the same for newer versions too):\n\n![  ](./img/lesson6_opengl2_pipeline.png)\n\nBecause of the time limits I have for my course, I restrict myself to the OpenGL 2 pipeline and therefore to fragment and vertex shaders only. In newer versions of OpenGL there are other shaders, allowing, for example, to generate geometry on the fly.\n\nOkay, in the above image all the stages we can not touch are shown in blue, whereas our callbacks are shown in orange. In fact, our render code - is the \\*\\*primitive processing \\*\\*routine. It calls the vertex shader. We do not have primitive assembly here, since we are drawing dumb triangles only (in our code it is merged with the primitive processing). `Triangle` function - is the **rasterizer**, for each point inside the triangle it calls the **fragment shader**, then performs depth checks (z-buffer) and such.\n\nThat is all. You know what the shaders are and now you can create your own shaders.\n\n# **My implementation of shaders shown on Gouraud shading**\n\nAccording to its name, it is a Gouraud shader. Here is the code:\n\n```csharp\nusing static ShaderUtils;\n\nclass GouraudShader : IShader\n{\n    readonly Model model;\n    readonly Vec3f lightDir;\n\n    // written by vertex shader, read by fragment shader\n    protected Vec3f varyingIntensity = new Vec3f ();\n\n    readonly Matrix4 transformation;\n\n    public GouraudShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n    {\n        this.model = model;\n        transformation = viewPort * projection * modelView;\n        this.lightDir = lightDir.Normalize ();\n    }\n\n    public virtual Vec4f Vertex (Face face, int nthvert)\n    {\n        var n = model.Normal (face, nthvert).Normalize ();\n        // get diffuse lighting intensity\n        varyingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir));\n        var d = Dot(n, lightDir);\n\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public virtual bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // interpolate intensity for the current pixel\n        var intensity = Dot (varyingIntensity, bar);\n        color = Color.White * intensity; // well duh\n        return false;\n    }\n}\n\n// set of utils which will be used in our shaders\nstatic class ShaderUtils\n{\n    public static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n    {\n        var v = model.Vertex (face, nthvert); // read the vertex from model\n        var glVertex = Embed4D (v);\n        return Mult (t, glVertex); // transform it to screen coordinates\n    }\n\n    public static void UpdateVarayingUV (Model model, Face face, int nthvert,\n                                         ref Vec3f varyingU, ref Vec3f varyingV)\n    {\n        var vt = model.GetUV (face, nthvert);\n        varyingU [nthvert] = vt.x;\n        varyingV [nthvert] = vt.y;\n    }\n\n    public static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n    {\n        return new Vec2f {\n            x = Dot (varU, bar),\n            y = Dot (varV, bar)\n        };\n    }\n\n    public static Color GetColor (Image texture, Vec2f uvf)\n    {\n        var uvi = CalcXY(texture, uvf);\n        return texture [uvi.x, uvi.y];\n    }\n\n    public static Vec3f Transform (Matrix4 t, Vec3f v)\n    {\n        var v4d = Mult (t, Embed4D (v));\n        return Project3D (v4d);\n    }\n\n    public static Vec3f Normal (Image normalMap, Vec2f uvf)\n    {\n        // RGB values as xyz. But Color stores data as BGR (zyx)\n        var c = GetColor (normalMap, uvf);\n\n        return new Vec3f {\n            x = (c [2] / 255f) * 2 - 1,\n            y = (c [1] / 255f) * 2 - 1,\n            z = (c [0] / 255f) * 2 - 1\n        };\n    }\n\n    public static float Specular (Image specularMap, Vec2f uvf)\n    {\n        var uvi = CalcXY (specularMap, uvf);\n        var color = specularMap [uvi.x, uvi.y];\n        return color[0];\n    }\n\n    public static Vec2i CalcXY (Image texture, Vec2f uvf)\n    {\n        return new Vec2i {\n            x = (int)(uvf.x * texture.Width),\n            y = (int)(uvf.y * texture.Height)\n        };\n    }\n}\n\nvar light_dir = new Vec3f { x = 1, y = 1, z = 1 };\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\nvar modelView = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1f/(eye-center).Norm());\n\nvar shader = new GouraudShader (headModel, viewPort, projection, modelView, light_dir);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n**vayring** is a reserved keyword in GLSL language, I have used VaryingIntensity as a name in order to show the correspondence. In varying variables we store data to be interpolated inside the triangle, and the fragment shaders get the interpolated value (for the current pixel).\n\nFragment routine is called for each pixel inside the triangle we draw; as an input it receives [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) for interpolation of VaryingXXX data. Thus, interpolated intensity can be computed as:\n\nVaryingIntensity\\[0\\]\\*bar\\[0\\] \\+ VaryingIntensity\\[1\\]\\*bar\\[1\\] \\+ VaryingIntensity\\[2\\]\\*bar\\[2\\]\n\nor simply as a dot product between two vectors: `Dot(VaryingIntensity,bar)`. In true GLSL, of course, fragment shaders receive ready interpolated values.\n\nNotice that the shader returns a bool value. It is easy to understand what it does if we look inside the updated rasterizer:\n\n```csharp\n/*\n...\nvar discard = shader.Fragment (fragment, bc, out color);\nif (!discard) {\n    zbuffer [idx] = frag_depth;\n    image [x, y] = color;\n}\n*/\n```\n\nFragment shader can discard drawing of the current pixel, then the rasterizer simply skips it. It is handy if we want to create binary masks or whatever you want.\n\nOf course, the rasterizer can not imagine all the weird stuff you could program, therefore it can not be pre-compiled with your shader. Here we use IShader interface as an intermediate between the two.\n\n# **First modification of the shaders**\n\nSimple modification of the Gourad shading, where the intensities are allowed to have 6 values only:\n\n```csharp\nclass GouraudShader6 : GouraudShader\n{\n    public GouraudShader6 (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n        : base (model, viewPort, projection, modelView, lightDir)\n    {\n    }\n\n    public override bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var intensity = Dot (varyingIntensity, bar);\n        if (intensity > 0.85f) intensity = 1;\n        else if (intensity > 0.60f) intensity = 0.80f;\n        else if (intensity > 0.45f) intensity = 0.60f;\n        else if (intensity > 0.30f) intensity = 0.45f;\n        else if (intensity > 0.15f) intensity = 0.30f;\n        else intensity = 0;\n        color = new Color (255, 155, 0) * intensity;\n        return false;\n    }\n}\n\nvar shader = new GouraudShader6 (headModel, viewPort, projection, modelView, light_dir);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Textures**\n\nI'll skip the [Phong shading](https://en.wikipedia.org/wiki/Phong_shading), but take a look at the article. Remember the homework assignment I gave you for texturing? We had to interpolate uv-coordinates.\n\n```csharp\nusing static ShaderUtils;\n\nclass TextureShader : IShader\n{\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 transformation;\n    readonly Image texture;\n\n    // written by vertex shader, read by fragment shader\n    Vec3f varyingIntensity = new Vec3f ();\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    public TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n    {\n        this.model = model;\n        transformation = viewPort * projection * modelView;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var n = model.Normal (face, nthvert).Normalize ();\n        varyingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // interpolate intensity for the current pixel\n        var intensity = Dot (varyingIntensity, bar);\n\n        // interpolate uv for the current pixel\n        var uvf = CalcUV (varyingU, varyingV, bar);\n\n        color = GetColor (texture, uvf) * intensity;\n        return false;\n    }\n}\n\nvar shader = new TextureShader (headModel, viewPort, projection, modelView, light_dir, headTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Normalmapping**\n\nOkay, now we have texture coordinates. What can we store in texture images? In fact, almost anything. It can be color, directions, temperature and so on. Let us load this texture:\n\n![  ](./img/lesson6_african_head_nm.png)\n\nIf we interpret RGB values as xyz directions, this image gives us normal vectors **for each pixel** of our render and not only per vertex as before.\n\nBy the way, compare this image to another one, it gives exactly the same information, but in another frame:\n\n![  ](./img/lesson6_african_head_nm_tangent.png)\n\nOne of the images gives normal vectors in global (Cartesian) coordinate system, another one in [Darboux frame](https://en.wikipedia.org/wiki/Darboux_frame) (so-called tangent space). In Darboux frame the z-vector is normal to the object, x - principal curvature direction and y - their cross product.\n\n**Exercise 1:** Can you tell which image is represented in Darboux frame and which one is in the global coordinate frame?\n\n**Exercise 2:** Can you tell which representation is better and if yes, why is that?\n\n**Uniform** is a reserved keyword in GLSL, it allows to pass constants to the shaders. Here I pass the matrix Projection\\*ModelView and its inverse transpose to transform the normal vectors (refer to the end of the lesson5). So, computation of the lighting intensity is the same as before with one exception: instead of interpolating normal vectors we retrieve the information from the normal mapping texture (do not forget to transform light vector and normal vectors).\n\n```csharp\nclass NormalMapShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public NormalMapShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n\n        var intensity = Math.Max (0f, Dot (n, l));\n        color = GetColor (texture, uv) * intensity;\n        return false;\n    }\n}\n\nvar headNormalMap = Image.Load (\"obj/african_head_nm.tga\");\nheadNormalMap.VerticalFlip ();\n\nvar shader = new NormalMapShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Specular mapping**\n\nOkay, let us continue the fun. All the computer graphics science is the art to cheat. To (cheaply) trick the eye we use the [Phong's approximation](https://en.wikipedia.org/wiki/Phong_reflection_model) of the lighting model. Phong proposed to consider the final lighting as a (weighted) sum of three light intensities: ambient lighting (constant per scene), diffuse lighting (the one we computed up to this moment) and specular lighting.\n\nTake a look at the following image, it speaks for itself:\n\n![  ](./img/lesson6_phong.png)\n\nWe compute diffuse lighting as a cosine of the angle between the normal vector and the light direction vector. I mean, this supposes that the light is reflected in all directions uniformly. What happens to glossy surfaces? In the limit case (mirror) the pixel is illuminated if and only if we can see the light source reflected by this pixel:\n\n![  ](./img/lesson6_reflection.png)\n\nFor diffuse lighting we computed the (cosine of) angle between vectors **n** and **l**, and now we are interested in the (cosine of) angle between vectors **r** (reflected light direction) and **v**(view direction).\n\n**Exercise 3:** Given vectors **n** and **l**, find vector **r**.\n\n*Answer:* If **n** and **l** are normalized, then **r** = 2**n**<**n**,**l**> - **l**\n\nFor diffused lighting we computed the light intensity as the cosine. But a glossy surface reflects in one direction much more than in others! Okay then, what happens if we take tenth power of the cosine? Recall that all numbers inferior to 1 will decrease when we apply the power. It means that tenth power of the cosine will give smaller radius of the reflected beam. And hundredth power **much** smaller beam radius. This power is stored in a special texture (specular mapping texture) that tells for each point if it is glossy or not.\\\n\\\nI think that i do not need to comment anything in the below code at the exception of coefficients: `5 + color [i] * (diff + 1.3f * specular)`\n\nI took 5 for the ambient component, 1 for the diffuse component and 1.3 for the specular component. What coefficients to choose - is your choice. Different choices give different appearances for the object. Normally it is for the artist to decide.\n\n*Please note that normally the sum of the coefficents must be equal to 1, but you know. I like to create light.*\n\n```csharp\nclass SpecularShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n    readonly Image specularMap;\n\n    public SpecularShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap, Image specularMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n        this.specularMap = specularMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n\n        var r = (n * (2 * Dot (n, l)) - l).Normalize ();\n\n        var diff = Math.Max (0f, Dot (n, l));\n        var specular = Math.Pow (Math.Max (0f, r.z), Specular (specularMap, uv) + 15);\n\n        color = GetColor (texture, uv);\n\n        int v = 0;\n        for (int i = 0; i < 4; i++)\n            v = (v << 8) | (byte)Math.Min (255, (int)(5 + color [i] * (diff + 1.3f * specular)));\n        color = new Color (v, color.format);\n\n        return false;\n    }\n}\n\nvar headSpecularMap = Image.Load (\"./obj/african_head_spec.tga\");\nvar shader = new SpecularShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap, headSpecularMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n```csharp\nvar diabloModel = Model.FromFile (\"obj/diablo3_pose.obj\");\nvar diabloTexture = Image.Load (\"obj/diablo3_pose_diffuse.tga\");\nvar diabloNormalMap = Image.Load (\"obj/diablo3_pose_nm.tga\");\nvar diabloTangentMap = Image.Load (\"obj/diablo3_pose_nm_tangent.tga\");\nvar diabloSpecularMap = Image.Load (\"obj/diablo3_pose_spec.tga\");\ndiabloTexture.VerticalFlip ();\ndiabloNormalMap.VerticalFlip ();\ndiabloTangentMap.VerticalFlip ();\ndiabloSpecularMap.VerticalFlip ();\n\nvar shader = new SpecularShader (diabloModel, viewPort, projection, modelView, light_dir, diabloTexture, diabloNormalMap, diabloSpecularMap);\n\nvar image = Render (diabloModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Conclusion**\n\nWe know how to render quite nice scenes, but our lighting is far from being real. In the next articles I will talk about shadows.\n\nEnjoy!"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson6bis.csx",
    "content": "using static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n\n    readonly Matrix4 transformation;\n    readonly Vec3f[] ndcTri = new Vec3f[3];     // triangle in normalized device coordinates\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        ndcTri[nthvert] = Project3D (glVertex / glVertex.h);\n\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        var A = new Matrix3 ();\n        A.SetRow (0, ndcTri [1] - ndcTri [0]);\n        A.SetRow (1, ndcTri [2] - ndcTri [0]);\n        A.SetRow (2, bn);\n\n        var AI = Inverse (A);\n        var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n        var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n\n        var B = new Matrix3 ();\n        B.SetColumn (0, i.Normalize ());\n        B.SetColumn (1, j.Normalize ());\n        B.SetColumn (2, bn);\n\n        var n = Mult (B, Normal (normalMap, uv)).Normalize ();\n\n        var l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (n, l));\n\n        color = GetColor (texture, uv) * diff;\n        return false;\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/lesson6bis.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\n#load \"lesson6.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n```\n\n# Lesson 6bis: tangent space normal mapping\n\nThe subject for today is [normal mapping](https://en.wikipedia.org/wiki/Normal_mapping). What is the main difference between normal mapping and Phong shading? The key is the density of information we have. For Phong shading we use normal vectors given per vertex of triangle mesh (and interpolate it inside triangles), whereas normal mapping textures provide dense information, dramatically improving rendering details.\n\nWell, we have already applied normal mapping in previous lesson, however we used the global system of coordinates to store the texture. Today we are talking about [tangent space](https://en.wikipedia.org/wiki/Darboux_frame) normal mapping.\n\nSo, we have two textures, the left one is given in the global frame (direct transformation from RGB to XYZ normal), whereas the right one in the Darboux frame:\n\n![](./img/lesson6bis_nm.jpg)\n\nTo use right texture, for each pixel we draw we compute tangent space (Darboux) frame. In this basis one vector (usually z) is orthogonal to our surface, and two others give a plane tangent to the current point. Then we read a (perturbed) normal vector from our texture, transform its coordinates from Darboux frame to the global system coordinates and we are done. Usually normal maps provide small perturbations of normal vectors, thus textures are in dominant blue color.\n\nWell, why such a mess? Why not to use global system as we did before? Imagine we want to animate our model. For example, I took the black guy model and opened his mouth. It is obvious that normal vectors are to be modified.\n\n![  ](./img/lesson6bis_mouth.jpg)\n\nLeft image gives the head with open mouth, but unchanged (global frame) normal texture. Inspect closely the interior of the lower lip. The light coming directly to his face; when the mouth was closed the backside of the lower lip naturally was not lit. Now the mouth is open, but the lip is not lit... The right image was computed with tangent space normal mapping.\n\nTherefore, if we have an animated model, then for correct normal mapping in global frame we need to have one texture per frame of the animation, whereas tangent space deforms accordingly to the model and we need one texture only!\n\nHere is another example:\n\n![  ](./img/global_vs_tangent_diablo.jpg)\n\nThese are textures for the Diablo model. Notice that only one hand is drawn in the texture, and only one side of the tail. The artist used the same texture for both arms and for both sides of the tail. It means that in the global coordinate system I can provide normal vectors either for the left side of the tail, either for the right one, but not for both! Same goes for the arms. And I need different information for the left and the right sides, for example, inspect left and right cheekbones in the left image, naturally normal vectors are pointing in the opposite directions!\n\nLet us finish with the motivation section and go straight ahead to the computations.\n\n# **Starting point, Phong shading**\n\nOkay, here is the starting point. The shader is really simple, it is Phong shading.\n\n```csharp\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        Vec3f bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        Vec3f l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (bn, l));\n\n        color = GetColor (texture, uv);\n        color *= diff;\n\n        return false;\n    }\n}\n\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, headTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\nFor the educational and debugging purposes I am removing the skin texture and apply a regular grid with horizontal red and vertical blue lines:\n\n```csharp\nvar gridTexture = Image.Load (\"obj/grid.tga\");\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, gridTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\nLet us remember how Phong shading works:\n\n![  ](./img/lesson6bis_triangle.png)\n\nFor each vertex of a triangle we have its coordinates p, texture coordinates uv and normal vectors. For shading current fragment our software rasterizer gives us barycentric coordinates of the fragment (alpha, beta, gamma). It means that the coordinates of the fragment can be obtained as p = alpha p0 \\+ beta p1 \\+ gamma p2. Then in the same way we interpolate texture coordinates and the normal vector:\n\n![ ](./img/lesson6bis_f00.png)\n\nNotice that blue and red lines are isolines of u and v, correspondingly. So, for each point of our surface we define a so-called Darboux frame, with x and y axes parallel to blue and red lines, and z axis orthogonal to the surface. This is the frame where tangent space normal map lives.\n\n# **How to reconstruct a (3D) linear function from three samples**\n\nOkay, so our goal is to compute three vectors (tangent basis) for each pixel we draw. Let us put that aside for a while and imagine a linear function f that for each point (x,y,z) gives a real number f(x,y,z) = Ax \\+ By \\+ Cz \\+ D. The only problem that we do not know A, B, C and D, however we do know three values of the function at three different points of the space (p0, p1, p2):\n\n![  ](./img/lesson6bis_f01.png)\n\n![  ](./img/lesson6bis_gradient_a.png)\n\nIt is convenient to imagine f as a height map of an inclined plane. We fix three different (non collinear) points on the plane and we know values of f in those points. Red lines inside the triangle show the iso-heights f0, f0 \\+ 1 meter, f0 \\+ 2 meters and so on. For a linear function we have the isolines are parallel (straight) lines.\n\nIn fact, I am more interested in the direction, orthogonal to the isolines. If we move along an iso, the height does not change (well duh, it is an iso!). If we deviate a little bit from an iso, the height starts to change a little bit. The steepest ascent we obtain when we move orthogonally to the isolines.\n\nLet us recall that the steepest ascent direction for a function is nothing else than its [gradient](https://en.wikipedia.org/wiki/Gradient). For a linear function f(x,y,z) = Ax \\+ By \\+ Cz \\+ D its gradient is a constant vector (A, B, C). Recall that we do not know the values of (A,B,C). We know only three samples of the function. Can we reconstruct A,B and C? Sure thing.\n\nSo, we have three points p0, p1, p2 and thre values f0, f1, f2. We need to find the vector of the steepest ascent (A,B,C). Let us consider another function defined as g(p) = f(p) - f(p0):\n\n![  ](./img/lesson6bis_gradient_b.png)\n\nObviously that we simply translated our inclined plane, without changing its inclination, therefore the steepest ascent direction for f and g is the same.\n\nLet us rewrite the definition of g:\n\n![  ](./img/lesson6bis_f02.png)\n\nPlease note that superscript x in p^x means x coordinate of the point p and not a power. So, the function g is simply a dot product between vector (p-p0) and (ABC). And we still do not know (A,B,C)!\n\nOkay, let us recall what we know. We know that if we go from point p0 to point p2, then the function g will go from zero to f2-f0. In other words, the dot product between vectors (p2-p0) and (ABC) is equal to f2-f0. Same thing for (p1-p0). Therefore, we are looking for the vector ABC, orthogonal to the normal n and respecting two constraints on dot products:\n\n![  ](./img/lesson6bis_f03.png)\n\nLet us rewrite this in a matrix form:\n\n![  ](./img/lesson6bis_f04.png)\n\nSo, we got an easy to solve linear matrix equation Ax = b:\n\n![  ](./img/lesson6bis_f05.png)\n\nPlease note that I used the letter A for two different things, the meaning should be clear from the context. So, our 3x3 matrix A, multiplied with the unknown vector x=(A,B,C), gives the vector b = (f1-f0, f2-f0, 0). Unknown vector x becomes known when we multiply inverse to A by b.\n\nAlso note that in the matrix A we have nothing related to the function f. It contains only some information about our triangle.\n\n# **Let us compute Darboux basis and apply the perturbation of normals**\n\nSo, Darboux basis is a triplet of vectors (i,j,n), where n - is the original normal vector, and i, j can be computed as follows:\n\n![  ](./img/lesson6bis_f06.png)\n\nUsing the normal maps in the tangent space.\n\n```csharp\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n\n    readonly Matrix4 transformation;\n    readonly Vec3f[] ndcTri = new Vec3f[3];     // triangle in normalized device coordinates\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        ndcTri[nthvert] = Project3D (glVertex / glVertex.h);\n\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        var A = new Matrix3 ();\n        A.SetRow (0, ndcTri [1] - ndcTri [0]);\n        A.SetRow (1, ndcTri [2] - ndcTri [0]);\n        A.SetRow (2, bn);\n\n        var AI = Inverse (A);\n        var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n        var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n\n        var B = new Matrix3 ();\n        B.SetColumn (0, i.Normalize ());\n        B.SetColumn (1, j.Normalize ());\n        B.SetColumn (2, bn);\n\n        var n = Mult (B, Normal (normalMap, uv)).Normalize ();\n\n        var l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (n, l));\n\n        color = GetColor (texture, uv) * diff;\n        return false;\n    }\n}\n```\n\nAll is quite straightforward, I compute the matrix A:\n\n```csharp\n// var A = new Matrix3 ();\n// A.SetRow (0, ndcTri [1] - ndcTri [0]);\n// A.SetRow (1, ndcTri [2] - ndcTri [0]);\n// A.SetRow (2, bn);\n```\n\nThen compute two unknown vectors (i,j) of Darboux basis:\n\n```csharp\n// var AI = Inverse (A);\n// var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n// var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n```\n\nOnce we have all the tangent basis, I read the perturbed normal from the texture and apply the basis change from the tangent basis to the global coordinates. Recall that I have already described how to perform change of basis.\n\nHere is the final rendered image, compare the details with Phong shading:\n\n```csharp\nvar headTangentMap = Image.Load (\"obj/african_head_nm_tangent.tga\");\nheadTangentMap.VerticalFlip ();\n\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headTangentMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Were you paying attention?**\n\nHave you noticed that generally a (flat) triangle has a constant normal vector, whereas I used the interpolated normal in the last row of the matrix A? Why did I do it?\n\nHappy coding!"
  },
  {
    "path": "graphics/tiny-renderer/lesson7.workbook/obj/diablo3_pose.obj",
    "content": "v 0.11526 0.700717 0.0677257\nv 0.114223 0.654606 0.0821706\nv 0.119952 0.67202 0.101202\nv 0.12069 0.712368 0.0932415\nv 0.120409 0.670105 0.118388\nv 0.103434 0.63749 0.102854\nv 0.0998313 0.642305 0.121165\nv 0.113204 0.661161 0.119513\nv 0.110674 0.71474 0.118248\nv 0.114329 0.673286 0.128141\nv 0.0938038 0.672987 0.125628\nv 0.0910976 0.702896 0.120497\nv 0.107546 0.664288 0.12793\nv 0.116526 0.652831 0.0186975\nv 0.122606 0.631867 0.0339156\nv 0.123238 0.584561 0.0390644\nv 0.113679 0.582153 0.0698344\nv 0.107247 0.593611 0.124012\nv 0.099392 0.618107 0.132025\nv 0.0519629 0.664482 0.148508\nv 0.056813 0.67065 0.139722\nv 0.0671458 0.660001 0.134186\nv 0.0799037 0.658226 0.13039\nv 0.0872667 0.645679 0.131726\nv 0.0690261 0.645978 0.151671\nv 0.0731557 0.627719 0.151074\nv 0.0524549 0.654325 0.16232\nv 0.0402945 0.655625 0.166186\nv 0.0399431 0.667873 0.157259\nv 0.0514006 0.648069 0.163058\nv 0.0395565 0.644343 0.164429\nv 0.0403297 0.634327 0.163322\nv 0.048132 0.610076 0.154571\nv 0.021597 0.677468 0.15559\nv 0.0424033 0.672267 0.161494\nv 0.0551611 0.669385 0.152479\nv 0.0324219 0.694391 0.157312\nv 0.0500123 0.692264 0.158015\nv 0.0621024 0.681106 0.149088\nv 0.042087 0.725178 0.149141\nv 0.0617158 0.711489 0.15088\nv 0.0706604 0.695445 0.133782\nv 0.0129512 0.710365 0.135873\nv 0.0267634 0.736074 0.134696\nv 0.0996029 0.759463 0.122043\nv 0.127526 0.758813 0.113749\nv 0.0634907 0.787228 0.117404\nv 0.0781113 0.602994 0.15624\nv 0.0661442 0.626208 0.15269\nv 0.0892525 0.572418 0.146698\nv 0.0501705 0.601641 0.155028\nv 0.0637543 0.593944 0.162443\nv 0.0649668 0.641321 0.158156\nv 0.0678663 0.629969 0.156521\nv 0.0497663 0.643588 0.152233\nv 0.0475697 0.626384 0.148209\nv 0.0605209 0.610199 0.15566\nv 0.0599761 0.626419 0.15429\nv 0.0643869 0.628457 0.153182\nv 0.0578146 0.640741 0.152849\nv 0.0813095 0.813025 0.103117\nv 0.135047 0.790409 0.0950163\nv 0.116789 0.817945 0.0520332\nv 0.0892876 0.821565 0.0596598\nv 0.0257091 0.775507 0.125488\nv 0.0636313 0.679507 0.139194\nv 0.0781289 0.671792 0.13872\nv 0.0878993 0.595034 0.00293464\nv 0.116772 0.566636 0.0537026\nv 0.114417 0.562155 0.0744385\nv 0.128176 0.558166 0.0246547\nv 0.107194 0.567445 0.09651\nv 0.0944716 0.545496 0.110902\nv 0.0712403 0.535304 0.117264\nv 0.112431 0.54474 0.087214\nv 0.0971602 0.533775 0.0882684\nv 0.0731382 0.524128 0.0962816\nv 0.106368 0.520964 0.0665483\nv 0.099392 0.514164 0.0756159\nv 0.0780586 0.512283 0.0791129\nv 0.1141 0.533037 0.0671107\nv 0.115436 0.533582 0.0411731\nv 0.115752 0.527449 0.0417179\nv 0.114469 0.546304 0.0516993\nv 0.102151 0.525076 0.0562506\nv 0.0970021 0.503198 0.0402242\nv 0.100605 0.498208 0.054177\nv 0.0863529 0.491407 0.0541595\nv 0.0949988 0.486943 0.0309282\nv 0.0732963 0.583559 0.000140556\nv 0.0795522 0.555653 0.0176783\nv 0.0874073 0.557569 0.0307173\nv 0.0843848 0.502601 0.03439\nv 0.0989175 0.529927 0.0420342\nv 0.0913612 0.482164 0.025094\nv 0.0906759 0.48197 0.0349172\nv 0.00242505 0.842706 0.085773\nv -0.0105613 0.872456 0.0789021\nv -0.0279935 0.869416 0.0666186\nv -0.0107546 0.825273 0.0714863\nv -0.00999895 0.80039 0.118951\nv -0.0275542 0.855217 0.105806\nv 0.00233719 0.823744 0.11222\nv -0.0122131 0.863705 0.0988999\nv -0.039451 0.902576 0.0606087\nv -0.00137068 0.808351 0.0664078\nv 0.0207008 0.806207 0.0844902\nv 0.0138474 0.77795 0.120374\nv -0.00152884 0.759691 0.126718\nv -0.0331072 0.875532 0.0913612\nv 0.0211577 0.79605 0.104594\nv -0.226707 -0.278811 0.0844199\nv -0.164271 -0.310688 0.0763188\nv -0.190121 -0.154536 0.0547394\nv -0.115682 -0.174358 0.0460584\nv -0.102748 -0.13025 0.0384494\nv -0.268074 -0.269339 0.0650371\nv -0.243946 -0.149703 0.0212455\nv -0.189084 -0.00231963 -0.0608723\nv -0.259147 -0.376006 0.0909394\nv -0.140495 -0.0527185 0.0225987\nv -0.164921 -0.01086 -0.00980567\nv -0.129125 -0.0841915 0.0319474\nv -0.116754 -0.0240045 0.0389238\nv -0.120655 -0.0525252 0.0430183\nv -0.0982849 -0.162391 0.0430007\nv -0.203775 -0.406776 0.0984782\nv -0.145872 -0.436597 0.059484\nv -0.112062 -0.35411 0.0492742\nv -0.237813 -0.446297 0.116033\nv -0.20511 -0.499332 0.0841563\nv -0.272291 -0.426932 0.106158\nv -0.270692 -0.459635 0.163568\nv -0.233912 -0.504639 0.102661\nv -0.283362 -0.512406 0.0865638\nv -0.252293 -0.489931 0.130584\nv -0.29858 -0.454451 0.1128\nv -0.291674 -0.453854 0.139897\nv -0.284153 -0.488068 0.128897\nv -0.294415 -0.476822 0.0981619\nv -0.302639 -0.443292 0.0965276\nv -0.311004 -0.454768 0.12489\nv -0.320423 -0.453836 0.0878993\nv -0.311865 -0.403683 0.0613995\nv -0.328718 -0.434137 0.0385899\nv -0.328278 -0.278442 -0.00706431\nv -0.321495 -0.34311 0.0478333\nv -0.297754 -0.253506 -0.137736\nv -0.214301 -0.520314 0.0970899\nv -0.231346 -0.516958 0.105876\nv -0.24356 -0.52411 0.101887\nv -0.222419 -0.53743 0.100727\nv -0.238007 -0.537219 0.100323\nv -0.233315 -0.527818 0.121288\nv -0.226268 -0.536639 0.0605033\nv -0.180209 -0.502091 0.0646329\nv -0.2563 -0.52404 0.0890767\nv -0.278617 -0.532422 0.106368\nv -0.24739 -0.547007 0.0609426\nv -0.272256 -0.556567 0.0515938\nv -0.237128 -0.554546 -0.0027238\nv -0.329438 -0.473131 0.0214564\nv -0.328981 -0.486733 0.0608371\nv -0.307384 -0.510948 0.0583242\nv -0.214266 -0.520806 0.0641936\nv -0.209187 -0.532686 0.0775489\nv -0.210118 -0.541472 0.0516817\nv -0.18448 -0.526307 0.0144449\nv -0.202369 -0.52469 0.046691\nv -0.13995 -0.494078 -0.0121604\nv -0.076477 -0.16464 -0.246828\nv -0.215215 -0.18578 -0.218676\nv -0.177468 -0.0685341 -0.2912\nv -0.300513 -0.164886 -0.0611535\nv -0.328489 -0.511264 -0.0174498\nv -0.32754 -0.511071 0.0356377\nv -0.294732 -0.547429 -0.00166944\nv -0.313974 -0.486012 0.0562506\nv -0.113872 -0.083102 0.0324922\nv -0.0877061 -0.1322 0.0504868\nv -0.0748427 -0.168576 0.02896\nv -0.0878115 -0.13336 0.0293466\nv -0.106439 -0.0435104 0.0336695\nv -0.100411 -0.0729097 0.019664\nv -0.0763716 -0.204442 0.0280814\nv -0.155678 -0.252803 -0.213914\nv -0.270464 -0.298615 -0.174779\nv -0.227252 -0.0342143 -0.120321\nv -0.229097 -0.0836292 -0.207834\nv -0.0959301 -0.172671 -0.22314\nv -0.18571 -0.119987 -0.24421\nv -0.0694303 -0.201104 0.043317\nv -0.0647911 -0.227656 0.0175025\nv -0.0861948 -0.217271 0.0386778\nv -0.0703792 -0.219379 0.0386251\nv -0.099515 -0.241258 0.0468492\nv -0.0809229 -0.241837 0.0346185\nv -0.361825 -0.347046 -0.0517169\nv -0.356465 -0.383352 0.0123713\nv -0.365041 -0.413717 -0.0374302\nv -0.198011 -0.343672 -0.195164\nv -0.222542 -0.382104 -0.170984\nv -0.0891119 -0.308386 -0.115946\nv -0.0247777 -0.200436 -0.16942\nv -0.122096 -0.400907 -0.110357\nv -0.0774611 -0.32262 -0.0285383\nv -0.0899027 -0.36237 -0.0259375\nv -0.0697642 -0.274013 0.00676553\nv -0.126085 -0.453625 -0.0196289\nv -0.150986 -0.459249 -0.0810108\nv -0.343496 -0.37142 -0.228429\nv -0.232489 -0.383334 -0.251801\nv -0.17195 -0.413577 -0.222964\nv -0.319439 -0.410818 -0.323955\nv -0.242874 -0.411029 -0.323674\nv -0.300373 -0.419147 -0.372492\nv -0.241398 -0.423136 -0.377693\nv -0.280023 -0.359242 -0.238586\nv -0.336608 -0.363635 -0.116596\nv -0.341528 -0.467894 -0.310635\nv -0.376516 -0.419341 -0.17\nv -0.34021 -0.470987 -0.359734\nv -0.356922 -0.494693 -0.23154\nv -0.3678 -0.432415 -0.235687\nv -0.3691 -0.469423 -0.118248\nv -0.337117 -0.518838 -0.136945\nv -0.268197 -0.578551 -0.134977\nv -0.192633 -0.538994 -0.0549854\nv -0.157927 -0.511422 -0.0755105\nv -0.170052 -0.525604 -0.152884\nv -0.146153 -0.481074 -0.182283\nv -0.185956 -0.440973 -0.312691\nv -0.281376 -0.36418 -0.154307\nv -0.159315 -0.374846 -0.160071\nv -0.177029 -0.419499 -0.142814\nv -0.207623 -0.455523 -0.380628\nv -0.20019 -0.524444 -0.379503\nv -0.332267 -0.533529 -0.224792\nv -0.27563 -0.574175 -0.229923\nv -0.175816 -0.507697 -0.257214\nv -0.293695 -0.535023 0.0562506\nv -0.0170808 -0.191808 -0.0932415\nv -0.0249886 -0.115858 -0.00550031\nv -0.0118968 -0.173286 -0.0372369\nv -0.216093 -0.549345 -0.141426\nv -0.23291 -0.571153 -0.356694\nv -0.211893 -0.551805 -0.242365\nv -0.213334 -0.49464 -0.477524\nv -0.24196 -0.540681 -0.524602\nv -0.222824 -0.433786 -0.46568\nv -0.322303 -0.541771 -0.514656\nv -0.347767 -0.520121 -0.487664\nv -0.280392 -0.547306 -0.527994\nv -0.286262 -0.580027 -0.331002\nv -0.335676 -0.543387 -0.345904\nv -0.371261 -0.533406 -0.419358\nv -0.324289 -0.469845 -0.50427\nv -0.359347 -0.47343 -0.451956\nv -0.242259 -0.468843 -0.513584\nv -0.328155 -0.438284 -0.464064\nv -0.274066 -0.472727 -0.520121\nv -0.268636 -0.418778 -0.47336\nv -0.26405 -0.676959 -0.365744\nv -0.223509 -0.587302 -0.461551\nv -0.229431 -0.689242 -0.390381\nv -0.217798 -0.629336 -0.456683\nv -0.244421 -0.666872 -0.48132\nv -0.27078 -0.728043 -0.425509\nv -0.283204 -0.679841 -0.483376\nv -0.276843 -0.784821 -0.410097\nv -0.244755 -0.72734 -0.414403\nv -0.238868 -0.781991 -0.378519\nv -0.24739 -0.767353 -0.363354\nv -0.241451 -0.720768 -0.382596\nv -0.268583 -0.7146 -0.363898\nv -0.251221 -0.79851 -0.377096\nv -0.273469 -0.798422 -0.39191\nv -0.263188 -0.827716 -0.377482\nv -0.25326 -0.811514 -0.363354\nv -0.282466 -0.829192 -0.392033\nv -0.274997 -0.828366 -0.372615\nv -0.275489 -0.81487 -0.357748\nv -0.239852 -0.749868 -0.402822\nv -0.257881 -0.783801 -0.405107\nv -0.234703 -0.689839 -0.458511\nv -0.328454 -0.660264 -0.488051\nv -0.367167 -0.637666 -0.455101\nv -0.388641 -0.741943 -0.435631\nv -0.376199 -0.631515 -0.395108\nv -0.400098 -0.749288 -0.367958\nv -0.383721 -0.823042 -0.261308\nv -0.341229 -0.632657 -0.35462\nv -0.362352 -0.751995 -0.321882\nv -0.42405 -0.853284 -0.300847\nv -0.350174 -0.740432 -0.472639\nv -0.374196 -0.81292 -0.477929\nv -0.319228 -0.757776 -0.318754\nv -0.282642 -0.767582 -0.344621\nv -0.337117 -0.824061 -0.251221\nv -0.378642 -0.839771 -0.211243\nv -0.346519 -0.841335 -0.204056\nv -0.384265 -0.849313 -0.179577\nv -0.353566 -0.852177 -0.173321\nv -0.398341 -0.84731 -0.154711\nv -0.351914 -0.850033 -0.14466\nv -0.403841 -0.868169 -0.125505\nv -0.359206 -0.872685 -0.119829\nv -0.407268 -0.896601 -0.109988\nv -0.428268 -0.941078 -0.0731733\nv -0.385618 -0.936808 -0.0554072\nv -0.427512 -0.988226 -0.0347064\nv -0.40834 -0.985977 -0.0265877\nv -0.418638 -1 -0.0334763\nv -0.409447 -0.922574 -0.0527537\nv -0.368555 -0.903806 -0.104699\nv -0.420114 -0.954082 -0.0233543\nv -0.420711 -0.984887 -0.0225108\nv -0.380716 -0.952641 -0.0529294\nv -0.34615 -0.890767 -0.143553\nv -0.322708 -0.865621 -0.209732\nv -0.305029 -0.838523 -0.25282\nv -0.394229 -0.880435 -0.21279\nv -0.40298 -0.884916 -0.172548\nv -0.339911 -0.878431 -0.173321\nv -0.340333 -0.942467 -0.116332\nv -0.372263 -0.974871 -0.0709767\nv -0.418111 -0.930781 -0.135627\nv -0.368063 -0.961059 -0.140565\nv -0.395266 -0.987225 -0.105613\nv -0.412768 -0.970864 -0.0551963\nv -0.405546 -0.98306 -0.078041\nv -0.434401 -0.949988 -0.0829438\nv -0.430183 -0.963326 -0.099269\nv -0.400661 -0.968861 -0.0308228\nv -0.415563 -0.977208 -0.0443539\nv -0.43173 -0.974168 -0.0451095\nv -0.224142 -0.382578 -0.183021\nv -0.280744 -0.362475 -0.179102\nv -0.344762 -0.376305 -0.133308\nv -0.175869 -0.418251 -0.162514\nv -0.151408 -0.46742 -0.0904298\nv -0.409061 -0.832689 -0.359452\nv -0.436527 -0.875479 -0.277827\nv -0.409078 -0.870471 -0.240203\nv -0.391171 -0.957931 -0.0474467\nv -0.428619 -0.95236 -0.0712403\nv -0.392612 -0.924736 -0.175588\nv -0.355446 -0.943785 -0.177661\nv -0.330826 -0.922803 -0.173795\nv -0.319826 -0.938302 -0.223263\nv -0.383246 -0.93419 -0.226075\nv -0.347784 -0.955277 -0.227568\nv -0.480494 -0.870594 -0.26296\nv -0.466014 -0.867518 -0.233859\nv -0.496784 -0.864953 -0.258479\nv -0.484782 -0.858591 -0.230099\nv -0.519383 -0.873036 -0.246775\nv -0.51021 -0.867501 -0.220557\nv -0.533916 -0.892402 -0.2382\nv -0.52476 -0.883633 -0.21532\nv -0.587987 -0.92753 -0.202176\nv -0.573015 -0.93013 -0.187977\nv -0.603399 -0.965013 -0.185112\nv -0.587759 -0.96807 -0.171968\nv -0.586863 -0.943134 -0.216779\nv -0.594753 -0.980635 -0.201314\nv -0.598478 -0.987506 -0.180719\nv -0.494025 -0.905792 -0.259076\nv -0.524075 -0.915598 -0.247777\nv -0.576249 -0.955312 -0.233332\nv -0.549134 -0.94679 -0.181686\nv -0.488437 -0.883668 -0.221137\nv -0.471251 -0.883334 -0.227797\nv -0.500105 -0.92268 -0.200366\nv -0.542315 -0.9693 -0.213774\nv -0.510175 -0.93665 -0.225196\nv -0.579254 -0.973834 -0.194496\nv -0.562577 -0.97654 -0.205005\nv -0.574913 -0.952009 -0.179278\nv -0.587583 -0.966858 -0.20931\nv -0.586318 -0.976945 -0.189242\nv -0.474519 -0.931536 -0.233244\nv -0.471128 -0.917724 -0.215742\nv -0.419358 -0.91319 -0.226532\nv -0.434822 -0.917548 -0.305978\nv -0.403086 -0.886515 -0.359224\nv -0.386269 -0.851984 -0.4263\nv -0.313341 -0.810829 -0.460127\nv -0.316188 -0.843602 -0.441131\nv -0.336397 -0.967947 -0.279725\nv -0.260763 -0.938847 -0.308069\nv -0.331336 -0.942554 -0.324307\nv -0.331266 -0.886444 -0.370506\nv -0.42948 -0.944575 -0.319878\nv -0.402225 -0.95707 -0.275103\nv -0.289021 -0.878203 -0.359347\nv -0.281288 -0.843813 -0.282975\nv -0.270323 -0.859347 -0.334481\nv -0.24479 -0.877289 -0.243893\nv -0.248199 -0.887095 -0.304731\nv -0.253963 -0.845781 -0.223509\nv -0.303676 -0.75029 -0.466717\nv -0.289108 -0.850455 -0.208502\nv -0.260588 -0.844603 -0.187889\nv -0.228816 -0.848575 -0.203423\nv -0.206727 -0.855376 -0.172688\nv -0.241908 -0.847099 -0.155889\nv -0.203898 -0.870436 -0.156785\nv -0.234949 -0.862159 -0.140811\nv -0.19541 -0.921221 -0.103943\nv -0.216146 -0.921098 -0.103697\nv -0.198591 -0.962798 -0.0907462\nv -0.213334 -0.965487 -0.0940499\nv -0.205005 -0.982515 -0.0964222\nv -0.188469 -0.935121 -0.118687\nv -0.196746 -0.973518 -0.107019\nv -0.22669 -0.884125 -0.210769\nv -0.20989 -0.902594 -0.18202\nv -0.244526 -0.94744 -0.12315\nv -0.259902 -0.893702 -0.160827\nv -0.264629 -0.859558 -0.181721\nv -0.263751 -0.886901 -0.173022\nv -0.23342 -0.952659 -0.161125\nv -0.195779 -0.953432 -0.152198\nv -0.238007 -0.917232 -0.176185\nv -0.212333 -0.960742 -0.113608\nv -0.223579 -0.965434 -0.138123\nv -0.22379 -0.944452 -0.106509\nv -0.197817 -0.949302 -0.126999\nv -0.21047 -0.968914 -0.104084\nv -0.240818 -0.908744 -0.186219\nv -0.307929 -0.903314 -0.210066\nv -0.240484 -0.924402 -0.250308\nv -0.278231 -0.957896 -0.25159\nv -0.268987 -0.933399 -0.223456\nv -0.0218079 -0.117158 0.00576388\nv -0.00451622 -0.172354 -0.017485\nv 0.0111588 -0.124943 0.00857553\nv 0.0238112 -0.188258 -0.0190665\nv -0.0554599 -0.00961236 0.0186623\nv -0.0614171 -0.0116157 0.0119144\nv -0.110744 -0.0432116 0.0195761\nv -0.0848944 0.0545812 0.00748601\nv 0.00130039 -0.0290304 0.0240924\nv 0.0115981 0.0488525 -0.00326856\nv -0.12735 -0.033775 0.0174498\nv -0.137437 0.00885669 0.00472708\nv -0.171651 0.0863529 -0.0459706\nv -0.154799 0.0739816 -0.0121253\nv -0.236794 0.11208 -0.127719\nv -0.00829438 -0.198556 -0.0915369\nv 0.00970021 -0.244807 -0.25275\nv -0.00630865 -0.252961 -0.285629\nv -0.126911 -0.230521 -0.328032\nv -0.0404702 -0.290022 -0.341757\nv -0.15805 -0.313658 -0.37764\nv -0.083225 -0.350771 -0.392753\nv -0.256054 -0.452518 -0.493463\nv -0.20815 -0.500773 -0.534478\nv -0.38785 -0.571943 -0.536727\nv -0.35831 -0.604172 -0.591642\nv -0.540699 -0.660106 -0.534829\nv -0.543475 -0.680473 -0.592679\nv -0.683214 -0.726338 -0.418321\nv -0.724001 -0.750641 -0.408744\nv -0.724388 -0.787808 -0.271782\nv -0.748234 -0.790022 -0.2689\nv -0.211313 -0.245001 -0.433381\nv -0.302499 -0.393263 -0.526043\nv -0.427301 -0.509964 -0.533318\nv -0.554036 -0.612449 -0.514199\nv -0.680245 -0.695516 -0.410888\nv -0.737585 -0.772502 -0.255017\nv -0.178171 -0.180192 -0.381313\nv -0.188715 -0.170773 -0.417759\nv -0.202053 -0.145064 -0.39212\nv -0.206551 -0.151056 -0.425157\nv -0.221031 -0.117808 -0.435455\nv -0.164482 -0.136752 -0.357045\nv -0.188293 -0.11888 -0.377025\nv -0.176484 -0.109971 -0.401733\nv -0.181826 -0.108793 -0.358328\nv -0.109865 -0.184638 -0.285313\nv -0.154623 -0.103557 -0.339982\nv -0.202105 -0.071293 -0.404562\nv -0.154992 -0.0832074 -0.364443\nv -0.237673 -0.218747 -0.499807\nv -0.233719 -0.194953 -0.539715\nv -0.245194 -0.22676 -0.551506\nv -0.263188 -0.209345 -0.57783\nv -0.23089 -0.256071 -0.488666\nv -0.233016 -0.250308 -0.535919\nv -0.207043 -0.223298 -0.566162\nv -0.206217 -0.240853 -0.557498\nv -0.18462 -0.187748 -0.548993\nv -0.212754 -0.192264 -0.556426\nv -0.241556 -0.20678 -0.578357\nv -0.20685 -0.173057 -0.491934\nv -0.20866 -0.138597 -0.47705\nv -0.218413 -0.113661 -0.525147\nv -0.215232 -0.118546 -0.496538\nv -0.224581 -0.051998 -0.457843\nv -0.201227 -0.0994096 -0.483007\nv -0.237444 -0.0798334 -0.476435\nv -0.190437 -0.1364 -0.440147\nv -0.238042 -0.0523847 -0.479932\nv -0.225038 -0.0361825 -0.473184\nv -0.204144 -0.026781 -0.448248\nv -0.221506 -0.00962994 -0.477858\nv -0.204899 -0.0453907 -0.494746\nv -0.219309 -0.0796226 -0.49884\nv -0.252188 -0.0474643 -0.521035\nv -0.151654 -0.104471 -0.517538\nv -0.186817 -0.100341 -0.495466\nv -0.169595 -0.0330721 -0.360524\nv -0.213686 0.0203142 -0.414912\nv -0.201771 -0.0223878 -0.43129\nv -0.22727 0.0430359 -0.42572\nv -0.168734 -0.0770218 -0.383475\nv -0.183689 -0.0212104 -0.453045\nv -0.137332 -0.0663023 -0.501599\nv -0.112677 -0.028714 -0.463185\nv -0.295294 -0.356096 -0.576424\nv -0.431079 -0.483569 -0.569009\nv -0.567901 -0.587179 -0.534109\nv -0.692089 -0.676326 -0.409816\nv -0.255263 -0.307103 -0.551752\nv -0.257512 -0.329192 -0.491811\nv -0.271079 -0.273082 -0.567005\nv -0.224423 -0.265631 -0.564756\nv -0.246758 -0.275191 -0.500949\nv -0.250712 -0.3106 -0.564299\nv -0.247461 -0.264401 -0.533986\nv -0.239676 -0.282202 -0.568868\nv -0.745598 -0.785278 -0.25282\nv -0.17058 -0.14835 -0.537219\nv -0.179348 -0.114329 -0.518979\nv -0.191597 -0.00715217 -0.30814\nv -0.223983 0.0790953 -0.344287\nv -0.260517 0.131884 -0.356869\nv -0.214125 0.0328788 -0.389818\nv -0.18383 0.0240396 -0.427231\nv -0.253137 0.104137 -0.375637\nv -0.27867 0.149861 -0.385531\nv -0.218202 0.115418 -0.406548\nv -0.113731 0.0165009 -0.454627\nv -0.106632 0.064545 -0.41971\nv -0.0471831 0.182318 0.00604504\nv -0.0370084 0.130549 -0.00416479\nv 0.0283977 0.118494 -0.0347767\nv -0.0450743 0.109514 0.0105788\nv -0.0674973 0.0732787 0.00590445\nv -0.0687977 0.109936 0.020279\nv -0.0988824 0.0630865 0.00678309\nv -0.05669 0.128475 -0.0250062\nv -0.0825396 0.0679893 -0.0156926\nv -0.0641233 0.105279 -0.0112818\nv -0.0997083 0.0442132 -0.00295226\nv -0.0515236 0.26368 -0.0284329\nv -0.0974063 0.409869 0.0412259\nv 0.0925034 0.404755 -0.0309634\nv 0.0899027 0.504077 -0.0140231\nv -0.210681 0.101466 -0.0606263\nv -0.165009 0.0900959 -0.0308931\nv -0.230907 0.108987 -0.0835589\nv -0.250554 0.145661 -0.116578\nv -0.200893 0.125663 -0.036534\nv -0.23762 0.0883387 -0.157453\nv -0.243384 0.101887 -0.219081\nv -0.228078 0.108495 -0.156838\nv -0.242119 0.0460057 -0.217148\nv -0.268724 0.124398 -0.177169\nv -0.267652 0.106948 -0.200401\nv -0.25869 0.0981092 -0.257196\nv -0.259709 0.086968 -0.311461\nv -0.245299 0.0941025 -0.28468\nv -0.25695 0.14162 -0.257354\nv -0.196306 0.118845 -0.202369\nv -0.273732 0.14603 -0.312094\nv -0.215056 0.115348 -0.267634\nv -0.170527 0.115172 -0.243489\nv -0.228342 0.113608 -0.289723\nv -0.273556 0.141321 -0.210171\nv -0.227094 0.121639 -0.194883\nv -0.245387 0.132816 -0.1839\nv -0.22669 0.12192 -0.242997\nv -0.203037 0.127825 -0.0755457\nv -0.162478 0.071293 -0.0233016\nv -0.199311 0.0553193 -0.0644221\nv -0.152181 0.114505 -0.0470777\nv -0.147137 0.0883738 -0.0385548\nv -0.02353 0.169859 -0.00704673\nv -0.0356201 0.185991 -0.0167645\nv -0.0239518 0.218184 -0.0281517\nv 0.0821706 0.347187 -0.041015\nv -0.0566197 0.318332 0.0103152\nv -0.0683056 0.370277 0.0193301\nv -0.0364461 0.218097 -0.0120901\nv -0.043317 0.219098 -0.0370436\nv -0.05307 0.172354 -0.0321056\nv -0.0248304 0.275858 -0.0146382\nv 0.0609602 0.245018 -0.0526834\nv -0.0702914 0.389133 0.0130566\nv -0.14104 0.178927 -0.0426493\nv -0.111201 0.22256 -0.0572172\nv -0.142305 0.331863 -0.0111939\nv -0.191509 0.13213 -0.126981\nv -0.171599 0.222419 -0.119566\nv -0.176273 0.291973 -0.0724353\nv -0.199294 0.174323 -0.243278\nv -0.218009 0.268003 -0.221312\nv -0.197079 0.350789 -0.0400134\nv -0.255931 0.328243 -0.16898\nv -0.265297 0.32204 -0.262398\nv -0.295716 0.36794 -0.250501\nv -0.238815 0.310301 -0.361508\nv -0.164552 0.174815 -0.262345\nv -0.192721 0.227779 -0.324852\nv -0.225512 0.270411 -0.334271\nv -0.206534 0.262538 -0.357906\nv -0.28642 0.334306 -0.245914\nv -0.287175 0.361561 -0.288827\nv -0.101905 0.20634 -0.336221\nv -0.211928 0.115524 -0.296419\nv -0.0737884 0.120304 -0.331195\nv -0.224686 0.145942 -0.351773\nv -0.153921 0.104348 -0.353601\nv -0.154729 0.134432 -0.300109\nv -0.0861421 0.470161 0.0632095\nv -0.0696236 0.420026 0.0354971\nv -0.116174 0.456788 0.065986\nv -0.099269 0.427459 0.0370084\nv -0.129213 0.440973 0.0426493\nv -0.0952799 0.419798 0.0239693\nv -0.104365 0.403015 0.0261659\nv -0.0480969 0.358345 0.0105964\nv -0.0635434 0.366148 0.00333882\nv -0.0767054 0.349594 -0.00279411\nv -0.216937 0.325537 -0.317963\nv -0.262064 0.35339 -0.277862\nv -0.251415 0.353232 -0.298896\nv -0.214248 0.287474 -0.268988\nv -0.135996 0.272449 -0.331441\nv -0.185991 0.352002 -0.366183\nv -0.177802 0.298334 -0.299353\nv -0.113152 0.272098 -0.350912\nv -0.134292 0.34789 -0.371683\nv -0.158419 0.209749 -0.320775\nv -0.144818 0.381788 -0.391628\nv -0.21887 0.291006 -0.323709\nv -0.271307 0.36982 -0.273662\nv -0.261308 0.383703 -0.295646\nv -0.297684 0.401206 -0.397586\nv -0.303553 0.405441 -0.369926\nv -0.300302 0.425087 -0.348329\nv -0.40841 0.456244 -0.431378\nv -0.39697 0.473869 -0.44389\nv -0.407022 0.47292 -0.407338\nv -0.474027 0.488859 -0.474607\nv -0.452114 0.485819 -0.465645\nv -0.470091 0.486293 -0.452764\nv -0.444593 0.465276 -0.442396\nv -0.434576 0.480617 -0.454891\nv -0.44758 0.479703 -0.426159\nv -0.460567 0.471971 -0.460742\nv -0.294855 0.443574 -0.346009\nv -0.3969 0.493867 -0.432872\nv -0.403051 0.493762 -0.411802\nv -0.461586 0.496538 -0.458528\nv -0.439356 0.495923 -0.443749\nv -0.444435 0.494289 -0.432222\nv -0.270253 0.463361 -0.397058\nv -0.258426 0.427653 -0.419183\nv -0.285242 0.464714 -0.364232\nv -0.250185 0.415 -0.287913\nv -0.163884 0.398587 -0.370242\nv -0.219731 0.462746 -0.353495\nv -0.188961 0.445067 -0.35411\nv -0.361104 0.568288 -0.308245\nv -0.354374 0.574403 -0.367589\nv -0.300671 0.599989 -0.392384\nv -0.312603 0.471637 -0.212051\nv -0.386058 0.625136 -0.27078\nv -0.440551 0.614206 -0.365181\nv -0.428162 0.646558 -0.388518\nv -0.435631 0.65566 -0.290444\nv -0.412997 0.68636 -0.368063\nv -0.319984 0.679524 -0.371999\nv -0.342003 0.658823 -0.283327\nv -0.419024 0.697079 -0.32218\nv -0.347538 0.705813 -0.334007\nv -0.150898 0.625716 -0.381893\nv -0.217552 0.679577 -0.296735\nv -0.172671 0.673479 -0.332232\nv -0.117756 0.687766 -0.318455\nv -0.274593 0.646874 -0.386726\nv -0.281798 0.677837 -0.329421\nv -0.351615 0.679278 -0.32863\nv -0.320616 0.659386 -0.380259\nv -0.148614 0.556022 -0.396496\nv -0.315696 0.684708 -0.327171\nv -0.223491 0.65812 -0.237216\nv -0.345218 0.671054 -0.308368\nv -0.278635 0.65436 -0.281763\nv -0.268724 0.631164 -0.229431\nv -0.307103 0.626401 -0.26108\nv -0.190244 0.68701 -0.250308\nv -0.138263 0.694531 -0.272678\nv -0.22191 0.704495 -0.291621\nv -0.450023 0.628686 -0.313236\nv -0.43013 0.694039 -0.294784\nv -0.524321 0.683882 -0.367483\nv -0.508716 0.697167 -0.386058\nv -0.526465 0.725723 -0.31835\nv -0.496134 0.739325 -0.369979\nv -0.524426 0.689189 -0.338225\nv -0.511616 0.739975 -0.314009\nv -0.56878 0.72973 -0.383703\nv -0.572558 0.782993 -0.358873\nv -0.575177 0.73994 -0.349489\nv -0.573753 0.771307 -0.338277\nv -0.503356 0.754279 -0.335097\nv -0.573753 0.768566 -0.379872\nv -0.6435 0.751379 -0.372492\nv -0.642481 0.760517 -0.362932\nv -0.631621 0.77621 -0.375321\nv -0.63633 0.76296 -0.380997\nv -0.659632 0.761062 -0.377588\nv -0.185622 0.524198 -0.384898\nv -0.195972 0.482902 -0.368678\nv -0.180772 0.441324 -0.45837\nv -0.208748 0.450216 -0.438776\nv -0.174727 0.536727 -0.443257\nv -0.207518 0.508523 -0.428971\nv -0.219696 0.522564 -0.519102\nv -0.21358 0.496345 -0.511967\nv -0.22379 0.498998 -0.504956\nv -0.212262 0.529558 -0.506203\nv -0.224054 0.519822 -0.500984\nv 0.0923629 0.459284 -0.0198397\nv -0.0165888 0.480195 0.0423329\nv -0.0253752 0.461832 0.0294521\nv 0.0173268 0.396935 0.00817136\nv 0.022792 0.347169 -0.0113345\nv 0.0708713 0.278617 -0.0503638\nv -0.0942256 0.492742 0.0723122\nv -0.144501 0.538379 0.0842617\nv -0.121007 0.498225 0.0578322\nv -0.17738 0.700137 -0.291727\nv -0.197835 0.689418 -0.27085\nv -0.094454 0.718676 -0.274576\nv -0.18643 0.712456 -0.219748\nv -0.132482 0.742681 -0.20374\nv -0.0662145 0.766668 -0.220293\nv -0.122079 0.76593 -0.171388\nv -0.022792 0.82566 -0.153393\nv -0.202527 0.718676 -0.194039\nv -0.172425 0.7327 -0.191245\nv -0.190349 0.696253 -0.212913\nv -0.191298 0.731575 -0.162039\nv -0.199786 0.700418 -0.184655\nv -0.187889 0.720293 -0.151794\nv -0.168893 0.765912 -0.128194\nv -0.118582 0.757196 -0.141215\nv -0.256001 0.688855 -0.215285\nv -0.252697 0.664183 -0.237655\nv -0.299336 0.51694 -0.317787\nv -0.33109 0.484132 -0.307191\nv -0.353232 0.496169 -0.348223\nv -0.305767 0.472376 -0.350227\nv -0.291217 0.558395 -0.371753\nv -0.192616 0.558518 -0.389836\nv -0.173813 0.725266 -0.155959\nv -0.1519 0.741662 -0.109338\nv -0.171072 0.73827 -0.132587\nv -0.101958 0.792395 -0.147788\nv -0.0465856 0.798352 -0.190982\nv -0.114364 0.756071 -0.102959\nv -0.118177 0.801937 -0.175553\nv -0.07479 0.79909 -0.172794\nv -0.109004 0.810284 -0.162285\nv -0.0652304 0.809756 -0.153991\nv -0.0105789 0.847556 -0.114452\nv -0.0680596 0.827646 -0.11881\nv -0.0867747 0.811689 -0.137051\nv -0.0922398 0.784522 -0.0962289\nv -0.119864 0.774751 -0.162531\nv -0.111921 0.777985 -0.16826\nv -0.214582 0.714283 -0.13814\nv -0.219661 0.734 -0.107862\nv -0.202914 0.686272 -0.107229\nv -0.233279 0.688785 -0.156662\nv -0.194514 0.694391 -0.0893579\nv -0.230028 0.679384 -0.12967\nv -0.233016 0.704812 -0.150951\nv -0.241205 0.703089 -0.115735\nv -0.219327 0.697378 -0.120075\nv -0.191702 0.721646 -0.109075\nv -0.160897 0.730977 -0.12113\nv -0.196763 0.675412 -0.0858961\nv -0.233033 0.661213 -0.112413\nv -0.0795698 0.802552 -0.103223\nv -0.0903596 0.821706 -0.135961\nv -0.0982849 0.783924 -0.165132\nv -0.103012 0.778863 -0.108723\nv -0.0882508 0.757337 -0.119337\nv -0.0494324 0.624433 -0.0333006\nv -0.158525 0.619741 -0.0540541\nv -0.0821179 0.708836 -0.110832\nv -0.153165 0.686202 -0.0551963\nv -0.0980037 0.604699 -0.0436334\nv -0.0140407 0.523776 0.0235476\nv -0.112923 0.520789 0.0663375\nv -0.188521 0.609057 -0.033652\nv -0.150652 0.559062 0.0299968\nv -0.222982 0.630021 0.0142516\nv -0.202703 0.545865 0.0467613\nv -0.174129 0.52165 0.0595192\nv -0.186993 0.649211 -0.0749482\nv -0.211805 0.605964 -0.0708713\nv -0.226531 0.680051 -0.0760728\nv -0.236443 0.616016 -0.0921168\nv -0.332777 0.47401 -0.181334\nv -0.361596 0.500176 -0.114786\nv -0.383158 0.42108 -0.117474\nv -0.276632 0.657435 -0.172073\nv -0.331793 0.511493 -0.219977\nv -0.39683 0.498295 -0.216146\nv -0.256599 0.664658 -0.123766\nv -0.271869 0.626226 -0.129916\nv -0.317717 0.629442 -0.1574\nv -0.315134 0.531192 -0.134397\nv -0.332689 0.496116 -0.155783\nv -0.355938 0.566777 -0.148174\nv -0.329842 0.531139 -0.115998\nv -0.348276 0.502003 -0.126577\nv -0.32081 0.521228 -0.148912\nv -0.39495 0.413225 0.045953\nv -0.403332 0.363143 -0.0164833\nv -0.399817 0.398991 -0.0650371\nv -0.392489 0.450181 -0.00407692\nv -0.346308 0.43491 0.123959\nv -0.367518 0.474801 0.0462341\nv -0.332373 0.535427 -0.0382912\nv -0.28171 0.441078 0.132236\nv -0.227849 0.465768 0.117439\nv -0.427459 0.387095 0.09108\nv -0.435789 0.338453 0.0306997\nv -0.381436 0.404456 0.137543\nv -0.445981 0.345218 0.129793\nv -0.40103 0.37815 0.163304\nv -0.343022 0.395828 0.198415\nv -0.247057 0.387112 0.149193\nv -0.301111 0.351193 0.208554\nv -0.502935 0.347099 0.210927\nv -0.414561 0.369135 0.26528\nv -0.472393 0.369047 0.222507\nv -0.525076 0.289671 0.226672\nv -0.448547 0.317436 0.0624011\nv -0.445647 0.289442 0.112765\nv -0.417601 0.287597 0.0317717\nv -0.29619 0.500808 0.109813\nv -0.37685 0.487435 -0.0773381\nv -0.271483 0.550118 0.0389062\nv -0.258215 0.567093 0.00386601\nv -0.136998 0.472797 0.0573753\nv -0.180543 0.516308 0.092644\nv -0.501213 0.341177 0.366253\nv -0.390398 0.318877 0.236513\nv -0.372615 0.303729 0.239026\nv -0.359189 0.311127 0.233859\nv -0.39017 0.326925 0.273469\nv -0.403455 0.34926 0.222015\nv -0.507029 0.287281 0.188065\nv -0.476048 0.350719 0.460285\nv -0.506801 0.306312 0.424876\nv -0.502144 0.329262 0.430622\nv -0.513303 0.304643 0.4609\nv -0.509595 0.322251 0.46554\nv -0.506063 0.31719 0.482867\nv -0.510579 0.288757 0.368063\nv -0.525006 0.295276 0.294152\nv -0.514884 0.339683 0.306224\nv -0.464573 0.372861 0.314378\nv -0.525375 0.258321 0.270218\nv -0.509138 0.244122 0.192212\nv -0.5223 0.242857 0.214107\nv -0.42043 0.246863 0.106316\nv -0.508576 0.232155 0.282606\nv -0.497733 0.22024 0.196499\nv -0.510807 0.219362 0.221734\nv -0.505869 0.288423 0.468931\nv -0.497188 0.29141 0.425948\nv -0.495291 0.25876 0.376164\nv -0.477788 0.219239 0.165835\nv -0.49327 0.246723 0.15921\nv -0.267037 0.352072 -0.149562\nv -0.309581 0.383808 -0.237778\nv -0.241785 0.297719 0.0423857\nv -0.302042 0.39683 -0.224282\nv -0.285277 0.271711 -0.000948948\nv -0.30698 0.390785 -0.281306\nv -0.316698 0.406249 -0.27512\nv -0.2731 0.385249 -0.293677\nv -0.263452 0.412821 -0.286367\nv -0.286156 0.401961 -0.303887\nv -0.314079 0.416002 -0.307226\nv -0.318156 0.421854 -0.302042\nv -0.280621 0.424296 -0.28403\nv -0.311935 0.428074 -0.302042\nv -0.304098 0.422187 -0.306839\nv -0.307331 0.457052 -0.262398\nv -0.370822 0.327382 -0.0895688\nv -0.343953 0.366218 -0.148139\nv -0.300671 0.491583 -0.277616\nv -0.335659 0.290637 -0.0737357\nv -0.320476 0.46496 -0.312111\nv -0.338066 0.474344 -0.340579\nv -0.297455 0.435719 -0.267617\nv -0.256634 0.516343 -0.333726\nv -0.263557 0.467613 -0.353636\nv -0.267793 0.493428 -0.353425\nv -0.301357 0.455242 -0.326503\nv -0.334429 0.500176 -0.33768\nv -0.309809 0.493182 -0.353495\nv -0.421098 0.275489 0.0633149\nv -0.386567 0.326714 -0.0402945\nv -0.335378 0.285875 -0.0232489\nv -0.203247 0.386761 0.0166415\nv -0.149896 0.414297 0.0263241\nv -0.167258 0.475011 0.0974941\nv -0.148438 0.479405 0.0743682\nv -0.35274 0.258619 0.207799\nv -0.291727 0.300443 0.118898\nv -0.249025 0.347099 0.0987418\nv -0.178312 0.408604 -0.0285207\nv -0.208185 0.421116 0.0755808\nv -0.363195 0.231136 0.119407\nv -0.381454 0.243911 0.0394686\nv -0.444241 0.202755 0.242646\nv -0.429023 0.199294 0.184251\nv -0.465821 0.260869 0.409061\nv -0.465557 0.22973 0.327733\nv -0.415211 0.276596 0.412751\nv -0.393597 0.231311 0.322954\nv -0.456859 0.366745 0.377236\nv -0.379275 0.297403 0.336239\nv -0.404 0.318508 0.418778\nv -0.410941 0.343268 0.465909\nv -0.372035 0.293062 0.278196\nv -0.364689 0.249991 0.295505\nv -0.381225 0.262714 0.347626\nv -0.322198 0.264489 0.169402\nv -0.3203 0.246318 0.0940498\nv -0.378115 0.221892 0.213018\nv -0.356131 0.254033 0.246986\nv -0.470144 0.325098 0.522862\nv -0.395406 0.31784 0.498172\nv -0.395582 0.311356 0.464889\nv -0.529013 0.265543 0.56031\nv -0.496521 0.275208 0.59101\nv -0.453555 0.274734 0.607458\nv -0.422012 0.276386 0.605578\nv -0.545127 0.249148 0.535286\nv -0.449671 0.259937 0.639388\nv -0.425755 0.262978 0.637648\nv -0.453432 0.243595 0.685306\nv -0.43918 0.246811 0.686764\nv -0.458844 0.243296 0.700418\nv -0.441359 0.248445 0.704003\nv -0.461111 0.233473 0.724071\nv -0.446245 0.234597 0.726356\nv -0.46684 0.212385 0.754261\nv -0.467807 0.186237 0.773363\nv -0.442291 0.188012 0.777001\nv -0.454803 0.197378 0.773047\nv -0.446543 0.214723 0.759059\nv -0.37337 0.244649 0.570081\nv -0.382438 0.288862 0.488543\nv -0.416617 0.235072 0.660212\nv -0.429603 0.229765 0.707535\nv -0.437212 0.17499 0.772731\nv -0.433434 0.201701 0.754701\nv -0.465382 0.163761 0.788089\nv -0.444066 0.169226 0.791094\nv -0.457614 0.177345 0.796067\nv -0.455699 0.149299 0.809458\nv -0.385355 0.257214 0.483657\nv -0.438987 0.241152 0.490282\nv -0.41428 0.220363 0.525305\nv -0.393983 0.231838 0.499772\nv -0.421625 0.273398 0.459706\nv -0.195111 0.17195 -0.13148\nv -0.221857 0.217675 -0.229484\nv -0.224985 0.237954 -0.304274\nv -0.218975 0.267494 -0.169472\nv -0.216445 0.599743 -0.0423681\nv -0.249605 0.611078 -0.0264823\nv -0.246072 0.579904 -0.0156047\nv -0.222595 0.611429 -0.0137947\nv -0.304256 0.549028 -0.0794644\nv -0.334798 0.551559 -0.0657927\nv -0.307472 0.551383 -0.0465153\nv -0.289021 0.567603 -0.102098\nv -0.29243 0.56096 -0.0901838\nv -0.269251 0.558887 -0.0647735\nv -0.25876 0.58015 -0.0920817\nv -0.279391 0.611588 -0.0779356\nv -0.273152 0.576776 -0.102801\nv -0.297561 0.552402 -0.12496\nv -0.320775 0.592855 -0.0986539\nv -0.326837 0.535023 -0.101132\nv -0.276948 0.558553 -0.0438091\nv -0.299564 0.5724 -0.066109\nv -0.230362 0.584156 -0.0659333\nv -0.242593 0.581556 -0.0777423\nv -0.228728 0.610463 -0.0642639\nv -0.233438 0.59825 -0.0768109\nv -0.257635 0.570063 -0.044758\nv -0.272713 0.570133 -0.0577444\nv -0.255369 0.562401 -0.0579904\nv -0.247812 0.568552 -0.0716796\nv -0.261466 0.562594 -0.0362001\nv -0.32877 0.535163 -0.0792535\nv -0.470899 0.192792 0.742171\nv -0.471145 0.174586 0.765895\nv -0.463132 0.2243 0.646997\nv -0.468 0.226215 0.696974\nv -0.4415 0.16334 0.76419\nv -0.438056 0.191192 0.738885\nv -0.46264 0.184726 0.733262\nv -0.46257 0.162039 0.760974\nv -0.444698 0.163533 0.787703\nv -0.463554 0.161196 0.785207\nv -0.450884 0.150898 0.803694\nv -0.459003 0.147823 0.801163\nv -0.432099 0.208607 0.696271\nv -0.425474 0.212561 0.647243\nv -0.459284 0.201719 0.689804\nv -0.454363 0.142041 0.808228\nv -0.3413 0.250958 0.508997\nv -0.347608 0.255158 0.535497\nv -0.344744 0.220873 0.540681\nv -0.340702 0.215179 0.51557\nv -0.339788 0.207184 0.543915\nv -0.334727 0.203265 0.518118\nv -0.333937 0.192387 0.547271\nv -0.329825 0.18694 0.519928\nv -0.314202 0.176537 0.534865\nv -0.309756 0.176343 0.553826\nv -0.30872 0.165888 0.522405\nv -0.367571 0.23762 0.495044\nv -0.347204 0.191737 0.506976\nv -0.314027 0.149158 0.516975\nv -0.281728 0.160493 0.547042\nv -0.29004 0.156785 0.559484\nv -0.287685 0.154465 0.530981\nv -0.266106 0.136717 0.553966\nv -0.272467 0.130513 0.559941\nv -0.271588 0.128633 0.545162\nv -0.352986 0.197027 0.551928\nv -0.321671 0.166995 0.561698\nv -0.328946 0.144378 0.533599\nv -0.329913 0.151601 0.555882\nv -0.311479 0.14002 0.537167\nv -0.312902 0.145872 0.557287\nv -0.291252 0.150125 0.53193\nv -0.297596 0.152585 0.560995\nv -0.364988 0.1839 0.546357\nv -0.364443 0.178645 0.521316\nv -0.389098 0.217007 0.557797\nv -0.265596 0.126419 0.553035\nv -0.401311 0.24305 0.616209\nv -0.456472 0.223034 0.53186\nv -0.407005 0.219362 0.605578\nv -0.428812 0.21105 0.570239\nv -0.484782 0.249886 0.629547\nv -0.501388 0.247215 0.62185\nv -0.512002 0.199048 0.670843\nv -0.497101 0.202404 0.678136\nv -0.518223 0.179682 0.684655\nv -0.498524 0.184954 0.695305\nv -0.513742 0.153727 0.686747\nv -0.492655 0.152339 0.696675\nv -0.505114 0.106562 0.691034\nv -0.489702 0.109022 0.701262\nv -0.49146 0.0842793 0.696974\nv -0.498594 0.0740871 0.680754\nv -0.472745 0.0792535 0.694707\nv -0.468896 0.221295 0.643184\nv -0.478913 0.169789 0.684462\nv -0.476857 0.112396 0.694057\nv -0.461305 0.0847362 0.683074\nv -0.481742 0.0503462 0.689716\nv -0.483482 0.0493621 0.669525\nv -0.465733 0.0555653 0.684198\nv -0.466594 0.0331951 0.668629\nv -0.469564 0.0414192 0.660458\nv -0.462535 0.0429129 0.668032\nv -0.517169 0.166186 0.667979\nv -0.507152 0.109848 0.668524\nv -0.495783 0.0758795 0.664991\nv -0.50854 0.214195 0.619091\nv -0.461516 0.0807823 0.667944\nv -0.469177 0.118986 0.676133\nv -0.491846 0.114803 0.656978\nv -0.481812 0.0766703 0.653534\nv -0.465136 0.0619618 0.679278\nv -0.480354 0.0565318 0.664781\nv -0.501898 0.157101 0.654061\nv -0.47575 0.165062 0.668734\nv -0.457544 0.197536 0.633764\nv -0.461832 0.0351808 0.660669\nv -0.521843 0.23878 0.604822\nv -0.535708 0.235441 0.591115\nv -0.545373 0.173848 0.626894\nv -0.531561 0.178681 0.634169\nv -0.547605 0.158981 0.631129\nv -0.533265 0.164534 0.643078\nv -0.535866 0.131515 0.627245\nv -0.523723 0.136154 0.637472\nv -0.51267 0.0994974 0.608776\nv -0.499649 0.103276 0.616789\nv -0.497206 0.0910976 0.602836\nv -0.498454 0.0871964 0.588919\nv -0.479756 0.0949636 0.598496\nv -0.511633 0.210452 0.617193\nv -0.512863 0.154641 0.633044\nv -0.48791 0.115102 0.608583\nv -0.471268 0.10194 0.590026\nv -0.479176 0.076108 0.584842\nv -0.482445 0.0781815 0.570573\nv -0.466278 0.0845956 0.584209\nv -0.455014 0.072857 0.550979\nv -0.543493 0.145732 0.618125\nv -0.514884 0.105911 0.59036\nv -0.499016 0.0927846 0.576758\nv -0.536183 0.195322 0.585281\nv -0.472586 0.109725 0.578217\nv -0.493428 0.127139 0.601413\nv -0.509208 0.125716 0.590184\nv -0.4903 0.102081 0.568288\nv -0.465997 0.090342 0.577391\nv -0.482199 0.0845605 0.567866\nv -0.529663 0.153305 0.603926\nv -0.509366 0.155397 0.621253\nv -0.523407 0.185727 0.575036\nv -0.493358 0.190015 0.606825\nv -0.512319 0.245721 0.489158\nv -0.525762 0.224757 0.51926\nv -0.482339 0.268232 0.453801\nv -0.519998 0.277704 0.493621\nv -0.542175 0.230907 0.578305\nv -0.553667 0.225161 0.564053\nv -0.567128 0.187326 0.577795\nv -0.558342 0.186676 0.585703\nv -0.573103 0.16232 0.583172\nv -0.562788 0.163849 0.592574\nv -0.56516 0.146803 0.574122\nv -0.557551 0.144501 0.584209\nv -0.550856 0.125857 0.56205\nv -0.542702 0.126068 0.573121\nv -0.535761 0.121639 0.561558\nv -0.530788 0.128457 0.544055\nv -0.52295 0.125171 0.562963\nv -0.537184 0.193618 0.581854\nv -0.549432 0.168805 0.587073\nv -0.536885 0.134713 0.576126\nv -0.51998 0.132113 0.564457\nv -0.505641 0.12055 0.539398\nv -0.508962 0.127491 0.535163\nv -0.503567 0.128826 0.54887\nv -0.484958 0.135153 0.529733\nv -0.566425 0.169841 0.563157\nv -0.548782 0.139054 0.549397\nv -0.530471 0.137121 0.540224\nv -0.549889 0.211208 0.548132\nv -0.520754 0.139212 0.561575\nv -0.537096 0.140688 0.572137\nv -0.543686 0.146188 0.552701\nv -0.523723 0.147612 0.543159\nv -0.503005 0.133975 0.548729\nv -0.509085 0.131181 0.534882\nv -0.553316 0.166555 0.558412\nv -0.54228 0.167276 0.58073\nv -0.53685 0.196183 0.541577\nv -0.388834 0.216286 0.528855\nv -0.0103153 0.638052 -0.0238288\nv -0.0345658 0.629775 -0.019049\nv 0.00405933 0.557569 -0.00878644\nv 0.0426317 0.577356 -0.0394862\nv 0.0241099 0.566988 -0.0196816\nv 0.0076969 0.631867 0.00458649\nv 0.0390469 0.596791 -0.0216498\nv 0.00486768 0.58514 -0.0238639\nv -0.0266404 0.585053 -0.0152181\nv -0.0916424 0.719766 -0.0684989\nv -0.0402945 0.674287 -0.0183461\nv -0.103855 0.744473 -0.0815204\nv -0.0429129 0.848452 -0.0981092\nv -0.092398 0.884441 -0.0697291\nv -0.125101 0.830369 -0.0901663\nv -0.108389 0.790391 -0.0504165\nv -0.0952272 0.788318 -0.00485012\nv -0.115524 0.871068 -0.115471\nv -0.0911679 0.938144 -0.114979\nv -0.0952272 0.926387 -0.137261\nv -0.107458 0.964485 -0.149984\nv -0.109584 0.95359 -0.159368\nv -0.0954029 0.825888 -0.120778\nv -0.0910625 0.856799 -0.136928\nv -0.078779 0.917917 -0.151337\nv -0.0947528 0.955014 -0.166274\nv -0.052947 0.868327 -0.112958\nv -0.0526658 0.925157 -0.137191\nv -0.0896039 0.964643 -0.158894\nv -0.0641057 0.949953 -0.146927\nv -0.097582 0.969968 -0.151285\nv -0.0716796 0.957878 -0.132165\nv -0.0365691 0.84977 -0.047148\nv -0.0555302 0.884968 -0.0781816\nv -0.0588339 0.934506 -0.1141\nv -0.0658454 0.862739 -0.127298\nv -0.0327733 0.832935 0.00599231\nv -0.0683056 0.893034 -0.0646856\nv -0.0804485 0.947018 -0.113644\nv -0.104031 0.965065 -0.165343\nv -0.0224757 0.610234 0.00912029\nv -0.0561277 0.648034 0.0549327\nv -0.0191193 0.588321 0.0233367\nv -0.0485186 0.620251 0.0886198\nv -0.0482726 0.623309 0.115998\nv -0.0187678 0.599937 0.0937335\nv -0.0111939 0.615418 0.124381\nv -0.0447756 0.661125 0.110357\nv -0.0671107 0.660106 0.104963\nv -0.0315257 0.609813 0.071293\nv 0.00829438 0.549204 0.0310863\nv 0.00829438 0.640758 0.159017\nv -0.00133554 0.652778 0.135381\nv -0.00307525 0.638421 0.128949\nv 0.000843496 0.625013 0.146575\nv -0.00405933 0.586089 0.126507\nv 0.0165712 0.584402 0.148438\nv 0.012301 0.563139 0.116912\nv 0.0242681 0.552736 0.138878\nv -0.0181703 0.606052 0.112361\nv -0.0501529 0.617685 0.105665\nv -0.0705549 0.653587 0.0789723\nv -0.0394159 0.614259 0.108108\nv -0.0376762 0.619654 0.117105\nv -0.0309809 0.634626 0.116315\nv -0.0120198 0.629986 0.123519\nv 0.00490282 0.650019 0.144993\nv 0.0281341 0.654096 0.164095\nv 0.0247953 0.667065 0.155414\nv 0.00774962 0.607616 0.146188\nv 0.0350051 0.632148 0.162514\nv 0.0241275 0.639616 0.163269\nv 0.0169754 0.648455 0.164447\nv 0.0116332 0.659175 0.155151\nv 0.0440727 0.604523 0.154764\nv 0.0376059 0.606843 0.15378\nv 0.0292588 0.630918 0.162496\nv 0.0313675 0.643763 0.16334\nv -0.000984079 0.652128 0.148297\nv 0.00660739 0.661266 0.158823\nv -0.0127755 0.658103 0.1435\nv 0.00296981 0.685341 0.155115\nv -0.0103328 0.673725 0.153516\nv -0.0257091 0.665835 0.126595\nv -0.0210171 0.705778 0.144431\nv -0.029663 0.683408 0.144045\nv -0.0126173 0.723966 0.131761\nv -0.106333 0.734756 -0.0590096\nv -0.1128 0.754437 -0.00653711\nv -0.0787966 0.707061 0.114751\nv 0.0330545 0.585211 0.153288\nv 0.0272555 0.599972 0.153182\nv 0.059115 0.557112 0.14835\nv 0.050434 0.58384 0.154606\nv 0.012547 0.636137 0.160159\nv 0.00590447 0.623168 0.153745\nv 0.0100868 0.612203 0.152216\nv 0.014111 0.610234 0.148807\nv 0.0298211 0.620919 0.146874\nv 0.014234 0.613046 0.149439\nv 0.0127755 0.626911 0.149492\nv 0.0188205 0.613767 0.151214\nv 0.0178716 0.633782 0.149844\nv 0.0405933 0.598707 0.154307\nv -0.120761 0.744948 0.0342846\nv -0.181984 0.660475 0.0333181\nv -0.162689 0.638931 -0.042825\nv -0.215812 0.575581 0.0540716\nv -0.178856 0.511844 0.0236355\nv -0.200981 0.54156 0.0800619\nv -0.135715 0.517749 0.0859312\nv -0.165958 0.54047 0.115787\nv -0.0240396 0.530735 0.175166\nv -0.0771272 0.523372 0.148016\nv -0.0928022 0.541525 0.164482\nv -0.12062 0.656592 0.0797455\nv -0.104875 0.687379 0.0964046\nv -0.143974 0.593382 0.0891119\nv -0.126155 0.710136 0.0755105\nv -0.0166591 0.53671 0.170421\nv -0.0740695 0.562841 0.150582\nv -0.142252 0.814308 -0.0267283\nv -0.170562 0.813236 0.0110709\nv -0.130865 0.792307 0.0589217\nv -0.174639 0.808491 -0.0442309\nv -0.196113 0.814607 -0.0249886\nv -0.21293 0.783485 -0.0637719\nv -0.103416 0.844709 0.0578498\nv -0.158683 0.850912 0.00551786\nv -0.188328 0.840544 -0.0316136\nv -0.206832 0.803852 -0.0627878\nv -0.129688 0.845078 -0.0156047\nv -0.0665483 0.818912 0.00741572\nv -0.121762 0.832021 -0.0222297\nv -0.162215 0.841142 -0.0418234\nv -0.194162 0.795276 -0.0576214\nv -0.208045 0.800706 -0.0498366\nv -0.0959126 0.758567 0.0898851\nv -0.0675851 0.843075 0.0246195\nv -0.0274488 0.815063 0.0534566\nv -0.077918 0.82942 0.0770042\nv -0.0649316 0.749359 0.111447\nv -0.101325 0.762995 0.0454258\nv -0.0159561 0.854989 -0.072119\nv -0.0170808 0.841458 -0.00147615\nv -0.0364461 0.783292 0.0993393\nv -0.0281693 0.75825 0.120725\nv -0.0181527 0.767669 0.117545\nv -0.0282747 0.799986 0.0745264\nv -0.026904 0.792166 0.0829438\nv -0.0282923 0.781218 0.102256\nv -0.0383615 0.830422 0.0836116\nv -0.0465856 0.861508 0.0766527\nv -0.0328788 0.813078 0.110129\nv -0.0438091 0.854075 0.0968263\nv -0.0117914 0.656328 0.133571\nv -0.0192598 0.641848 0.131462\nv -0.0913612 0.64473 -0.0213159\nv -0.0823288 0.621657 0.0387657\nv -0.176607 0.536112 0.00196813\nv -0.116262 0.556813 0.037026\nv -0.139581 0.586511 -0.015306\nv -0.103961 0.538326 0.0664078\nv -0.0602221 0.534583 0.120022\nv -0.0206305 0.520033 0.164868\nv -0.0187854 0.525902 0.156082\nv -0.131814 0.576618 0.104576\nv -0.0118617 0.526236 0.169139\nv 0.0568481 0.578094 -0.0518223\nv 0.0632095 0.595544 -0.0297157\nv 0.0492391 0.583787 0.00488523\nv 0.019418 0.53671 0.0464274\nv 0.0210347 0.533459 0.0674621\nv 0.0300496 0.528503 0.0214916\nv 0.0110885 0.550627 0.0621727\nv 0.020982 0.540945 0.0900784\nv 0.0417179 0.529276 0.106948\nv 0.0491337 0.519014 0.0846835\nv 0.0306646 0.519611 0.0811162\nv 0.0514884 0.507029 0.0627877\nv 0.0406811 0.510614 0.035585\nv 0.0437739 0.505325 0.0363406\nv 0.0385548 0.509823 0.0614698\nv 0.0329315 0.521246 0.0456015\nv 0.0592908 0.505729 0.0730679\nv 0.0708186 0.489052 0.0519629\nv 0.0542649 0.51035 0.0526658\nv 0.0745088 0.496292 0.0385372\nv 0.0665308 0.547886 0.0225459\nv 0.0700453 0.518135 0.0338804\nv 0.0848592 0.483815 0.0301726\nv -0.419446 0.356096 0.403086\nv -0.413717 0.363371 0.323393\nv 0.0299793 -0.116772 -0.00943663\nv 0.0278881 -0.117035 0.0023196\nv 0.0328261 -0.174323 -0.0231435\nv 0.0351457 -0.176607 -0.0447756\nv 0.0457597 -0.00630867 0.0128809\nv 0.0517872 -0.00905004 0.00576388\nv 0.107651 0.0463044 -0.031596\nv 0.102169 0.0571117 -0.0239869\nv 0.0152181 -0.208045 -0.0943662\nv 0.0278354 -0.19954 -0.0988824\nv 0.0328788 -0.19309 -0.102608\nv 0.00843496 -0.221101 -0.18752\nv 0.0369733 -0.196236 -0.178874\nv 0.114382 0.167241 -0.0716093\nv 0.106527 0.129301 -0.0596071\nv 0.144027 0.178364 -0.0871964\nv 0.10925 0.109321 -0.0409272\nv 0.0984782 0.0749657 -0.0309282\nv 0.13438 0.109619 -0.0477981\nv 0.12055 0.0655643 -0.0350227\nv 0.108161 0.105015 -0.0648438\nv 0.105648 0.127157 -0.085527\nv 0.0997259 0.0685692 -0.0509964\nv 0.113644 0.169332 -0.10918\nv 0.119443 0.18267 -0.0928022\nv 0.172214 0.545127 -0.0801146\nv 0.192862 0.504358 -0.0835765\nv 0.225249 0.599919 -0.183267\nv 0.113907 0.214002 -0.10324\nv 0.140038 0.264436 -0.121182\nv 0.131867 0.338962 -0.0827681\nv 0.159649 0.400169 -0.0818543\nv 0.179911 0.300531 -0.144572\nv 0.201139 0.358539 -0.155203\nv 0.181123 0.34137 -0.139441\nv 0.134274 0.213106 -0.104857\nv 0.116666 0.214406 -0.123273\nv 0.13742 0.254982 -0.142656\nv 0.180139 0.331547 -0.170703\nv 0.182424 0.350648 -0.157066\nv 0.218149 0.459003 -0.139441\nv 0.231645 0.475029 -0.169349\nv 0.250431 0.527572 -0.192897\nv 0.231645 0.542122 -0.17608\nv 0.237427 0.455224 -0.162303\nv 0.229062 0.448178 -0.176519\nv 0.219942 0.462746 -0.168155\nv 0.240748 0.503075 -0.204109\nv 0.203827 0.402963 -0.158753\nv 0.1852 0.490353 -0.0985485\nv 0.234931 0.568183 -0.174129\nv 0.229677 0.574263 -0.196394\nv 0.240625 0.539574 -0.218307\nv 0.0274663 0.802411 0.102309\nv 0.0202263 0.814185 0.0757741\nv -0.183496 0.644396 -0.0129336\nv -0.209134 0.549766 0.0197167\nv -0.198714 0.522599 0.0515587\nv -0.0914491 0.62844 0.0662671\nv -0.115383 0.576547 0.0599058\nv -0.108161 0.563139 0.0778653\nv -0.109637 0.603838 0.0616631\nv -0.105718 0.58797 0.0298562\nv 0.0795522 0.555671 0.0176783\nv 0.0844024 0.502601 0.03439\nv 0.0913788 0.482164 0.025094\nv 0.319615 -0.279391 -0.0492391\nv 0.26542 -0.323744 -0.0486416\nv 0.245229 -0.168875 -0.011809\nv 0.175711 -0.204601 -0.00776722\nv 0.131093 -0.152427 0.0120725\nv 0.349541 -0.256388 -0.0736126\nv 0.28417 -0.142199 -0.0529821\nv 0.173532 0.00755631 -0.0877412\nv 0.368221 -0.35534 -0.0836819\nv 0.133079 -0.0532984 0.0125997\nv 0.156627 -0.00543002 -0.0297684\nv 0.132323 -0.0923804 0.0181527\nv 0.101993 -0.0188733 0.0320001\nv 0.106439 -0.0508207 0.037887\nv 0.149053 -0.193354 0.00110707\nv 0.32682 -0.398939 -0.0634907\nv 0.267968 -0.440604 -0.0848241\nv 0.217007 -0.373809 -0.0685517\nv 0.372439 -0.428092 -0.0628405\nv 0.343936 -0.485028 -0.0888659\nv 0.396496 -0.40038 -0.0800267\nv 0.420834 -0.434436 -0.0314378\nv 0.377394 -0.483394 -0.0817137\nv 0.41906 -0.476822 -0.112906\nv 0.400011 -0.46619 -0.0599234\nv 0.428777 -0.419745 -0.08565\nv 0.431097 -0.422328 -0.0587284\nv 0.428197 -0.456015 -0.0710997\nv 0.425157 -0.441149 -0.100745\nv 0.424771 -0.407391 -0.100271\nv 0.444118 -0.417408 -0.0785155\nv 0.440586 -0.412171 -0.115014\nv 0.413085 -0.36613 -0.130144\nv 0.427881 -0.38908 -0.159966\nv 0.382473 -0.23393 -0.155871\nv 0.404685 -0.306558 -0.135838\nv 0.307718 -0.187889 -0.250958\nv 0.361104 -0.502987 -0.0829087\nv 0.3788 -0.495835 -0.0797456\nv 0.390205 -0.499139 -0.0882157\nv 0.373405 -0.517169 -0.0846835\nv 0.387481 -0.512863 -0.0898851\nv 0.387956 -0.506414 -0.0679366\nv 0.363705 -0.513162 -0.122377\nv 0.315468 -0.493182 -0.0992866\nv 0.397673 -0.495009 -0.103873\nv 0.425491 -0.498014 -0.0964046\nv 0.385355 -0.517292 -0.130162\nv 0.40704 -0.519067 -0.148034\nv 0.35824 -0.524989 -0.182213\nv 0.431589 -0.424507 -0.180807\nv 0.446825 -0.439321 -0.146874\nv 0.431536 -0.467525 -0.145907\nv 0.350508 -0.501722 -0.112941\nv 0.352775 -0.514902 -0.100921\nv 0.347134 -0.521456 -0.126103\nv 0.308755 -0.512424 -0.148631\nv 0.334815 -0.507556 -0.125751\nv 0.253084 -0.494429 -0.153446\nv 0.0683584 -0.169156 -0.319492\nv 0.199188 -0.144045 -0.250554\nv 0.104963 -0.0734018 -0.409623\nv 0.31473 -0.122852 -0.14357\nv 0.427881 -0.461305 -0.218132\nv 0.442607 -0.461006 -0.172794\nv 0.4095 -0.503005 -0.198696\nv 0.431466 -0.442361 -0.146294\nv 0.112923 -0.0907462 0.0221242\nv 0.110428 -0.153253 0.0297859\nv 0.118845 -0.198538 -0.00574633\nv 0.111658 -0.154536 0.00688854\nv 0.0916072 -0.0419112 0.0288546\nv 0.093716 -0.0783397 0.0125821\nv 0.140495 -0.2395 -0.0249359\nv 0.151355 -0.217938 -0.267283\nv 0.279162 -0.253611 -0.309071\nv 0.201789 -0.0121956 -0.147208\nv 0.1991 -0.0523144 -0.231715\nv 0.108495 -0.165255 -0.268197\nv 0.166714 -0.0962113 -0.275876\nv 0.136945 -0.241152 -0.00766177\nv 0.133431 -0.26289 -0.0405757\nv 0.159298 -0.253418 -0.024233\nv 0.144185 -0.25927 -0.0205427\nv 0.181545 -0.274769 -0.0289425\nv 0.159895 -0.277458 -0.0354972\nv 0.409851 -0.294099 -0.240801\nv 0.433592 -0.333058 -0.185938\nv 0.432766 -0.361807 -0.239694\nv 0.216374 -0.339244 -0.32863\nv 0.255597 -0.383088 -0.322216\nv 0.131937 -0.302657 -0.197273\nv 0.184989 -0.41254 -0.23096\nv 0.152884 -0.338664 -0.117387\nv 0.173057 -0.376498 -0.130847\nv 0.147524 -0.303659 -0.0683232\nv 0.228675 -0.459829 -0.152444\nv 0.235546 -0.466489 -0.216058\nv 0.347556 -0.362703 -0.420694\nv 0.242066 -0.403894 -0.407233\nv 0.203019 -0.443662 -0.359294\nv 0.307999 -0.418532 -0.501898\nv 0.237796 -0.437089 -0.47763\nv 0.277756 -0.436791 -0.542772\nv 0.223052 -0.455576 -0.529329\nv 0.283046 -0.366323 -0.410273\nv 0.370928 -0.32761 -0.303061\nv 0.34752 -0.466032 -0.493006\nv 0.40776 -0.393122 -0.373265\nv 0.33239 -0.475029 -0.5391\nv 0.393544 -0.478456 -0.420922\nv 0.38423 -0.416459 -0.432099\nv 0.429445 -0.435947 -0.319299\nv 0.410168 -0.494271 -0.323903\nv 0.373388 -0.568727 -0.293045\nv 0.301515 -0.529944 -0.2062\nv 0.257723 -0.516975 -0.212473\nv 0.251907 -0.542807 -0.286613\nv 0.209398 -0.50963 -0.309247\nv 0.197009 -0.478368 -0.447563\nv 0.309721 -0.345271 -0.321917\nv 0.198573 -0.380628 -0.287878\nv 0.231698 -0.430605 -0.282483\nv 0.200067 -0.495185 -0.519418\nv 0.212684 -0.562805 -0.510667\nv 0.387218 -0.520841 -0.402506\nv 0.349928 -0.57291 -0.382297\nv 0.22205 -0.53794 -0.388219\nv 0.423541 -0.493551 -0.14712\nv 0.305469 -0.553035 -0.288177\nv 0.26238 -0.594788 -0.493481\nv 0.273785 -0.569026 -0.380786\nv 0.189541 -0.547218 -0.610674\nv 0.216093 -0.59217 -0.660229\nv 0.181141 -0.483692 -0.607599\nv 0.293185 -0.57226 -0.675201\nv 0.31791 -0.54091 -0.659122\nv 0.252434 -0.589815 -0.674656\nv 0.322163 -0.585228 -0.48248\nv 0.352441 -0.541894 -0.517186\nv 0.362018 -0.536358 -0.599427\nv 0.277493 -0.500914 -0.672126\nv 0.325098 -0.487295 -0.63271\nv 0.197607 -0.521105 -0.656117\nv 0.283116 -0.463062 -0.637701\nv 0.227516 -0.518416 -0.671652\nv 0.21822 -0.460039 -0.630514\nv 0.322479 -0.683461 -0.487488\nv 0.229958 -0.631181 -0.589534\nv 0.287316 -0.705884 -0.494658\nv 0.238551 -0.671054 -0.575757\nv 0.266808 -0.701807 -0.595913\nv 0.322426 -0.739377 -0.53866\nv 0.304309 -0.703687 -0.60607\nv 0.345341 -0.788089 -0.520262\nv 0.302745 -0.741433 -0.516888\nv 0.324272 -0.788089 -0.473817\nv 0.334815 -0.771202 -0.465171\nv 0.309932 -0.73089 -0.485854\nv 0.338769 -0.717253 -0.480934\nv 0.338927 -0.801708 -0.477718\nv 0.35223 -0.799441 -0.501494\nv 0.354058 -0.82761 -0.483218\nv 0.34926 -0.812621 -0.465997\nv 0.364795 -0.827013 -0.505114\nv 0.366974 -0.826047 -0.484466\nv 0.371701 -0.811672 -0.471427\nv 0.308034 -0.760746 -0.499807\nv 0.330123 -0.789583 -0.507047\nv 0.269989 -0.718237 -0.563069\nv 0.339033 -0.676185 -0.628633\nv 0.377535 -0.639757 -0.613204\nv 0.423505 -0.727762 -0.592029\nv 0.401856 -0.620515 -0.559607\nv 0.461797 -0.72553 -0.536569\nv 0.513303 -0.800513 -0.446912\nv 0.383035 -0.622852 -0.510069\nv 0.448107 -0.729765 -0.477735\nv 0.530296 -0.825572 -0.503884\nv 0.376041 -0.738815 -0.609795\nv 0.396707 -0.799494 -0.624504\nv 0.412663 -0.743243 -0.456507\nv 0.372597 -0.76289 -0.464257\nv 0.478649 -0.807454 -0.416828\nv 0.534478 -0.816434 -0.403859\nv 0.507152 -0.819439 -0.384634\nv 0.549678 -0.820353 -0.371841\nv 0.522915 -0.823674 -0.355709\nv 0.570379 -0.816487 -0.34991\nv 0.528187 -0.818807 -0.326205\nv 0.583489 -0.839648 -0.320616\nv 0.54221 -0.842618 -0.302868\nv 0.588374 -0.870646 -0.307191\nv 0.613521 -0.919376 -0.279619\nv 0.577531 -0.914543 -0.250712\nv 0.619443 -0.969705 -0.245914\nv 0.603328 -0.967209 -0.23277\nv 0.610375 -0.981074 -0.243191\nv 0.602151 -0.901856 -0.253559\nv 0.552525 -0.876568 -0.291902\nv 0.617861 -0.936386 -0.230503\nv 0.616403 -0.967121 -0.23212\nv 0.572277 -0.930271 -0.248164\nv 0.525147 -0.860349 -0.323006\nv 0.486487 -0.846765 -0.378853\nv 0.45417 -0.827013 -0.401873\nv 0.552402 -0.855745 -0.409781\nv 0.572365 -0.854919 -0.370594\nv 0.511827 -0.850947 -0.350244\nv 0.53504 -0.916933 -0.301093\nv 0.557938 -0.950339 -0.264893\nv 0.596405 -0.902963 -0.342337\nv 0.567585 -0.936632 -0.340228\nv 0.576038 -0.961024 -0.307525\nv 0.601132 -0.949812 -0.260324\nv 0.587302 -0.959512 -0.281218\nv 0.616244 -0.927635 -0.291358\nv 0.607669 -0.93918 -0.307331\nv 0.596088 -0.949425 -0.233508\nv 0.606228 -0.957245 -0.251134\nv 0.621797 -0.954996 -0.256001\nv 0.253805 -0.386954 -0.335255\nv 0.301655 -0.350701 -0.347767\nv 0.37706 -0.347028 -0.326345\nv 0.224862 -0.434313 -0.30148\nv 0.235705 -0.476927 -0.224897\nv 0.486803 -0.80705 -0.539311\nv 0.564088 -0.845289 -0.496591\nv 0.552771 -0.845025 -0.446104\nv 0.583383 -0.936545 -0.24609\nv 0.613503 -0.930781 -0.27867\nv 0.572962 -0.897884 -0.379767\nv 0.549714 -0.924085 -0.370365\nv 0.524426 -0.904984 -0.351246\nv 0.495115 -0.924683 -0.389959\nv 0.546199 -0.911451 -0.424367\nv 0.519049 -0.937581 -0.409834\nv 0.620497 -0.845658 -0.491126\nv 0.612501 -0.842372 -0.459723\nv 0.638 -0.842741 -0.488314\nv 0.631744 -0.836028 -0.458423\nv 0.660686 -0.852388 -0.479422\nv 0.656187 -0.84629 -0.452378\nv 0.676379 -0.870646 -0.472622\nv 0.671036 -0.861456 -0.449021\nv 0.736899 -0.902436 -0.443082\nv 0.724528 -0.905142 -0.426616\nv 0.756634 -0.938548 -0.42753\nv 0.743419 -0.941781 -0.411978\nv 0.734264 -0.918603 -0.456824\nv 0.746301 -0.955137 -0.441658\nv 0.753576 -0.961041 -0.421731\nv 0.632253 -0.881348 -0.491794\nv 0.666151 -0.893474 -0.481724\nv 0.721787 -0.931853 -0.471128\nv 0.702861 -0.922504 -0.41623\nv 0.635328 -0.862053 -0.449619\nv 0.617861 -0.859558 -0.4541\nv 0.653464 -0.898763 -0.432889\nv 0.692229 -0.94642 -0.446315\nv 0.658419 -0.913665 -0.457614\nv 0.731768 -0.948758 -0.432679\nv 0.713791 -0.952571 -0.440305\nv 0.728816 -0.926581 -0.417636\nv 0.737304 -0.941992 -0.448828\nv 0.739711 -0.951341 -0.428514\nv 0.619952 -0.902717 -0.468773\nv 0.622184 -0.891013 -0.448389\nv 0.570924 -0.885864 -0.441992\nv 0.553175 -0.886849 -0.523407\nv 0.486733 -0.862704 -0.544407\nv 0.436175 -0.832935 -0.588163\nv 0.356834 -0.808614 -0.579535\nv 0.370066 -0.837258 -0.56502\nv 0.483482 -0.952536 -0.448898\nv 0.401293 -0.935525 -0.430816\nv 0.452167 -0.928848 -0.482146\nv 0.422223 -0.873687 -0.514832\nv 0.537448 -0.915563 -0.531227\nv 0.538256 -0.931167 -0.479844\nv 0.391171 -0.871859 -0.483183\nv 0.420536 -0.835378 -0.412048\nv 0.38532 -0.855323 -0.451112\nv 0.418304 -0.875303 -0.361104\nv 0.385689 -0.885583 -0.417513\nv 0.43737 -0.84608 -0.344305\nv 0.340087 -0.757196 -0.585158\nv 0.469634 -0.844937 -0.353952\nv 0.463501 -0.850525 -0.319984\nv 0.42948 -0.855042 -0.316698\nv 0.426792 -0.862317 -0.284293\nv 0.46554 -0.856043 -0.287562\nv 0.431185 -0.874688 -0.270481\nv 0.46633 -0.868836 -0.272713\nv 0.445647 -0.914016 -0.213949\nv 0.463782 -0.91725 -0.223544\nv 0.451376 -0.953414 -0.196095\nv 0.462306 -0.958897 -0.205374\nv 0.452501 -0.974467 -0.200243\nv 0.431255 -0.928303 -0.22075\nv 0.440885 -0.965645 -0.207219\nv 0.421801 -0.889766 -0.325695\nv 0.42159 -0.909043 -0.292342\nv 0.476786 -0.950111 -0.248902\nv 0.476031 -0.902383 -0.300724\nv 0.470407 -0.867255 -0.319176\nv 0.473237 -0.895284 -0.313763\nv 0.449812 -0.958036 -0.277932\nv 0.420008 -0.952061 -0.250079\nv 0.448441 -0.924841 -0.300267\nv 0.452255 -0.956595 -0.222701\nv 0.449724 -0.96619 -0.248445\nv 0.467051 -0.941676 -0.225091\nv 0.434084 -0.944734 -0.229624\nv 0.454609 -0.963044 -0.212034\nv 0.446174 -0.916406 -0.31306\nv 0.484923 -0.891418 -0.370365\nv 0.412944 -0.9234 -0.3704\nv 0.448547 -0.950989 -0.393632\nv 0.452237 -0.928373 -0.363494\nv 0.0993217 -0.0437212 0.013039\nv 0.117 -0.0326855 0.00843494\nv 0.132956 0.0132675 -0.0162198\nv 0.174393 0.0882332 -0.136154\nv 0.172284 0.0767757 -0.0868099\nv 0.171159 0.108829 -0.285049\nv 0.00316311 -0.239694 -0.424384\nv -0.0470776 -0.322356 -0.4651\nv -0.206288 -0.446754 -0.598162\nv -0.387411 -0.551928 -0.631445\nv -0.577268 -0.63445 -0.594559\nv -0.729255 -0.698028 -0.432784\nv -0.756634 -0.767687 -0.272432\nv -0.0792359 -0.255087 -0.536024\nv -0.261572 -0.388817 -0.610832\nv -0.427213 -0.493516 -0.610639\nv -0.583787 -0.592222 -0.559713\nv -0.7104 -0.676994 -0.421221\nv -0.0270973 -0.190806 -0.492918\nv -0.0579904 -0.180034 -0.514849\nv -0.023407 -0.156609 -0.518012\nv -0.0553017 -0.161248 -0.534214\nv -0.0514006 -0.128001 -0.550258\nv -0.00166942 -0.146557 -0.467385\nv -0.00917302 -0.129371 -0.496679\nv -0.035708 -0.118283 -0.496187\nv 0.007117 -0.119214 -0.480547\nv 0.0405405 -0.19309 -0.383492\nv 0.0145679 -0.112326 -0.445964\nv -0.0222824 -0.0805364 -0.516835\nv -0.00671283 -0.090834 -0.457034\nv -0.131445 -0.226655 -0.581046\nv -0.161038 -0.199944 -0.592732\nv -0.186729 -0.231417 -0.598092\nv -0.191685 -0.214336 -0.630531\nv -0.136365 -0.263962 -0.566109\nv -0.184778 -0.254472 -0.576389\nv -0.182881 -0.19432 -0.578199\nv -0.199258 -0.209767 -0.609725\nv -0.121833 -0.178909 -0.554037\nv -0.100534 -0.145644 -0.553632\nv -0.130584 -0.118546 -0.582259\nv -0.109795 -0.124855 -0.567726\nv -0.0574456 -0.0602397 -0.560046\nv -0.0993393 -0.105314 -0.550575\nv -0.0711524 -0.0882332 -0.579341\nv -0.0723474 -0.144238 -0.524584\nv -0.0709416 -0.0606088 -0.58203\nv -0.069729 -0.0438443 -0.568077\nv -0.0576565 -0.0340386 -0.537799\nv -0.0776895 -0.0167997 -0.565898\nv -0.0986539 -0.0506449 -0.559677\nv -0.099761 -0.0857555 -0.573349\nv -0.100692 -0.0549151 -0.613608\nv -0.116982 -0.104435 -0.542157\nv 0.00662496 -0.0410502 -0.463958\nv -0.0404878 0.0115278 -0.520332\nv -0.0445472 -0.0301902 -0.527414\nv -0.0606439 0.0340737 -0.528099\nv -0.0182758 -0.0848768 -0.478104\nv -0.0715566 -0.026781 -0.521632\nv -0.237427 -0.307929 -0.574316\nv -0.176308 -0.333954 -0.587425\nv -0.239694 -0.275841 -0.599304\nv -0.156925 -0.283221 -0.579623\nv -0.18947 -0.269655 -0.585211\nv -0.144132 -0.116473 -0.542983\nv 0.0806769 -0.0121428 -0.424314\nv -0.00416476 0.0702035 -0.465505\nv -0.0435982 0.121868 -0.484852\nv -0.0251292 0.0236179 -0.502829\nv -0.0629459 0.0179594 -0.50065\nv -0.0487998 0.0939092 -0.497382\nv -0.0861245 0.139528 -0.506537\nv -0.0925386 0.109092 -0.482779\nv 0.199487 0.100938 -0.197782\nv 0.17738 0.0913612 -0.124627\nv 0.19831 0.106421 -0.242382\nv 0.175887 0.137174 -0.313728\nv 0.206639 0.121463 -0.19787\nv 0.162514 0.0891997 -0.289969\nv 0.111763 0.0971251 -0.364724\nv 0.147348 0.106263 -0.297948\nv 0.154588 0.0526482 -0.320616\nv 0.144045 0.11635 -0.363319\nv 0.133835 0.100376 -0.371753\nv 0.0854743 0.0908691 -0.411521\nv 0.0331424 0.0769514 -0.462359\nv 0.0567427 0.0864408 -0.42709\nv 0.0578674 0.132394 -0.418814\nv 0.0914666 0.115664 -0.319017\nv 0.0016167 0.135241 -0.468404\nv 0.0493445 0.109145 -0.391611\nv 0.0489404 0.111588 -0.338225\nv 0.0333533 0.106052 -0.420044\nv 0.108635 0.131322 -0.399483\nv 0.111939 0.116701 -0.338611\nv 0.12431 0.125769 -0.350754\nv 0.0719081 0.115612 -0.379767\nv 0.181773 0.124222 -0.225758\nv 0.173251 0.074421 -0.0969318\nv 0.187168 0.0622078 -0.136506\nv 0.161776 0.113239 -0.152321\nv 0.156644 0.0894457 -0.11577\nv 0.163533 0.173005 -0.186237\nv 0.138052 0.21655 -0.187854\nv 0.189839 0.314607 -0.241785\nv 0.139194 0.129389 -0.254472\nv 0.103065 0.216954 -0.298123\nv 0.140635 0.300373 -0.309159\nv 0.0359189 0.167785 -0.365445\nv 0.0516114 0.260623 -0.381559\nv 0.184603 0.382684 -0.320423\nv 0.12243 0.350279 -0.409394\nv 0.048132 0.337785 -0.456929\nv 0.0643166 0.384441 -0.477665\nv -0.0773381 0.303975 -0.46568\nv 0.00256563 0.170052 -0.349875\nv -0.0538783 0.223702 -0.407795\nv -0.0493797 0.267019 -0.444101\nv -0.0796753 0.25999 -0.437142\nv 0.0692721 0.35274 -0.468861\nv 0.0275191 0.374653 -0.486399\nv 0.0205427 0.1086 -0.41363\nv -0.0501353 0.13879 -0.453133\nv -0.0464977 0.100271 -0.41247\nv -0.0154465 0.130267 -0.371507\nv -0.0440024 0.319562 -0.428795\nv 0.0268162 0.364338 -0.458932\nv -0.00581661 0.351791 -0.455365\nv 0.0063438 0.282782 -0.404316\nv -0.0853337 0.271272 -0.362405\nv -0.10846 0.346167 -0.416951\nv -0.0374653 0.295681 -0.386321\nv -0.0625417 0.206727 -0.376322\nv -0.0438442 0.287351 -0.433715\nv 0.0339859 0.382596 -0.465118\nv 0.00667768 0.391382 -0.464749\nv -0.070801 0.407426 -0.540962\nv -0.0435104 0.41254 -0.534267\nv -0.0234422 0.43969 -0.521738\nv -0.0482902 0.500281 -0.651337\nv -0.0672513 0.516044 -0.644853\nv -0.0307876 0.517503 -0.637455\nv -0.0628756 0.544547 -0.724528\nv -0.0640882 0.538362 -0.701508\nv -0.0449865 0.543862 -0.711173\nv -0.0430886 0.519154 -0.686553\nv -0.0613995 0.531069 -0.681756\nv -0.0303483 0.535427 -0.679946\nv -0.0533863 0.527115 -0.708256\nv -0.0242681 0.461129 -0.514744\nv -0.0612941 0.537131 -0.637367\nv -0.0400309 0.539012 -0.633325\nv -0.0557762 0.551488 -0.705216\nv -0.0525076 0.548237 -0.678892\nv -0.0398552 0.548835 -0.678206\nv -0.081907 0.478157 -0.513935\nv -0.106122 0.434717 -0.514796\nv -0.0461814 0.483745 -0.512512\nv 0.00878642 0.425755 -0.450708\nv -0.115998 0.394985 -0.40161\nv -0.0658279 0.470935 -0.449812\nv -0.0820652 0.444083 -0.422504\nv 0.0177661 0.620304 -0.538432\nv -0.03859 0.617158 -0.559537\nv -0.0890064 0.628668 -0.521052\nv 0.0423505 0.613222 -0.466664\nv 0.0536323 0.686571 -0.536639\nv -0.00625593 0.673022 -0.629178\nv -0.0384669 0.699329 -0.6254\nv 0.0489579 0.721295 -0.585\nv -0.0350051 0.73755 -0.597828\nv -0.0781464 0.71228 -0.518996\nv 0.0140231 0.706112 -0.49993\nv 0.00576389 0.754613 -0.580378\nv -0.0378695 0.747759 -0.522247\nv -0.053193 0.699698 -0.395407\nv -0.10556 0.682195 -0.37279\nv -0.104717 0.669894 -0.489984\nv -0.0573753 0.708238 -0.465838\nv -0.0261484 0.723351 -0.526465\nv -0.0811865 0.691825 -0.525797\nv -0.0417882 0.721804 -0.493656\nv 0.00660739 0.685288 -0.375514\nv -0.00962992 0.716515 -0.512354\nv -0.00961234 0.688381 -0.444909\nv 0.0383615 0.66833 -0.415703\nv 0.026658 0.667786 -0.464433\nv -0.0246723 0.706305 -0.348962\nv -0.0683584 0.702334 -0.313992\nv -0.0517344 0.7256 -0.393684\nv 0.0405933 0.695129 -0.611465\nv 0.0352335 0.757073 -0.577654\nv 0.0150951 0.756932 -0.695357\nv -0.0106491 0.764612 -0.688803\nv 0.0508909 0.803922 -0.669314\nv -0.0103504 0.805117 -0.665255\nv 0.0397146 0.765596 -0.681141\nv 0.0453731 0.815397 -0.652567\nv 0.0115454 0.808333 -0.736443\nv 0.0245493 0.863863 -0.72184\nv 0.042333 0.823586 -0.724862\nv 0.0454082 0.855165 -0.714635\nv 0.0204724 0.825221 -0.653516\nv 0.00950691 0.847573 -0.734404\nv 0.0500826 0.845324 -0.794099\nv 0.0562331 0.855147 -0.78765\nv 0.037518 0.866833 -0.782062\nv 0.0372193 0.854198 -0.790409\nv 0.0508558 0.857291 -0.809458\nv -0.115981 0.531051 -0.427653\nv -0.0912382 0.489737 -0.433873\nv -0.149598 0.450497 -0.476435\nv -0.14299 0.513847 -0.468949\nv -0.202931 0.499982 -0.518047\nv -0.201086 0.521492 -0.515271\nv 0.24551 0.627122 -0.204091\nv -0.0693424 0.71286 -0.356043\nv -0.0400134 0.70808 -0.365023\nv -0.00474467 0.733877 -0.327874\nv -0.0193301 0.755263 -0.270218\nv 0.0036903 0.780181 -0.243208\nv 0.0229326 0.74602 -0.328753\nv 0.0102098 0.754086 -0.299599\nv 0.00609778 0.719309 -0.329983\nv 0.0434576 0.75992 -0.30206\nv 0.0336344 0.728377 -0.324201\nv 0.0531227 0.749165 -0.295522\nv 0.0597301 0.793361 -0.261589\nv 0.0312621 0.774259 -0.225389\nv 0.0324395 0.725214 -0.389414\nv 0.0169051 0.697308 -0.400467\nv -0.00803079 0.556391 -0.494851\nv 0.0222648 0.52302 -0.523969\nv -0.00615049 0.534162 -0.561224\nv -0.0252697 0.499192 -0.523231\nv -0.0669877 0.58876 -0.508066\nv -0.125417 0.567093 -0.430728\nv 0.042825 0.750641 -0.284592\nv 0.061628 0.772854 -0.233508\nv 0.0597828 0.765438 -0.269286\nv 0.0325976 0.812586 -0.209451\nv 0.065986 0.777791 -0.199803\nv 0.0765473 0.852494 -0.202088\nv 0.0429129 0.830651 -0.188346\nv 0.073349 0.858293 -0.18158\nv 0.0397498 0.837978 -0.164499\nv 0.0480969 0.863108 -0.110902\nv 0.0721189 0.858996 -0.130742\nv 0.0882508 0.835413 -0.0971251\nv 0.0114399 0.790057 -0.23588\nv 0.0655643 0.817155 -0.217868\nv 0.076969 0.750589 -0.313306\nv 0.0968439 0.77686 -0.299687\nv 0.105226 0.724177 -0.29243\nv 0.0745088 0.727182 -0.342143\nv 0.103662 0.737919 -0.272274\nv 0.0993393 0.720768 -0.328208\nv 0.0754929 0.7437 -0.336907\nv 0.109865 0.748111 -0.327944\nv 0.0984255 0.737075 -0.311426\nv 0.0810811 0.760693 -0.274699\nv 0.0665483 0.757688 -0.255263\nv 0.121094 0.716146 -0.278178\nv 0.117931 0.712403 -0.323235\nv 0.0691316 0.846431 -0.0978456\nv 0.0713985 0.870945 -0.125593\nv 0.068868 0.826275 -0.191509\nv 0.0580782 0.800214 -0.187871\nv 0.086845 0.798914 -0.148578\nv 0.114751 0.643904 -0.123924\nv 0.148297 0.657769 -0.237269\nv 0.101149 0.750343 -0.149756\nv 0.10867 0.729361 -0.215478\nv 0.125769 0.632622 -0.179788\nv 0.183127 0.658788 -0.255931\nv 0.213598 0.618933 -0.212913\nv 0.2353 0.68701 -0.26043\nv 0.246108 0.624381 -0.262942\nv 0.246231 0.594612 -0.24428\nv 0.134907 0.692247 -0.26716\nv 0.15682 0.673374 -0.290022\nv 0.14176 0.728904 -0.299564\nv 0.14241 0.691157 -0.318385\nv 0.0764946 0.682582 -0.44642\nv 0.16898 0.688715 -0.44447\nv 0.144554 0.645696 -0.50297\nv 0.0820827 0.709943 -0.390381\nv 0.0476224 0.665009 -0.471971\nv 0.0828384 0.701191 -0.526412\nv 0.115787 0.719748 -0.348944\nv 0.120567 0.709556 -0.362791\nv 0.105349 0.729378 -0.41196\nv 0.143834 0.710558 -0.388746\nv 0.114346 0.702105 -0.422346\nv 0.136154 0.738569 -0.429164\nv 0.16464 0.704442 -0.400221\nv 0.15081 0.694602 -0.431659\nv 0.127842 0.713352 -0.399431\nv 0.20207 0.501476 -0.500211\nv 0.160106 0.53193 -0.529821\nv 0.158015 0.590377 -0.519488\nv 0.223896 0.560995 -0.485028\nv 0.256563 0.454416 -0.452413\nv 0.265016 0.527994 -0.443749\nv 0.244895 0.63814 -0.399466\nv 0.256599 0.444646 -0.385179\nv 0.261027 0.474555 -0.31429\nv 0.207096 0.454434 -0.539117\nv 0.134731 0.469335 -0.554212\nv 0.246319 0.427196 -0.491178\nv 0.203335 0.399448 -0.562718\nv 0.258989 0.384687 -0.510315\nv 0.276473 0.37272 -0.454065\nv 0.228974 0.39625 -0.360278\nv 0.253207 0.32812 -0.415615\nv 0.237128 0.345201 -0.636998\nv 0.313095 0.320775 -0.570081\nv 0.278846 0.350262 -0.607915\nv 0.193477 0.292799 -0.652023\nv 0.138333 0.431976 -0.568886\nv 0.150529 0.375584 -0.569465\nv 0.0929076 0.432819 -0.542017\nv 0.278477 0.478895 -0.362194\nv 0.20316 0.651619 -0.462851\nv 0.274787 0.562858 -0.330475\nv 0.265578 0.603855 -0.31603\nv 0.261045 0.516518 -0.253102\nv 0.328911 0.233965 -0.682055\nv 0.267494 0.304783 -0.533037\nv 0.266896 0.292605 -0.516255\nv 0.264665 0.29851 -0.495835\nv 0.298281 0.285225 -0.544828\nv 0.274013 0.333814 -0.537799\nv 0.173778 0.317612 -0.624205\nv 0.408217 0.176133 -0.686571\nv 0.341563 0.162848 -0.698169\nv 0.36258 0.179032 -0.699821\nv 0.365058 0.133571 -0.711577\nv 0.380136 0.147313 -0.71358\nv 0.390925 0.132851 -0.712298\nv 0.293062 0.194742 -0.677925\nv 0.242277 0.250431 -0.672249\nv 0.282694 0.274294 -0.677486\nv 0.329842 0.292008 -0.639335\nv 0.202474 0.24008 -0.656521\nv 0.147296 0.283292 -0.616033\nv 0.15617 0.267423 -0.634046\nv 0.112185 0.350402 -0.549872\nv 0.200401 0.21242 -0.637771\nv 0.139212 0.26289 -0.600622\nv 0.150617 0.245036 -0.619566\nv 0.364531 0.115418 -0.701121\nv 0.336063 0.14849 -0.686905\nv 0.285084 0.167258 -0.658419\nv 0.125576 0.283098 -0.573331\nv 0.134274 0.307261 -0.593628\nv 0.138597 0.37706 -0.411363\nv 0.0770921 0.39987 -0.484308\nv 0.0934172 0.420325 -0.4011\nv 0.0719608 0.423136 -0.473324\nv 0.0955084 0.416072 -0.450866\nv 0.0423681 0.409148 -0.500088\nv 0.0506801 0.425087 -0.505377\nv 0.015675 0.397744 -0.475047\nv 0.0168524 0.426598 -0.462113\nv 0.0130742 0.419675 -0.490862\nv 0.0217727 0.438354 -0.516536\nv 0.0273433 0.444013 -0.517538\nv 0.0263241 0.441992 -0.475925\nv 0.0241451 0.450005 -0.511581\nv 0.0173795 0.444259 -0.507029\nv 0.0509437 0.486276 -0.487154\nv 0.0784276 0.575598 -0.52353\nv 0.064176 0.613837 -0.497276\nv 0.0314027 0.540769 -0.479809\nv 0.0544231 0.526728 -0.505465\nv 0.0159737 0.495642 -0.519945\nv -0.00274136 0.50717 -0.547218\nv 0.0469195 0.453713 -0.483359\nv -0.0390293 0.540347 -0.467104\nv -0.0466559 0.483991 -0.488384\nv -0.0477103 0.51506 -0.489017\nv -0.00442836 0.478684 -0.510755\nv -0.00618564 0.540382 -0.538151\nv -0.0295927 0.52585 -0.525006\nv 0.105103 0.401504 -0.546972\nv 0.104207 0.515816 -0.532932\nv 0.0946122 0.458774 -0.492145\nv 0.190279 0.441061 -0.330967\nv 0.24117 0.472446 -0.223931\nv 0.241345 0.485274 -0.25927\nv 0.250237 0.511282 -0.227305\nv 0.219573 0.280656 -0.478192\nv 0.180069 0.338207 -0.41066\nv 0.175535 0.389432 -0.375514\nv 0.206165 0.45772 -0.26665\nv 0.197782 0.47111 -0.320529\nv 0.107388 0.326697 -0.496327\nv 0.0789372 0.389432 -0.516852\nv 0.179155 0.218009 -0.559572\nv 0.14589 0.253084 -0.530506\nv 0.317014 0.141936 -0.644554\nv 0.245334 0.179243 -0.609971\nv 0.346747 0.156943 -0.603592\nv 0.270323 0.183056 -0.542403\nv 0.369364 0.244579 -0.650564\nv 0.32689 0.221769 -0.549643\nv 0.38604 0.180666 -0.601237\nv 0.425649 0.174639 -0.626156\nv 0.287474 0.258268 -0.525024\nv 0.274804 0.215232 -0.512705\nv 0.311602 0.188767 -0.545812\nv 0.184181 0.305539 -0.441377\nv 0.130197 0.35998 -0.470566\nv 0.195814 0.251643 -0.495115\nv 0.247812 0.251415 -0.492145\nv 0.434506 0.136682 -0.691509\nv 0.435929 0.145978 -0.608934\nv 0.408498 0.156117 -0.605332\nv 0.438319 0.0318771 -0.703652\nv 0.476294 0.0384669 -0.672354\nv 0.495976 0.0486416 -0.630812\nv 0.498823 0.0632798 -0.604172\nv 0.402611 0.0256212 -0.716831\nv 0.518399 0.0263768 -0.614206\nv 0.52049 0.039943 -0.594243\nv 0.552209 -0.00880402 -0.600868\nv 0.555829 -0.000369045 -0.588655\nv 0.56523 -0.0182758 -0.601606\nv 0.571574 -0.0077145 -0.587196\nv 0.581064 -0.0372896 -0.593593\nv 0.584068 -0.030401 -0.58022\nv 0.596633 -0.0694479 -0.582803\nv 0.600341 -0.0983025 -0.568517\nv 0.605156 -0.0864935 -0.546041\nv 0.605964 -0.0835413 -0.561874\nv 0.602573 -0.0602046 -0.564914\nv 0.461217 0.0783397 -0.548659\nv 0.41261 0.136242 -0.587513\nv 0.528029 0.0128106 -0.569202\nv 0.565881 -0.017854 -0.567462\nv 0.595175 -0.0921344 -0.536921\nv 0.592767 -0.0619619 -0.548747\nv 0.602169 -0.120813 -0.553703\nv 0.608108 -0.107915 -0.536639\nv 0.616016 -0.11034 -0.550996\nv 0.614013 -0.136734 -0.534583\nv 0.394229 0.109215 -0.580695\nv 0.376797 0.0783046 -0.624732\nv 0.402014 0.0526834 -0.590641\nv 0.391523 0.0777422 -0.580132\nv 0.374794 0.125646 -0.617668\nv 0.128036 0.164921 -0.286455\nv 0.0497311 0.209609 -0.381893\nv -0.020982 0.232278 -0.427002\nv 0.102063 0.264014 -0.357713\nv 0.18882 0.668875 -0.281447\nv 0.216779 0.690577 -0.297807\nv 0.236794 0.652673 -0.299213\nv 0.217271 0.672934 -0.273504\nv 0.197413 0.685763 -0.367044\nv 0.218466 0.689558 -0.39089\nv 0.226883 0.66594 -0.366218\nv 0.165167 0.703265 -0.356817\nv 0.182951 0.697255 -0.355094\nv 0.202404 0.672249 -0.331389\nv 0.159069 0.690542 -0.332654\nv 0.173409 0.718518 -0.338752\nv 0.155484 0.696394 -0.348065\nv 0.147647 0.708326 -0.370348\nv 0.176554 0.726742 -0.379538\nv 0.179366 0.696781 -0.394897\nv 0.22437 0.658402 -0.336625\nv 0.212631 0.695357 -0.351105\nv 0.172003 0.674217 -0.301568\nv 0.165237 0.682476 -0.314554\nv 0.166397 0.689154 -0.297596\nv 0.158226 0.68513 -0.30749\nv 0.21648 0.666011 -0.314905\nv 0.213405 0.678259 -0.327575\nv 0.200313 0.667206 -0.318982\nv 0.17789 0.675869 -0.31712\nv 0.228377 0.650371 -0.320915\nv 0.200225 0.682301 -0.395336\nv 0.576389 -0.080923 -0.580572\nv 0.588022 -0.105455 -0.568042\nv 0.507715 -0.0106667 -0.609479\nv 0.553615 -0.0340386 -0.602766\nv 0.581889 -0.0992339 -0.537518\nv 0.573736 -0.0651425 -0.551664\nv 0.564932 -0.0792008 -0.57175\nv 0.57783 -0.108758 -0.55618\nv 0.602344 -0.111025 -0.53548\nv 0.598461 -0.12062 -0.551611\nv 0.609918 -0.130689 -0.532211\nv 0.605964 -0.135733 -0.538572\nv 0.545689 -0.0302077 -0.563122\nv 0.505377 -0.0027238 -0.569747\nv 0.535761 -0.0454961 -0.586107\nv 0.609426 -0.141075 -0.530559\nv 0.413067 0.126893 -0.532193\nv 0.438056 0.116877 -0.536059\nv 0.432784 0.101799 -0.505571\nv 0.408252 0.109461 -0.50188\nv 0.43187 0.0954732 -0.489439\nv 0.407268 0.104857 -0.486328\nv 0.429498 0.0848065 -0.475011\nv 0.402594 0.092644 -0.472235\nv 0.409693 0.0749657 -0.45243\nv 0.425421 0.0643869 -0.447686\nv 0.392542 0.0690437 -0.44816\nv 0.392981 0.10129 -0.551137\nv 0.391171 0.092644 -0.493305\nv 0.379644 0.0546867 -0.453168\nv 0.410537 0.0548624 -0.420413\nv 0.420096 0.044881 -0.427284\nv 0.393684 0.0560749 -0.427038\nv 0.405335 0.0327558 -0.401979\nv 0.407954 0.0237409 -0.407145\nv 0.393948 0.0289249 -0.407303\nv 0.433575 0.0765121 -0.495009\nv 0.428057 0.0499947 -0.45786\nv 0.392577 0.0409798 -0.465469\nv 0.415598 0.037026 -0.465522\nv 0.393122 0.0375004 -0.448652\nv 0.413717 0.0333357 -0.449021\nv 0.392612 0.0513654 -0.430043\nv 0.419692 0.0395389 -0.434225\nv 0.421678 0.0610305 -0.500685\nv 0.397058 0.0669876 -0.500879\nv 0.436931 0.0567075 -0.547324\nv 0.399765 0.0241451 -0.400485\nv 0.494289 0.0443187 -0.56755\nv 0.401188 0.0382385 -0.628335\nv 0.473412 0.0279935 -0.564106\nv 0.435824 0.025709 -0.587372\nv 0.501283 0.00789019 -0.642639\nv 0.491723 0.00207358 -0.657488\nv 0.510737 -0.0610481 -0.639722\nv 0.520174 -0.0554072 -0.626876\nv 0.514164 -0.0838225 -0.6364\nv 0.527765 -0.0760728 -0.61953\nv 0.507785 -0.104348 -0.623168\nv 0.518996 -0.101378 -0.603047\nv 0.501529 -0.143728 -0.601536\nv 0.513478 -0.139493 -0.587847\nv 0.505342 -0.16218 -0.583243\nv 0.487717 -0.170878 -0.587038\nv 0.504903 -0.162109 -0.564264\nv 0.50188 -0.0136717 -0.614311\nv 0.513355 -0.0773381 -0.596071\nv 0.508224 -0.131339 -0.576143\nv 0.495361 -0.152532 -0.553703\nv 0.495484 -0.191245 -0.56581\nv 0.475257 -0.189646 -0.56581\nv 0.492373 -0.181809 -0.551155\nv 0.474115 -0.201262 -0.545549\nv 0.466787 -0.192827 -0.549784\nv 0.47517 -0.190911 -0.543879\nv 0.493481 -0.0884968 -0.631146\nv 0.479809 -0.136348 -0.603434\nv 0.47278 -0.166169 -0.583664\nv 0.473483 -0.0254279 -0.650072\nv 0.479949 -0.154184 -0.551875\nv 0.492549 -0.119197 -0.569835\nv 0.470759 -0.125066 -0.589569\nv 0.463097 -0.160616 -0.569518\nv 0.488384 -0.174779 -0.551735\nv 0.471796 -0.181334 -0.564141\nv 0.478262 -0.0850526 -0.614311\nv 0.497171 -0.0737357 -0.592451\nv 0.483763 -0.0229677 -0.595385\nv 0.467016 -0.197132 -0.540822\nv 0.470776 -0.00569362 -0.674639\nv 0.455576 -0.00808352 -0.687573\nv 0.457562 -0.0733666 -0.665027\nv 0.467402 -0.0675676 -0.653464\nv 0.455769 -0.0879169 -0.661635\nv 0.470038 -0.0832074 -0.649334\nv 0.445876 -0.107827 -0.643447\nv 0.457509 -0.103662 -0.63257\nv 0.426387 -0.129846 -0.616297\nv 0.435771 -0.1254 -0.604471\nv 0.420694 -0.134749 -0.599445\nv 0.406196 -0.136594 -0.599111\nv 0.418181 -0.127561 -0.582469\nv 0.469757 -0.0288019 -0.651443\nv 0.457685 -0.0812744 -0.626296\nv 0.429955 -0.110849 -0.594085\nv 0.411292 -0.118142 -0.574614\nv 0.402084 -0.143799 -0.577971\nv 0.387991 -0.140214 -0.580677\nv 0.403631 -0.133483 -0.566566\nv 0.370189 -0.138509 -0.551611\nv 0.438882 -0.0935754 -0.653481\nv 0.408832 -0.121182 -0.618406\nv 0.394791 -0.129406 -0.599779\nv 0.432222 -0.0367624 -0.671107\nv 0.400467 -0.108987 -0.576389\nv 0.4234 -0.0987067 -0.600446\nv 0.411257 -0.100921 -0.615489\nv 0.38829 -0.117703 -0.592099\nv 0.397691 -0.126823 -0.566812\nv 0.386198 -0.133536 -0.581274\nv 0.428074 -0.0769866 -0.642656\nv 0.446772 -0.0745264 -0.62366\nv 0.420026 -0.0341792 -0.657347\nv 0.453063 -0.0321583 -0.62793\nv 0.358662 0.0625769 -0.692915\nv 0.377957 0.0218782 -0.692651\nv 0.349471 0.110709 -0.671283\nv 0.375655 0.085404 -0.71235\nv 0.441219 -0.00864585 -0.693635\nv 0.424613 -0.0115629 -0.703652\nv 0.418954 -0.0527713 -0.696113\nv 0.426528 -0.0531227 -0.687028\nv 0.410853 -0.0766528 -0.68933\nv 0.42101 -0.0754051 -0.679753\nv 0.395758 -0.0803079 -0.675939\nv 0.404439 -0.0834359 -0.666995\nv 0.376322 -0.0832777 -0.655028\nv 0.387007 -0.0848417 -0.646505\nv 0.375022 -0.0797983 -0.639458\nv 0.362422 -0.064053 -0.639335\nv 0.378642 -0.0719959 -0.628844\nv 0.428391 -0.0369909 -0.67181\nv 0.419815 -0.0633677 -0.67072\nv 0.394247 -0.0771096 -0.644677\nv 0.383088 -0.0658806 -0.628563\nv 0.35636 -0.0587812 -0.613714\nv 0.355235 -0.0525955 -0.619847\nv 0.36852 -0.0550733 -0.613819\nv 0.354901 -0.0347767 -0.601184\nv 0.397287 -0.0588515 -0.689084\nv 0.371015 -0.0659685 -0.659878\nv 0.362633 -0.0551084 -0.642709\nv 0.404 -0.0135311 -0.696763\nv 0.383439 -0.0591853 -0.632306\nv 0.393509 -0.0707659 -0.647946\nv 0.377711 -0.0597828 -0.657962\nv 0.370049 -0.0449338 -0.640056\nv 0.370576 -0.0505219 -0.615225\nv 0.356518 -0.0494676 -0.621358\nv 0.393069 -0.0537729 -0.676853\nv 0.414438 -0.0587636 -0.664763\nv 0.391488 -0.0168172 -0.680877\nv 0.410484 0.0641409 -0.552121\nv 0.102871 0.658261 -0.0631041\nv 0.121024 0.65146 -0.094208\nv 0.127596 0.573472 -0.0729976\nv 0.0750185 0.581661 -0.0556708\nv 0.104998 0.578059 -0.0594314\nv 0.102871 0.655291 -0.00917304\nv 0.0840509 0.604927 -0.0374478\nv 0.106509 0.598566 -0.0755281\nv 0.129529 0.604207 -0.100341\nv 0.123695 0.779303 -0.0699751\nv 0.101606 0.7146 -0.016044\nv 0.118125 0.805346 -0.0877764\nv 0.0132675 0.865726 -0.0939093\nv 0.0375356 0.9221 -0.06755\nv 0.0895336 0.896338 -0.0741398\nv 0.0928022 0.85223 -0.0353917\nv 0.0770218 0.841265 0.0080132\nv 0.0623836 0.925737 -0.102204\nv 0.00576389 0.967736 -0.108618\nv 0.0187502 0.960936 -0.130514\nv 0.00847011 1 -0.14176\nv 0.0176431 0.992479 -0.15067\nv 0.0718026 0.877131 -0.108793\nv 0.0532633 0.90117 -0.126155\nv 0.0110357 0.945524 -0.144625\nv 0.00553544 0.985608 -0.159561\nv 0.0123889 0.888413 -0.108073\nv -0.0163076 0.936334 -0.134467\nv -0.00506098 0.990493 -0.153077\nv -0.0194707 0.963659 -0.143588\nv -0.00254806 0.999104 -0.144537\nv -0.0197167 0.973852 -0.128282\nv 0.000421748 0.861139 -0.044389\nv 0.000474467 0.90219 -0.0739993\nv -0.0196113 0.946561 -0.111166\nv 0.0279935 0.891593 -0.120286\nv 0.0138123 0.848592 0.00926086\nv 0.00954205 0.91674 -0.0609251\nv -0.00832953 0.969054 -0.108829\nv 0.00736302 0.999157 -0.157558\nv 0.123379 0.805363 -0.0418761\nv 0.110551 0.823077 0.0101395\nv 0.214248 0.782255 0.0628932\nv 0.220838 0.756809 -0.0141989\nv 0.28656 0.729993 0.091572\nv 0.298563 0.657189 0.0578498\nv 0.289899 0.69244 0.116719\nv 0.259674 0.63155 0.114821\nv 0.257003 0.670474 0.147348\nv 0.138281 0.580607 0.187291\nv 0.189506 0.605332 0.167926\nv 0.189962 0.628422 0.185587\nv 0.159913 0.742822 0.100675\nv 0.213088 0.703125 0.11577\nv 0.129547 0.581643 0.181334\nv 0.164605 0.63619 0.1684\nv 0.103943 0.889977 -0.00834712\nv 0.122571 0.903332 0.0329491\nv 0.0952799 0.861807 0.0758092\nv 0.136067 0.903982 -0.0210347\nv 0.147594 0.920255 0.000667753\nv 0.184005 0.905493 -0.034144\nv 0.0506976 0.891224 0.0661969\nv 0.0925562 0.928127 0.0242681\nv 0.127632 0.937652 -0.00801324\nv 0.167504 0.918901 -0.034847\nv 0.0749482 0.907971 -0.000333902\nv 0.0480969 0.851843 0.00903242\nv 0.0766527 0.893017 -0.00741575\nv 0.107317 0.92398 -0.0217025\nv 0.161231 0.904509 -0.031104\nv 0.168506 0.916441 -0.02172\nv 0.0276421 0.872825 0.0308052\nv 0.00883914 0.827734 0.0575335\nv 0.0361825 0.863828 0.0831547\nv 0.156451 0.720609 -0.00374304\nv 0.153674 0.694197 0.0563736\nv 0.290532 0.680332 0.0269743\nv 0.220188 0.660299 0.0603451\nv 0.231505 0.700858 0.00569359\nv 0.217956 0.637384 0.0884441\nv 0.173215 0.606333 0.137455\nv 0.142867 0.570274 0.177082\nv 0.139282 0.574474 0.167873\nv 0.2104 0.681809 0.130127\nv 0.131656 0.570344 0.179858\nv 0.0881278 0.595016 0.00268863\nv 0.128264 0.558201 0.0246547\nv 0.115524 0.533617 0.0411731\nv 0.11584 0.527484 0.0417179\nv 0.0849823 0.499508 0.039328\nv 0.0874952 0.557604 0.0307173\nv 0.0989878 0.529944 0.0420518\nv 0.0950866 0.486961 0.0309282\nv 0.388992 0.221172 -0.621499\nv 0.347503 0.278723 -0.594384\nv 0.230767 0.771711 0.0179946\nv 0.300162 0.706305 0.0577268\nv 0.302516 0.67666 0.0889713\nv 0.153604 0.703757 0.0845605\nv 0.203054 0.674428 0.0836819\nv 0.202193 0.658525 0.101026\nv 0.182863 0.693741 0.0835061\nv 0.192844 0.679717 0.0521562\n# 2519 vertices\n\nvt  0.644 0.154 0.599\nvt  0.632 0.188 0.600\nvt  0.640 0.183 0.600\nvt  0.656 0.168 0.599\nvt  0.643 0.221 0.601\nvt  0.656 0.202 0.601\nvt  0.639 0.194 0.600\nvt  0.621 0.228 0.601\nvt  0.586 0.119 0.597\nvt  0.562 0.130 0.598\nvt  0.578 0.188 0.600\nvt  0.615 0.158 0.599\nvt  0.614 0.081 0.598\nvt  0.644 0.095 0.597\nvt  0.695 0.188 0.602\nvt  0.671 0.180 0.600\nvt  0.673 0.195 0.601\nvt  0.684 0.201 0.602\nvt  0.647 0.189 0.600\nvt  0.595 0.214 0.600\nvt  0.703 0.208 0.602\nvt  0.713 0.199 0.602\nvt  0.719 0.214 0.603\nvt  0.724 0.204 0.603\nvt  0.715 0.196 0.602\nvt  0.728 0.196 0.602\nvt  0.735 0.206 0.602\nvt  0.734 0.198 0.602\nvt  0.734 0.218 0.603\nvt  0.730 0.165 0.600\nvt  0.731 0.189 0.602\nvt  0.734 0.188 0.602\nvt  0.733 0.162 0.600\nvt  0.734 0.227 0.602\nvt  0.716 0.218 0.603\nvt  0.703 0.212 0.603\nvt  0.717 0.236 0.602\nvt  0.702 0.230 0.602\nvt  0.694 0.221 0.602\nvt  0.697 0.257 0.602\nvt  0.682 0.239 0.602\nvt  0.673 0.225 0.602\nvt  0.734 0.260 0.602\nvt  0.710 0.276 0.602\nvt  0.637 0.273 0.601\nvt  0.598 0.264 0.601\nvt  0.659 0.309 0.601\nvt  0.704 0.152 0.599\nvt  0.706 0.125 0.597\nvt  0.682 0.130 0.598\nvt  0.677 0.154 0.599\nvt  0.719 0.150 0.599\nvt  0.733 0.122 0.597\nvt  0.703 0.187 0.602\nvt  0.703 0.177 0.601\nvt  0.699 0.172 0.601\nvt  0.707 0.175 0.602\nvt  0.711 0.186 0.606\nvt  0.717 0.188 0.606\nvt  0.706 0.173 0.601\nvt  0.717 0.161 0.601\nvt  0.730 0.159 0.599\nvt  0.624 0.324 0.601\nvt  0.578 0.291 0.600\nvt  0.734 0.303 0.601\nvt  0.700 0.310 0.601\nvt  0.715 0.317 0.601\nvt  0.673 0.210 0.602\nvt  0.692 0.216 0.602\nvt  0.691 0.211 0.602\nvt  0.641 0.070 0.597\nvt  0.662 0.081 0.596\nvt  0.676 0.098 0.596\nvt  0.705 0.093 0.595\nvt  0.733 0.096 0.595\nvt  0.686 0.077 0.596\nvt  0.704 0.073 0.595\nvt  0.733 0.077 0.595\nvt  0.711 0.057 0.595\nvt  0.697 0.054 0.595\nvt  0.661 0.057 0.597\nvt  0.682 0.060 0.596\nvt  0.674 0.039 0.597\nvt  0.670 0.043 0.597\nvt  0.694 0.044 0.596\nvt  0.719 0.033 0.595\nvt  0.711 0.023 0.596\nvt  0.733 0.053 0.594\nvt  0.734 0.032 0.594\nvt  0.275 0.976 0.506\nvt  0.271 0.991 0.510\nvt  0.241 0.990 0.536\nvt  0.236 0.970 0.540\nvt  0.325 0.976 0.455\nvt  0.322 0.987 0.457\nvt  0.299 0.955 0.477\nvt  0.305 0.955 0.472\nvt  0.302 0.969 0.479\nvt  0.339 0.984 0.440\nvt  0.336 0.990 0.443\nvt  0.733 0.014 0.595\nvt  0.727 0.011 0.596\nvt  0.298 0.668 0.427\nvt  0.321 0.707 0.450\nvt  0.332 0.693 0.450\nvt  0.323 0.665 0.434\nvt  0.339 0.678 0.447\nvt  0.337 0.640 0.426\nvt  0.307 0.634 0.413\nvt  0.288 0.655 0.417\nvt  0.352 0.621 0.416\nvt  0.352 0.584 0.395\nvt  0.333 0.597 0.401\nvt  0.320 0.616 0.409\nvt  0.597 0.747 -0.465\nvt  0.621 0.733 -0.465\nvt  0.638 0.776 -0.437\nvt  0.611 0.783 -0.437\nvt  0.648 0.761 -0.440\nvt  0.645 0.778 -0.437\nvt  0.644 0.754 -0.446\nvt  0.579 0.752 -0.465\nvt  0.590 0.787 -0.440\nvt  0.542 0.754 -0.462\nvt  0.556 0.791 -0.451\nvt  0.606 0.693 -0.456\nvt  0.634 0.678 -0.468\nvt  0.643 0.715 -0.465\nvt  0.572 0.710 -0.457\nvt  0.571 0.695 -0.460\nvt  0.593 0.685 -0.461\nvt  0.563 0.668 -0.455\nvt  0.566 0.684 -0.426\nvt  0.561 0.686 -0.437\nvt  0.553 0.670 -0.459\nvt  0.547 0.707 -0.450\nvt  0.554 0.695 -0.446\nvt  0.541 0.682 -0.446\nvt  0.525 0.688 -0.442\nvt  0.556 0.654 -0.501\nvt  0.569 0.652 -0.505\nvt  0.576 0.668 -0.453\nvt  0.603 0.655 -0.496\nvt  0.586 0.664 -0.492\nvt  0.585 0.658 -0.494\nvt  0.595 0.649 -0.493\nvt  0.577 0.651 -0.498\nvt  0.586 0.642 -0.488\nvt  0.577 0.645 -0.494\nvt  0.570 0.634 -0.513\nvt  0.582 0.634 -0.511\nvt  0.563 0.651 -0.516\nvt  0.557 0.631 -0.502\nvt  0.521 0.674 -0.487\nvt  0.533 0.670 -0.497\nvt  0.588 0.624 -0.500\nvt  0.564 0.611 -0.444\nvt  0.609 0.620 -0.451\nvt  0.597 0.626 -0.482\nvt  0.454 0.857 -0.466\nvt  0.462 0.834 -0.465\nvt  0.497 0.846 -0.461\nvt  0.485 0.886 -0.467\nvt  0.525 0.846 -0.458\nvt  0.518 0.777 -0.462\nvt  0.563 0.844 -0.459\nvt  0.645 0.790 -0.437\nvt  0.643 0.805 -0.440\nvt  0.636 0.805 -0.444\nvt  0.640 0.813 -0.425\nvt  0.650 0.809 -0.442\nvt  0.644 0.817 -0.430\nvt  0.653 0.790 -0.438\nvt  0.657 0.776 -0.440\nvt  0.654 0.769 -0.436\nvt  0.467 0.802 -0.465\nvt  0.470 0.774 -0.467\nvt  0.499 0.775 -0.465\nvt  0.498 0.818 -0.462\nvt  0.661 0.741 -0.451\nvt  0.651 0.753 -0.447\nvt  0.517 0.713 -0.454\nvt  0.544 0.728 -0.465\nvt  0.512 0.735 -0.456\nvt  0.499 0.707 -0.479\nvt  0.386 0.562 -0.685\nvt  0.424 0.552 -0.685\nvt  0.411 0.596 -0.685\nvt  0.388 0.597 -0.685\nvt  0.423 0.813 -0.467\nvt  0.431 0.768 -0.467\nvt  0.441 0.742 -0.469\nvt  0.449 0.721 -0.469\nvt  0.460 0.745 -0.469\nvt  0.456 0.760 -0.468\nvt  0.408 0.746 -0.469\nvt  0.413 0.734 -0.469\nvt  0.667 0.706 -0.465\nvt  0.670 0.722 -0.461\nvt  0.430 0.709 -0.454\nvt  0.397 0.522 -0.685\nvt  0.389 0.523 -0.685\nvt  0.387 0.496 -0.685\nvt  0.395 0.491 -0.685\nvt  0.389 0.442 -0.685\nvt  0.409 0.461 -0.685\nvt  0.384 0.469 -0.685\nvt  0.367 0.448 -0.685\nvt  0.457 0.478 -0.685\nvt  0.437 0.450 -0.685\nvt  0.453 0.440 -0.697\nvt  0.468 0.464 -0.696\nvt  0.445 0.513 -0.685\nvt  0.425 0.499 -0.685\nvt  0.477 0.499 -0.685\nvt  0.495 0.484 -0.696\nvt  0.497 0.445 -0.646\nvt  0.510 0.452 -0.642\nvt  0.423 0.527 -0.685\nvt  0.462 0.528 -0.685\nvt  0.474 0.542 -0.685\nvt  0.445 0.562 -0.685\nvt  0.367 0.420 -0.685\nvt  0.334 0.432 -0.685\nvt  0.351 0.404 -0.685\nvt  0.323 0.418 -0.685\nvt  0.422 0.427 -0.685\nvt  0.395 0.403 -0.685\nvt  0.474 0.760 -0.468\nvt  0.493 0.756 -0.468\nvt  0.379 0.470 -0.685\nvt  0.447 0.388 -0.709\nvt  0.448 0.419 -0.705\nvt  0.485 0.401 -0.627\nvt  0.480 0.420 -0.637\nvt  0.478 0.587 -0.685\nvt  0.496 0.568 -0.685\nvt  0.486 0.600 -0.685\nvt  0.515 0.584 -0.685\nvt  0.395 0.801 -0.468\nvt  0.678 0.800 -0.452\nvt  0.660 0.758 -0.446\nvt  0.688 0.779 -0.457\nvt  0.706 0.767 -0.457\nvt  0.467 0.627 -0.685\nvt  0.501 0.611 -0.685\nvt  0.487 0.631 -0.685\nvt  0.538 0.562 -0.685\nvt  0.550 0.583 -0.685\nvt  0.528 0.603 -0.685\nvt  0.513 0.398 -0.667\nvt  0.523 0.406 -0.679\nvt  0.502 0.418 -0.600\nvt  0.496 0.414 -0.604\nvt  0.521 0.549 -0.685\nvt  0.508 0.511 -0.685\nvt  0.486 0.431 -0.620\nvt  0.506 0.432 -0.616\nvt  0.527 0.421 -0.676\nvt  0.545 0.559 -0.712\nvt  0.584 0.532 -0.709\nvt  0.583 0.550 -0.708\nvt  0.551 0.566 -0.701\nvt  0.612 0.550 -0.709\nvt  0.598 0.562 -0.709\nvt  0.589 0.564 -0.710\nvt  0.594 0.551 -0.709\nvt  0.598 0.537 -0.709\nvt  0.611 0.577 -0.710\nvt  0.610 0.570 -0.709\nvt  0.619 0.561 -0.709\nvt  0.617 0.570 -0.710\nvt  0.589 0.577 -0.701\nvt  0.629 0.566 -0.710\nvt  0.625 0.558 -0.709\nvt  0.632 0.555 -0.709\nvt  0.632 0.565 -0.709\nvt  0.620 0.536 -0.709\nvt  0.576 0.387 -0.709\nvt  0.605 0.396 -0.709\nvt  0.603 0.416 -0.709\nvt  0.574 0.413 -0.709\nvt  0.609 0.439 -0.709\nvt  0.570 0.439 -0.708\nvt  0.620 0.466 -0.709\nvt  0.572 0.467 -0.708\nvt  0.572 0.490 -0.708\nvt  0.623 0.493 -0.709\nvt  0.538 0.492 -0.708\nvt  0.531 0.463 -0.706\nvt  0.555 0.509 -0.709\nvt  0.623 0.515 -0.709\nvt  0.627 0.419 -0.709\nvt  0.647 0.429 -0.709\nvt  0.524 0.437 -0.666\nvt  0.521 0.356 -0.709\nvt  0.554 0.364 -0.708\nvt  0.662 0.494 -0.709\nvt  0.661 0.511 -0.709\nvt  0.681 0.501 -0.709\nvt  0.680 0.507 -0.709\nvt  0.752 0.685 -0.953\nvt  0.738 0.692 -0.953\nvt  0.731 0.679 -0.953\nvt  0.746 0.673 -0.953\nvt  0.726 0.671 -0.953\nvt  0.742 0.665 -0.954\nvt  0.721 0.659 -0.954\nvt  0.737 0.654 -0.954\nvt  0.716 0.649 -0.955\nvt  0.733 0.642 -0.955\nvt  0.720 0.620 -0.957\nvt  0.711 0.625 -0.957\nvt  0.705 0.612 -0.959\nvt  0.710 0.605 -0.958\nvt  0.700 0.603 -0.961\nvt  0.703 0.601 -0.958\nvt  0.699 0.629 -0.957\nvt  0.694 0.612 -0.958\nvt  0.695 0.604 -0.958\nvt  0.713 0.676 -0.954\nvt  0.698 0.655 -0.954\nvt  0.749 0.652 -0.954\nvt  0.756 0.664 -0.953\nvt  0.681 0.514 -0.709\nvt  0.665 0.524 -0.709\nvt  0.766 0.677 -0.953\nvt  0.684 0.487 -0.709\nvt  0.694 0.494 -0.709\nvt  0.717 0.692 -0.953\nvt  0.748 0.630 -0.954\nvt  0.766 0.647 -0.954\nvt  0.722 0.614 -0.956\nvt  0.733 0.611 -0.955\nvt  0.778 0.662 -0.953\nvt  0.695 0.631 -0.956\nvt  0.690 0.637 -0.955\nvt  0.678 0.661 -0.954\nvt  0.674 0.640 -0.954\nvt  0.747 0.602 -0.954\nvt  0.762 0.619 -0.954\nvt  0.720 0.599 -0.956\nvt  0.733 0.598 -0.955\nvt  0.677 0.627 -0.955\nvt  0.686 0.617 -0.956\nvt  0.718 0.610 -0.957\nvt  0.711 0.598 -0.957\nvt  0.695 0.626 -0.957\nvt  0.688 0.610 -0.957\nvt  0.696 0.597 -0.957\nvt  0.414 0.480 -0.685\nvt  0.360 0.450 -0.685\nvt  0.331 0.436 -0.685\nvt  0.652 0.454 -0.709\nvt  0.698 0.676 -0.954\nvt  0.682 0.679 -0.954\nvt  0.773 0.634 -0.954\nvt  0.695 0.697 -0.953\nvt  0.679 0.699 -0.953\nvt  0.793 0.639 -0.953\nvt  0.788 0.651 -0.953\nvt  0.861 0.723 -0.888\nvt  0.883 0.735 -0.890\nvt  0.863 0.747 -0.890\nvt  0.848 0.731 -0.892\nvt  0.845 0.726 -0.890\nvt  0.855 0.720 -0.882\nvt  0.840 0.719 -0.901\nvt  0.848 0.713 -0.894\nvt  0.833 0.714 -0.922\nvt  0.844 0.708 -0.911\nvt  0.826 0.685 -0.961\nvt  0.820 0.689 -0.959\nvt  0.810 0.676 -0.999\nvt  0.816 0.672 -1.002\nvt  0.813 0.691 -0.977\nvt  0.801 0.679 -1.017\nvt  0.831 0.733 -0.932\nvt  0.823 0.719 -0.947\nvt  0.835 0.680 -0.979\nvt  0.855 0.694 -0.951\nvt  0.859 0.711 -0.910\nvt  0.864 0.716 -0.907\nvt  0.869 0.703 -0.942\nvt  0.808 0.696 -0.991\nvt  0.809 0.722 -0.968\nvt  0.794 0.706 -1.006\nvt  0.848 0.669 -1.006\nvt  0.862 0.685 -0.968\nvt  0.825 0.666 -1.010\nvt  0.824 0.676 -0.985\nvt  0.816 0.666 -1.013\nvt  0.803 0.685 -1.003\nvt  0.795 0.684 -1.010\nvt  0.796 0.678 -1.013\nvt  0.817 0.738 -0.955\nvt  0.876 0.697 -0.955\nvt  0.668 0.471 -0.709\nvt  0.672 0.442 -0.708\nvt  0.691 0.461 -0.709\nvt  0.848 0.762 -0.935\nvt  0.629 0.397 -0.709\nvt  0.644 0.401 -0.709\nvt  0.741 0.427 -0.750\nvt  0.741 0.443 -0.728\nvt  0.718 0.446 -0.708\nvt  0.721 0.422 -0.704\nvt  0.746 0.415 -0.734\nvt  0.733 0.401 -0.694\nvt  0.699 0.454 -0.709\nvt  0.702 0.418 -0.714\nvt  0.711 0.392 -0.725\nvt  0.675 0.413 -0.707\nvt  0.679 0.396 -0.703\nvt  0.840 0.774 -0.966\nvt  0.817 0.772 -0.983\nvt  0.659 0.538 -0.709\nvt  0.651 0.559 -0.709\nvt  0.648 0.573 -0.709\nvt  0.693 0.558 -0.709\nvt  0.679 0.577 -0.709\nvt  0.668 0.560 -0.709\nvt  0.684 0.544 -0.709\nvt  0.685 0.525 -0.709\nvt  0.686 0.533 -0.709\nvt  0.913 0.704 -0.983\nvt  0.887 0.717 -0.934\nvt  0.628 0.574 -0.709\nvt  0.623 0.597 -0.709\nvt  0.610 0.598 -0.709\nvt  0.591 0.597 -0.711\nvt  0.711 0.753 -0.884\nvt  0.725 0.749 -0.889\nvt  0.736 0.760 -0.893\nvt  0.723 0.763 -0.883\nvt  0.737 0.743 -0.895\nvt  0.747 0.754 -0.900\nvt  0.742 0.740 -0.909\nvt  0.752 0.751 -0.914\nvt  0.788 0.725 -1.001\nvt  0.774 0.734 -0.957\nvt  0.769 0.729 -0.962\nvt  0.786 0.720 -1.007\nvt  0.780 0.738 -0.972\nvt  0.794 0.729 -1.014\nvt  0.747 0.772 -0.931\nvt  0.762 0.763 -0.952\nvt  0.734 0.726 -0.947\nvt  0.762 0.715 -0.999\nvt  0.724 0.741 -0.908\nvt  0.726 0.729 -0.939\nvt  0.785 0.751 -0.999\nvt  0.790 0.765 -1.007\nvt  0.771 0.773 -0.970\nvt  0.734 0.713 -0.970\nvt  0.751 0.704 -1.007\nvt  0.779 0.713 -1.005\nvt  0.787 0.716 -1.012\nvt  0.773 0.720 -0.989\nvt  0.799 0.731 -1.012\nvt  0.798 0.739 -1.005\nvt  0.787 0.741 -0.991\nvt  0.762 0.775 -0.961\nvt  0.726 0.715 -0.961\nvt  0.757 0.794 -0.975\nvt  0.740 0.793 -0.968\nvt  0.703 0.714 -0.975\nvt  0.700 0.733 -0.937\nvt  0.022 0.649 0.173\nvt  0.019 0.619 0.173\nvt  0.014 0.626 0.173\nvt  0.017 0.652 0.173\nvt  0.006 0.626 0.173\nvt  0.006 0.652 0.173\nvt  0.006 0.694 0.173\nvt  0.029 0.699 0.173\nvt  0.033 0.697 0.173\nvt  0.659 0.833 -0.454\nvt  0.646 0.821 -0.443\nvt  0.049 0.730 0.173\nvt  0.057 0.726 0.173\nvt  0.006 0.734 0.173\nvt  0.638 0.852 -0.457\nvt  0.628 0.839 -0.451\nvt  0.636 0.824 -0.446\nvt  0.615 0.835 -0.450\nvt  0.630 0.817 -0.442\nvt  0.013 0.588 0.173\nvt  0.006 0.588 0.173\nvt  0.017 0.588 0.172\nvt  0.022 0.546 0.111\nvt  0.006 0.532 0.117\nvt  0.203 0.940 -0.291\nvt  0.213 0.950 -0.291\nvt  0.264 0.917 -0.291\nvt  0.225 0.894 -0.291\nvt  0.281 0.893 -0.291\nvt  0.238 0.881 -0.291\nvt  0.291 0.865 -0.291\nvt  0.255 0.859 -0.291\nvt  0.289 0.825 -0.291\nvt  0.261 0.832 -0.291\nvt  0.268 0.756 -0.291\nvt  0.236 0.767 -0.291\nvt  0.226 0.700 -0.291\nvt  0.203 0.715 -0.291\nvt  0.183 0.647 -0.292\nvt  0.165 0.659 -0.292\nvt  0.146 0.581 -0.292\nvt  0.126 0.574 -0.292\nvt  0.121 0.528 -0.292\nvt  0.116 0.525 -0.292\nvt  0.328 0.815 -0.291\nvt  0.314 0.767 -0.291\nvt  0.295 0.734 -0.291\nvt  0.249 0.684 -0.291\nvt  0.201 0.637 -0.292\nvt  0.158 0.579 -0.292\nvt  0.123 0.522 -0.292\nvt  0.322 0.855 -0.291\nvt  0.338 0.844 -0.290\nvt  0.363 0.821 -0.291\nvt  0.330 0.862 -0.290\nvt  0.340 0.851 -0.290\nvt  0.319 0.881 -0.290\nvt  0.330 0.878 -0.290\nvt  0.325 0.888 -0.290\nvt  0.320 0.900 -0.291\nvt  0.333 0.900 -0.290\nvt  0.342 0.894 -0.290\nvt  0.353 0.802 -0.291\nvt  0.368 0.799 -0.290\nvt  0.368 0.783 -0.285\nvt  0.364 0.783 -0.291\nvt  0.355 0.777 -0.291\nvt  0.340 0.792 -0.291\nvt  0.377 0.783 -0.291\nvt  0.369 0.773 -0.291\nvt  0.381 0.805 -0.291\nvt  0.374 0.796 -0.291\nvt  0.368 0.782 -0.284\nvt  0.314 0.932 -0.291\nvt  0.364 0.837 -0.290\nvt  0.349 0.852 -0.290\nvt  0.374 0.850 -0.290\nvt  0.376 0.877 -0.290\nvt  0.370 0.877 -0.290\nvt  0.374 0.890 -0.290\nvt  0.380 0.880 -0.290\nvt  0.343 0.876 -0.290\nvt  0.385 0.850 -0.290\nvt  0.389 0.841 -0.290\nvt  0.373 0.840 -0.290\nvt  0.379 0.858 -0.290\nvt  0.385 0.871 -0.290\nvt  0.345 0.913 -0.290\nvt  0.398 0.846 -0.291\nvt  0.404 0.867 -0.291\nvt  0.385 0.891 -0.290\nvt  0.386 0.908 -0.290\nvt  0.411 0.901 -0.291\nvt  0.409 0.889 -0.291\nvt  0.315 0.721 -0.291\nvt  0.262 0.675 -0.291\nvt  0.211 0.632 -0.292\nvt  0.163 0.577 -0.292\nvt  0.335 0.781 -0.291\nvt  0.347 0.772 -0.291\nvt  0.372 0.918 -0.290\nvt  0.335 0.938 -0.291\nvt  0.372 0.939 -0.290\nvt  0.385 0.932 -0.287\nvt  0.381 0.927 -0.292\nvt  0.392 0.922 -0.290\nvt  0.419 0.914 -0.291\nvt  0.006 0.768 0.173\nvt  0.043 0.760 0.173\nvt  0.046 0.742 0.173\nvt  0.042 0.774 0.173\nvt  0.056 0.776 0.173\nvt  0.056 0.763 0.173\nvt  0.049 0.797 0.173\nvt  0.060 0.798 0.173\nvt  0.564 0.899 -0.417\nvt  0.556 0.895 -0.436\nvt  0.545 0.910 -0.381\nvt  0.540 0.908 -0.399\nvt  0.534 0.892 -0.435\nvt  0.535 0.915 -0.422\nvt  0.553 0.926 -0.441\nvt  0.533 0.931 -0.422\nvt  0.524 0.931 -0.385\nvt  0.601 0.873 -0.460\nvt  0.605 0.872 -0.459\nvt  0.612 0.875 -0.459\nvt  0.606 0.880 -0.452\nvt  0.006 0.921 0.173\nvt  0.042 0.914 0.173\nvt  0.035 0.886 0.173\nvt  0.006 0.890 0.173\nvt  0.048 0.804 0.173\nvt  0.046 0.816 0.173\nvt  0.055 0.821 0.173\nvt  0.064 0.840 0.173\nvt  0.044 0.821 0.173\nvt  0.052 0.847 0.173\nvt  0.040 0.795 0.173\nvt  0.379 0.374 0.257\nvt  0.397 0.365 0.257\nvt  0.417 0.331 0.257\nvt  0.395 0.331 0.257\nvt  0.369 0.339 0.257\nvt  0.357 0.348 0.257\nvt  0.416 0.362 0.257\nvt  0.432 0.356 0.257\nvt  0.118 0.199 0.365\nvt  0.138 0.210 0.372\nvt  0.133 0.232 0.365\nvt  0.098 0.201 0.360\nvt  0.390 0.287 0.257\nvt  0.399 0.237 0.257\nvt  0.379 0.242 0.257\nvt  0.374 0.298 0.257\nvt  0.392 0.203 0.257\nvt  0.375 0.199 0.257\nvt  0.364 0.236 0.257\nvt  0.393 0.185 0.257\nvt  0.379 0.181 0.257\nvt  0.519 0.123 0.194\nvt  0.504 0.133 0.211\nvt  0.498 0.157 0.248\nvt  0.531 0.162 0.263\nvt  0.413 0.942 -0.291\nvt  0.438 0.941 -0.291\nvt  0.384 0.962 -0.291\nvt  0.412 0.962 -0.291\nvt  0.395 0.939 -0.294\nvt  0.395 0.986 -0.291\nvt  0.376 0.973 -0.291\nvt  0.498 0.055 0.095\nvt  0.491 0.083 0.156\nvt  0.506 0.088 0.158\nvt  0.521 0.069 0.118\nvt  0.355 0.382 0.257\nvt  0.370 0.379 0.257\nvt  0.083 0.929 0.173\nvt  0.109 0.962 0.173\nvt  0.117 0.953 0.173\nvt  0.098 0.934 0.173\nvt  0.092 0.923 0.173\nvt  0.094 0.928 0.173\nvt  0.097 0.920 0.173\nvt  0.118 0.942 0.173\nvt  0.078 0.901 0.173\nvt  0.085 0.881 0.173\nvt  0.078 0.890 0.168\nvt  0.069 0.885 0.173\nvt  0.470 0.350 0.257\nvt  0.466 0.318 0.257\nvt  0.548 0.208 0.346\nvt  0.562 0.190 0.346\nvt  0.544 0.158 0.263\nvt  0.569 0.217 0.399\nvt  0.573 0.203 0.382\nvt  0.803 0.618 0.349\nvt  0.802 0.627 0.353\nvt  0.809 0.631 0.373\nvt  0.817 0.623 0.386\nvt  0.786 0.610 0.318\nvt  0.838 0.598 0.408\nvt  0.835 0.588 0.402\nvt  0.846 0.608 0.435\nvt  0.890 0.638 0.432\nvt  0.911 0.637 0.402\nvt  0.920 0.588 0.479\nvt  0.911 0.586 0.497\nvt  0.887 0.576 0.499\nvt  0.882 0.567 0.479\nvt  0.925 0.574 0.493\nvt  0.916 0.572 0.508\nvt  0.900 0.564 0.511\nvt  0.896 0.558 0.493\nvt  0.925 0.564 0.500\nvt  0.918 0.564 0.514\nvt  0.911 0.558 0.517\nvt  0.907 0.552 0.500\nvt  0.902 0.583 0.521\nvt  0.877 0.626 0.476\nvt  0.853 0.614 0.458\nvt  0.895 0.580 0.522\nvt  0.914 0.561 0.527\nvt  0.909 0.569 0.526\nvt  0.905 0.567 0.526\nvt  0.865 0.619 0.481\nvt  0.828 0.632 0.426\nvt  0.858 0.642 0.476\nvt  0.858 0.656 0.452\nvt  0.870 0.675 0.399\nvt  0.936 0.481 0.530\nvt  0.900 0.508 0.615\nvt  0.913 0.530 0.614\nvt  0.936 0.499 0.553\nvt  0.902 0.477 0.613\nvt  0.867 0.503 0.683\nvt  0.797 0.433 0.635\nvt  0.770 0.443 0.614\nvt  0.760 0.479 0.665\nvt  0.778 0.485 0.697\nvt  0.799 0.492 0.741\nvt  0.813 0.454 0.703\nvt  0.847 0.519 0.718\nvt  0.855 0.482 0.715\nvt  0.830 0.513 0.759\nvt  0.819 0.504 0.759\nvt  0.829 0.478 0.733\nvt  0.872 0.434 0.726\nvt  0.868 0.411 0.712\nvt  0.821 0.436 0.685\nvt  0.846 0.450 0.726\nvt  0.821 0.456 0.726\nvt  0.840 0.463 0.736\nvt  0.831 0.472 0.761\nvt  0.843 0.479 0.726\nvt  0.867 0.459 0.704\nvt  0.878 0.473 0.678\nvt  0.319 0.117 0.426\nvt  0.330 0.095 0.408\nvt  0.337 0.110 0.409\nvt  0.328 0.119 0.417\nvt  0.858 0.530 0.687\nvt  0.753 0.522 0.747\nvt  0.765 0.522 0.759\nvt  0.808 0.551 0.799\nvt  0.824 0.558 0.757\nvt  0.783 0.530 0.806\nvt  0.796 0.539 0.826\nvt  0.805 0.543 0.814\nvt  0.875 0.545 0.665\nvt  0.831 0.568 0.747\nvt  0.795 0.572 0.815\nvt  0.805 0.583 0.799\nvt  0.755 0.549 0.799\nvt  0.766 0.559 0.843\nvt  0.784 0.565 0.850\nvt  0.775 0.562 0.861\nvt  0.750 0.584 0.830\nvt  0.756 0.582 0.841\nvt  0.767 0.589 0.841\nvt  0.769 0.593 0.830\nvt  0.762 0.582 0.856\nvt  0.810 0.388 0.581\nvt  0.798 0.378 0.543\nvt  0.782 0.420 0.591\nvt  0.961 0.985 0.382\nvt  0.947 0.980 0.399\nvt  0.959 0.938 0.454\nvt  0.972 0.944 0.444\nvt  0.918 0.921 0.543\nvt  0.908 0.902 0.575\nvt  0.933 0.899 0.550\nvt  0.941 0.918 0.522\nvt  0.928 0.961 0.452\nvt  0.923 0.942 0.497\nvt  0.973 0.905 0.505\nvt  0.977 0.906 0.501\nvt  0.965 0.892 0.538\nvt  0.967 0.898 0.528\nvt  0.006 0.949 0.173\nvt  0.063 0.948 0.173\nvt  0.070 0.868 0.173\nvt  0.006 0.853 0.173\nvt  0.293 0.111 0.446\nvt  0.304 0.108 0.435\nvt  0.303 0.115 0.440\nvt  0.290 0.118 0.449\nvt  0.282 0.106 0.451\nvt  0.277 0.108 0.452\nvt  0.947 0.645 0.476\nvt  0.960 0.631 0.484\nvt  0.953 0.621 0.516\nvt  0.932 0.645 0.497\nvt  0.845 0.391 0.653\nvt  0.267 0.092 0.439\nvt  0.292 0.099 0.441\nvt  0.278 0.102 0.449\nvt  0.267 0.100 0.447\nvt  0.299 0.045 0.396\nvt  0.307 0.058 0.404\nvt  0.279 0.070 0.423\nvt  0.269 0.058 0.420\nvt  0.288 0.029 0.389\nvt  0.266 0.039 0.406\nvt  0.257 0.025 0.395\nvt  0.277 0.011 0.381\nvt  0.251 0.125 0.456\nvt  0.263 0.135 0.458\nvt  0.256 0.138 0.459\nvt  0.243 0.124 0.453\nvt  0.230 0.042 0.396\nvt  0.255 0.047 0.442\nvt  0.256 0.045 0.457\nvt  0.234 0.058 0.410\nvt  0.257 0.085 0.433\nvt  0.257 0.098 0.443\nvt  0.231 0.101 0.436\nvt  0.223 0.076 0.415\nvt  0.190 0.114 0.418\nvt  0.181 0.094 0.409\nvt  0.209 0.129 0.436\nvt  0.229 0.128 0.449\nvt  0.210 0.144 0.444\nvt  0.228 0.141 0.458\nvt  0.266 0.150 0.460\nvt  0.244 0.144 0.463\nvt  0.265 0.144 0.457\nvt  0.284 0.252 0.376\nvt  0.251 0.260 0.377\nvt  0.258 0.236 0.390\nvt  0.289 0.230 0.388\nvt  0.280 0.276 0.366\nvt  0.250 0.284 0.365\nvt  0.212 0.270 0.374\nvt  0.223 0.288 0.364\nvt  0.279 0.290 0.360\nvt  0.255 0.308 0.356\nvt  0.223 0.310 0.356\nvt  0.199 0.303 0.359\nvt  0.185 0.262 0.371\nvt  0.177 0.311 0.356\nvt  0.165 0.278 0.364\nvt  0.209 0.343 0.348\nvt  0.186 0.346 0.348\nvt  0.267 0.205 0.416\nvt  0.295 0.211 0.405\nvt  0.234 0.239 0.387\nvt  0.240 0.197 0.422\nvt  0.199 0.238 0.383\nvt  0.205 0.202 0.409\nvt  0.235 0.351 0.345\nvt  0.248 0.349 0.345\nvt  0.251 0.386 0.336\nvt  0.229 0.388 0.336\nvt  0.216 0.364 0.343\nvt  0.209 0.388 0.336\nvt  0.197 0.355 0.345\nvt  0.188 0.357 0.345\nvt  0.269 0.410 0.332\nvt  0.266 0.431 0.327\nvt  0.255 0.433 0.326\nvt  0.248 0.409 0.331\nvt  0.268 0.445 0.325\nvt  0.260 0.447 0.324\nvt  0.275 0.448 0.325\nvt  0.261 0.453 0.323\nvt  0.267 0.381 0.336\nvt  0.228 0.413 0.331\nvt  0.286 0.352 0.343\nvt  0.285 0.344 0.345\nvt  0.295 0.345 0.345\nvt  0.293 0.354 0.342\nvt  0.280 0.372 0.338\nvt  0.290 0.376 0.338\nvt  0.286 0.331 0.348\nvt  0.282 0.312 0.354\nvt  0.304 0.315 0.354\nvt  0.298 0.334 0.348\nvt  0.274 0.431 0.329\nvt  0.282 0.412 0.332\nvt  0.241 0.445 0.325\nvt  0.298 0.284 0.364\nvt  0.310 0.258 0.374\nvt  0.329 0.212 0.396\nvt  0.320 0.234 0.385\nvt  0.475 0.201 0.257\nvt  0.465 0.241 0.257\nvt  0.481 0.242 0.257\nvt  0.481 0.203 0.257\nvt  0.493 0.218 0.257\nvt  0.488 0.201 0.257\nvt  0.367 0.022 0.372\nvt  0.384 0.023 0.393\nvt  0.387 0.049 0.417\nvt  0.375 0.047 0.398\nvt  0.410 0.055 0.452\nvt  0.392 0.072 0.442\nvt  0.389 0.068 0.435\nvt  0.384 0.069 0.427\nvt  0.816 0.627 0.389\nvt  0.824 0.635 0.423\nvt  0.425 0.079 0.423\nvt  0.424 0.101 0.389\nvt  0.410 0.092 0.409\nvt  0.415 0.072 0.437\nvt  0.383 0.075 0.434\nvt  0.396 0.078 0.434\nvt  0.351 0.217 0.382\nvt  0.337 0.243 0.377\nvt  0.353 0.236 0.372\nvt  0.360 0.258 0.369\nvt  0.306 0.191 0.446\nvt  0.315 0.180 0.422\nvt  0.333 0.190 0.402\nvt  0.968 0.585 0.515\nvt  0.983 0.599 0.526\nvt  0.985 0.588 0.499\nvt  0.975 0.577 0.490\nvt  0.958 0.563 0.479\nvt  0.965 0.554 0.452\nvt  0.984 0.660 0.426\nvt  0.982 0.628 0.475\nvt  0.974 0.542 0.423\nvt  0.971 0.550 0.437\nvt  0.983 0.570 0.475\nvt  0.979 0.539 0.426\nvt  0.948 0.581 0.530\nvt  0.952 0.599 0.553\nvt  0.972 0.599 0.532\nvt  0.143 0.197 0.377\nvt  0.153 0.202 0.383\nvt  0.152 0.219 0.378\nvt  0.146 0.310 0.354\nvt  0.147 0.283 0.360\nvt  0.164 0.349 0.347\nvt  0.151 0.329 0.350\nvt  0.151 0.247 0.367\nvt  0.172 0.239 0.376\nvt  0.117 0.341 0.348\nvt  0.114 0.323 0.351\nvt  0.320 0.341 0.346\nvt  0.327 0.317 0.352\nvt  0.318 0.294 0.360\nvt  0.342 0.306 0.356\nvt  0.334 0.262 0.369\nvt  0.355 0.272 0.363\nvt  0.318 0.362 0.342\nvt  0.291 0.425 0.332\nvt  0.286 0.439 0.329\nvt  0.160 0.455 0.334\nvt  0.162 0.440 0.336\nvt  0.181 0.432 0.334\nvt  0.184 0.450 0.331\nvt  0.142 0.416 0.339\nvt  0.163 0.399 0.339\nvt  0.200 0.432 0.331\nvt  0.203 0.450 0.328\nvt  0.176 0.404 0.337\nvt  0.185 0.398 0.336\nvt  0.189 0.377 0.341\nvt  0.201 0.371 0.342\nvt  0.171 0.383 0.340\nvt  0.149 0.359 0.345\nvt  0.168 0.365 0.344\nvt  0.129 0.383 0.342\nvt  0.125 0.364 0.345\nvt  0.090 0.293 0.352\nvt  0.112 0.282 0.355\nvt  0.216 0.448 0.327\nvt  0.247 0.465 0.321\nvt  0.216 0.464 0.323\nvt  0.203 0.465 0.325\nvt  0.268 0.497 0.314\nvt  0.283 0.485 0.316\nvt  0.236 0.501 0.318\nvt  0.249 0.504 0.315\nvt  0.280 0.457 0.323\nvt  0.292 0.474 0.319\nvt  0.261 0.517 0.312\nvt  0.272 0.513 0.311\nvt  0.292 0.498 0.312\nvt  0.284 0.506 0.311\nvt  0.245 0.518 0.313\nvt  0.236 0.514 0.315\nvt  0.301 0.485 0.315\nvt  0.297 0.491 0.313\nvt  0.233 0.538 0.310\nvt  0.228 0.535 0.311\nvt  0.231 0.544 0.309\nvt  0.225 0.541 0.310\nvt  0.225 0.553 0.308\nvt  0.220 0.550 0.308\nvt  0.219 0.565 0.306\nvt  0.212 0.562 0.307\nvt  0.205 0.493 0.322\nvt  0.198 0.487 0.324\nvt  0.216 0.542 0.313\nvt  0.222 0.525 0.318\nvt  0.205 0.560 0.312\nvt  0.203 0.571 0.306\nvt  0.198 0.570 0.309\nvt  0.204 0.580 0.303\nvt  0.210 0.570 0.304\nvt  0.213 0.576 0.305\nvt  0.208 0.585 0.309\nvt  0.199 0.579 0.307\nvt  0.198 0.590 0.309\nvt  0.202 0.591 0.311\nvt  0.196 0.588 0.310\nvt  0.189 0.479 0.327\nvt  0.192 0.466 0.328\nvt  0.413 0.279 0.257\nvt  0.421 0.232 0.257\nvt  0.420 0.203 0.257\nvt  0.211 0.163 0.451\nvt  0.209 0.165 0.460\nvt  0.218 0.150 0.456\nvt  0.260 0.159 0.467\nvt  0.251 0.154 0.471\nvt  0.273 0.164 0.459\nvt  0.265 0.164 0.464\nvt  0.234 0.187 0.439\nvt  0.208 0.187 0.428\nvt  0.225 0.178 0.447\nvt  0.236 0.150 0.466\nvt  0.243 0.152 0.467\nvt  0.232 0.155 0.465\nvt  0.229 0.149 0.464\nvt  0.211 0.175 0.448\nvt  0.222 0.170 0.456\nvt  0.219 0.176 0.447\nvt  0.270 0.189 0.433\nvt  0.255 0.180 0.445\nvt  0.261 0.177 0.452\nvt  0.274 0.184 0.440\nvt  0.235 0.549 0.311\nvt  0.225 0.570 0.310\nvt  0.217 0.580 0.310\nvt  0.250 0.533 0.312\nvt  0.192 0.569 0.313\nvt  0.200 0.555 0.317\nvt  0.230 0.573 0.316\nvt  0.220 0.585 0.315\nvt  0.990 0.300 -0.059\nvt  0.991 0.318 -0.059\nvt  0.982 0.319 -0.059\nvt  0.979 0.302 -0.059\nvt  0.992 0.329 -0.059\nvt  0.984 0.330 -0.059\nvt  0.991 0.339 -0.060\nvt  0.988 0.340 -0.060\nvt  0.976 0.280 -0.059\nvt  0.988 0.278 -0.059\nvt  0.971 0.257 -0.059\nvt  0.986 0.256 -0.059\nvt  0.242 0.556 0.316\nvt  0.253 0.541 0.315\nvt  0.213 0.520 0.322\nvt  0.208 0.538 0.318\nvt  0.196 0.503 0.322\nvt  0.189 0.497 0.323\nvt  0.191 0.508 0.322\nvt  0.185 0.501 0.323\nvt  0.186 0.513 0.322\nvt  0.179 0.505 0.323\nvt  0.179 0.497 0.325\nvt  0.166 0.512 0.324\nvt  0.160 0.508 0.327\nvt  0.163 0.525 0.324\nvt  0.173 0.514 0.322\nvt  0.175 0.521 0.323\nvt  0.167 0.529 0.325\nvt  0.159 0.519 0.325\nvt  0.155 0.532 0.325\nvt  0.156 0.535 0.327\nvt  0.151 0.529 0.327\nvt  0.195 0.515 0.323\nvt  0.179 0.526 0.325\nvt  0.211 0.505 0.322\nvt  0.155 0.501 0.329\nvt  0.170 0.493 0.328\nvt  0.197 0.522 0.326\nvt  0.183 0.533 0.328\nvt  0.940 0.076 -0.059\nvt  0.959 0.078 -0.059\nvt  0.958 0.089 -0.059\nvt  0.939 0.088 -0.059\nvt  0.966 0.079 -0.060\nvt  0.965 0.089 -0.060\nvt  0.976 0.079 -0.060\nvt  0.972 0.092 -0.060\nvt  0.987 0.086 -0.063\nvt  0.986 0.093 -0.064\nvt  0.925 0.090 -0.059\nvt  0.922 0.076 -0.059\nvt  0.210 0.519 0.325\nvt  0.172 0.480 0.330\nvt  0.225 0.507 0.320\nvt  0.977 0.223 -0.059\nvt  0.960 0.205 -0.059\nvt  0.977 0.199 -0.059\nvt  0.989 0.207 -0.059\nvt  0.221 0.509 0.324\nvt  0.990 0.237 -0.059\nvt  0.277 0.540 0.307\nvt  0.270 0.543 0.307\nvt  0.280 0.549 0.305\nvt  0.273 0.551 0.305\nvt  0.283 0.557 0.304\nvt  0.275 0.562 0.304\nvt  0.287 0.574 0.301\nvt  0.280 0.576 0.302\nvt  0.266 0.557 0.308\nvt  0.256 0.532 0.312\nvt  0.275 0.578 0.305\nvt  0.281 0.589 0.297\nvt  0.276 0.591 0.304\nvt  0.289 0.595 0.286\nvt  0.285 0.583 0.295\nvt  0.292 0.585 0.297\nvt  0.296 0.596 0.297\nvt  0.284 0.599 0.297\nvt  0.293 0.605 0.292\nvt  0.297 0.604 0.300\nvt  0.288 0.606 0.299\nvt  0.287 0.549 0.307\nvt  0.295 0.570 0.306\nvt  0.298 0.585 0.303\nvt  0.285 0.520 0.310\nvt  0.272 0.596 0.309\nvt  0.268 0.579 0.312\nvt  0.302 0.568 0.312\nvt  0.304 0.586 0.309\nvt  0.955 0.307 -0.059\nvt  0.948 0.325 -0.059\nvt  0.938 0.322 -0.059\nvt  0.943 0.302 -0.059\nvt  0.945 0.335 -0.059\nvt  0.937 0.332 -0.059\nvt  0.939 0.343 -0.059\nvt  0.935 0.341 -0.059\nvt  0.949 0.279 -0.059\nvt  0.962 0.282 -0.059\nvt  0.953 0.248 -0.059\nvt  0.296 0.548 0.313\nvt  0.294 0.526 0.313\nvt  0.259 0.559 0.313\nvt  0.311 0.515 0.307\nvt  0.306 0.520 0.307\nvt  0.315 0.517 0.306\nvt  0.311 0.523 0.306\nvt  0.323 0.524 0.304\nvt  0.319 0.529 0.304\nvt  0.333 0.531 0.303\nvt  0.330 0.535 0.302\nvt  0.310 0.532 0.308\nvt  0.290 0.518 0.310\nvt  0.327 0.542 0.306\nvt  0.337 0.543 0.300\nvt  0.337 0.548 0.306\nvt  0.346 0.541 0.297\nvt  0.337 0.536 0.299\nvt  0.342 0.534 0.301\nvt  0.351 0.539 0.299\nvt  0.344 0.547 0.302\nvt  0.322 0.517 0.308\nvt  0.339 0.526 0.307\nvt  0.346 0.531 0.305\nvt  0.308 0.498 0.313\nvt  0.335 0.553 0.312\nvt  0.322 0.546 0.312\nvt  0.340 0.517 0.313\nvt  0.351 0.529 0.309\nvt  0.932 0.243 -0.059\nvt  0.927 0.260 -0.059\nvt  0.917 0.257 -0.059\nvt  0.923 0.240 -0.059\nvt  0.924 0.270 -0.059\nvt  0.914 0.267 -0.059\nvt  0.927 0.219 -0.059\nvt  0.939 0.224 -0.059\nvt  0.930 0.194 -0.059\nvt  0.950 0.203 -0.059\nvt  0.326 0.509 0.314\nvt  0.313 0.498 0.315\nvt  0.306 0.537 0.313\nvt  0.917 0.159 -0.059\nvt  0.918 0.137 -0.059\nvt  0.954 0.131 -0.059\nvt  0.953 0.158 -0.059\nvt  0.293 0.453 0.326\nvt  0.301 0.463 0.324\nvt  0.490 0.357 0.257\nvt  0.515 0.310 0.257\nvt  0.316 0.486 0.313\nvt  0.316 0.491 0.312\nvt  0.325 0.486 0.311\nvt  0.325 0.491 0.311\nvt  0.331 0.484 0.310\nvt  0.332 0.489 0.310\nvt  0.339 0.484 0.310\nvt  0.340 0.489 0.310\nvt  0.323 0.496 0.313\nvt  0.310 0.496 0.313\nvt  0.340 0.494 0.313\nvt  0.348 0.489 0.310\nvt  0.350 0.493 0.314\nvt  0.356 0.484 0.310\nvt  0.344 0.486 0.309\nvt  0.348 0.480 0.311\nvt  0.356 0.481 0.310\nvt  0.355 0.489 0.313\nvt  0.323 0.478 0.316\nvt  0.339 0.476 0.315\nvt  0.348 0.477 0.314\nvt  0.306 0.478 0.318\nvt  0.351 0.497 0.318\nvt  0.339 0.498 0.317\nvt  0.339 0.471 0.319\nvt  0.350 0.472 0.319\nvt  0.907 0.217 -0.059\nvt  0.897 0.228 -0.059\nvt  0.891 0.223 -0.059\nvt  0.898 0.211 -0.059\nvt  0.892 0.236 -0.059\nvt  0.885 0.233 -0.059\nvt  0.909 0.197 -0.059\nvt  0.920 0.203 -0.059\nvt  0.918 0.178 -0.059\nvt  0.324 0.472 0.320\nvt  0.310 0.470 0.322\nvt  0.323 0.500 0.316\nvt  0.176 0.085 0.401\nvt  0.215 0.062 0.397\nvt  0.153 0.089 0.396\nvt  0.162 0.098 0.403\nvt  0.145 0.098 0.397\nvt  0.142 0.089 0.391\nvt  0.137 0.117 0.393\nvt  0.108 0.087 0.373\nvt  0.147 0.068 0.378\nvt  0.166 0.059 0.379\nvt  0.171 0.074 0.392\nvt  0.141 0.078 0.384\nvt  0.953 0.836 0.434\nvt  0.972 0.813 0.434\nvt  0.986 0.844 0.428\nvt  0.934 0.863 0.427\nvt  0.075 0.646 0.962\nvt  0.074 0.608 0.962\nvt  0.090 0.585 0.962\nvt  0.101 0.665 0.963\nvt  0.100 0.713 0.964\nvt  0.089 0.720 0.963\nvt  0.079 0.677 0.963\nvt  0.101 0.745 0.969\nvt  0.096 0.746 0.962\nvt  0.063 0.684 0.962\nvt  0.058 0.658 0.962\nvt  0.079 0.725 0.963\nvt  0.091 0.752 0.963\nvt  0.053 0.625 0.962\nvt  0.164 0.685 0.962\nvt  0.150 0.699 0.962\nvt  0.142 0.688 0.962\nvt  0.147 0.671 0.962\nvt  0.104 0.747 0.962\nvt  0.110 0.728 0.964\nvt  0.117 0.733 0.963\nvt  0.108 0.750 0.963\nvt  0.116 0.710 0.963\nvt  0.125 0.721 0.963\nvt  0.125 0.672 0.963\nvt  0.133 0.639 0.962\nvt  0.160 0.712 0.962\nvt  0.134 0.738 0.962\nvt  0.114 0.667 0.963\nvt  0.105 0.715 0.963\nvt  0.161 0.043 0.599\nvt  0.176 0.031 0.599\nvt  0.186 0.055 0.382\nvt  0.821 0.154 0.598\nvt  0.830 0.180 0.599\nvt  0.837 0.187 0.599\nvt  0.846 0.183 0.599\nvt  0.824 0.224 0.601\nvt  0.847 0.227 0.600\nvt  0.830 0.192 0.600\nvt  0.813 0.199 0.600\nvt  0.879 0.119 0.598\nvt  0.850 0.158 0.598\nvt  0.888 0.188 0.599\nvt  0.903 0.130 0.599\nvt  0.851 0.081 0.598\nvt  0.822 0.095 0.597\nvt  0.771 0.186 0.601\nvt  0.785 0.197 0.601\nvt  0.795 0.191 0.600\nvt  0.797 0.177 0.600\nvt  0.822 0.187 0.600\nvt  0.873 0.214 0.600\nvt  0.812 0.166 0.599\nvt  0.766 0.207 0.602\nvt  0.755 0.198 0.602\nvt  0.750 0.214 0.602\nvt  0.745 0.203 0.602\nvt  0.753 0.195 0.602\nvt  0.740 0.196 0.602\nvt  0.737 0.165 0.600\nvt  0.737 0.188 0.602\nvt  0.753 0.218 0.602\nvt  0.766 0.212 0.602\nvt  0.751 0.237 0.602\nvt  0.767 0.231 0.602\nvt  0.777 0.219 0.602\nvt  0.769 0.259 0.602\nvt  0.784 0.243 0.602\nvt  0.798 0.225 0.601\nvt  0.758 0.276 0.602\nvt  0.884 0.834 0.418\nvt  0.846 0.815 0.389\nvt  0.881 0.797 0.403\nvt  0.905 0.808 0.417\nvt  0.832 0.274 0.601\nvt  0.870 0.264 0.600\nvt  0.807 0.309 0.601\nvt  0.763 0.151 0.599\nvt  0.790 0.152 0.598\nvt  0.785 0.129 0.597\nvt  0.760 0.125 0.597\nvt  0.748 0.150 0.599\nvt  0.765 0.185 0.601\nvt  0.764 0.175 0.601\nvt  0.769 0.171 0.600\nvt  0.760 0.174 0.601\nvt  0.757 0.185 0.606\nvt  0.751 0.187 0.606\nvt  0.750 0.160 0.600\nvt  0.761 0.172 0.600\nvt  0.737 0.158 0.599\nvt  0.844 0.324 0.601\nvt  0.891 0.292 0.600\nvt  0.888 0.768 0.401\nvt  0.910 0.771 0.408\nvt  0.752 0.937 0.721\nvt  0.801 0.920 0.721\nvt  0.816 0.938 0.722\nvt  0.759 0.960 0.721\nvt  0.736 0.957 0.721\nvt  0.731 0.939 0.720\nvt  0.700 0.960 0.721\nvt  0.644 0.938 0.720\nvt  0.655 0.926 0.719\nvt  0.709 0.931 0.720\nvt  0.612 0.920 0.701\nvt  0.606 0.925 0.711\nvt  0.730 0.896 0.720\nvt  0.777 0.879 0.721\nvt  0.704 0.902 0.720\nvt  0.611 0.917 0.708\nvt  0.653 0.913 0.717\nvt  0.188 0.806 0.906\nvt  0.220 0.794 0.906\nvt  0.241 0.834 0.906\nvt  0.191 0.856 0.906\nvt  0.185 0.773 0.907\nvt  0.205 0.767 0.906\nvt  0.151 0.854 0.906\nvt  0.160 0.807 0.906\nvt  0.167 0.777 0.909\nvt  0.119 0.850 0.906\nvt  0.135 0.806 0.906\nvt  0.148 0.779 0.908\nvt  0.099 0.841 0.906\nvt  0.124 0.803 0.906\nvt  0.195 0.746 0.906\nvt  0.183 0.749 0.906\nvt  0.174 0.743 0.905\nvt  0.195 0.900 0.906\nvt  0.148 0.876 0.906\nvt  0.971 0.755 0.431\nvt  0.954 0.793 0.436\nvt  0.943 0.747 0.431\nvt  0.976 0.691 0.417\nvt  0.952 0.704 0.423\nvt  0.778 0.337 0.601\nvt  0.769 0.309 0.601\nvt  0.756 0.316 0.601\nvt  0.770 0.334 0.601\nvt  0.111 0.890 0.906\nvt  0.771 0.353 0.601\nvt  0.774 0.363 0.601\nvt  0.405 0.669 0.427\nvt  0.381 0.665 0.434\nvt  0.371 0.694 0.450\nvt  0.381 0.708 0.450\nvt  0.367 0.640 0.426\nvt  0.364 0.678 0.447\nvt  0.416 0.655 0.417\nvt  0.397 0.634 0.413\nvt  0.372 0.598 0.401\nvt  0.385 0.617 0.409\nvt  0.796 0.204 0.601\nvt  0.777 0.208 0.602\nvt  0.785 0.214 0.602\nvt  0.755 0.850 0.721\nvt  0.756 0.817 0.721\nvt  0.790 0.811 0.722\nvt  0.779 0.847 0.721\nvt  0.894 0.935 0.722\nvt  0.864 0.975 0.722\nvt  0.828 0.951 0.722\nvt  0.893 0.927 0.722\nvt  0.685 0.872 0.720\nvt  0.669 0.827 0.721\nvt  0.685 0.818 0.721\nvt  0.706 0.858 0.720\nvt  0.785 0.851 0.722\nvt  0.764 0.862 0.721\nvt  0.743 0.867 0.721\nvt  0.716 0.874 0.720\nvt  0.733 0.854 0.721\nvt  0.625 0.885 0.720\nvt  0.662 0.857 0.721\nvt  0.643 0.895 0.718\nvt  0.610 0.909 0.717\nvt  0.604 0.909 0.717\nvt  0.692 0.883 0.720\nvt  0.136 0.074 0.377\nvt  0.138 0.067 0.371\nvt  0.134 0.056 0.365\nvt  0.143 0.055 0.370\nvt  0.825 0.070 0.597\nvt  0.804 0.081 0.597\nvt  0.789 0.097 0.596\nvt  0.761 0.093 0.595\nvt  0.780 0.077 0.596\nvt  0.762 0.073 0.595\nvt  0.770 0.054 0.595\nvt  0.754 0.051 0.595\nvt  0.805 0.057 0.597\nvt  0.796 0.043 0.597\nvt  0.792 0.039 0.597\nvt  0.784 0.060 0.596\nvt  0.746 0.033 0.595\nvt  0.772 0.044 0.596\nvt  0.755 0.024 0.596\nvt  0.944 0.389 0.506\nvt  0.988 0.393 0.540\nvt  0.982 0.369 0.536\nvt  0.948 0.371 0.510\nvt  0.887 0.372 0.457\nvt  0.893 0.379 0.455\nvt  0.909 0.408 0.477\nvt  0.912 0.391 0.479\nvt  0.904 0.406 0.472\nvt  0.877 0.372 0.443\nvt  0.879 0.381 0.440\nvt  0.741 0.011 0.596\nvt  0.214 0.421 0.330\nvt  0.029 0.141 0.173\nvt  0.024 0.143 0.173\nvt  0.022 0.118 0.173\nvt  0.027 0.110 0.173\nvt  0.014 0.144 0.173\nvt  0.014 0.118 0.173\nvt  0.036 0.190 0.173\nvt  0.014 0.186 0.173\nvt  0.040 0.189 0.173\nvt  0.064 0.218 0.173\nvt  0.056 0.222 0.173\nvt  0.014 0.225 0.173\nvt  0.014 0.080 0.173\nvt  0.021 0.080 0.173\nvt  0.025 0.080 0.172\nvt  0.014 0.024 0.117\nvt  0.029 0.038 0.111\nvt  0.014 0.260 0.173\nvt  0.053 0.233 0.173\nvt  0.050 0.252 0.173\nvt  0.063 0.255 0.173\nvt  0.064 0.268 0.173\nvt  0.050 0.266 0.173\nvt  0.057 0.289 0.173\nvt  0.067 0.290 0.173\nvt  0.014 0.412 0.173\nvt  0.014 0.382 0.173\nvt  0.042 0.377 0.173\nvt  0.050 0.406 0.173\nvt  0.062 0.313 0.173\nvt  0.054 0.307 0.173\nvt  0.056 0.296 0.173\nvt  0.072 0.332 0.173\nvt  0.059 0.339 0.173\nvt  0.051 0.313 0.173\nvt  0.047 0.286 0.173\nvt  0.090 0.421 0.173\nvt  0.105 0.426 0.173\nvt  0.124 0.445 0.173\nvt  0.116 0.454 0.173\nvt  0.100 0.415 0.173\nvt  0.105 0.412 0.173\nvt  0.102 0.419 0.173\nvt  0.126 0.433 0.173\nvt  0.085 0.393 0.173\nvt  0.077 0.377 0.173\nvt  0.086 0.382 0.168\nvt  0.093 0.372 0.173\nvt  0.071 0.440 0.173\nvt  0.014 0.441 0.173\nvt  0.014 0.345 0.173\nvt  0.077 0.359 0.173\nvt  0.691 0.337 0.601\nvt  0.700 0.334 0.601\nvt  0.696 0.362 0.601\nvt  0.698 0.353 0.601\nvt  0.765 0.978 0.721\nvt  0.740 0.975 0.721\nvt  0.799 0.868 0.721\nvt  0.597 0.747 -0.465\nvt  0.611 0.783 -0.437\nvt  0.638 0.776 -0.437\nvt  0.621 0.733 -0.465\nvt  0.648 0.761 -0.440\nvt  0.644 0.754 -0.446\nvt  0.645 0.778 -0.437\nvt  0.579 0.752 -0.465\nvt  0.590 0.787 -0.440\nvt  0.542 0.754 -0.462\nvt  0.556 0.791 -0.451\nvt  0.643 0.715 -0.465\nvt  0.634 0.678 -0.468\nvt  0.606 0.693 -0.456\nvt  0.593 0.685 -0.461\nvt  0.571 0.695 -0.460\nvt  0.572 0.710 -0.457\nvt  0.563 0.668 -0.455\nvt  0.553 0.670 -0.459\nvt  0.561 0.686 -0.437\nvt  0.566 0.684 -0.426\nvt  0.554 0.695 -0.446\nvt  0.547 0.707 -0.450\nvt  0.541 0.682 -0.446\nvt  0.525 0.688 -0.442\nvt  0.576 0.668 -0.453\nvt  0.569 0.652 -0.505\nvt  0.556 0.654 -0.501\nvt  0.603 0.655 -0.496\nvt  0.595 0.649 -0.493\nvt  0.585 0.658 -0.494\nvt  0.586 0.664 -0.492\nvt  0.577 0.651 -0.498\nvt  0.586 0.642 -0.488\nvt  0.582 0.634 -0.511\nvt  0.570 0.634 -0.513\nvt  0.577 0.645 -0.494\nvt  0.557 0.631 -0.502\nvt  0.563 0.651 -0.516\nvt  0.533 0.670 -0.497\nvt  0.521 0.674 -0.487\nvt  0.588 0.624 -0.500\nvt  0.597 0.626 -0.482\nvt  0.609 0.620 -0.451\nvt  0.564 0.611 -0.444\nvt  0.454 0.857 -0.466\nvt  0.485 0.886 -0.467\nvt  0.497 0.846 -0.461\nvt  0.462 0.834 -0.465\nvt  0.525 0.846 -0.458\nvt  0.563 0.844 -0.459\nvt  0.518 0.777 -0.462\nvt  0.645 0.790 -0.437\nvt  0.636 0.805 -0.444\nvt  0.643 0.805 -0.440\nvt  0.640 0.813 -0.425\nvt  0.644 0.817 -0.430\nvt  0.650 0.809 -0.442\nvt  0.653 0.790 -0.438\nvt  0.657 0.776 -0.440\nvt  0.654 0.769 -0.436\nvt  0.467 0.802 -0.465\nvt  0.498 0.818 -0.462\nvt  0.499 0.775 -0.465\nvt  0.470 0.774 -0.467\nvt  0.651 0.753 -0.447\nvt  0.661 0.741 -0.451\nvt  0.517 0.713 -0.454\nvt  0.512 0.735 -0.456\nvt  0.544 0.728 -0.465\nvt  0.499 0.707 -0.479\nvt  0.386 0.562 -0.685\nvt  0.388 0.597 -0.685\nvt  0.411 0.596 -0.685\nvt  0.424 0.552 -0.685\nvt  0.431 0.768 -0.467\nvt  0.423 0.813 -0.467\nvt  0.441 0.742 -0.469\nvt  0.456 0.760 -0.468\nvt  0.460 0.745 -0.469\nvt  0.449 0.721 -0.469\nvt  0.408 0.746 -0.469\nvt  0.413 0.734 -0.469\nvt  0.667 0.706 -0.465\nvt  0.670 0.722 -0.461\nvt  0.430 0.709 -0.454\nvt  0.397 0.522 -0.685\nvt  0.395 0.491 -0.685\nvt  0.387 0.496 -0.685\nvt  0.389 0.523 -0.685\nvt  0.389 0.442 -0.685\nvt  0.367 0.448 -0.685\nvt  0.384 0.469 -0.685\nvt  0.409 0.461 -0.685\nvt  0.457 0.478 -0.685\nvt  0.468 0.464 -0.696\nvt  0.453 0.440 -0.697\nvt  0.437 0.450 -0.685\nvt  0.445 0.513 -0.685\nvt  0.477 0.499 -0.685\nvt  0.425 0.499 -0.685\nvt  0.495 0.484 -0.696\nvt  0.510 0.452 -0.642\nvt  0.497 0.445 -0.646\nvt  0.462 0.528 -0.685\nvt  0.423 0.527 -0.685\nvt  0.474 0.542 -0.685\nvt  0.445 0.562 -0.685\nvt  0.367 0.420 -0.685\nvt  0.334 0.432 -0.685\nvt  0.351 0.404 -0.685\nvt  0.323 0.418 -0.685\nvt  0.422 0.427 -0.685\nvt  0.395 0.403 -0.685\nvt  0.474 0.760 -0.468\nvt  0.493 0.756 -0.468\nvt  0.379 0.470 -0.685\nvt  0.448 0.419 -0.705\nvt  0.447 0.388 -0.709\nvt  0.480 0.420 -0.637\nvt  0.485 0.401 -0.627\nvt  0.478 0.587 -0.685\nvt  0.496 0.568 -0.685\nvt  0.486 0.600 -0.685\nvt  0.515 0.584 -0.685\nvt  0.395 0.801 -0.468\nvt  0.678 0.800 -0.452\nvt  0.688 0.779 -0.457\nvt  0.660 0.758 -0.446\nvt  0.706 0.767 -0.457\nvt  0.467 0.627 -0.685\nvt  0.487 0.631 -0.685\nvt  0.501 0.611 -0.685\nvt  0.538 0.562 -0.685\nvt  0.528 0.603 -0.685\nvt  0.550 0.583 -0.685\nvt  0.513 0.398 -0.667\nvt  0.496 0.414 -0.604\nvt  0.502 0.418 -0.600\nvt  0.523 0.406 -0.679\nvt  0.521 0.549 -0.685\nvt  0.508 0.511 -0.685\nvt  0.486 0.431 -0.620\nvt  0.506 0.432 -0.616\nvt  0.527 0.421 -0.676\nvt  0.545 0.559 -0.712\nvt  0.551 0.566 -0.701\nvt  0.583 0.550 -0.708\nvt  0.584 0.532 -0.709\nvt  0.612 0.550 -0.709\nvt  0.594 0.551 -0.709\nvt  0.589 0.564 -0.710\nvt  0.598 0.562 -0.709\nvt  0.598 0.537 -0.709\nvt  0.611 0.577 -0.710\nvt  0.617 0.570 -0.710\nvt  0.619 0.561 -0.709\nvt  0.610 0.570 -0.709\nvt  0.589 0.577 -0.701\nvt  0.629 0.566 -0.710\nvt  0.632 0.565 -0.709\nvt  0.632 0.555 -0.709\nvt  0.625 0.558 -0.709\nvt  0.620 0.536 -0.709\nvt  0.576 0.387 -0.709\nvt  0.574 0.413 -0.709\nvt  0.603 0.416 -0.709\nvt  0.605 0.396 -0.709\nvt  0.570 0.439 -0.708\nvt  0.609 0.439 -0.709\nvt  0.572 0.467 -0.708\nvt  0.620 0.466 -0.709\nvt  0.572 0.490 -0.708\nvt  0.623 0.493 -0.709\nvt  0.538 0.492 -0.708\nvt  0.531 0.463 -0.706\nvt  0.623 0.515 -0.709\nvt  0.555 0.509 -0.709\nvt  0.627 0.419 -0.709\nvt  0.647 0.429 -0.709\nvt  0.524 0.437 -0.666\nvt  0.521 0.356 -0.709\nvt  0.554 0.364 -0.708\nvt  0.661 0.511 -0.709\nvt  0.662 0.494 -0.709\nvt  0.680 0.507 -0.709\nvt  0.681 0.501 -0.709\nvt  0.752 0.685 -0.953\nvt  0.746 0.673 -0.953\nvt  0.731 0.679 -0.953\nvt  0.738 0.692 -0.953\nvt  0.742 0.665 -0.954\nvt  0.726 0.671 -0.953\nvt  0.737 0.654 -0.954\nvt  0.721 0.659 -0.954\nvt  0.733 0.642 -0.955\nvt  0.716 0.649 -0.955\nvt  0.720 0.620 -0.957\nvt  0.710 0.605 -0.958\nvt  0.705 0.612 -0.959\nvt  0.711 0.625 -0.957\nvt  0.703 0.601 -0.958\nvt  0.700 0.603 -0.961\nvt  0.699 0.629 -0.957\nvt  0.694 0.612 -0.958\nvt  0.695 0.604 -0.958\nvt  0.713 0.676 -0.954\nvt  0.698 0.655 -0.954\nvt  0.756 0.664 -0.953\nvt  0.749 0.652 -0.954\nvt  0.665 0.524 -0.709\nvt  0.681 0.514 -0.709\nvt  0.766 0.677 -0.953\nvt  0.694 0.494 -0.709\nvt  0.684 0.487 -0.709\nvt  0.717 0.692 -0.953\nvt  0.766 0.647 -0.954\nvt  0.748 0.630 -0.954\nvt  0.733 0.611 -0.955\nvt  0.722 0.614 -0.956\nvt  0.778 0.662 -0.953\nvt  0.695 0.631 -0.956\nvt  0.690 0.637 -0.955\nvt  0.674 0.640 -0.954\nvt  0.678 0.661 -0.954\nvt  0.762 0.619 -0.954\nvt  0.747 0.602 -0.954\nvt  0.733 0.598 -0.955\nvt  0.720 0.599 -0.956\nvt  0.677 0.627 -0.955\nvt  0.686 0.617 -0.956\nvt  0.711 0.598 -0.957\nvt  0.718 0.610 -0.957\nvt  0.688 0.610 -0.957\nvt  0.695 0.626 -0.957\nvt  0.696 0.597 -0.957\nvt  0.414 0.480 -0.685\nvt  0.360 0.450 -0.685\nvt  0.331 0.436 -0.685\nvt  0.652 0.454 -0.709\nvt  0.682 0.679 -0.954\nvt  0.698 0.676 -0.954\nvt  0.773 0.634 -0.954\nvt  0.679 0.699 -0.953\nvt  0.695 0.697 -0.953\nvt  0.788 0.651 -0.953\nvt  0.793 0.639 -0.953\nvt  0.861 0.723 -0.888\nvt  0.848 0.731 -0.892\nvt  0.863 0.747 -0.890\nvt  0.883 0.735 -0.890\nvt  0.855 0.720 -0.882\nvt  0.845 0.726 -0.890\nvt  0.848 0.713 -0.894\nvt  0.840 0.719 -0.901\nvt  0.844 0.708 -0.911\nvt  0.833 0.714 -0.922\nvt  0.826 0.685 -0.961\nvt  0.816 0.672 -1.002\nvt  0.810 0.676 -0.999\nvt  0.820 0.689 -0.959\nvt  0.813 0.691 -0.977\nvt  0.801 0.679 -1.017\nvt  0.831 0.733 -0.932\nvt  0.823 0.719 -0.947\nvt  0.855 0.694 -0.951\nvt  0.835 0.680 -0.979\nvt  0.864 0.716 -0.907\nvt  0.859 0.711 -0.910\nvt  0.869 0.703 -0.942\nvt  0.808 0.696 -0.991\nvt  0.794 0.706 -1.006\nvt  0.809 0.722 -0.968\nvt  0.862 0.685 -0.968\nvt  0.848 0.669 -1.006\nvt  0.825 0.666 -1.010\nvt  0.816 0.666 -1.013\nvt  0.824 0.676 -0.985\nvt  0.796 0.678 -1.013\nvt  0.795 0.684 -1.010\nvt  0.803 0.685 -1.003\nvt  0.817 0.738 -0.955\nvt  0.876 0.697 -0.955\nvt  0.668 0.471 -0.709\nvt  0.691 0.461 -0.709\nvt  0.672 0.442 -0.708\nvt  0.848 0.762 -0.935\nvt  0.629 0.397 -0.709\nvt  0.644 0.401 -0.709\nvt  0.741 0.427 -0.750\nvt  0.721 0.422 -0.704\nvt  0.718 0.446 -0.708\nvt  0.741 0.443 -0.728\nvt  0.746 0.415 -0.734\nvt  0.733 0.401 -0.694\nvt  0.702 0.418 -0.714\nvt  0.699 0.454 -0.709\nvt  0.711 0.392 -0.725\nvt  0.675 0.413 -0.707\nvt  0.679 0.396 -0.703\nvt  0.840 0.774 -0.966\nvt  0.817 0.772 -0.983\nvt  0.659 0.538 -0.709\nvt  0.648 0.573 -0.709\nvt  0.651 0.559 -0.709\nvt  0.693 0.558 -0.709\nvt  0.684 0.544 -0.709\nvt  0.668 0.560 -0.709\nvt  0.679 0.577 -0.709\nvt  0.686 0.533 -0.709\nvt  0.685 0.525 -0.709\nvt  0.913 0.704 -0.983\nvt  0.887 0.717 -0.934\nvt  0.628 0.574 -0.709\nvt  0.623 0.597 -0.709\nvt  0.610 0.598 -0.709\nvt  0.591 0.597 -0.711\nvt  0.711 0.753 -0.884\nvt  0.723 0.763 -0.883\nvt  0.736 0.760 -0.893\nvt  0.725 0.749 -0.889\nvt  0.747 0.754 -0.900\nvt  0.737 0.743 -0.895\nvt  0.752 0.751 -0.914\nvt  0.742 0.740 -0.909\nvt  0.788 0.725 -1.001\nvt  0.786 0.720 -1.007\nvt  0.769 0.729 -0.962\nvt  0.774 0.734 -0.957\nvt  0.780 0.738 -0.972\nvt  0.794 0.729 -1.014\nvt  0.747 0.772 -0.931\nvt  0.762 0.763 -0.952\nvt  0.762 0.715 -0.999\nvt  0.734 0.726 -0.947\nvt  0.724 0.741 -0.908\nvt  0.726 0.729 -0.939\nvt  0.785 0.751 -0.999\nvt  0.771 0.773 -0.970\nvt  0.790 0.765 -1.007\nvt  0.751 0.704 -1.007\nvt  0.734 0.713 -0.970\nvt  0.779 0.713 -1.005\nvt  0.773 0.720 -0.989\nvt  0.787 0.716 -1.012\nvt  0.787 0.741 -0.991\nvt  0.798 0.739 -1.005\nvt  0.799 0.731 -1.012\nvt  0.762 0.775 -0.961\nvt  0.726 0.715 -0.961\nvt  0.740 0.793 -0.968\nvt  0.757 0.794 -0.975\nvt  0.703 0.714 -0.975\nvt  0.700 0.733 -0.937\nvt  0.646 0.821 -0.443\nvt  0.659 0.833 -0.454\nvt  0.636 0.824 -0.446\nvt  0.628 0.839 -0.451\nvt  0.638 0.852 -0.457\nvt  0.630 0.817 -0.442\nvt  0.615 0.835 -0.450\nvt  0.203 0.940 -0.291\nvt  0.225 0.894 -0.291\nvt  0.264 0.917 -0.291\nvt  0.213 0.950 -0.291\nvt  0.238 0.881 -0.291\nvt  0.281 0.893 -0.291\nvt  0.255 0.859 -0.291\nvt  0.291 0.865 -0.291\nvt  0.261 0.832 -0.291\nvt  0.289 0.825 -0.291\nvt  0.236 0.767 -0.291\nvt  0.268 0.756 -0.291\nvt  0.203 0.715 -0.291\nvt  0.226 0.700 -0.291\nvt  0.165 0.659 -0.292\nvt  0.183 0.647 -0.292\nvt  0.126 0.574 -0.292\nvt  0.146 0.581 -0.292\nvt  0.116 0.525 -0.292\nvt  0.121 0.528 -0.292\nvt  0.314 0.767 -0.291\nvt  0.328 0.815 -0.291\nvt  0.249 0.684 -0.291\nvt  0.295 0.734 -0.291\nvt  0.201 0.637 -0.292\nvt  0.158 0.579 -0.292\nvt  0.123 0.522 -0.292\nvt  0.322 0.855 -0.291\nvt  0.363 0.821 -0.291\nvt  0.338 0.844 -0.290\nvt  0.340 0.851 -0.290\nvt  0.330 0.862 -0.290\nvt  0.330 0.878 -0.290\nvt  0.319 0.881 -0.290\nvt  0.325 0.888 -0.290\nvt  0.320 0.900 -0.291\nvt  0.342 0.894 -0.290\nvt  0.333 0.900 -0.290\nvt  0.353 0.802 -0.291\nvt  0.364 0.783 -0.291\nvt  0.368 0.783 -0.285\nvt  0.368 0.799 -0.290\nvt  0.340 0.792 -0.291\nvt  0.355 0.777 -0.291\nvt  0.369 0.773 -0.291\nvt  0.377 0.783 -0.291\nvt  0.374 0.796 -0.291\nvt  0.381 0.805 -0.291\nvt  0.368 0.782 -0.284\nvt  0.314 0.932 -0.291\nvt  0.364 0.837 -0.290\nvt  0.374 0.850 -0.290\nvt  0.349 0.852 -0.290\nvt  0.376 0.877 -0.290\nvt  0.380 0.880 -0.290\nvt  0.374 0.890 -0.290\nvt  0.370 0.877 -0.290\nvt  0.343 0.876 -0.290\nvt  0.373 0.840 -0.290\nvt  0.389 0.841 -0.290\nvt  0.385 0.850 -0.290\nvt  0.379 0.858 -0.290\nvt  0.385 0.871 -0.290\nvt  0.345 0.913 -0.290\nvt  0.398 0.846 -0.291\nvt  0.404 0.867 -0.291\nvt  0.385 0.891 -0.290\nvt  0.409 0.889 -0.291\nvt  0.411 0.901 -0.291\nvt  0.386 0.908 -0.290\nvt  0.262 0.675 -0.291\nvt  0.315 0.721 -0.291\nvt  0.211 0.632 -0.292\nvt  0.163 0.577 -0.292\nvt  0.335 0.781 -0.291\nvt  0.347 0.772 -0.291\nvt  0.372 0.918 -0.290\nvt  0.372 0.939 -0.290\nvt  0.335 0.938 -0.291\nvt  0.381 0.927 -0.292\nvt  0.385 0.932 -0.287\nvt  0.419 0.914 -0.291\nvt  0.392 0.922 -0.290\nvt  0.564 0.899 -0.417\nvt  0.556 0.895 -0.436\nvt  0.534 0.892 -0.435\nvt  0.540 0.908 -0.399\nvt  0.545 0.910 -0.381\nvt  0.535 0.915 -0.422\nvt  0.524 0.931 -0.385\nvt  0.533 0.931 -0.422\nvt  0.553 0.926 -0.441\nvt  0.601 0.873 -0.460\nvt  0.606 0.880 -0.452\nvt  0.612 0.875 -0.459\nvt  0.605 0.872 -0.459\nvt  0.379 0.374 0.257\nvt  0.395 0.331 0.257\nvt  0.417 0.331 0.257\nvt  0.397 0.365 0.257\nvt  0.357 0.348 0.257\nvt  0.369 0.339 0.257\nvt  0.432 0.356 0.257\nvt  0.416 0.362 0.257\nvt  0.118 0.199 0.365\nvt  0.098 0.201 0.360\nvt  0.133 0.232 0.365\nvt  0.138 0.210 0.372\nvt  0.390 0.287 0.257\nvt  0.374 0.298 0.257\nvt  0.379 0.242 0.257\nvt  0.399 0.237 0.257\nvt  0.364 0.236 0.257\nvt  0.375 0.199 0.257\nvt  0.392 0.203 0.257\nvt  0.393 0.185 0.257\nvt  0.379 0.181 0.257\nvt  0.519 0.123 0.194\nvt  0.531 0.162 0.263\nvt  0.498 0.157 0.248\nvt  0.504 0.133 0.211\nvt  0.438 0.941 -0.291\nvt  0.413 0.942 -0.291\nvt  0.384 0.962 -0.291\nvt  0.395 0.939 -0.294\nvt  0.412 0.962 -0.291\nvt  0.395 0.986 -0.291\nvt  0.376 0.973 -0.291\nvt  0.498 0.055 0.095\nvt  0.521 0.069 0.118\nvt  0.506 0.088 0.158\nvt  0.491 0.083 0.156\nvt  0.370 0.379 0.257\nvt  0.355 0.382 0.257\nvt  0.466 0.318 0.257\nvt  0.470 0.350 0.257\nvt  0.544 0.158 0.263\nvt  0.562 0.190 0.346\nvt  0.548 0.208 0.346\nvt  0.573 0.203 0.382\nvt  0.569 0.217 0.399\nvt  0.803 0.618 0.349\nvt  0.817 0.623 0.386\nvt  0.809 0.631 0.373\nvt  0.802 0.627 0.353\nvt  0.786 0.610 0.318\nvt  0.835 0.588 0.402\nvt  0.838 0.598 0.408\nvt  0.846 0.608 0.435\nvt  0.890 0.638 0.432\nvt  0.911 0.586 0.497\nvt  0.920 0.588 0.479\nvt  0.911 0.637 0.402\nvt  0.882 0.567 0.479\nvt  0.887 0.576 0.499\nvt  0.916 0.572 0.508\nvt  0.925 0.574 0.493\nvt  0.896 0.558 0.493\nvt  0.900 0.564 0.511\nvt  0.918 0.564 0.514\nvt  0.925 0.564 0.500\nvt  0.911 0.558 0.517\nvt  0.907 0.552 0.500\nvt  0.877 0.626 0.476\nvt  0.902 0.583 0.521\nvt  0.895 0.580 0.522\nvt  0.853 0.614 0.458\nvt  0.909 0.569 0.526\nvt  0.914 0.561 0.527\nvt  0.905 0.567 0.526\nvt  0.865 0.619 0.481\nvt  0.858 0.642 0.476\nvt  0.828 0.632 0.426\nvt  0.870 0.675 0.399\nvt  0.858 0.656 0.452\nvt  0.936 0.481 0.530\nvt  0.936 0.499 0.553\nvt  0.913 0.530 0.614\nvt  0.900 0.508 0.615\nvt  0.867 0.503 0.683\nvt  0.902 0.477 0.613\nvt  0.797 0.433 0.635\nvt  0.778 0.485 0.697\nvt  0.760 0.479 0.665\nvt  0.770 0.443 0.614\nvt  0.813 0.454 0.703\nvt  0.799 0.492 0.741\nvt  0.847 0.519 0.718\nvt  0.830 0.513 0.759\nvt  0.855 0.482 0.715\nvt  0.829 0.478 0.733\nvt  0.819 0.504 0.759\nvt  0.872 0.434 0.726\nvt  0.846 0.450 0.726\nvt  0.821 0.436 0.685\nvt  0.868 0.411 0.712\nvt  0.821 0.456 0.726\nvt  0.840 0.463 0.736\nvt  0.831 0.472 0.761\nvt  0.867 0.459 0.704\nvt  0.843 0.479 0.726\nvt  0.878 0.473 0.678\nvt  0.319 0.117 0.426\nvt  0.328 0.119 0.417\nvt  0.337 0.110 0.409\nvt  0.330 0.095 0.408\nvt  0.858 0.530 0.687\nvt  0.765 0.522 0.759\nvt  0.753 0.522 0.747\nvt  0.824 0.558 0.757\nvt  0.808 0.551 0.799\nvt  0.783 0.530 0.806\nvt  0.805 0.543 0.814\nvt  0.796 0.539 0.826\nvt  0.875 0.545 0.665\nvt  0.831 0.568 0.747\nvt  0.805 0.583 0.799\nvt  0.795 0.572 0.815\nvt  0.766 0.559 0.843\nvt  0.755 0.549 0.799\nvt  0.784 0.565 0.850\nvt  0.775 0.562 0.861\nvt  0.756 0.582 0.841\nvt  0.750 0.584 0.830\nvt  0.769 0.593 0.830\nvt  0.767 0.589 0.841\nvt  0.762 0.582 0.856\nvt  0.810 0.388 0.581\nvt  0.782 0.420 0.591\nvt  0.798 0.378 0.543\nvt  0.961 0.985 0.382\nvt  0.972 0.944 0.444\nvt  0.959 0.938 0.454\nvt  0.947 0.980 0.399\nvt  0.918 0.921 0.543\nvt  0.941 0.918 0.522\nvt  0.933 0.899 0.550\nvt  0.908 0.902 0.575\nvt  0.928 0.961 0.452\nvt  0.923 0.942 0.497\nvt  0.977 0.906 0.501\nvt  0.973 0.905 0.505\nvt  0.967 0.898 0.528\nvt  0.965 0.892 0.538\nvt  0.293 0.111 0.446\nvt  0.290 0.118 0.449\nvt  0.303 0.115 0.440\nvt  0.304 0.108 0.435\nvt  0.282 0.106 0.451\nvt  0.277 0.108 0.452\nvt  0.947 0.645 0.476\nvt  0.932 0.645 0.497\nvt  0.953 0.621 0.516\nvt  0.960 0.631 0.484\nvt  0.845 0.391 0.653\nvt  0.267 0.092 0.439\nvt  0.267 0.100 0.447\nvt  0.278 0.102 0.449\nvt  0.292 0.099 0.441\nvt  0.299 0.045 0.396\nvt  0.269 0.058 0.420\nvt  0.279 0.070 0.423\nvt  0.307 0.058 0.404\nvt  0.288 0.029 0.389\nvt  0.277 0.011 0.381\nvt  0.257 0.025 0.395\nvt  0.266 0.039 0.406\nvt  0.251 0.125 0.456\nvt  0.243 0.124 0.453\nvt  0.256 0.138 0.459\nvt  0.263 0.135 0.458\nvt  0.230 0.042 0.396\nvt  0.234 0.058 0.410\nvt  0.256 0.045 0.457\nvt  0.255 0.047 0.442\nvt  0.257 0.085 0.433\nvt  0.223 0.076 0.415\nvt  0.231 0.101 0.436\nvt  0.257 0.098 0.443\nvt  0.190 0.114 0.418\nvt  0.181 0.094 0.409\nvt  0.209 0.129 0.436\nvt  0.229 0.128 0.449\nvt  0.210 0.144 0.444\nvt  0.228 0.141 0.458\nvt  0.266 0.150 0.460\nvt  0.265 0.144 0.457\nvt  0.244 0.144 0.463\nvt  0.284 0.252 0.376\nvt  0.289 0.230 0.388\nvt  0.258 0.236 0.390\nvt  0.251 0.260 0.377\nvt  0.250 0.284 0.365\nvt  0.280 0.276 0.366\nvt  0.212 0.270 0.374\nvt  0.223 0.288 0.364\nvt  0.255 0.308 0.356\nvt  0.279 0.290 0.360\nvt  0.223 0.310 0.356\nvt  0.199 0.303 0.359\nvt  0.185 0.262 0.371\nvt  0.165 0.278 0.364\nvt  0.177 0.311 0.356\nvt  0.186 0.346 0.348\nvt  0.209 0.343 0.348\nvt  0.267 0.205 0.416\nvt  0.295 0.211 0.405\nvt  0.240 0.197 0.422\nvt  0.234 0.239 0.387\nvt  0.205 0.202 0.409\nvt  0.199 0.238 0.383\nvt  0.235 0.351 0.345\nvt  0.229 0.388 0.336\nvt  0.251 0.386 0.336\nvt  0.248 0.349 0.345\nvt  0.216 0.364 0.343\nvt  0.209 0.388 0.336\nvt  0.197 0.355 0.345\nvt  0.188 0.357 0.345\nvt  0.269 0.410 0.332\nvt  0.248 0.409 0.331\nvt  0.255 0.433 0.326\nvt  0.266 0.431 0.327\nvt  0.260 0.447 0.324\nvt  0.268 0.445 0.325\nvt  0.261 0.453 0.323\nvt  0.275 0.448 0.325\nvt  0.267 0.381 0.336\nvt  0.228 0.413 0.331\nvt  0.286 0.352 0.343\nvt  0.293 0.354 0.342\nvt  0.295 0.345 0.345\nvt  0.285 0.344 0.345\nvt  0.280 0.372 0.338\nvt  0.290 0.376 0.338\nvt  0.286 0.331 0.348\nvt  0.298 0.334 0.348\nvt  0.304 0.315 0.354\nvt  0.282 0.312 0.354\nvt  0.274 0.431 0.329\nvt  0.282 0.412 0.332\nvt  0.241 0.445 0.325\nvt  0.298 0.284 0.364\nvt  0.310 0.258 0.374\nvt  0.320 0.234 0.385\nvt  0.329 0.212 0.396\nvt  0.475 0.201 0.257\nvt  0.481 0.203 0.257\nvt  0.481 0.242 0.257\nvt  0.465 0.241 0.257\nvt  0.493 0.218 0.257\nvt  0.488 0.201 0.257\nvt  0.367 0.022 0.372\nvt  0.375 0.047 0.398\nvt  0.387 0.049 0.417\nvt  0.384 0.023 0.393\nvt  0.389 0.068 0.435\nvt  0.392 0.072 0.442\nvt  0.410 0.055 0.452\nvt  0.384 0.069 0.427\nvt  0.824 0.635 0.423\nvt  0.816 0.627 0.389\nvt  0.425 0.079 0.423\nvt  0.415 0.072 0.437\nvt  0.410 0.092 0.409\nvt  0.424 0.101 0.389\nvt  0.383 0.075 0.434\nvt  0.396 0.078 0.434\nvt  0.337 0.243 0.377\nvt  0.351 0.217 0.382\nvt  0.353 0.236 0.372\nvt  0.360 0.258 0.369\nvt  0.333 0.190 0.402\nvt  0.315 0.180 0.422\nvt  0.306 0.191 0.446\nvt  0.968 0.585 0.515\nvt  0.975 0.577 0.490\nvt  0.985 0.588 0.499\nvt  0.983 0.599 0.526\nvt  0.958 0.563 0.479\nvt  0.965 0.554 0.452\nvt  0.982 0.628 0.475\nvt  0.984 0.660 0.426\nvt  0.971 0.550 0.437\nvt  0.983 0.570 0.475\nvt  0.974 0.542 0.423\nvt  0.979 0.539 0.426\nvt  0.972 0.599 0.532\nvt  0.952 0.599 0.553\nvt  0.948 0.581 0.530\nvt  0.152 0.219 0.378\nvt  0.153 0.202 0.383\nvt  0.143 0.197 0.377\nvt  0.147 0.283 0.360\nvt  0.146 0.310 0.354\nvt  0.151 0.329 0.350\nvt  0.164 0.349 0.347\nvt  0.151 0.247 0.367\nvt  0.172 0.239 0.376\nvt  0.114 0.323 0.351\nvt  0.117 0.341 0.348\nvt  0.320 0.341 0.346\nvt  0.327 0.317 0.352\nvt  0.318 0.294 0.360\nvt  0.342 0.306 0.356\nvt  0.334 0.262 0.369\nvt  0.355 0.272 0.363\nvt  0.318 0.362 0.342\nvt  0.286 0.439 0.329\nvt  0.291 0.425 0.332\nvt  0.160 0.455 0.334\nvt  0.184 0.450 0.331\nvt  0.181 0.432 0.334\nvt  0.162 0.440 0.336\nvt  0.163 0.399 0.339\nvt  0.142 0.416 0.339\nvt  0.203 0.450 0.328\nvt  0.200 0.432 0.331\nvt  0.185 0.398 0.336\nvt  0.176 0.404 0.337\nvt  0.201 0.371 0.342\nvt  0.189 0.377 0.341\nvt  0.171 0.383 0.340\nvt  0.168 0.365 0.344\nvt  0.149 0.359 0.345\nvt  0.129 0.383 0.342\nvt  0.125 0.364 0.345\nvt  0.112 0.282 0.355\nvt  0.090 0.293 0.352\nvt  0.216 0.448 0.327\nvt  0.216 0.464 0.323\nvt  0.247 0.465 0.321\nvt  0.203 0.465 0.325\nvt  0.268 0.497 0.314\nvt  0.283 0.485 0.316\nvt  0.236 0.501 0.318\nvt  0.249 0.504 0.315\nvt  0.280 0.457 0.323\nvt  0.292 0.474 0.319\nvt  0.261 0.517 0.312\nvt  0.272 0.513 0.311\nvt  0.284 0.506 0.311\nvt  0.292 0.498 0.312\nvt  0.236 0.514 0.315\nvt  0.245 0.518 0.313\nvt  0.297 0.491 0.313\nvt  0.301 0.485 0.315\nvt  0.228 0.535 0.311\nvt  0.233 0.538 0.310\nvt  0.225 0.541 0.310\nvt  0.231 0.544 0.309\nvt  0.220 0.550 0.308\nvt  0.225 0.553 0.308\nvt  0.212 0.562 0.307\nvt  0.219 0.565 0.306\nvt  0.198 0.487 0.324\nvt  0.205 0.493 0.322\nvt  0.222 0.525 0.318\nvt  0.216 0.542 0.313\nvt  0.205 0.560 0.312\nvt  0.198 0.570 0.309\nvt  0.203 0.571 0.306\nvt  0.204 0.580 0.303\nvt  0.208 0.585 0.309\nvt  0.213 0.576 0.305\nvt  0.210 0.570 0.304\nvt  0.199 0.579 0.307\nvt  0.198 0.590 0.309\nvt  0.202 0.591 0.311\nvt  0.196 0.588 0.310\nvt  0.192 0.466 0.328\nvt  0.189 0.479 0.327\nvt  0.413 0.279 0.257\nvt  0.421 0.232 0.257\nvt  0.420 0.203 0.257\nvt  0.211 0.163 0.451\nvt  0.218 0.150 0.456\nvt  0.209 0.165 0.460\nvt  0.251 0.154 0.471\nvt  0.260 0.159 0.467\nvt  0.273 0.164 0.459\nvt  0.265 0.164 0.464\nvt  0.234 0.187 0.439\nvt  0.225 0.178 0.447\nvt  0.208 0.187 0.428\nvt  0.236 0.150 0.466\nvt  0.229 0.149 0.464\nvt  0.232 0.155 0.465\nvt  0.243 0.152 0.467\nvt  0.219 0.176 0.447\nvt  0.222 0.170 0.456\nvt  0.211 0.175 0.448\nvt  0.270 0.189 0.433\nvt  0.274 0.184 0.440\nvt  0.261 0.177 0.452\nvt  0.255 0.180 0.445\nvt  0.235 0.549 0.311\nvt  0.225 0.570 0.310\nvt  0.217 0.580 0.310\nvt  0.250 0.533 0.312\nvt  0.192 0.569 0.313\nvt  0.200 0.555 0.317\nvt  0.230 0.573 0.316\nvt  0.220 0.585 0.315\nvt  0.990 0.300 -0.059\nvt  0.979 0.302 -0.059\nvt  0.982 0.319 -0.059\nvt  0.991 0.318 -0.059\nvt  0.992 0.329 -0.059\nvt  0.984 0.330 -0.059\nvt  0.991 0.339 -0.060\nvt  0.988 0.340 -0.060\nvt  0.976 0.280 -0.059\nvt  0.988 0.278 -0.059\nvt  0.971 0.257 -0.059\nvt  0.986 0.256 -0.059\nvt  0.242 0.556 0.316\nvt  0.253 0.541 0.315\nvt  0.213 0.520 0.322\nvt  0.208 0.538 0.318\nvt  0.189 0.497 0.323\nvt  0.196 0.503 0.322\nvt  0.185 0.501 0.323\nvt  0.191 0.508 0.322\nvt  0.179 0.505 0.323\nvt  0.186 0.513 0.322\nvt  0.179 0.497 0.325\nvt  0.160 0.508 0.327\nvt  0.166 0.512 0.324\nvt  0.163 0.525 0.324\nvt  0.167 0.529 0.325\nvt  0.175 0.521 0.323\nvt  0.173 0.514 0.322\nvt  0.159 0.519 0.325\nvt  0.155 0.532 0.325\nvt  0.156 0.535 0.327\nvt  0.151 0.529 0.327\nvt  0.195 0.515 0.323\nvt  0.179 0.526 0.325\nvt  0.211 0.505 0.322\nvt  0.155 0.501 0.329\nvt  0.170 0.493 0.328\nvt  0.197 0.522 0.326\nvt  0.183 0.533 0.328\nvt  0.940 0.076 -0.059\nvt  0.939 0.088 -0.059\nvt  0.958 0.089 -0.059\nvt  0.959 0.078 -0.059\nvt  0.966 0.079 -0.060\nvt  0.965 0.089 -0.060\nvt  0.976 0.079 -0.060\nvt  0.972 0.092 -0.060\nvt  0.987 0.086 -0.063\nvt  0.986 0.093 -0.064\nvt  0.925 0.090 -0.059\nvt  0.922 0.076 -0.059\nvt  0.210 0.519 0.325\nvt  0.172 0.480 0.330\nvt  0.225 0.507 0.320\nvt  0.977 0.223 -0.059\nvt  0.989 0.207 -0.059\nvt  0.977 0.199 -0.059\nvt  0.960 0.205 -0.059\nvt  0.221 0.509 0.324\nvt  0.990 0.237 -0.059\nvt  0.270 0.543 0.307\nvt  0.277 0.540 0.307\nvt  0.273 0.551 0.305\nvt  0.280 0.549 0.305\nvt  0.275 0.562 0.304\nvt  0.283 0.557 0.304\nvt  0.280 0.576 0.302\nvt  0.287 0.574 0.301\nvt  0.256 0.532 0.312\nvt  0.266 0.557 0.308\nvt  0.275 0.578 0.305\nvt  0.276 0.591 0.304\nvt  0.281 0.589 0.297\nvt  0.289 0.595 0.286\nvt  0.296 0.596 0.297\nvt  0.292 0.585 0.297\nvt  0.285 0.583 0.295\nvt  0.284 0.599 0.297\nvt  0.293 0.605 0.292\nvt  0.297 0.604 0.300\nvt  0.288 0.606 0.299\nvt  0.287 0.549 0.307\nvt  0.295 0.570 0.306\nvt  0.298 0.585 0.303\nvt  0.285 0.520 0.310\nvt  0.268 0.579 0.312\nvt  0.272 0.596 0.309\nvt  0.302 0.568 0.312\nvt  0.304 0.586 0.309\nvt  0.955 0.307 -0.059\nvt  0.943 0.302 -0.059\nvt  0.938 0.322 -0.059\nvt  0.948 0.325 -0.059\nvt  0.945 0.335 -0.059\nvt  0.937 0.332 -0.059\nvt  0.939 0.343 -0.059\nvt  0.935 0.341 -0.059\nvt  0.949 0.279 -0.059\nvt  0.962 0.282 -0.059\nvt  0.953 0.248 -0.059\nvt  0.296 0.548 0.313\nvt  0.294 0.526 0.313\nvt  0.259 0.559 0.313\nvt  0.306 0.520 0.307\nvt  0.311 0.515 0.307\nvt  0.311 0.523 0.306\nvt  0.315 0.517 0.306\nvt  0.319 0.529 0.304\nvt  0.323 0.524 0.304\nvt  0.330 0.535 0.302\nvt  0.333 0.531 0.303\nvt  0.290 0.518 0.310\nvt  0.310 0.532 0.308\nvt  0.327 0.542 0.306\nvt  0.337 0.548 0.306\nvt  0.337 0.543 0.300\nvt  0.346 0.541 0.297\nvt  0.351 0.539 0.299\nvt  0.342 0.534 0.301\nvt  0.337 0.536 0.299\nvt  0.344 0.547 0.302\nvt  0.322 0.517 0.308\nvt  0.339 0.526 0.307\nvt  0.346 0.531 0.305\nvt  0.308 0.498 0.313\nvt  0.335 0.553 0.312\nvt  0.322 0.546 0.312\nvt  0.340 0.517 0.313\nvt  0.351 0.529 0.309\nvt  0.932 0.243 -0.059\nvt  0.923 0.240 -0.059\nvt  0.917 0.257 -0.059\nvt  0.927 0.260 -0.059\nvt  0.924 0.270 -0.059\nvt  0.914 0.267 -0.059\nvt  0.927 0.219 -0.059\nvt  0.939 0.224 -0.059\nvt  0.930 0.194 -0.059\nvt  0.950 0.203 -0.059\nvt  0.326 0.509 0.314\nvt  0.313 0.498 0.315\nvt  0.306 0.537 0.313\nvt  0.917 0.159 -0.059\nvt  0.953 0.158 -0.059\nvt  0.954 0.131 -0.059\nvt  0.918 0.137 -0.059\nvt  0.293 0.453 0.326\nvt  0.301 0.463 0.324\nvt  0.515 0.310 0.257\nvt  0.490 0.357 0.257\nvt  0.316 0.491 0.312\nvt  0.316 0.486 0.313\nvt  0.325 0.491 0.311\nvt  0.325 0.486 0.311\nvt  0.332 0.489 0.310\nvt  0.331 0.484 0.310\nvt  0.340 0.489 0.310\nvt  0.339 0.484 0.310\nvt  0.310 0.496 0.313\nvt  0.323 0.496 0.313\nvt  0.340 0.494 0.313\nvt  0.350 0.493 0.314\nvt  0.348 0.489 0.310\nvt  0.356 0.484 0.310\nvt  0.356 0.481 0.310\nvt  0.348 0.480 0.311\nvt  0.344 0.486 0.309\nvt  0.355 0.489 0.313\nvt  0.323 0.478 0.316\nvt  0.339 0.476 0.315\nvt  0.348 0.477 0.314\nvt  0.306 0.478 0.318\nvt  0.351 0.497 0.318\nvt  0.339 0.498 0.317\nvt  0.339 0.471 0.319\nvt  0.350 0.472 0.319\nvt  0.907 0.217 -0.059\nvt  0.898 0.211 -0.059\nvt  0.891 0.223 -0.059\nvt  0.897 0.228 -0.059\nvt  0.892 0.236 -0.059\nvt  0.885 0.233 -0.059\nvt  0.909 0.197 -0.059\nvt  0.920 0.203 -0.059\nvt  0.918 0.178 -0.059\nvt  0.324 0.472 0.320\nvt  0.310 0.470 0.322\nvt  0.323 0.500 0.316\nvt  0.215 0.062 0.397\nvt  0.176 0.085 0.401\nvt  0.153 0.089 0.396\nvt  0.142 0.089 0.391\nvt  0.145 0.098 0.397\nvt  0.162 0.098 0.403\nvt  0.137 0.117 0.393\nvt  0.108 0.087 0.373\nvt  0.147 0.068 0.378\nvt  0.141 0.078 0.384\nvt  0.171 0.074 0.392\nvt  0.166 0.059 0.379\nvt  0.953 0.836 0.434\nvt  0.934 0.863 0.427\nvt  0.986 0.844 0.428\nvt  0.972 0.813 0.434\nvt  0.075 0.646 0.962\nvt  0.101 0.665 0.963\nvt  0.090 0.585 0.962\nvt  0.074 0.608 0.962\nvt  0.100 0.713 0.964\nvt  0.079 0.677 0.963\nvt  0.089 0.720 0.963\nvt  0.096 0.746 0.962\nvt  0.101 0.745 0.969\nvt  0.063 0.684 0.962\nvt  0.058 0.658 0.962\nvt  0.079 0.725 0.963\nvt  0.091 0.752 0.963\nvt  0.053 0.625 0.962\nvt  0.164 0.685 0.962\nvt  0.147 0.671 0.962\nvt  0.142 0.688 0.962\nvt  0.150 0.699 0.962\nvt  0.104 0.747 0.962\nvt  0.108 0.750 0.963\nvt  0.117 0.733 0.963\nvt  0.110 0.728 0.964\nvt  0.125 0.721 0.963\nvt  0.116 0.710 0.963\nvt  0.125 0.672 0.963\nvt  0.133 0.639 0.962\nvt  0.134 0.738 0.962\nvt  0.160 0.712 0.962\nvt  0.105 0.715 0.963\nvt  0.114 0.667 0.963\nvt  0.161 0.043 0.599\nvt  0.186 0.055 0.382\nvt  0.176 0.031 0.599\nvt  0.884 0.834 0.418\nvt  0.905 0.808 0.417\nvt  0.881 0.797 0.403\nvt  0.846 0.815 0.389\nvt  0.888 0.768 0.401\nvt  0.910 0.771 0.408\nvt  0.752 0.937 0.721\nvt  0.759 0.960 0.721\nvt  0.816 0.938 0.722\nvt  0.801 0.920 0.721\nvt  0.736 0.957 0.721\nvt  0.731 0.939 0.720\nvt  0.700 0.960 0.721\nvt  0.709 0.931 0.720\nvt  0.655 0.926 0.719\nvt  0.644 0.938 0.720\nvt  0.612 0.920 0.701\nvt  0.606 0.925 0.711\nvt  0.777 0.879 0.721\nvt  0.730 0.896 0.720\nvt  0.704 0.902 0.720\nvt  0.653 0.913 0.717\nvt  0.611 0.917 0.708\nvt  0.188 0.806 0.906\nvt  0.191 0.856 0.906\nvt  0.241 0.834 0.906\nvt  0.220 0.794 0.906\nvt  0.185 0.773 0.907\nvt  0.205 0.767 0.906\nvt  0.151 0.854 0.906\nvt  0.160 0.807 0.906\nvt  0.167 0.777 0.909\nvt  0.119 0.850 0.906\nvt  0.135 0.806 0.906\nvt  0.148 0.779 0.908\nvt  0.124 0.803 0.906\nvt  0.099 0.841 0.906\nvt  0.195 0.746 0.906\nvt  0.183 0.749 0.906\nvt  0.174 0.743 0.905\nvt  0.195 0.900 0.906\nvt  0.148 0.876 0.906\nvt  0.971 0.755 0.431\nvt  0.943 0.747 0.431\nvt  0.954 0.793 0.436\nvt  0.976 0.691 0.417\nvt  0.952 0.704 0.423\nvt  0.111 0.890 0.906\nvt  0.755 0.850 0.721\nvt  0.779 0.847 0.721\nvt  0.790 0.811 0.722\nvt  0.756 0.817 0.721\nvt  0.894 0.935 0.722\nvt  0.828 0.951 0.722\nvt  0.864 0.975 0.722\nvt  0.904 0.978 0.721\nvt  0.685 0.872 0.720\nvt  0.685 0.818 0.721\nvt  0.669 0.827 0.721\nvt  0.662 0.857 0.721\nvt  0.764 0.862 0.721\nvt  0.785 0.851 0.722\nvt  0.743 0.867 0.721\nvt  0.733 0.854 0.721\nvt  0.706 0.858 0.720\nvt  0.716 0.874 0.720\nvt  0.625 0.885 0.720\nvt  0.643 0.895 0.718\nvt  0.610 0.909 0.717\nvt  0.604 0.909 0.717\nvt  0.692 0.883 0.720\nvt  0.136 0.074 0.377\nvt  0.138 0.067 0.371\nvt  0.134 0.056 0.365\nvt  0.143 0.055 0.370\nvt  0.944 0.389 0.506\nvt  0.948 0.371 0.510\nvt  0.982 0.369 0.536\nvt  0.988 0.393 0.540\nvt  0.893 0.379 0.455\nvt  0.887 0.372 0.457\nvt  0.909 0.408 0.477\nvt  0.904 0.406 0.472\nvt  0.912 0.391 0.479\nvt  0.877 0.372 0.443\nvt  0.879 0.381 0.440\nvt  0.214 0.421 0.330\nvt  0.765 0.978 0.721\nvt  0.740 0.975 0.721\nvt  0.799 0.868 0.721\nvt  0.619 0.182 0.599\nvt  0.733 0.144 0.598\nvt  0.723 0.176 0.596\nvt  0.712 0.174 0.600\nvt  0.563 0.337 0.616\nvt  0.589 0.348 0.604\nvt  0.562 0.075 0.607\nvt  0.613 0.056 0.591\nvt  0.637 0.035 0.604\nvt  0.687 0.032 0.597\nvt  0.734 0.006 0.596\nvt  0.281 0.943 0.494\nvt  0.351 0.673 0.445\nvt  0.350 0.730 0.468\nvt  0.351 0.694 0.455\nvt  0.593 0.846 -0.455\nvt  0.640 0.820 -0.420\nvt  0.573 0.682 -0.408\nvt  0.553 0.683 -0.421\nvt  0.583 0.651 -0.475\nvt  0.601 0.639 -0.491\nvt  0.531 0.626 -0.447\nvt  0.538 0.653 -0.511\nvt  0.529 0.660 -0.506\nvt  0.545 0.641 -0.514\nvt  0.616 0.646 -0.504\nvt  0.592 0.630 -0.504\nvt  0.648 0.640 -0.468\nvt  0.437 0.628 -0.685\nvt  0.420 0.613 -0.685\nvt  0.527 0.653 -0.492\nvt  0.510 0.640 -0.443\nvt  0.649 0.787 -0.420\nvt  0.654 0.764 -0.418\nvt  0.653 0.759 -0.433\nvt  0.501 0.744 -0.468\nvt  0.658 0.665 -0.468\nvt  0.438 0.697 -0.491\nvt  0.450 0.649 -0.685\nvt  0.474 0.655 -0.685\nvt  0.547 0.524 -0.709\nvt  0.528 0.525 -0.708\nvt  0.499 0.369 -0.697\nvt  0.568 0.575 -0.720\nvt  0.554 0.586 -0.723\nvt  0.564 0.596 -0.696\nvt  0.613 0.558 -0.709\nvt  0.698 0.510 -0.709\nvt  0.300 0.430 -0.685\nvt  0.683 0.473 -0.709\nvt  0.701 0.483 -0.709\nvt  0.714 0.492 -0.709\nvt  0.805 0.670 -1.024\nvt  0.836 0.665 -1.013\nvt  0.792 0.694 -1.013\nvt  0.741 0.458 -0.752\nvt  0.703 0.574 -0.710\nvt  0.795 0.722 -1.024\nvt  0.767 0.704 -1.015\nvt  0.798 0.753 -1.015\nvt  0.730 0.778 -0.915\nvt  0.729 0.554 -0.937\nvt  0.726 0.573 -0.831\nvt  0.710 0.560 -0.852\nvt  0.609 0.865 -0.458\nvt  0.617 0.861 -0.457\nvt  0.343 0.860 -0.290\nvt  0.342 0.888 -0.290\nvt  0.378 0.838 -0.290\nvt  0.371 0.864 -0.290\nvt  0.374 0.872 -0.291\nvt  0.379 0.866 -0.246\nvt  0.375 0.908 -0.290\nvt  0.371 0.896 -0.290\nvt  0.379 0.905 -0.290\nvt  0.492 0.904 -0.459\nvt  0.336 0.740 -0.291\nvt  0.333 0.746 -0.291\nvt  0.346 0.750 -0.291\nvt  0.342 0.756 -0.291\nvt  0.356 0.761 -0.291\nvt  0.118 0.520 -0.292\nvt  0.389 0.825 -0.291\nvt  0.387 0.925 -0.262\nvt  0.048 0.758 0.173\nvt  0.054 0.734 0.173\nvt  0.061 0.742 0.173\nvt  0.640 0.862 -0.460\nvt  0.059 0.979 0.173\nvt  0.117 0.988 0.173\nvt  0.061 0.959 0.173\nvt  0.576 0.888 -0.406\nvt  0.589 0.865 -0.461\nvt  0.584 0.882 -0.410\nvt  0.589 0.886 -0.402\nvt  0.585 0.893 -0.415\nvt  0.573 0.899 -0.388\nvt  0.560 0.906 -0.441\nvt  0.547 0.916 -0.399\nvt  0.540 0.913 -0.377\nvt  0.360 0.961 -0.290\nvt  0.373 0.951 -0.256\nvt  0.362 0.949 -0.295\nvt  0.519 0.920 -0.431\nvt  0.511 0.928 -0.430\nvt  0.374 0.966 -0.291\nvt  0.547 0.942 -0.405\nvt  0.526 0.940 -0.403\nvt  0.550 0.921 -0.418\nvt  0.580 0.910 -0.445\nvt  0.006 0.834 0.173\nvt  0.077 0.888 0.183\nvt  0.449 0.282 0.257\nvt  0.479 0.051 0.100\nvt  0.444 0.043 0.119\nvt  0.432 0.255 0.257\nvt  0.461 0.209 0.257\nvt  0.449 0.205 0.257\nvt  0.402 0.182 0.257\nvt  0.390 0.164 0.257\nvt  0.466 0.191 0.257\nvt  0.483 0.175 0.298\nvt  0.515 0.190 0.292\nvt  0.420 0.181 0.257\nvt  0.481 0.285 0.257\nvt  0.457 0.189 0.257\nvt  0.469 0.185 0.257\nvt  0.434 0.178 0.257\nvt  0.451 0.183 0.257\nvt  0.520 0.211 0.318\nvt  0.542 0.123 0.193\nvt  0.551 0.080 0.107\nvt  0.889 0.682 0.346\nvt  0.916 0.688 0.318\nvt  0.919 0.555 0.518\nvt  0.993 0.520 0.543\nvt  0.992 0.501 0.497\nvt  0.942 0.525 0.591\nvt  0.316 0.159 0.424\nvt  0.318 0.136 0.427\nvt  0.338 0.152 0.409\nvt  0.335 0.167 0.406\nvt  0.383 0.100 0.375\nvt  0.356 0.108 0.394\nvt  0.348 0.088 0.393\nvt  0.339 0.128 0.404\nvt  0.338 0.125 0.414\nvt  0.757 0.592 0.841\nvt  0.943 0.660 0.452\nvt  0.973 0.893 0.530\nvt  0.111 0.974 0.173\nvt  0.006 0.974 0.173\nvt  0.168 0.154 0.405\nvt  0.178 0.161 0.411\nvt  0.159 0.169 0.397\nvt  0.121 0.975 0.173\nvt  0.329 0.077 0.404\nvt  0.298 0.083 0.425\nvt  0.283 0.074 0.424\nvt  0.260 0.064 0.448\nvt  0.268 0.076 0.426\nvt  0.300 0.140 0.439\nvt  0.311 0.144 0.433\nvt  0.956 0.501 0.544\nvt  0.819 0.374 0.575\nvt  0.266 0.050 0.414\nvt  0.250 0.073 0.424\nvt  0.253 0.060 0.417\nvt  0.254 0.051 0.427\nvt  0.255 0.035 0.419\nvt  0.254 0.037 0.416\nvt  0.241 0.028 0.395\nvt  0.275 0.127 0.461\nvt  0.270 0.119 0.459\nvt  0.263 0.114 0.480\nvt  0.261 0.106 0.451\nvt  0.277 0.133 0.454\nvt  0.249 0.114 0.452\nvt  0.264 0.127 0.479\nvt  0.260 0.125 0.465\nvt  0.287 0.152 0.447\nvt  0.184 0.152 0.421\nvt  0.193 0.173 0.429\nvt  0.182 0.174 0.411\nvt  0.245 0.132 0.459\nvt  0.300 0.171 0.432\nvt  0.284 0.171 0.452\nvt  0.281 0.163 0.460\nvt  0.274 0.175 0.482\nvt  0.250 0.185 0.436\nvt  0.164 0.208 0.388\nvt  0.270 0.356 0.342\nvt  0.270 0.341 0.347\nvt  0.297 0.296 0.359\nvt  0.157 0.188 0.388\nvt  0.144 0.175 0.386\nvt  0.129 0.958 0.173\nvt  0.494 0.243 0.257\nvt  0.400 0.029 0.419\nvt  0.350 0.036 0.373\nvt  0.364 0.064 0.409\nvt  0.352 0.052 0.389\nvt  0.427 0.055 0.479\nvt  0.973 0.619 0.494\nvt  0.985 0.611 0.499\nvt  0.940 0.614 0.544\nvt  0.968 0.611 0.520\nvt  0.507 0.282 0.257\nvt  0.121 0.192 0.368\nvt  0.134 0.253 0.361\nvt  0.301 0.395 0.336\nvt  0.186 0.473 0.330\nvt  0.983 0.184 -0.059\nvt  0.964 0.180 -0.059\nvt  0.176 0.469 0.332\nvt  0.217 0.164 0.460\nvt  0.245 0.188 0.433\nvt  0.251 0.161 0.472\nvt  0.255 0.171 0.463\nvt  0.244 0.168 0.464\nvt  0.243 0.177 0.453\nvt  0.244 0.162 0.481\nvt  0.230 0.169 0.459\nvt  0.227 0.172 0.460\nvt  0.237 0.178 0.464\nvt  0.228 0.165 0.461\nvt  0.232 0.146 0.470\nvt  0.236 0.146 0.465\nvt  0.210 0.587 0.312\nvt  0.196 0.578 0.310\nvt  0.197 0.592 0.312\nvt  0.990 0.344 -0.060\nvt  0.176 0.535 0.328\nvt  0.170 0.531 0.327\nvt  0.157 0.518 0.327\nvt  0.152 0.509 0.329\nvt  0.152 0.534 0.327\nvt  0.989 0.090 -0.058\nvt  0.299 0.595 0.303\nvt  0.281 0.600 0.302\nvt  0.294 0.608 0.301\nvt  0.935 0.346 -0.059\nvt  0.358 0.551 0.309\nvt  0.914 0.284 -0.059\nvt  0.353 0.537 0.303\nvt  0.344 0.550 0.307\nvt  0.927 0.112 -0.059\nvt  0.365 0.486 0.317\nvt  0.883 0.245 -0.060\nvt  0.357 0.480 0.312\nvt  0.356 0.491 0.316\nvt  0.991 0.220 -0.059\nvt  0.220 0.056 0.399\nvt  0.841 0.831 0.393\nvt  0.829 0.813 0.379\nvt  0.858 0.858 0.410\nvt  0.468 0.690 0.962\nvt  0.483 0.681 0.962\nvt  0.478 0.704 0.962\nvt  0.174 0.698 0.962\nvt  0.112 0.757 0.963\nvt  0.109 0.595 0.962\nvt  0.123 0.601 0.962\nvt  0.101 0.755 0.963\nvt  0.745 0.176 0.596\nvt  0.756 0.173 0.600\nvt  0.905 0.338 0.601\nvt  0.878 0.898 0.722\nvt  0.855 0.884 0.722\nvt  0.820 0.876 0.722\nvt  0.218 0.872 0.906\nvt  0.183 0.732 0.906\nvt  0.086 0.812 0.906\nvt  0.122 0.781 0.906\nvt  0.146 0.755 0.906\nvt  0.164 0.738 0.906\nvt  0.146 0.923 0.906\nvt  0.125 0.908 0.906\nvt  0.917 0.743 0.428\nvt  0.180 0.930 0.906\nvt  0.879 0.349 0.601\nvt  0.953 0.683 0.417\nvt  0.955 0.673 0.413\nvt  0.716 0.822 0.721\nvt  0.811 0.978 0.722\nvt  0.904 0.978 0.721\nvt  0.604 0.916 0.715\nvt  0.904 0.074 0.599\nvt  0.853 0.056 0.598\nvt  0.829 0.035 0.598\nvt  0.779 0.031 0.597\nvt  0.493 0.680 0.946\nvt  0.940 0.431 0.494\nvt  0.055 0.249 0.173\nvt  0.062 0.225 0.173\nvt  0.068 0.234 0.173\nvt  0.067 0.471 0.173\nvt  0.068 0.450 0.173\nvt  0.124 0.480 0.173\nvt  0.014 0.325 0.173\nvt  0.085 0.380 0.183\nvt  0.119 0.465 0.173\nvt  0.014 0.465 0.173\nvt  0.129 0.467 0.173\nvt  0.136 0.449 0.173\nvt  0.593 0.846 -0.455\nvt  0.640 0.820 -0.420\nvt  0.573 0.682 -0.408\nvt  0.553 0.683 -0.421\nvt  0.583 0.651 -0.475\nvt  0.601 0.639 -0.491\nvt  0.531 0.626 -0.447\nvt  0.538 0.653 -0.511\nvt  0.529 0.660 -0.506\nvt  0.545 0.641 -0.514\nvt  0.616 0.646 -0.504\nvt  0.592 0.630 -0.504\nvt  0.648 0.640 -0.468\nvt  0.437 0.628 -0.685\nvt  0.420 0.613 -0.685\nvt  0.527 0.653 -0.492\nvt  0.510 0.640 -0.443\nvt  0.649 0.787 -0.420\nvt  0.654 0.764 -0.418\nvt  0.653 0.759 -0.433\nvt  0.501 0.744 -0.468\nvt  0.658 0.665 -0.468\nvt  0.438 0.697 -0.491\nvt  0.450 0.649 -0.685\nvt  0.474 0.655 -0.685\nvt  0.547 0.524 -0.709\nvt  0.528 0.525 -0.708\nvt  0.499 0.369 -0.697\nvt  0.568 0.575 -0.720\nvt  0.554 0.586 -0.723\nvt  0.564 0.596 -0.696\nvt  0.613 0.558 -0.709\nvt  0.698 0.510 -0.709\nvt  0.300 0.430 -0.685\nvt  0.683 0.473 -0.709\nvt  0.714 0.492 -0.709\nvt  0.701 0.483 -0.709\nvt  0.805 0.670 -1.024\nvt  0.836 0.665 -1.013\nvt  0.792 0.694 -1.013\nvt  0.741 0.458 -0.752\nvt  0.703 0.574 -0.710\nvt  0.795 0.722 -1.024\nvt  0.767 0.704 -1.015\nvt  0.798 0.753 -1.015\nvt  0.730 0.778 -0.915\nvt  0.729 0.554 -0.937\nvt  0.710 0.560 -0.852\nvt  0.726 0.573 -0.831\nvt  0.609 0.865 -0.458\nvt  0.617 0.861 -0.457\nvt  0.343 0.860 -0.290\nvt  0.342 0.888 -0.290\nvt  0.378 0.838 -0.290\nvt  0.371 0.864 -0.290\nvt  0.379 0.866 -0.246\nvt  0.374 0.872 -0.291\nvt  0.375 0.908 -0.290\nvt  0.371 0.896 -0.290\nvt  0.379 0.905 -0.290\nvt  0.492 0.904 -0.459\nvt  0.336 0.740 -0.291\nvt  0.333 0.746 -0.291\nvt  0.346 0.750 -0.291\nvt  0.342 0.756 -0.291\nvt  0.356 0.761 -0.291\nvt  0.118 0.520 -0.292\nvt  0.389 0.825 -0.291\nvt  0.387 0.925 -0.262\nvt  0.640 0.862 -0.460\nvt  0.576 0.888 -0.406\nvt  0.589 0.865 -0.461\nvt  0.584 0.882 -0.410\nvt  0.585 0.893 -0.415\nvt  0.589 0.886 -0.402\nvt  0.573 0.899 -0.388\nvt  0.560 0.906 -0.441\nvt  0.547 0.916 -0.399\nvt  0.540 0.913 -0.377\nvt  0.360 0.961 -0.290\nvt  0.362 0.949 -0.295\nvt  0.373 0.951 -0.256\nvt  0.519 0.920 -0.431\nvt  0.511 0.928 -0.430\nvt  0.374 0.966 -0.291\nvt  0.526 0.940 -0.403\nvt  0.547 0.942 -0.405\nvt  0.550 0.921 -0.418\nvt  0.580 0.910 -0.445\nvt  0.449 0.282 0.257\nvt  0.479 0.051 0.100\nvt  0.444 0.043 0.119\nvt  0.432 0.255 0.257\nvt  0.461 0.209 0.257\nvt  0.449 0.205 0.257\nvt  0.402 0.182 0.257\nvt  0.390 0.164 0.257\nvt  0.466 0.191 0.257\nvt  0.483 0.175 0.298\nvt  0.515 0.190 0.292\nvt  0.420 0.181 0.257\nvt  0.481 0.285 0.257\nvt  0.457 0.189 0.257\nvt  0.469 0.185 0.257\nvt  0.434 0.178 0.257\nvt  0.451 0.183 0.257\nvt  0.520 0.211 0.318\nvt  0.542 0.123 0.193\nvt  0.551 0.080 0.107\nvt  0.889 0.682 0.346\nvt  0.916 0.688 0.318\nvt  0.919 0.555 0.518\nvt  0.993 0.520 0.543\nvt  0.942 0.525 0.591\nvt  0.992 0.501 0.497\nvt  0.316 0.159 0.424\nvt  0.338 0.152 0.409\nvt  0.318 0.136 0.427\nvt  0.335 0.167 0.406\nvt  0.383 0.100 0.375\nvt  0.348 0.088 0.393\nvt  0.356 0.108 0.394\nvt  0.338 0.125 0.414\nvt  0.339 0.128 0.404\nvt  0.757 0.592 0.841\nvt  0.943 0.660 0.452\nvt  0.973 0.893 0.530\nvt  0.168 0.154 0.405\nvt  0.159 0.169 0.397\nvt  0.178 0.161 0.411\nvt  0.329 0.077 0.404\nvt  0.298 0.083 0.425\nvt  0.283 0.074 0.424\nvt  0.260 0.064 0.448\nvt  0.268 0.076 0.426\nvt  0.300 0.140 0.439\nvt  0.311 0.144 0.433\nvt  0.956 0.501 0.544\nvt  0.819 0.374 0.575\nvt  0.266 0.050 0.414\nvt  0.250 0.073 0.424\nvt  0.253 0.060 0.417\nvt  0.254 0.051 0.427\nvt  0.255 0.035 0.419\nvt  0.254 0.037 0.416\nvt  0.241 0.028 0.395\nvt  0.270 0.119 0.459\nvt  0.275 0.127 0.461\nvt  0.263 0.114 0.480\nvt  0.261 0.106 0.451\nvt  0.277 0.133 0.454\nvt  0.249 0.114 0.452\nvt  0.264 0.127 0.479\nvt  0.260 0.125 0.465\nvt  0.287 0.152 0.447\nvt  0.184 0.152 0.421\nvt  0.193 0.173 0.429\nvt  0.182 0.174 0.411\nvt  0.245 0.132 0.459\nvt  0.300 0.171 0.432\nvt  0.284 0.171 0.452\nvt  0.281 0.163 0.460\nvt  0.274 0.175 0.482\nvt  0.250 0.185 0.436\nvt  0.164 0.208 0.388\nvt  0.270 0.356 0.342\nvt  0.270 0.341 0.347\nvt  0.297 0.296 0.359\nvt  0.157 0.188 0.388\nvt  0.144 0.175 0.386\nvt  0.494 0.243 0.257\nvt  0.400 0.029 0.419\nvt  0.350 0.036 0.373\nvt  0.364 0.064 0.409\nvt  0.352 0.052 0.389\nvt  0.427 0.055 0.479\nvt  0.985 0.611 0.499\nvt  0.973 0.619 0.494\nvt  0.940 0.614 0.544\nvt  0.968 0.611 0.520\nvt  0.507 0.282 0.257\nvt  0.121 0.192 0.368\nvt  0.134 0.253 0.361\nvt  0.301 0.395 0.336\nvt  0.186 0.473 0.330\nvt  0.983 0.184 -0.059\nvt  0.964 0.180 -0.059\nvt  0.176 0.469 0.332\nvt  0.217 0.164 0.460\nvt  0.245 0.188 0.433\nvt  0.251 0.161 0.472\nvt  0.244 0.168 0.464\nvt  0.255 0.171 0.463\nvt  0.243 0.177 0.453\nvt  0.244 0.162 0.481\nvt  0.230 0.169 0.459\nvt  0.227 0.172 0.460\nvt  0.237 0.178 0.464\nvt  0.228 0.165 0.461\nvt  0.236 0.146 0.465\nvt  0.232 0.146 0.470\nvt  0.210 0.587 0.312\nvt  0.196 0.578 0.310\nvt  0.197 0.592 0.312\nvt  0.990 0.344 -0.060\nvt  0.176 0.535 0.328\nvt  0.170 0.531 0.327\nvt  0.157 0.518 0.327\nvt  0.152 0.509 0.329\nvt  0.152 0.534 0.327\nvt  0.989 0.090 -0.058\nvt  0.299 0.595 0.303\nvt  0.281 0.600 0.302\nvt  0.294 0.608 0.301\nvt  0.935 0.346 -0.059\nvt  0.358 0.551 0.309\nvt  0.914 0.284 -0.059\nvt  0.353 0.537 0.303\nvt  0.344 0.550 0.307\nvt  0.927 0.112 -0.059\nvt  0.365 0.486 0.317\nvt  0.883 0.245 -0.060\nvt  0.357 0.480 0.312\nvt  0.356 0.491 0.316\nvt  0.991 0.220 -0.059\nvt  0.220 0.056 0.399\nvt  0.841 0.831 0.393\nvt  0.829 0.813 0.379\nvt  0.858 0.858 0.410\nvt  0.468 0.690 0.962\nvt  0.478 0.704 0.962\nvt  0.483 0.681 0.962\nvt  0.174 0.698 0.962\nvt  0.112 0.757 0.963\nvt  0.109 0.595 0.962\nvt  0.123 0.601 0.962\nvt  0.101 0.755 0.963\nvt  0.878 0.898 0.722\nvt  0.893 0.927 0.722\nvt  0.855 0.884 0.722\nvt  0.820 0.876 0.722\nvt  0.218 0.872 0.906\nvt  0.183 0.732 0.906\nvt  0.086 0.812 0.906\nvt  0.122 0.781 0.906\nvt  0.146 0.755 0.906\nvt  0.164 0.738 0.906\nvt  0.125 0.908 0.906\nvt  0.146 0.923 0.906\nvt  0.917 0.743 0.428\nvt  0.180 0.930 0.906\nvt  0.955 0.673 0.413\nvt  0.953 0.683 0.417\nvt  0.716 0.822 0.721\nvt  0.811 0.978 0.722\nvt  0.604 0.916 0.715\nvt  0.493 0.680 0.946\nvt  0.940 0.431 0.494\n# 3263 texture vertices\n\nvn  0.760 -0.649 0.033\nvn  0.982 -0.127 0.139\nvn  0.978 -0.195 -0.079\nvn  0.740 -0.425 0.521\nvn  0.924 -0.223 0.310\nvn  0.963 -0.145 0.228\nvn  0.830 -0.154 0.537\nvn  0.718 -0.501 0.483\nvn  0.563 0.011 0.826\nvn  0.487 -0.038 0.872\nvn  0.220 0.118 0.968\nvn  0.355 0.055 0.933\nvn  0.347 -0.199 0.916\nvn  0.941 -0.019 -0.339\nvn  0.968 -0.027 -0.251\nvn  0.990 0.074 -0.116\nvn  0.973 -0.011 0.231\nvn  0.926 -0.053 0.374\nvn  0.783 0.176 0.596\nvn  0.798 0.109 0.592\nvn  0.718 -0.257 0.646\nvn  0.410 0.238 0.881\nvn  0.418 0.124 0.900\nvn  0.561 0.192 0.805\nvn  0.677 0.407 0.614\nvn  0.572 0.121 0.811\nvn  0.479 0.413 0.775\nvn  0.056 0.253 0.966\nvn  0.070 -0.036 0.997\nvn  0.233 -0.432 0.871\nvn  0.207 -0.259 0.943\nvn  0.476 -0.109 0.873\nvn  0.118 0.100 0.988\nvn  -0.115 0.133 0.984\nvn  0.094 -0.325 0.941\nvn  0.667 -0.504 0.549\nvn  -0.310 0.255 0.916\nvn  0.287 0.104 0.952\nvn  0.810 -0.225 0.542\nvn  -0.172 0.397 0.901\nvn  0.458 0.123 0.881\nvn  0.654 -0.051 0.754\nvn  -0.188 0.392 0.901\nvn  -0.268 0.311 0.912\nvn  0.293 0.239 0.926\nvn  0.401 0.117 0.909\nvn  0.055 0.424 0.904\nvn  0.475 0.141 0.868\nvn  0.114 -0.170 0.979\nvn  0.619 -0.352 0.702\nvn  -0.300 -0.035 0.953\nvn  -0.006 -0.019 1.000\nvn  0.321 -0.104 0.941\nvn  0.152 -0.317 0.936\nvn  0.191 -0.631 0.752\nvn  0.365 0.080 0.928\nvn  -0.037 0.280 0.959\nvn  -0.101 0.072 0.992\nvn  -0.160 -0.184 0.970\nvn  -0.349 -0.486 0.801\nvn  0.338 0.508 0.792\nvn  0.374 0.621 0.689\nvn  0.317 0.920 0.232\nvn  0.761 0.631 0.151\nvn  -0.054 0.443 0.895\nvn  0.639 -0.190 0.746\nvn  0.371 -0.106 0.922\nvn  0.557 -0.288 -0.779\nvn  0.964 -0.251 0.091\nvn  0.984 0.034 0.176\nvn  0.737 -0.570 -0.364\nvn  0.936 -0.122 0.329\nvn  0.653 -0.556 0.514\nvn  0.242 -0.799 0.551\nvn  0.866 -0.263 0.426\nvn  0.465 -0.602 0.650\nvn  0.179 -0.803 0.569\nvn  0.685 -0.704 -0.187\nvn  0.599 -0.614 0.513\nvn  0.123 -0.776 0.619\nvn  0.918 -0.375 0.126\nvn  0.731 0.062 -0.680\nvn  0.606 -0.592 -0.532\nvn  0.946 0.121 -0.301\nvn  0.772 -0.611 -0.177\nvn  0.816 0.071 -0.574\nvn  0.848 -0.483 0.218\nvn  0.195 -0.811 0.552\nvn  0.920 -0.189 -0.343\nvn  0.349 -0.682 -0.643\nvn  0.503 -0.320 -0.803\nvn  0.565 -0.384 -0.730\nvn  0.046 0.040 -0.998\nvn  0.510 -0.351 -0.785\nvn  0.217 -0.525 -0.823\nvn  0.282 -0.947 0.151\nvn  0.888 0.390 -0.245\nvn  0.814 0.524 -0.250\nvn  0.108 -0.109 -0.988\nvn  0.010 0.148 -0.989\nvn  -0.110 0.152 0.982\nvn  -0.177 0.366 0.913\nvn  0.533 0.387 0.753\nvn  0.510 0.578 0.637\nvn  -0.246 0.841 -0.482\nvn  -0.275 0.958 -0.084\nvn  -0.116 0.904 0.411\nvn  0.000 0.451 0.893\nvn  -0.165 0.231 0.959\nvn  -0.256 0.654 0.712\nvn  0.118 0.737 0.665\nvn  -0.106 0.203 0.973\nvn  0.327 0.060 0.943\nvn  -0.164 0.318 0.934\nvn  0.185 0.107 0.977\nvn  0.090 0.361 0.928\nvn  -0.552 0.308 0.775\nvn  -0.638 0.446 0.627\nvn  -0.838 0.216 0.501\nvn  -0.297 0.215 0.930\nvn  -0.491 0.350 0.797\nvn  -0.663 0.301 0.686\nvn  -0.077 0.082 0.994\nvn  0.116 0.881 0.459\nvn  -0.078 -0.036 0.996\nvn  0.206 -0.039 0.978\nvn  0.321 0.056 0.946\nvn  0.741 -0.240 0.627\nvn  0.726 -0.196 0.659\nvn  0.508 0.244 0.826\nvn  0.647 -0.292 0.704\nvn  -0.246 0.582 0.775\nvn  0.011 0.107 0.994\nvn  0.395 -0.145 0.907\nvn  -0.752 -0.300 0.588\nvn  0.451 -0.532 0.717\nvn  -0.320 0.482 0.816\nvn  -0.806 0.309 0.505\nvn  -0.602 -0.614 0.511\nvn  -0.551 -0.627 0.550\nvn  -0.519 0.642 0.565\nvn  -0.268 0.165 0.949\nvn  -0.936 0.107 0.336\nvn  -0.718 0.204 0.666\nvn  -0.927 -0.040 0.372\nvn  -0.885 0.378 0.273\nvn  -0.697 0.219 0.683\nvn  -0.861 0.186 -0.473\nvn  0.873 -0.079 0.481\nvn  0.033 0.557 0.830\nvn  -0.744 0.039 0.667\nvn  0.566 -0.760 0.320\nvn  -0.417 -0.808 0.417\nvn  -0.107 -0.049 0.993\nvn  0.257 -0.940 0.223\nvn  0.621 -0.556 0.553\nvn  -0.148 -0.639 0.755\nvn  -0.188 -0.217 0.958\nvn  0.190 -0.931 0.311\nvn  -0.191 -0.951 0.245\nvn  0.205 -0.974 0.092\nvn  -0.971 -0.112 0.213\nvn  -0.572 0.320 0.755\nvn  -0.677 -0.534 0.505\nvn  0.810 -0.250 0.530\nvn  0.266 -0.124 0.956\nvn  0.449 -0.856 0.258\nvn  0.592 -0.786 0.179\nvn  0.892 0.192 0.410\nvn  0.855 -0.512 0.083\nvn  -0.566 -0.817 0.110\nvn  -0.412 -0.131 -0.901\nvn  -0.850 -0.420 -0.319\nvn  -0.923 0.376 0.080\nvn  -0.865 -0.486 0.124\nvn  -0.829 -0.508 0.234\nvn  -0.503 -0.859 0.096\nvn  -0.771 0.070 0.633\nvn  0.343 0.015 0.939\nvn  0.313 0.538 0.783\nvn  0.597 -0.000 0.802\nvn  0.652 0.430 0.624\nvn  0.910 0.206 0.360\nvn  0.522 0.064 0.850\nvn  0.735 0.360 0.574\nvn  0.175 -0.315 -0.933\nvn  -0.543 -0.057 -0.838\nvn  -0.966 0.219 0.138\nvn  -0.865 0.038 -0.500\nvn  0.003 -0.667 -0.745\nvn  -0.486 -0.352 -0.800\nvn  0.341 0.722 0.602\nvn  0.832 -0.177 0.525\nvn  0.224 0.046 0.974\nvn  0.587 -0.278 0.760\nvn  0.445 0.026 0.895\nvn  0.665 -0.173 0.727\nvn  -0.970 0.221 -0.106\nvn  -0.909 0.022 0.415\nvn  -0.987 -0.069 0.143\nvn  0.002 -0.351 -0.936\nvn  0.357 0.418 -0.835\nvn  0.793 -0.448 -0.412\nvn  -0.004 -0.977 -0.215\nvn  0.771 -0.436 -0.464\nvn  0.940 -0.341 0.024\nvn  0.941 -0.335 0.042\nvn  0.884 -0.266 0.386\nvn  0.929 -0.369 0.002\nvn  0.934 -0.201 -0.296\nvn  -0.588 0.783 -0.204\nvn  0.444 0.862 -0.246\nvn  0.779 0.616 -0.119\nvn  -0.552 0.731 -0.402\nvn  0.294 0.889 -0.350\nvn  -0.363 0.925 -0.115\nvn  0.399 0.914 -0.075\nvn  0.077 0.975 -0.206\nvn  -0.815 0.405 -0.414\nvn  -0.975 0.106 -0.196\nvn  -0.980 0.197 -0.038\nvn  -0.950 0.303 0.070\nvn  -0.941 -0.332 -0.065\nvn  -0.964 0.105 -0.243\nvn  -0.943 -0.322 0.084\nvn  -0.756 -0.651 0.069\nvn  -0.089 -0.996 0.024\nvn  0.520 -0.852 0.051\nvn  0.846 -0.530 -0.065\nvn  0.735 -0.677 -0.013\nvn  0.994 -0.085 -0.072\nvn  0.833 0.445 -0.329\nvn  -0.370 0.633 -0.680\nvn  0.492 -0.420 -0.762\nvn  0.884 0.116 -0.452\nvn  0.883 0.434 -0.178\nvn  0.966 -0.241 -0.096\nvn  -0.732 -0.679 0.061\nvn  -0.121 -0.992 0.037\nvn  0.899 -0.393 -0.193\nvn  -0.787 -0.558 0.263\nvn  0.208 -0.962 0.177\nvn  -0.367 -0.312 0.876\nvn  0.047 -0.811 0.583\nvn  0.459 -0.888 -0.012\nvn  0.758 -0.604 0.245\nvn  0.550 -0.835 -0.017\nvn  0.937 0.051 -0.345\nvn  0.518 -0.182 -0.836\nvn  0.689 0.645 -0.332\nvn  -0.514 -0.024 -0.857\nvn  -0.835 0.062 -0.546\nvn  -0.038 -0.139 -0.990\nvn  -0.077 -0.689 0.721\nvn  -0.897 -0.200 0.394\nvn  -0.991 0.118 0.062\nvn  -0.522 0.406 -0.750\nvn  -0.906 0.385 -0.173\nvn  0.439 0.453 -0.776\nvn  -0.576 0.766 -0.285\nvn  -0.044 0.405 -0.913\nvn  0.031 0.903 -0.428\nvn  0.716 -0.013 0.698\nvn  0.996 -0.061 -0.065\nvn  0.896 -0.016 0.443\nvn  0.980 -0.031 -0.199\nvn  0.504 -0.347 -0.791\nvn  0.556 -0.472 -0.684\nvn  0.193 -0.411 -0.891\nvn  0.397 -0.602 -0.693\nvn  0.783 -0.440 -0.439\nvn  0.936 -0.327 0.128\nvn  0.753 0.055 0.655\nvn  0.897 -0.093 0.432\nvn  0.745 0.018 0.667\nvn  0.852 -0.431 -0.298\nvn  0.630 -0.425 -0.651\nvn  0.611 -0.778 -0.143\nvn  0.756 -0.431 0.493\nvn  0.785 -0.384 -0.486\nvn  0.763 -0.644 0.060\nvn  0.860 -0.182 0.477\nvn  0.945 0.022 -0.327\nvn  0.449 -0.556 -0.699\nvn  0.688 -0.538 -0.487\nvn  -0.366 -0.169 -0.915\nvn  -0.877 0.016 -0.480\nvn  -0.905 0.113 -0.410\nvn  -0.958 0.144 0.247\nvn  -0.943 0.275 0.185\nvn  -0.512 0.707 0.488\nvn  -0.606 0.130 0.785\nvn  -0.376 0.533 0.758\nvn  -0.936 0.352 -0.018\nvn  -0.334 0.028 -0.942\nvn  -0.421 -0.347 -0.838\nvn  0.324 0.427 0.844\nvn  0.640 0.169 0.750\nvn  0.183 0.776 0.603\nvn  -0.497 0.815 0.298\nvn  0.380 0.844 0.378\nvn  -0.504 0.861 -0.065\nvn  0.504 0.844 0.185\nvn  -0.598 0.801 0.032\nvn  0.561 0.758 0.334\nvn  -0.669 0.539 0.511\nvn  0.498 0.419 0.759\nvn  -0.662 0.643 0.385\nvn  -0.891 0.399 0.214\nvn  0.614 0.444 0.652\nvn  -0.890 -0.435 -0.134\nvn  0.791 -0.441 0.423\nvn  0.009 -0.994 -0.113\nvn  -0.217 0.780 0.587\nvn  0.509 0.521 0.685\nvn  -0.324 0.399 0.858\nvn  -0.346 -0.233 0.909\nvn  0.619 -0.066 0.783\nvn  0.915 0.183 0.360\nvn  0.460 0.516 0.723\nvn  0.286 0.849 0.444\nvn  -0.939 0.172 0.298\nvn  -0.965 0.107 -0.241\nvn  0.900 0.264 0.347\nvn  0.935 -0.249 0.253\nvn  0.605 -0.668 0.433\nvn  -0.889 -0.174 -0.424\nvn  0.152 -0.899 -0.411\nvn  -0.058 -0.939 -0.340\nvn  -0.028 -0.995 -0.094\nvn  -0.298 -0.926 0.234\nvn  -0.991 -0.046 0.125\nvn  -0.832 -0.493 -0.254\nvn  0.835 -0.269 0.480\nvn  0.328 -0.722 -0.610\nvn  -0.893 -0.390 -0.226\nvn  0.460 0.887 -0.039\nvn  0.078 0.995 0.056\nvn  -0.651 0.755 -0.075\nvn  0.764 0.642 0.067\nvn  0.991 0.038 -0.130\nvn  -0.966 -0.017 -0.259\nvn  -0.572 0.759 -0.312\nvn  -0.572 0.609 0.550\nvn  0.776 -0.536 0.332\nvn  -0.963 -0.241 0.117\nvn  -0.763 -0.553 -0.335\nvn  0.147 -0.987 -0.065\nvn  0.905 -0.313 0.290\nvn  0.344 -0.760 0.551\nvn  -0.572 -0.715 0.403\nvn  0.051 -0.946 0.320\nvn  -0.149 0.697 -0.701\nvn  0.250 0.824 0.508\nvn  -0.252 0.683 -0.685\nvn  0.191 0.900 0.391\nvn  -0.665 0.554 -0.501\nvn  -0.264 0.738 0.621\nvn  -0.669 0.495 -0.554\nvn  -0.350 0.701 0.621\nvn  -0.778 0.625 0.069\nvn  -0.238 0.563 0.791\nvn  -0.954 0.169 0.248\nvn  0.126 -0.137 0.983\nvn  -0.815 0.214 -0.538\nvn  -0.298 -0.733 -0.611\nvn  -0.310 -0.870 0.383\nvn  -0.490 -0.312 -0.814\nvn  -0.192 -0.244 -0.951\nvn  -0.431 -0.335 -0.838\nvn  0.316 -0.157 0.936\nvn  0.275 0.315 0.908\nvn  0.247 0.297 0.922\nvn  0.433 -0.193 0.880\nvn  0.467 -0.867 -0.174\nvn  0.375 -0.864 -0.335\nvn  0.395 -0.909 0.134\nvn  0.109 -0.993 0.037\nvn  0.247 -0.024 0.969\nvn  -0.249 -0.611 -0.752\nvn  0.603 -0.779 0.172\nvn  -0.084 -0.987 0.138\nvn  0.342 -0.262 0.902\nvn  -0.101 -0.283 0.954\nvn  -0.729 0.234 -0.644\nvn  -0.650 -0.419 -0.634\nvn  -0.590 -0.581 -0.561\nvn  0.529 -0.373 -0.762\nvn  0.366 -0.623 -0.691\nvn  0.097 -0.989 -0.115\nvn  0.601 -0.647 -0.469\nvn  0.096 -0.766 -0.636\nvn  0.094 -0.764 -0.638\nvn  -0.512 -0.618 -0.596\nvn  -0.241 -0.958 0.153\nvn  0.634 -0.472 -0.613\nvn  0.771 0.624 0.127\nvn  0.964 0.097 -0.247\nvn  0.877 0.335 -0.344\nvn  0.928 0.183 -0.324\nvn  0.347 0.926 -0.151\nvn  0.530 -0.233 -0.816\nvn  -0.355 0.751 0.558\nvn  -0.319 0.921 0.225\nvn  0.559 0.762 -0.329\nvn  0.825 0.563 -0.042\nvn  -0.242 0.821 0.518\nvn  0.882 0.441 0.163\nvn  -0.203 0.593 0.779\nvn  0.596 0.400 0.696\nvn  -0.344 0.341 0.875\nvn  0.495 -0.080 0.865\nvn  -0.734 -0.251 0.631\nvn  -0.072 -0.969 0.238\nvn  0.999 -0.017 0.039\nvn  0.583 -0.718 -0.381\nvn  0.907 -0.117 -0.405\nvn  0.720 -0.256 -0.645\nvn  -0.833 -0.373 0.409\nvn  -0.953 -0.155 0.258\nvn  -0.724 0.305 0.619\nvn  -0.828 -0.272 0.490\nvn  -0.393 -0.655 -0.645\nvn  0.692 -0.566 -0.447\nvn  -0.372 -0.583 -0.722\nvn  -0.417 -0.893 -0.167\nvn  -0.177 -0.981 -0.080\nvn  -0.697 -0.162 0.699\nvn  0.764 -0.636 -0.106\nvn  -0.728 -0.566 -0.386\nvn  -0.055 -0.990 -0.126\nvn  0.259 -0.224 0.940\nvn  0.889 -0.457 -0.016\nvn  0.317 -0.925 0.211\nvn  0.213 -0.782 0.586\nvn  -0.597 -0.363 0.715\nvn  -0.548 -0.587 0.596\nvn  0.131 -0.281 0.951\nvn  0.280 -0.763 0.582\nvn  -0.390 -0.091 0.916\nvn  -0.376 -0.088 0.922\nvn  0.644 0.508 0.572\nvn  -0.161 -0.046 0.986\nvn  0.088 0.021 0.996\nvn  0.175 0.322 0.931\nvn  -0.345 0.638 0.689\nvn  -0.281 0.186 0.942\nvn  -0.470 0.090 0.878\nvn  -0.356 0.779 0.515\nvn  -0.926 0.227 -0.302\nvn  -0.486 -0.847 0.215\nvn  0.252 -0.921 0.298\nvn  0.191 -0.935 0.299\nvn  -0.584 -0.352 0.732\nvn  0.352 -0.788 0.505\nvn  -0.468 -0.350 0.812\nvn  0.374 -0.779 0.503\nvn  -0.268 -0.322 0.908\nvn  0.592 -0.795 0.132\nvn  0.177 -0.424 0.888\nvn  0.487 -0.836 -0.253\nvn  0.533 -0.606 0.591\nvn  0.091 -0.779 -0.620\nvn  0.755 -0.595 0.275\nvn  -0.395 -0.809 -0.435\nvn  0.720 -0.637 0.276\nvn  -0.528 -0.849 0.025\nvn  -0.860 0.099 0.501\nvn  -0.663 0.370 0.651\nvn  -0.277 0.351 0.894\nvn  0.298 0.229 0.927\nvn  0.785 0.116 0.609\nvn  0.258 0.429 0.866\nvn  -0.823 -0.146 0.549\nvn  -0.973 -0.163 0.163\nvn  -0.855 -0.225 0.467\nvn  -0.728 -0.586 -0.356\nvn  -0.732 0.455 -0.508\nvn  -0.791 -0.318 0.523\nvn  -0.901 -0.020 0.434\nvn  -0.927 0.369 -0.065\nvn  -0.773 0.127 0.622\nvn  -0.668 -0.301 0.680\nvn  -0.896 -0.042 0.443\nvn  -0.591 0.643 -0.487\nvn  -0.928 0.155 0.340\nvn  -0.938 0.179 0.297\nvn  -0.523 0.852 0.037\nvn  -0.632 -0.728 -0.267\nvn  -0.772 0.032 -0.634\nvn  -0.938 0.287 0.194\nvn  -0.932 0.181 -0.314\nvn  -0.575 -0.150 -0.804\nvn  -0.625 -0.005 -0.781\nvn  -0.360 0.754 -0.549\nvn  0.041 0.839 -0.543\nvn  0.009 0.137 -0.991\nvn  -0.970 0.242 0.009\nvn  -0.945 0.028 0.326\nvn  -0.679 0.521 -0.518\nvn  -0.898 0.423 0.117\nvn  -0.770 0.206 0.604\nvn  -0.823 -0.359 -0.441\nvn  -0.876 -0.468 0.115\nvn  -0.987 -0.040 -0.158\nvn  -0.830 0.491 0.265\nvn  -0.905 0.423 -0.033\nvn  -0.658 0.583 0.476\nvn  -0.476 0.831 -0.287\nvn  0.061 0.536 -0.842\nvn  -0.164 -0.537 -0.828\nvn  -0.606 0.332 -0.722\nvn  -0.463 0.467 -0.753\nvn  -0.487 0.250 -0.837\nvn  -0.926 -0.366 0.093\nvn  -0.891 0.157 0.426\nvn  -0.978 -0.204 -0.049\nvn  -0.646 0.764 -0.003\nvn  -0.809 0.260 0.527\nvn  -0.110 0.709 -0.696\nvn  -0.362 0.687 -0.630\nvn  -0.465 0.466 -0.753\nvn  -0.667 0.669 -0.327\nvn  -0.624 0.763 0.169\nvn  -0.335 0.803 0.493\nvn  0.158 0.771 0.617\nvn  -0.937 0.091 -0.339\nvn  -0.870 0.151 0.470\nvn  -0.752 0.322 -0.576\nvn  -0.398 0.785 -0.475\nvn  -0.862 0.422 0.280\nvn  -0.677 0.511 -0.529\nvn  -0.587 0.808 0.054\nvn  -0.714 0.182 -0.676\nvn  -0.279 -0.419 0.864\nvn  -0.535 0.193 -0.823\nvn  -0.124 0.702 -0.702\nvn  -0.898 -0.392 -0.200\nvn  -0.902 -0.422 -0.092\nvn  -0.783 0.125 0.609\nvn  -0.932 -0.332 -0.143\nvn  -0.157 0.491 -0.857\nvn  -0.862 -0.475 -0.175\nvn  -0.783 0.535 -0.318\nvn  -0.092 0.492 -0.866\nvn  -0.457 0.435 -0.776\nvn  -0.435 0.721 -0.539\nvn  -0.324 0.559 0.763\nvn  -0.084 0.215 0.973\nvn  0.322 0.189 0.927\nvn  0.207 0.288 0.935\nvn  -0.156 0.026 0.987\nvn  -0.386 0.535 0.751\nvn  -0.778 0.382 0.499\nvn  -0.577 0.233 0.783\nvn  -0.547 0.619 0.564\nvn  -0.804 0.576 0.147\nvn  -0.305 0.193 0.933\nvn  -0.278 -0.353 0.893\nvn  -0.440 -0.005 0.898\nvn  0.529 -0.209 0.823\nvn  0.470 0.195 0.861\nvn  -0.833 0.016 0.554\nvn  -0.333 0.767 0.549\nvn  -0.828 0.096 0.552\nvn  -0.740 0.646 -0.186\nvn  -0.388 0.558 0.734\nvn  -0.956 -0.071 0.283\nvn  -0.800 0.516 -0.307\nvn  -0.486 0.849 0.209\nvn  -0.966 -0.248 -0.066\nvn  -0.738 0.279 0.614\nvn  -0.912 -0.361 -0.194\nvn  -0.990 -0.124 -0.070\nvn  -0.914 -0.394 -0.096\nvn  -0.993 -0.044 0.111\nvn  -0.479 0.873 -0.090\nvn  -0.716 0.692 -0.088\nvn  -0.607 0.789 -0.090\nvn  0.043 0.981 -0.190\nvn  -0.674 0.640 -0.369\nvn  -0.207 0.792 0.575\nvn  -0.556 0.688 -0.465\nvn  0.315 0.928 -0.199\nvn  0.250 0.916 0.314\nvn  0.139 0.958 0.251\nvn  -0.208 0.919 0.336\nvn  -0.654 0.425 0.626\nvn  -0.613 -0.170 0.772\nvn  -0.527 0.307 0.792\nvn  -0.137 0.481 0.866\nvn  0.409 0.165 0.897\nvn  -0.257 0.531 0.808\nvn  0.160 0.262 0.952\nvn  0.524 -0.219 0.823\nvn  -0.308 -0.357 0.881\nvn  -0.318 0.700 0.639\nvn  -0.085 0.547 0.833\nvn  -0.526 0.126 0.841\nvn  -0.676 0.248 0.694\nvn  0.106 -0.341 0.934\nvn  0.500 -0.047 0.865\nvn  -0.055 -0.486 0.872\nvn  -0.507 0.290 0.812\nvn  -0.418 -0.012 0.908\nvn  -0.364 -0.279 0.888\nvn  -0.737 0.671 0.083\nvn  -0.859 -0.033 0.511\nvn  -0.683 -0.477 0.553\nvn  -0.798 -0.478 -0.369\nvn  -0.914 -0.404 0.038\nvn  0.076 -0.801 0.593\nvn  -0.801 -0.517 0.301\nvn  -0.603 -0.654 -0.456\nvn  -0.873 -0.475 -0.109\nvn  -0.646 0.577 -0.500\nvn  -0.612 -0.425 -0.667\nvn  -0.436 -0.705 -0.559\nvn  -0.950 -0.284 -0.128\nvn  -0.207 -0.385 -0.899\nvn  -0.868 -0.496 -0.014\nvn  -0.449 0.200 -0.871\nvn  -0.486 -0.172 -0.857\nvn  -0.027 0.994 0.102\nvn  -0.382 0.470 -0.796\nvn  0.142 0.980 0.136\nvn  0.166 0.919 -0.357\nvn  -0.382 0.790 -0.479\nvn  0.168 -0.286 0.943\nvn  0.195 -0.414 0.889\nvn  -0.199 -0.251 0.947\nvn  -0.225 -0.814 0.536\nvn  -0.046 -0.638 0.769\nvn  -0.408 -0.156 0.900\nvn  -0.374 -0.630 0.681\nvn  0.225 -0.034 0.974\nvn  -0.476 0.250 0.843\nvn  -0.419 -0.308 0.854\nvn  -0.414 -0.753 -0.512\nvn  -0.506 -0.280 -0.816\nvn  -0.823 -0.488 -0.291\nvn  -0.919 -0.259 -0.296\nvn  -0.284 -0.218 -0.934\nvn  -0.118 -0.531 -0.839\nvn  -0.566 0.180 -0.805\nvn  -0.498 -0.314 -0.809\nvn  -0.505 -0.382 -0.774\nvn  -0.313 -0.522 -0.794\nvn  -0.430 -0.692 -0.579\nvn  -0.758 0.519 0.396\nvn  -0.480 -0.086 -0.873\nvn  -0.931 -0.259 -0.256\nvn  -0.315 -0.812 -0.491\nvn  -0.686 -0.683 0.253\nvn  -0.727 -0.169 0.666\nvn  -0.309 -0.926 -0.215\nvn  0.194 -0.040 -0.980\nvn  -0.519 -0.222 0.825\nvn  -0.627 0.167 -0.761\nvn  0.526 0.137 -0.839\nvn  -0.913 0.044 0.405\nvn  -0.300 -0.952 -0.063\nvn  0.357 -0.040 -0.933\nvn  -0.609 -0.173 0.774\nvn  -0.235 -0.897 -0.375\nvn  -0.465 0.438 0.770\nvn  0.227 0.864 -0.450\nvn  -0.152 0.816 0.557\nvn  -0.155 0.978 -0.137\nvn  0.185 0.939 -0.292\nvn  -0.347 0.788 0.509\nvn  0.320 0.845 -0.429\nvn  0.281 -0.005 -0.960\nvn  -0.026 0.918 0.395\nvn  -0.861 -0.151 -0.486\nvn  -0.409 -0.471 -0.782\nvn  0.009 0.269 -0.963\nvn  -0.526 0.135 -0.840\nvn  -0.712 -0.692 0.122\nvn  -0.370 -0.688 -0.625\nvn  -0.095 -0.158 -0.983\nvn  -0.853 -0.148 -0.501\nvn  -0.463 -0.051 0.885\nvn  -0.500 -0.756 -0.422\nvn  -0.083 -0.093 -0.992\nvn  -0.332 -0.158 0.930\nvn  0.303 0.720 -0.624\nvn  -0.099 0.722 -0.684\nvn  0.024 0.703 0.711\nvn  0.415 0.907 0.075\nvn  -0.439 0.898 0.024\nvn  -0.497 0.486 -0.719\nvn  -0.576 0.788 -0.217\nvn  -0.001 0.829 -0.559\nvn  -0.315 0.885 -0.342\nvn  0.105 0.507 -0.856\nvn  0.150 0.989 0.004\nvn  -0.458 0.889 -0.004\nvn  -0.134 0.368 -0.920\nvn  -0.521 0.391 -0.759\nvn  0.312 0.859 0.406\nvn  -0.518 0.750 -0.411\nvn  0.096 0.854 0.511\nvn  -0.225 0.843 0.488\nvn  -0.851 0.522 0.064\nvn  -0.293 0.503 0.813\nvn  -0.449 0.878 -0.169\nvn  -0.261 0.866 -0.426\nvn  -0.767 0.641 0.036\nvn  -0.572 -0.652 0.497\nvn  0.161 0.583 0.796\nvn  -0.600 -0.735 -0.314\nvn  -0.122 -0.149 -0.981\nvn  -0.462 -0.186 0.867\nvn  0.381 0.659 -0.649\nvn  -0.665 -0.612 0.427\nvn  -0.039 0.457 0.889\nvn  -0.327 -0.517 -0.791\nvn  0.146 0.988 -0.040\nvn  -0.522 -0.606 0.600\nvn  -0.221 0.474 0.853\nvn  0.393 0.902 0.176\nvn  0.189 0.527 -0.829\nvn  -0.448 -0.891 -0.080\nvn  -0.529 0.046 0.848\nvn  -0.296 0.921 -0.252\nvn  -0.151 0.008 -0.989\nvn  -0.967 0.003 -0.256\nvn  -0.714 0.242 -0.657\nvn  -0.826 -0.233 -0.514\nvn  -0.341 -0.771 -0.538\nvn  -0.876 -0.476 -0.081\nvn  -0.195 0.967 -0.166\nvn  -0.894 0.393 0.216\nvn  -0.502 0.426 -0.753\nvn  -0.415 -0.584 -0.698\nvn  -0.880 -0.367 -0.302\nvn  -0.182 0.969 -0.168\nvn  -0.906 0.417 0.080\nvn  0.529 -0.135 0.838\nvn  0.388 -0.162 0.907\nvn  0.333 -0.409 0.850\nvn  0.333 -0.215 0.918\nvn  0.365 -0.255 0.896\nvn  0.525 -0.231 0.819\nvn  -0.032 -0.064 0.997\nvn  -0.052 0.368 0.928\nvn  -0.177 -0.213 0.961\nvn  0.128 0.981 -0.149\nvn  -0.365 0.847 0.386\nvn  -0.374 0.794 -0.478\nvn  -0.659 0.593 -0.463\nvn  -0.369 0.814 -0.449\nvn  -0.382 0.769 -0.512\nvn  -0.500 0.797 -0.339\nvn  -0.273 0.868 -0.414\nvn  -0.892 0.397 -0.215\nvn  -0.404 0.856 -0.324\nvn  -0.722 0.610 -0.325\nvn  -0.523 0.764 0.378\nvn  -0.747 0.652 -0.130\nvn  -0.530 0.848 0.002\nvn  -0.558 0.739 0.378\nvn  -0.464 0.840 0.281\nvn  -0.583 0.744 -0.325\nvn  -0.336 0.315 -0.888\nvn  -0.648 -0.101 -0.755\nvn  -0.876 0.135 0.462\nvn  -0.855 0.322 -0.406\nvn  -0.166 -0.540 -0.825\nvn  -0.244 -0.596 -0.765\nvn  -0.102 -0.059 -0.993\nvn  -0.633 0.771 0.067\nvn  -0.381 0.542 0.749\nvn  -0.842 0.445 0.305\nvn  -0.488 0.871 0.060\nvn  -0.341 0.788 -0.513\nvn  -0.186 0.396 0.899\nvn  -0.748 0.154 -0.646\nvn  -0.239 0.149 -0.959\nvn  -0.470 0.880 -0.066\nvn  -0.182 0.890 -0.417\nvn  -0.242 0.894 -0.378\nvn  -0.013 0.483 -0.876\nvn  -0.795 0.592 -0.133\nvn  -0.967 -0.099 -0.233\nvn  -0.545 0.819 0.178\nvn  -0.235 -0.111 0.966\nvn  -0.541 0.822 -0.180\nvn  -0.616 0.704 0.353\nvn  -0.803 0.227 0.551\nvn  -0.777 0.623 -0.093\nvn  -0.600 0.354 0.718\nvn  -0.703 0.355 0.616\nvn  -0.710 0.597 -0.375\nvn  -0.649 0.269 0.712\nvn  -0.105 0.350 0.931\nvn  0.158 0.806 0.570\nvn  -0.578 0.471 0.666\nvn  -0.438 0.545 0.715\nvn  -0.667 0.534 0.520\nvn  -0.761 0.119 -0.637\nvn  -0.801 0.531 -0.275\nvn  0.052 -0.869 -0.491\nvn  0.023 0.716 0.698\nvn  -0.598 0.132 0.791\nvn  -0.574 0.153 0.804\nvn  -0.042 0.524 0.851\nvn  -0.597 0.098 0.796\nvn  -0.117 0.442 0.889\nvn  -0.013 0.584 0.812\nvn  0.298 0.498 0.815\nvn  0.265 0.334 0.904\nvn  0.009 0.950 0.313\nvn  0.175 0.757 0.630\nvn  -0.452 0.816 0.360\nvn  -0.413 0.084 0.907\nvn  0.100 0.680 0.727\nvn  -0.305 0.267 0.914\nvn  -0.540 0.575 0.615\nvn  -0.436 0.765 0.474\nvn  -0.688 0.274 0.671\nvn  -0.405 0.913 0.045\nvn  -0.749 0.643 -0.162\nvn  -0.967 -0.096 -0.234\nvn  -0.820 0.572 0.016\nvn  -0.672 0.325 -0.666\nvn  -0.604 0.460 -0.650\nvn  -0.609 0.502 0.614\nvn  -0.649 0.358 0.672\nvn  -0.891 0.451 -0.057\nvn  -0.239 0.864 -0.443\nvn  -0.820 0.316 -0.477\nvn  -0.457 0.855 -0.247\nvn  -0.768 0.630 0.119\nvn  -0.786 0.460 -0.413\nvn  -0.605 0.791 -0.085\nvn  -0.870 0.490 0.059\nvn  -0.961 0.022 -0.276\nvn  -0.979 -0.013 -0.205\nvn  -0.932 0.354 0.080\nvn  -0.485 0.716 0.502\nvn  -0.753 0.576 0.318\nvn  -0.670 0.713 0.205\nvn  0.079 0.489 0.869\nvn  0.344 0.130 0.930\nvn  -0.783 0.620 0.047\nvn  -0.889 0.100 -0.446\nvn  -0.561 0.753 0.345\nvn  -0.838 0.506 -0.202\nvn  -0.464 0.857 0.224\nvn  -0.053 0.693 0.719\nvn  0.760 -0.051 0.648\nvn  0.620 0.033 0.784\nvn  -0.756 0.584 -0.296\nvn  0.506 0.860 -0.069\nvn  -0.282 0.950 -0.133\nvn  -0.968 0.140 -0.206\nvn  -0.963 -0.112 -0.244\nvn  -0.871 -0.156 -0.467\nvn  -0.704 -0.499 -0.504\nvn  -0.279 0.642 0.715\nvn  -0.876 0.474 -0.089\nvn  -0.240 0.880 0.409\nvn  -0.293 0.897 0.331\nvn  0.349 0.032 0.937\nvn  0.416 0.656 0.629\nvn  -0.807 0.578 0.121\nvn  0.669 0.635 0.386\nvn  0.763 0.337 0.551\nvn  0.370 0.022 0.929\nvn  0.866 0.500 0.025\nvn  0.342 0.846 0.409\nvn  -0.846 0.150 -0.511\nvn  -0.309 0.919 0.244\nvn  -0.992 -0.128 -0.022\nvn  -0.867 0.499 0.006\nvn  -0.980 -0.118 0.159\nvn  -0.878 0.450 0.161\nvn  -0.831 0.520 0.198\nvn  -0.975 -0.136 0.178\nvn  -0.992 0.073 0.100\nvn  -0.840 0.536 0.082\nvn  -0.223 0.973 0.066\nvn  -0.962 -0.249 0.109\nvn  -0.840 -0.244 -0.484\nvn  -0.929 -0.255 -0.267\nvn  -0.489 -0.722 -0.490\nvn  -0.635 -0.735 0.237\nvn  -0.562 -0.763 -0.320\nvn  -0.628 -0.775 -0.074\nvn  -0.912 -0.238 -0.335\nvn  -0.787 -0.615 0.050\nvn  -0.643 -0.695 0.323\nvn  -0.466 -0.743 -0.480\nvn  -0.761 -0.219 -0.611\nvn  -0.282 -0.956 -0.087\nvn  -0.954 -0.280 0.106\nvn  0.768 -0.622 0.152\nvn  -0.996 -0.037 -0.081\nvn  0.369 -0.873 -0.318\nvn  -0.635 -0.671 -0.382\nvn  -0.997 -0.017 0.078\nvn  -0.201 -0.493 -0.846\nvn  0.028 -0.113 -0.993\nvn  0.192 -0.222 -0.956\nvn  -0.539 -0.213 -0.815\nvn  -0.916 0.312 -0.251\nvn  -0.275 -0.079 -0.958\nvn  -0.359 0.854 -0.376\nvn  0.222 0.460 -0.859\nvn  -0.995 -0.069 0.075\nvn  -0.694 -0.536 -0.481\nvn  0.166 -0.786 0.595\nvn  -0.992 -0.046 0.121\nvn  0.219 -0.922 -0.318\nvn  -0.711 -0.700 0.058\nvn  -0.636 -0.711 -0.300\nvn  -0.991 -0.047 -0.124\nvn  -0.495 -0.156 -0.855\nvn  -0.075 -0.446 -0.892\nvn  -0.077 0.401 -0.913\nvn  -0.348 -0.842 -0.413\nvn  -0.299 0.954 0.008\nvn  -0.086 0.405 -0.910\nvn  -0.766 -0.560 -0.315\nvn  -0.792 -0.486 -0.370\nvn  -0.180 -0.857 -0.482\nvn  0.885 -0.350 0.308\nvn  0.047 -0.871 0.489\nvn  0.572 -0.143 0.808\nvn  0.826 0.106 0.553\nvn  0.830 -0.349 0.435\nvn  0.789 -0.498 0.360\nvn  0.820 -0.428 0.379\nvn  0.193 -0.639 0.745\nvn  0.707 -0.504 0.495\nvn  0.226 -0.968 -0.113\nvn  -0.279 -0.862 -0.424\nvn  -0.013 -0.991 0.137\nvn  0.036 -0.985 -0.167\nvn  -0.130 -0.932 0.338\nvn  -0.162 -0.935 0.314\nvn  0.631 -0.713 0.306\nvn  0.430 -0.839 0.333\nvn  -0.146 0.982 0.120\nvn  0.947 0.268 0.179\nvn  0.988 0.145 0.053\nvn  0.558 0.807 0.194\nvn  0.943 0.323 0.076\nvn  0.913 -0.374 0.161\nvn  0.860 -0.317 0.400\nvn  0.764 -0.576 0.292\nvn  0.499 -0.864 0.063\nvn  0.565 -0.818 0.111\nvn  0.970 -0.190 0.149\nvn  -0.188 0.884 0.428\nvn  0.641 0.739 0.211\nvn  0.968 0.095 -0.233\nvn  -0.716 0.639 0.280\nvn  -0.429 0.755 0.495\nvn  -0.134 0.856 0.498\nvn  0.371 0.804 0.465\nvn  -0.925 0.283 -0.254\nvn  -0.342 0.820 0.459\nvn  0.389 0.835 0.389\nvn  -0.577 0.817 -0.010\nvn  0.207 0.953 0.222\nvn  -0.626 0.779 0.016\nvn  0.302 0.927 0.224\nvn  -0.586 0.729 0.354\nvn  0.269 0.804 0.530\nvn  -0.710 0.557 0.431\nvn  -0.838 0.361 0.410\nvn  0.643 0.454 0.616\nvn  -0.140 0.654 0.743\nvn  0.263 0.741 0.618\nvn  0.731 0.035 0.681\nvn  0.739 0.225 -0.635\nvn  0.957 0.021 0.288\nvn  0.926 0.264 0.270\nvn  0.978 -0.115 0.176\nvn  0.950 0.191 0.249\nvn  -0.961 -0.146 0.234\nvn  0.826 0.142 0.545\nvn  -0.226 0.528 0.818\nvn  -0.168 0.044 0.985\nvn  0.427 -0.230 -0.874\nvn  -0.005 -0.815 -0.579\nvn  -0.104 -0.928 -0.358\nvn  0.028 -0.783 -0.621\nvn  0.438 -0.758 -0.484\nvn  -0.942 0.064 0.329\nvn  -0.975 -0.181 0.127\nvn  -0.900 -0.342 -0.272\nvn  -0.765 -0.610 0.207\nvn  -0.290 0.917 -0.275\nvn  -0.611 0.783 0.111\nvn  -0.694 0.530 0.487\nvn  -0.581 0.813 -0.031\nvn  -0.502 0.852 0.150\nvn  -0.755 0.633 -0.170\nvn  -0.418 0.875 0.245\nvn  -0.222 0.905 -0.363\nvn  -0.323 0.642 0.696\nvn  -0.262 0.955 0.141\nvn  -0.075 0.930 0.359\nvn  -0.209 0.958 0.195\nvn  -0.654 0.751 -0.090\nvn  -0.672 0.701 -0.240\nvn  -0.354 0.929 0.110\nvn  -0.844 0.516 0.145\nvn  -0.279 0.942 0.187\nvn  -0.332 0.915 -0.228\nvn  -0.738 0.552 0.388\nvn  -0.678 0.423 0.601\nvn  -0.234 0.841 0.487\nvn  -0.755 0.605 0.250\nvn  -0.743 0.669 -0.016\nvn  -0.524 0.765 -0.374\nvn  -0.424 0.840 -0.339\nvn  -0.417 0.834 0.361\nvn  -0.575 0.809 0.123\nvn  -0.700 0.671 -0.245\nvn  -0.978 -0.153 -0.142\nvn  -0.979 -0.205 -0.017\nvn  -0.876 0.031 0.482\nvn  -0.982 0.170 -0.085\nvn  0.575 -0.772 -0.271\nvn  0.754 -0.582 -0.305\nvn  -0.368 -0.779 -0.508\nvn  -0.364 -0.856 -0.366\nvn  0.735 -0.678 0.008\nvn  -0.495 -0.842 -0.214\nvn  0.925 -0.375 0.059\nvn  -0.570 -0.759 -0.314\nvn  0.784 -0.620 -0.018\nvn  0.681 -0.723 0.113\nvn  -0.517 -0.842 -0.158\nvn  0.123 -0.920 0.372\nvn  0.887 0.255 -0.385\nvn  0.829 0.419 0.370\nvn  0.871 0.190 0.454\nvn  0.960 0.118 -0.255\nvn  0.702 0.411 0.582\nvn  0.877 0.298 -0.377\nvn  0.598 0.682 0.421\nvn  0.757 0.516 -0.400\nvn  0.590 0.781 -0.206\nvn  0.429 0.773 0.467\nvn  0.559 0.449 -0.697\nvn  0.186 -0.322 -0.928\nvn  0.045 -0.207 -0.977\nvn  0.094 -0.516 -0.851\nvn  0.724 0.690 0.017\nvn  0.372 0.420 0.828\nvn  0.618 0.186 -0.764\nvn  0.939 0.293 0.181\nvn  -0.026 -0.547 0.837\nvn  0.144 -0.743 -0.654\nvn  0.116 0.013 0.993\nvn  -0.061 0.116 0.991\nvn  -0.485 -0.857 -0.175\nvn  -0.469 -0.604 0.645\nvn  0.113 -0.993 -0.019\nvn  -0.023 -0.773 0.634\nvn  0.209 -0.793 -0.572\nvn  -0.015 -0.442 0.897\nvn  -0.612 -0.551 0.567\nvn  -0.665 -0.589 -0.459\nvn  0.059 -0.891 0.450\nvn  0.654 -0.755 0.051\nvn  0.893 0.120 0.435\nvn  0.046 -0.922 -0.385\nvn  0.645 -0.727 0.235\nvn  0.144 -0.981 -0.127\nvn  -0.280 0.675 0.683\nvn  -0.612 0.565 0.554\nvn  -0.804 0.488 0.341\nvn  0.091 0.685 0.723\nvn  -0.867 0.216 0.450\nvn  0.044 0.425 0.904\nvn  -0.824 -0.108 0.557\nvn  0.070 0.083 0.994\nvn  -0.843 -0.146 0.518\nvn  -0.061 0.020 0.998\nvn  -0.406 -0.266 0.875\nvn  -0.909 -0.384 0.164\nvn  0.443 -0.096 0.891\nvn  0.048 0.166 0.985\nvn  0.788 0.200 0.583\nvn  0.675 0.151 0.722\nvn  0.937 0.058 0.344\nvn  -0.303 -0.630 0.715\nvn  -0.762 -0.553 -0.337\nvn  0.766 -0.259 0.589\nvn  0.100 -0.980 0.172\nvn  -0.122 -0.060 -0.991\nvn  0.979 0.155 -0.132\nvn  -0.956 -0.145 -0.255\nvn  -0.889 -0.179 -0.421\nvn  -0.786 -0.317 -0.531\nvn  -0.899 -0.051 0.434\nvn  0.859 -0.066 -0.508\nvn  0.956 0.205 -0.211\nvn  0.008 0.026 -1.000\nvn  0.048 -0.202 -0.978\nvn  0.952 -0.091 -0.291\nvn  -0.015 -0.196 -0.981\nvn  -0.253 -0.479 -0.841\nvn  0.932 -0.288 -0.221\nvn  0.458 -0.888 0.035\nvn  0.592 -0.482 -0.647\nvn  -0.622 0.463 0.632\nvn  -0.822 0.392 0.414\nvn  -0.904 0.246 0.350\nvn  -0.054 0.455 0.889\nvn  -0.932 -0.041 0.360\nvn  -0.139 0.207 0.968\nvn  -0.717 -0.568 0.404\nvn  0.015 -0.354 0.935\nvn  -0.575 -0.750 0.326\nvn  0.247 -0.488 0.837\nvn  -0.070 -0.832 0.551\nvn  -0.609 -0.793 -0.006\nvn  0.561 -0.321 0.763\nvn  -0.193 0.040 0.980\nvn  0.677 0.078 0.732\nvn  0.788 0.202 0.581\nvn  0.863 0.257 0.434\nvn  0.007 -0.915 0.403\nvn  -0.535 -0.731 -0.424\nvn  0.795 -0.291 0.532\nvn  0.585 -0.308 -0.750\nvn  -0.907 -0.295 -0.300\nvn  -0.798 -0.283 -0.532\nvn  -0.729 -0.360 -0.582\nvn  -0.964 -0.264 -0.027\nvn  0.643 0.634 -0.430\nvn  0.681 0.698 -0.224\nvn  -0.142 0.495 -0.857\nvn  -0.188 0.288 -0.939\nvn  0.858 0.450 -0.247\nvn  -0.282 0.048 -0.958\nvn  -0.200 -0.266 -0.943\nvn  0.992 0.005 -0.123\nvn  0.339 -0.881 -0.329\nvn  0.412 -0.886 -0.213\nvn  -0.504 -0.544 -0.670\nvn  -0.418 -0.546 -0.726\nvn  -0.359 -0.847 -0.393\nvn  -0.925 0.134 -0.356\nvn  -0.810 0.330 0.485\nvn  -0.932 0.351 0.094\nvn  -0.917 0.325 0.233\nvn  -0.286 0.268 0.920\nvn  -0.934 -0.169 0.315\nvn  -0.223 -0.093 0.970\nvn  -0.876 -0.482 -0.007\nvn  -0.302 -0.508 0.807\nvn  -0.634 -0.757 -0.157\nvn  -0.085 -0.770 0.633\nvn  -0.078 -0.996 0.048\nvn  -0.399 -0.617 -0.678\nvn  0.402 -0.690 0.602\nvn  -0.091 -0.267 0.959\nvn  0.420 -0.047 0.906\nvn  0.494 -0.143 0.858\nvn  0.611 -0.030 0.791\nvn  0.231 -0.943 -0.239\nvn  -0.221 -0.377 -0.899\nvn  0.665 -0.409 0.625\nvn  0.840 0.271 -0.470\nvn  -0.791 -0.011 -0.612\nvn  -0.581 -0.062 -0.811\nvn  -0.372 0.073 -0.925\nvn  -0.819 -0.039 -0.573\nvn  0.504 0.662 0.554\nvn  0.767 0.543 0.343\nvn  0.149 0.782 -0.605\nvn  0.112 0.904 -0.413\nvn  0.693 0.564 0.450\nvn  -0.068 0.424 -0.903\nvn  0.224 -0.097 -0.970\nvn  0.883 -0.317 0.345\nvn  -0.141 -0.617 -0.774\nvn  -0.415 -0.828 -0.377\nvn  -0.420 -0.354 0.835\nvn  -0.266 0.155 0.951\nvn  0.210 0.575 0.790\nvn  0.502 0.103 0.859\nvn  0.362 0.532 0.765\nvn  -0.468 -0.654 -0.594\nvn  -0.438 -0.861 0.257\nvn  0.317 0.301 0.899\nvn  -0.011 0.362 0.932\nvn  -0.734 -0.461 -0.500\nvn  -0.363 -0.866 -0.345\nvn  -0.950 -0.156 -0.272\nvn  0.437 0.768 -0.468\nvn  -0.660 0.501 0.560\nvn  -0.992 -0.074 -0.103\nvn  -0.996 -0.083 0.024\nvn  -0.983 -0.010 -0.184\nvn  -0.956 0.119 -0.270\nvn  -0.762 0.404 0.506\nvn  -0.953 -0.185 -0.239\nvn  -0.794 0.524 0.307\nvn  -0.895 -0.233 -0.381\nvn  -0.348 -0.450 -0.823\nvn  -0.212 -0.264 -0.941\nvn  0.018 -0.306 -0.952\nvn  0.117 -0.065 -0.991\nvn  0.924 -0.014 -0.383\nvn  0.916 0.065 -0.397\nvn  0.491 0.704 -0.513\nvn  0.794 0.405 -0.453\nvn  -0.045 0.991 0.126\nvn  0.493 0.828 0.268\nvn  0.420 0.896 0.142\nvn  0.893 0.414 0.179\nvn  0.781 0.497 0.378\nvn  0.587 -0.233 -0.775\nvn  -0.203 0.860 0.468\nvn  0.190 0.722 0.665\nvn  -0.086 0.719 0.690\nvn  -0.390 0.532 -0.752\nvn  -0.519 -0.418 -0.745\nvn  -0.257 -0.964 -0.073\nvn  -0.689 -0.568 -0.451\nvn  -0.695 -0.688 -0.210\nvn  -0.497 -0.339 0.799\nvn  -0.696 -0.701 0.155\nvn  -0.676 -0.188 0.712\nvn  -0.439 -0.195 0.877\nvn  -0.581 -0.375 0.723\nvn  -0.760 -0.649 -0.025\nvn  -0.719 -0.544 -0.433\nvn  -0.729 0.042 0.684\nvn  -0.531 -0.641 0.554\nvn  -0.588 -0.069 0.806\nvn  -0.864 -0.067 0.499\nvn  -0.798 -0.460 0.389\nvn  -0.524 -0.290 0.801\nvn  -0.811 -0.535 0.236\nvn  -0.521 -0.606 0.601\nvn  -0.627 -0.631 0.458\nvn  -0.683 -0.703 0.200\nvn  -0.439 -0.787 0.433\nvn  -0.375 -0.817 0.438\nvn  -0.298 -0.397 0.868\nvn  -0.377 -0.065 0.924\nvn  -0.533 -0.169 0.829\nvn  -0.794 -0.381 0.473\nvn  -0.148 0.250 0.957\nvn  -0.138 0.216 0.967\nvn  -0.619 -0.288 0.730\nvn  -0.007 -0.217 0.976\nvn  -0.153 -0.371 0.916\nvn  -0.319 0.137 0.938\nvn  -0.173 -0.112 0.979\nvn  -0.051 -0.075 0.996\nvn  -0.300 -0.084 0.950\nvn  -0.447 -0.392 0.804\nvn  -0.048 -0.087 0.995\nvn  -0.338 -0.813 0.475\nvn  -0.023 -0.362 0.932\nvn  -0.610 -0.662 0.436\nvn  -0.014 0.346 0.938\nvn  -0.422 -0.114 0.899\nvn  -0.609 -0.439 0.660\nvn  -0.179 0.377 0.908\nvn  -0.554 -0.205 0.807\nvn  -0.054 0.377 0.925\nvn  -0.904 0.033 -0.426\nvn  -0.899 0.432 -0.071\nvn  -0.524 -0.007 0.852\nvn  -0.176 -0.181 0.968\nvn  -0.188 0.036 0.982\nvn  0.075 -0.594 0.801\nvn  -0.218 -0.188 0.958\nvn  -0.068 -0.524 0.849\nvn  -0.331 -0.304 0.893\nvn  -0.073 -0.388 0.919\nvn  -0.131 -0.286 0.949\nvn  -0.468 -0.176 0.866\nvn  0.102 -0.104 0.989\nvn  0.449 -0.241 0.860\nvn  -0.092 0.074 0.993\nvn  0.093 -0.660 0.745\nvn  -0.114 -0.011 0.993\nvn  -0.805 0.575 0.148\nvn  -0.842 0.455 0.289\nvn  -0.381 -0.103 -0.919\nvn  -0.934 0.167 0.317\nvn  -0.107 -0.902 -0.417\nvn  -0.778 -0.212 0.592\nvn  0.063 -0.994 0.088\nvn  -0.590 -0.212 0.779\nvn  0.025 -0.104 0.994\nvn  -0.114 -0.969 0.217\nvn  -0.407 -0.064 0.911\nvn  -0.272 -0.114 0.955\nvn  -0.540 -0.178 0.823\nvn  0.012 0.452 0.892\nvn  -0.746 0.276 0.606\nvn  0.654 0.683 0.324\nvn  0.212 0.928 0.305\nvn  0.165 -0.687 -0.707\nvn  -0.767 -0.463 0.444\nvn  -0.823 -0.291 0.488\nvn  0.486 -0.781 -0.392\nvn  -0.734 -0.389 0.557\nvn  -0.482 -0.809 -0.337\nvn  -0.199 0.798 0.569\nvn  -0.419 0.850 0.319\nvn  -0.631 0.773 -0.067\nvn  -0.453 0.379 -0.807\nvn  0.278 0.862 -0.423\nvn  0.055 0.995 -0.078\nvn  0.457 0.238 -0.857\nvn  0.206 0.606 -0.768\nvn  0.602 -0.712 -0.363\nvn  -0.811 -0.274 0.517\nvn  -0.692 0.203 0.692\nvn  0.486 0.844 -0.226\nvn  0.191 0.904 0.383\nvn  0.007 0.698 0.716\nvn  -0.374 0.316 0.872\nvn  -0.996 0.091 0.019\nvn  -0.292 0.956 -0.021\nvn  -0.313 0.883 0.351\nvn  0.003 0.659 0.752\nvn  -0.279 0.382 0.881\nvn  -0.398 0.325 0.858\nvn  0.214 0.751 0.625\nvn  -0.564 0.750 0.344\nvn  -0.660 0.456 0.596\nvn  -0.843 -0.281 -0.459\nvn  -0.909 -0.092 -0.407\nvn  -0.789 -0.068 0.611\nvn  -0.852 0.114 0.512\nvn  -0.518 -0.545 0.660\nvn  -0.369 -0.335 0.867\nvn  0.462 -0.585 -0.667\nvn  0.734 -0.677 0.056\nvn  -0.049 -0.573 -0.818\nvn  0.816 -0.403 -0.414\nvn  0.390 -0.494 -0.777\nvn  0.777 -0.413 -0.476\nvn  0.725 -0.245 -0.643\nvn  0.208 -0.969 0.130\nvn  0.672 -0.229 -0.704\nvn  0.058 0.853 0.519\nvn  0.916 -0.274 0.293\nvn  0.445 -0.063 0.893\nvn  0.223 -0.971 0.082\nvn  -0.263 -0.619 -0.740\nvn  -0.693 -0.714 -0.104\nvn  -0.847 -0.529 0.039\nvn  -0.100 -0.897 -0.431\nvn  -0.829 -0.550 0.104\nvn  -0.805 -0.549 0.226\nvn  -0.271 -0.851 0.449\nvn  -0.114 -0.814 0.569\nvn  -0.604 -0.735 0.308\nvn  -0.111 -0.989 -0.101\nvn  -0.639 -0.293 -0.711\nvn  -0.215 -0.838 -0.502\nvn  -0.498 -0.864 0.072\nvn  -0.783 -0.405 -0.471\nvn  -0.231 -0.861 0.453\nvn  -0.472 -0.871 0.134\nvn  -0.221 -0.961 -0.166\nvn  -0.655 -0.288 -0.698\nvn  -0.047 -0.428 -0.902\nvn  -0.541 -0.441 -0.716\nvn  -0.621 -0.609 -0.494\nvn  0.577 0.806 0.132\nvn  0.588 0.804 0.092\nvn  0.588 -0.246 0.771\nvn  0.743 -0.174 0.646\nvn  0.903 -0.254 0.347\nvn  0.256 -0.796 0.549\nvn  0.346 0.168 0.923\nvn  0.468 -0.041 0.883\nvn  0.570 0.233 0.788\nvn  0.431 0.129 0.893\nvn  0.121 -0.979 0.164\nvn  0.699 -0.710 0.092\nvn  0.085 -0.982 0.169\nvn  0.083 -0.987 0.138\nvn  0.055 -0.984 -0.169\nvn  0.438 0.296 0.849\nvn  0.779 0.186 0.599\nvn  0.912 0.409 0.023\nvn  0.329 0.590 0.738\nvn  0.433 0.340 0.835\nvn  0.914 0.405 0.031\nvn  0.977 0.213 0.009\nvn  0.870 -0.105 -0.482\nvn  0.965 -0.031 0.260\nvn  0.915 0.343 0.212\nvn  0.978 -0.142 -0.154\nvn  0.840 0.488 0.236\nvn  0.593 0.442 0.673\nvn  0.795 -0.235 0.559\nvn  0.602 0.525 0.601\nvn  0.676 0.328 0.659\nvn  0.779 -0.407 0.478\nvn  0.653 -0.265 0.709\nvn  0.707 -0.205 0.677\nvn  0.870 -0.491 0.050\nvn  0.690 0.722 -0.052\nvn  0.770 -0.098 0.630\nvn  0.866 0.469 0.171\nvn  0.994 -0.098 0.043\nvn  0.876 -0.451 0.168\nvn  0.919 -0.380 -0.110\nvn  0.944 0.310 -0.112\nvn  0.827 -0.092 0.554\nvn  0.872 -0.489 -0.013\nvn  0.973 0.201 0.111\nvn  0.934 0.103 0.342\nvn  0.962 0.269 0.049\nvn  0.960 -0.212 -0.185\nvn  0.996 0.089 -0.019\nvn  0.970 -0.212 0.117\nvn  0.917 -0.333 0.219\nvn  0.789 -0.347 0.507\nvn  0.968 0.147 0.202\nvn  0.987 0.035 0.154\nvn  0.949 0.179 0.260\nvn  -0.466 0.559 0.685\nvn  -0.708 0.420 0.569\nvn  -0.876 0.301 -0.377\nvn  -0.864 -0.276 -0.421\nvn  -0.669 -0.732 0.126\nvn  0.416 -0.566 0.712\nvn  0.969 0.124 0.212\nvn  0.775 0.607 -0.177\nvn  0.705 -0.345 0.619\nvn  0.916 -0.400 0.036\nvn  0.856 -0.107 -0.506\nvn  0.993 0.066 -0.102\nvn  0.479 0.656 -0.583\nvn  0.413 -0.041 0.910\nvn  0.048 -0.245 0.968\nvn  0.405 0.076 0.911\nvn  0.148 -0.245 0.958\nvn  0.292 0.082 0.953\nvn  0.736 0.218 0.641\nvn  0.697 0.428 0.575\nvn  0.888 0.333 0.317\nvn  0.582 0.159 0.798\nvn  0.593 0.315 0.741\nvn  0.689 0.375 0.620\nvn  0.305 -0.046 0.951\nvn  -0.172 0.914 0.367\nvn  0.026 -0.071 0.997\nvn  0.122 -0.325 0.938\nvn  0.051 -0.132 0.990\nvn  -0.393 -0.478 0.785\nvn  -0.386 -0.514 0.766\nvn  -0.234 0.062 0.970\nvn  -0.274 -0.489 0.828\nvn  0.342 0.588 0.733\nvn  0.298 0.049 0.953\nvn  -0.010 -0.292 0.956\nvn  0.948 -0.137 0.287\nvn  -0.044 -0.666 0.744\nvn  0.459 0.498 0.736\nvn  0.833 0.478 0.277\nvn  0.858 -0.467 0.215\nvn  0.831 -0.492 0.260\nvn  0.504 0.726 0.468\nvn  0.528 0.180 0.830\nvn  0.944 0.327 0.050\nvn  0.827 0.340 0.447\nvn  0.981 0.179 0.071\nvn  0.855 0.508 0.101\nvn  0.844 0.247 0.476\nvn  0.538 0.571 -0.619\nvn  -0.609 -0.338 0.718\nvn  0.125 0.473 0.872\nvn  0.892 0.182 0.414\nvn  -0.232 -0.900 0.369\nvn  0.700 -0.698 0.152\nvn  0.445 -0.079 0.892\nvn  0.061 -0.984 0.168\nvn  -0.233 -0.726 0.647\nvn  0.533 -0.626 0.569\nvn  0.546 -0.221 0.808\nvn  0.162 -0.960 0.228\nvn  0.477 -0.878 0.045\nvn  0.111 -0.974 0.197\nvn  0.987 0.127 -0.098\nvn  0.706 0.411 0.576\nvn  0.903 -0.377 0.204\nvn  -0.488 -0.488 0.724\nvn  0.101 -0.247 0.964\nvn  -0.125 -0.953 0.275\nvn  -0.255 -0.912 0.321\nvn  -0.698 -0.105 0.708\nvn  -0.626 -0.702 0.339\nvn  0.700 -0.662 -0.269\nvn  0.182 0.169 -0.969\nvn  0.696 -0.284 -0.660\nvn  0.796 0.605 -0.005\nvn  0.966 -0.233 -0.114\nvn  0.955 -0.278 -0.100\nvn  0.747 -0.664 -0.030\nvn  0.904 0.215 0.370\nvn  -0.211 -0.271 0.939\nvn  -0.445 0.386 0.808\nvn  -0.351 -0.500 0.792\nvn  -0.633 -0.011 0.774\nvn  -0.949 0.132 0.285\nvn  -0.474 -0.177 0.862\nvn  -0.537 -0.128 0.834\nvn  -0.443 -0.053 -0.895\nvn  0.137 0.388 -0.911\nvn  0.899 0.438 0.017\nvn  0.826 0.267 -0.497\nvn  0.189 -0.679 -0.709\nvn  0.729 -0.212 -0.651\nvn  -0.337 0.429 0.838\nvn  -0.564 -0.582 0.587\nvn  0.107 -0.317 0.942\nvn  -0.180 -0.649 0.739\nvn  -0.079 -0.358 0.930\nvn  -0.317 -0.550 0.773\nvn  0.800 0.460 -0.385\nvn  0.971 0.211 0.114\nvn  0.963 0.192 -0.189\nvn  -0.369 -0.086 -0.925\nvn  -0.687 0.327 -0.650\nvn  -0.842 -0.453 -0.292\nvn  -0.818 -0.538 -0.203\nvn  -0.817 -0.551 0.169\nvn  -0.777 -0.567 0.273\nvn  -0.623 -0.600 0.501\nvn  -0.760 -0.590 0.273\nvn  -0.907 -0.422 0.006\nvn  0.287 0.840 -0.460\nvn  -0.722 0.671 -0.167\nvn  -0.930 0.360 0.077\nvn  0.198 0.786 -0.585\nvn  -0.612 0.743 -0.271\nvn  0.050 0.963 -0.266\nvn  -0.630 0.777 0.014\nvn  -0.403 0.869 -0.287\nvn  0.486 0.560 -0.671\nvn  0.808 0.308 -0.503\nvn  0.840 0.398 -0.368\nvn  0.806 0.537 -0.250\nvn  0.931 -0.070 -0.359\nvn  0.785 0.305 -0.539\nvn  0.983 -0.064 -0.174\nvn  0.920 -0.379 -0.098\nvn  0.421 -0.901 0.106\nvn  -0.194 -0.929 0.315\nvn  -0.633 -0.727 0.267\nvn  -0.486 -0.828 0.279\nvn  -0.906 -0.342 0.248\nvn  -0.981 0.184 -0.063\nvn  -0.084 0.671 -0.737\nvn  -0.726 -0.375 -0.577\nvn  -0.984 -0.082 -0.158\nvn  -0.979 0.178 0.098\nvn  -0.850 -0.476 0.226\nvn  0.884 -0.431 -0.182\nvn  0.400 -0.916 -0.009\nvn  -0.768 -0.630 0.119\nvn  0.931 -0.361 -0.061\nvn  -0.174 -0.960 0.218\nvn  -0.491 -0.715 0.498\nvn  -0.269 -0.945 0.186\nvn  -0.966 -0.257 -0.034\nvn  -0.646 -0.453 -0.614\nvn  -0.910 0.386 -0.148\nvn  0.273 -0.085 -0.958\nvn  0.615 0.150 -0.774\nvn  -0.169 -0.327 -0.930\nvn  0.454 -0.524 0.721\nvn  0.988 0.132 0.081\nvn  0.895 0.354 -0.270\nvn  0.167 0.390 -0.906\nvn  0.680 0.559 -0.474\nvn  -0.738 0.184 -0.649\nvn  0.244 0.826 -0.509\nvn  -0.310 0.242 -0.919\nvn  -0.390 0.788 -0.477\nvn  -0.408 0.037 0.912\nvn  -0.923 -0.304 0.236\nvn  -0.694 -0.047 0.718\nvn  -0.939 -0.335 0.074\nvn  -0.508 -0.692 -0.513\nvn  -0.617 -0.709 -0.340\nvn  -0.287 -0.659 -0.696\nvn  -0.487 -0.761 -0.428\nvn  -0.733 -0.679 -0.034\nvn  -0.699 -0.454 0.552\nvn  -0.400 0.038 0.916\nvn  -0.630 -0.156 0.761\nvn  -0.381 0.058 0.923\nvn  -0.794 -0.595 0.126\nvn  -0.757 -0.587 -0.288\nvn  -0.459 -0.877 0.144\nvn  -0.346 -0.499 0.795\nvn  -0.854 -0.516 -0.063\nvn  -0.537 -0.739 0.406\nvn  -0.513 -0.287 0.809\nvn  -0.980 -0.136 0.147\nvn  -0.565 -0.728 -0.388\nvn  -0.608 -0.787 -0.107\nvn  0.148 -0.309 -0.939\nvn  0.682 0.098 -0.724\nvn  0.638 0.177 -0.749\nvn  0.908 0.411 -0.080\nvn  0.853 0.477 -0.214\nvn  0.591 0.779 0.209\nvn  0.715 0.442 0.541\nvn  0.543 0.647 0.535\nvn  0.652 0.553 -0.519\nvn  -0.038 -0.069 -0.997\nvn  -0.001 -0.321 -0.947\nvn  -0.013 0.428 0.904\nvn  -0.272 0.154 0.950\nvn  0.064 0.745 0.665\nvn  0.521 0.853 0.028\nvn  -0.299 0.859 0.415\nvn  0.380 0.889 -0.257\nvn  -0.502 0.842 0.197\nvn  0.564 0.817 -0.119\nvn  -0.478 0.762 0.436\nvn  0.792 0.494 0.359\nvn  -0.271 0.412 0.870\nvn  0.756 0.580 0.302\nvn  0.946 0.324 0.005\nvn  -0.399 0.421 0.815\nvn  0.787 -0.467 -0.402\nvn  -0.681 -0.437 0.588\nvn  -0.112 -0.977 -0.179\nvn  0.416 0.712 0.565\nvn  -0.385 0.428 0.818\nvn  0.568 0.303 0.765\nvn  0.556 -0.332 0.762\nvn  -0.456 -0.095 0.885\nvn  -0.870 -0.010 0.494\nvn  -0.095 0.609 0.788\nvn  -0.117 0.770 0.627\nvn  0.951 0.285 -0.119\nvn  0.873 0.269 -0.407\nvn  -0.848 0.073 0.525\nvn  -0.912 -0.301 0.280\nvn  -0.624 -0.610 0.488\nvn  0.896 -0.054 -0.440\nvn  -0.002 -0.866 -0.500\nvn  -0.092 -0.940 -0.330\nvn  -0.072 -0.983 -0.169\nvn  0.268 -0.957 0.108\nvn  0.989 -0.123 -0.086\nvn  0.765 -0.536 -0.358\nvn  -0.696 -0.268 0.666\nvn  -0.530 -0.646 -0.550\nvn  0.770 -0.413 -0.486\nvn  -0.726 0.687 -0.030\nvn  -0.323 0.940 -0.109\nvn  0.412 0.830 -0.377\nvn  -0.891 0.391 0.232\nvn  -0.959 -0.215 0.183\nvn  0.684 0.139 -0.716\nvn  0.317 0.788 -0.527\nvn  0.685 0.676 0.273\nvn  -0.698 -0.522 0.491\nvn  0.940 -0.300 -0.162\nvn  0.829 -0.265 -0.492\nvn  0.140 -0.983 -0.117\nvn  -0.715 -0.558 0.420\nvn  0.109 -0.795 0.596\nvn  0.817 -0.577 0.015\nvn  0.262 -0.937 0.231\nvn  0.106 0.711 -0.695\nvn  -0.052 0.858 0.510\nvn  0.239 0.689 -0.684\nvn  -0.046 0.905 0.422\nvn  0.611 0.538 -0.581\nvn  0.367 0.735 0.570\nvn  0.586 0.503 -0.635\nvn  0.412 0.725 0.552\nvn  0.750 0.657 -0.070\nvn  0.319 0.607 0.728\nvn  0.972 0.219 0.087\nvn  0.037 -0.106 0.994\nvn  0.714 0.224 -0.663\nvn  0.233 -0.743 -0.628\nvn  0.409 -0.841 0.355\nvn  0.321 -0.303 -0.897\nvn  0.109 -0.270 -0.957\nvn  0.321 -0.356 -0.878\nvn  -0.207 -0.114 0.972\nvn  -0.169 0.266 0.949\nvn  -0.026 0.243 0.970\nvn  -0.397 -0.183 0.899\nvn  -0.471 -0.880 -0.055\nvn  -0.463 -0.858 -0.222\nvn  -0.325 -0.919 0.223\nvn  -0.058 -0.994 0.088\nvn  -0.092 0.002 0.996\nvn  0.157 -0.627 -0.763\nvn  -0.529 -0.797 0.290\nvn  0.140 -0.988 -0.070\nvn  -0.192 -0.377 0.906\nvn  0.518 -0.277 0.809\nvn  0.346 0.214 -0.913\nvn  0.231 -0.299 -0.926\nvn  0.310 -0.509 -0.803\nvn  -0.766 -0.495 -0.411\nvn  -0.585 -0.689 -0.428\nvn  -0.005 -0.993 -0.114\nvn  -0.670 -0.731 -0.133\nvn  -0.328 -0.769 -0.548\nvn  -0.319 -0.771 -0.551\nvn  0.180 -0.571 -0.801\nvn  0.378 -0.923 -0.065\nvn  -0.796 -0.558 -0.236\nvn  -0.636 0.485 0.600\nvn  -0.956 -0.051 0.288\nvn  -0.925 0.273 0.264\nvn  -0.972 0.039 0.230\nvn  -0.413 0.876 0.250\nvn  -0.754 -0.442 -0.487\nvn  0.563 0.751 0.345\nvn  0.458 0.870 0.183\nvn  -0.648 0.750 0.133\nvn  -0.705 0.589 0.396\nvn  0.533 0.774 0.341\nvn  -0.662 0.547 0.513\nvn  0.617 0.605 0.503\nvn  -0.142 0.575 0.805\nvn  0.757 0.384 0.529\nvn  -0.011 0.114 0.993\nvn  0.925 -0.288 0.248\nvn  0.099 -0.929 0.357\nvn  -0.852 0.152 0.502\nvn  -0.753 -0.653 0.083\nvn  -0.982 -0.118 0.148\nvn  -0.944 -0.255 -0.211\nvn  0.895 -0.444 0.048\nvn  0.938 -0.241 -0.250\nvn  0.959 0.257 0.118\nvn  0.941 -0.330 -0.080\nvn  0.006 -0.787 -0.617\nvn  -0.862 -0.505 0.044\nvn  -0.059 -0.697 -0.715\nvn  0.205 -0.964 -0.168\nvn  0.029 -0.999 0.046\nvn  0.933 -0.187 0.307\nvn  -0.771 -0.510 0.381\nvn  0.395 -0.725 -0.565\nvn  -0.070 -0.986 -0.150\nvn  0.393 -0.253 0.884\nvn  -0.721 -0.559 0.410\nvn  -0.026 -0.960 0.280\nvn  0.257 -0.844 0.470\nvn  -0.742 0.471 0.477\nvn  0.402 0.685 0.608\nvn  0.407 0.415 0.814\nvn  0.736 0.551 0.393\nvn  0.620 0.767 0.164\nvn  0.467 -0.213 -0.858\nvn  0.860 -0.422 -0.286\nvn  0.807 -0.531 -0.259\nvn  0.552 -0.343 -0.760\nvn  0.087 -0.188 -0.978\nvn  -0.504 0.019 -0.864\nvn  -0.899 0.184 -0.398\nvn  -0.902 0.335 0.274\nvn  0.677 -0.120 -0.726\nvn  -0.042 0.264 -0.964\nvn  -0.458 0.526 -0.717\nvn  -0.653 0.682 -0.330\nvn  -0.561 0.813 0.157\nvn  0.750 -0.276 -0.601\nvn  0.439 -0.264 -0.859\nvn  0.717 -0.321 -0.619\nvn  -0.157 -0.570 -0.806\nvn  -0.102 0.462 -0.881\nvn  0.786 -0.358 -0.504\nvn  0.751 -0.081 -0.655\nvn  0.383 0.336 -0.861\nvn  0.890 0.065 -0.451\nvn  0.890 -0.353 -0.290\nvn  0.807 -0.022 -0.590\nvn  -0.116 0.674 -0.729\nvn  0.721 0.127 -0.681\nvn  0.541 -0.092 -0.836\nvn  0.319 0.748 -0.582\nvn  -0.324 -0.780 -0.536\nvn  -0.286 0.012 -0.958\nvn  0.374 -0.068 -0.925\nvn  -0.200 0.006 -0.980\nvn  -0.339 0.919 -0.201\nvn  -0.891 0.321 -0.320\nvn  0.314 0.090 -0.945\nvn  0.630 -0.161 -0.760\nvn  -0.079 0.497 -0.864\nvn  0.536 0.300 -0.789\nvn  0.905 0.134 -0.405\nvn  -0.101 -0.380 -0.920\nvn  0.461 -0.518 -0.720\nvn  0.191 -0.114 -0.975\nvn  0.651 0.412 -0.638\nvn  0.415 0.422 -0.806\nvn  0.746 0.547 -0.380\nvn  -0.077 0.837 -0.541\nvn  -0.732 0.580 -0.359\nvn  -0.696 -0.462 -0.549\nvn  -0.333 0.327 -0.884\nvn  -0.535 0.309 -0.787\nvn  0.573 -0.178 -0.800\nvn  0.608 0.411 -0.679\nvn  0.590 0.030 -0.807\nvn  -0.176 0.887 -0.427\nvn  0.825 0.255 -0.505\nvn  -0.533 0.689 -0.492\nvn  -0.561 0.084 -0.823\nvn  0.292 0.016 -0.956\nvn  -0.605 0.346 -0.717\nvn  0.367 0.130 -0.921\nvn  0.094 0.467 -0.879\nvn  -0.531 0.731 -0.429\nvn  0.642 0.040 -0.765\nvn  0.442 0.194 -0.875\nvn  0.602 0.536 -0.593\nvn  0.474 0.218 -0.853\nvn  -0.633 0.479 -0.608\nvn  0.241 0.126 -0.962\nvn  -0.486 0.596 -0.639\nvn  -0.950 0.195 -0.245\nvn  0.992 -0.072 -0.104\nvn  0.677 0.736 -0.020\nvn  0.961 0.143 -0.237\nvn  0.119 0.376 -0.919\nvn  0.829 0.548 -0.110\nvn  0.816 0.064 -0.575\nvn  0.246 0.228 -0.942\nvn  0.462 0.846 -0.268\nvn  0.887 0.019 -0.462\nvn  0.866 0.383 -0.322\nvn  0.458 -0.515 -0.725\nvn  0.684 0.213 -0.698\nvn  0.484 0.021 -0.875\nvn  0.556 0.369 -0.745\nvn  -0.236 0.834 -0.499\nvn  0.450 0.753 -0.479\nvn  -0.349 0.819 -0.455\nvn  -0.293 0.956 -0.014\nvn  0.241 0.647 -0.723\nvn  0.447 0.893 -0.051\nvn  -0.345 0.442 -0.828\nvn  -0.447 0.894 0.020\nvn  0.044 0.980 0.196\nvn  0.043 0.987 0.154\nvn  0.400 0.915 0.056\nvn  0.794 0.531 0.296\nvn  0.856 0.238 0.458\nvn  0.835 0.451 0.317\nvn  0.467 0.705 0.534\nvn  0.958 0.271 0.088\nvn  0.995 -0.004 0.099\nvn  0.905 -0.401 -0.140\nvn  0.635 0.641 -0.431\nvn  0.887 -0.074 -0.457\nvn  0.800 -0.469 -0.374\nvn  0.166 -0.549 -0.819\nvn  0.483 -0.407 -0.775\nvn  0.878 -0.219 -0.426\nvn  0.706 -0.453 -0.544\nvn  -0.067 -0.633 -0.772\nvn  0.305 -0.406 -0.862\nvn  -0.309 0.541 -0.782\nvn  -0.151 -0.420 -0.895\nvn  -0.298 -0.737 -0.607\nvn  0.297 -0.259 -0.919\nvn  -0.699 -0.466 -0.543\nvn  0.431 -0.420 -0.799\nvn  -0.614 0.162 -0.772\nvn  0.113 0.993 -0.025\nvn  -0.090 0.966 0.241\nvn  -0.412 0.906 0.096\nvn  -0.091 0.802 -0.590\nvn  -0.259 -0.776 -0.576\nvn  -0.438 -0.339 -0.833\nvn  0.096 -0.522 -0.847\nvn  0.217 -0.274 -0.937\nvn  -0.712 -0.242 -0.659\nvn  -0.726 -0.485 -0.487\nvn  -0.497 0.132 -0.857\nvn  -0.543 -0.538 -0.645\nvn  0.601 0.583 -0.546\nvn  -0.558 -0.059 -0.828\nvn  0.215 -0.267 -0.939\nvn  -0.283 -0.716 -0.638\nvn  0.543 -0.603 -0.585\nvn  0.914 -0.143 -0.379\nvn  0.091 -0.820 -0.565\nvn  -0.940 -0.142 -0.311\nvn  0.992 -0.075 -0.097\nvn  -0.422 0.195 -0.885\nvn  -0.994 -0.065 0.083\nvn  0.749 0.271 -0.604\nvn  0.258 -0.852 -0.456\nvn  -0.973 -0.185 -0.137\nvn  0.980 0.047 -0.192\nvn  -0.054 -0.867 -0.496\nvn  0.902 0.430 -0.026\nvn  -0.634 0.761 0.139\nvn  0.457 0.840 0.294\nvn  -0.241 0.967 -0.081\nvn  -0.511 0.845 0.161\nvn  0.460 0.886 0.059\nvn  -0.614 0.759 0.217\nvn  -0.977 0.002 -0.214\nvn  0.311 0.900 0.307\nvn  -0.026 -0.067 -0.997\nvn  -0.572 -0.451 -0.685\nvn  -0.876 0.262 -0.404\nvn  -0.548 0.212 -0.809\nvn  0.550 -0.536 -0.640\nvn  -0.244 -0.674 -0.697\nvn  -0.788 -0.252 -0.562\nvn  0.246 0.298 -0.922\nvn  0.991 0.134 0.028\nvn  -0.000 -0.690 -0.724\nvn  -0.815 -0.192 -0.547\nvn  0.993 0.026 0.117\nvn  -0.821 0.568 0.059\nvn  -0.697 0.641 -0.321\nvn  0.463 0.762 0.452\nvn  -0.293 0.810 0.509\nvn  0.040 0.963 -0.267\nvn  -0.060 0.861 -0.504\nvn  -0.627 0.764 -0.152\nvn  -0.895 0.375 -0.242\nvn  -0.259 0.926 0.274\nvn  0.025 0.955 -0.297\nvn  -0.819 0.276 -0.503\nvn  0.050 0.823 0.565\nvn  -0.282 0.783 -0.554\nvn  0.256 0.866 0.431\nvn  0.384 0.913 0.137\nvn  -0.077 0.865 -0.496\nvn  0.810 0.556 0.184\nvn  -0.105 0.921 -0.376\nvn  -0.404 0.849 -0.341\nvn  0.241 0.782 -0.574\nvn  0.815 -0.465 -0.346\nvn  0.511 0.630 0.585\nvn  0.134 -0.636 -0.760\nvn  -0.776 -0.238 -0.583\nvn  1.000 0.012 -0.021\nvn  -0.865 0.490 0.109\nvn  0.787 -0.416 -0.456\nvn  0.707 0.558 0.435\nvn  -0.448 -0.533 -0.718\nvn  -0.292 0.929 0.227\nvn  0.874 -0.417 -0.248\nvn  0.752 0.605 0.261\nvn  -0.195 0.823 0.534\nvn  -0.912 0.377 -0.160\nvn  0.300 -0.789 -0.535\nvn  0.967 0.248 -0.061\nvn  -0.270 0.925 -0.268\nvn  -0.801 -0.080 -0.593\nvn  0.202 0.161 -0.966\nvn  -0.307 0.273 -0.912\nvn  -0.114 -0.164 -0.980\nvn  0.313 -0.473 -0.824\nvn  0.546 0.482 -0.686\nvn  0.143 -0.305 -0.942\nvn  0.421 0.511 -0.750\nvn  0.590 0.776 0.224\nvn  -0.333 0.926 0.176\nvn  0.352 0.935 -0.048\nvn  -0.211 0.654 -0.727\nvn  -0.354 0.822 -0.445\nvn  -0.213 0.835 -0.508\nvn  0.132 0.546 -0.827\nvn  -0.259 0.880 -0.399\nvn  -0.074 0.707 -0.703\nvn  0.417 0.892 -0.176\nvn  0.087 0.772 -0.629\nvn  0.027 0.933 -0.359\nvn  0.495 0.839 -0.228\nvn  0.430 0.770 -0.472\nvn  -0.205 0.802 -0.561\nvn  -0.704 0.262 -0.660\nvn  -0.260 -0.116 -0.959\nvn  0.785 0.297 -0.544\nvn  -0.026 0.384 -0.923\nvn  -0.624 -0.481 -0.616\nvn  -0.451 -0.607 -0.654\nvn  -0.817 -0.160 -0.555\nvn  0.208 0.878 -0.431\nvn  0.584 0.810 0.048\nvn  0.559 0.622 -0.548\nvn  -0.086 0.886 -0.456\nvn  0.818 0.449 -0.359\nvn  0.329 0.471 -0.818\nvn  -0.217 0.651 -0.727\nvn  0.164 0.975 -0.152\nvn  -0.370 0.879 -0.302\nvn  -0.158 0.480 -0.863\nvn  0.939 0.206 -0.275\nvn  0.821 0.475 -0.317\nvn  0.064 0.560 -0.826\nvn  0.644 0.675 -0.358\nvn  -0.071 0.884 -0.461\nvn  0.407 0.872 -0.271\nvn  0.761 0.607 -0.229\nvn  0.088 0.789 -0.608\nvn  0.784 0.614 0.096\nvn  0.694 0.691 -0.202\nvn  -0.151 0.685 -0.713\nvn  0.837 0.508 -0.204\nvn  0.785 0.491 0.378\nvn  0.232 0.893 0.385\nvn  0.758 0.651 0.038\nvn  0.586 0.794 0.163\nvn  0.478 0.862 -0.169\nvn  0.575 0.406 -0.710\nvn  0.502 0.858 -0.107\nvn  0.347 -0.372 -0.861\nvn  0.846 0.333 -0.417\nvn  0.897 0.192 -0.397\nvn  0.976 0.213 -0.044\nvn  0.557 0.657 0.509\nvn  0.936 0.254 -0.244\nvn  0.839 0.542 0.038\nvn  0.741 0.562 0.368\nvn  0.066 0.864 0.499\nvn  0.236 0.860 0.453\nvn  0.477 0.879 -0.018\nvn  0.906 0.298 0.300\nvn  0.933 0.205 0.295\nvn  0.767 0.559 0.313\nvn  0.507 0.798 0.326\nvn  0.432 0.900 -0.054\nvn  0.614 0.785 -0.084\nvn  -0.355 0.926 -0.127\nvn  0.380 0.840 -0.387\nvn  0.352 0.333 -0.875\nvn  -0.144 0.908 -0.393\nvn  -0.870 0.417 -0.263\nvn  -0.224 0.639 -0.736\nvn  0.570 0.816 -0.097\nvn  0.338 0.941 0.032\nvn  -0.152 0.863 -0.481\nvn  -0.004 0.988 0.155\nvn  -0.242 0.672 -0.700\nvn  -0.053 0.897 -0.439\nvn  0.463 0.781 -0.419\nvn  0.155 0.767 -0.622\nvn  0.034 0.975 0.221\nvn  0.644 0.206 -0.737\nvn  0.313 0.140 -0.939\nvn  0.287 0.261 -0.922\nvn  0.676 0.170 -0.717\nvn  0.931 0.127 -0.343\nvn  0.893 0.096 -0.440\nvn  0.858 0.449 -0.249\nvn  0.928 -0.340 0.151\nvn  0.618 -0.670 0.412\nvn  0.568 0.425 -0.705\nvn  -0.187 0.460 -0.868\nvn  0.833 0.328 -0.445\nvn  0.335 0.553 -0.763\nvn  0.822 0.487 -0.294\nvn  0.996 0.029 0.078\nvn  0.343 -0.516 0.785\nvn  0.553 -0.572 0.606\nvn  -0.002 0.705 -0.709\nvn  0.733 0.578 0.359\nvn  0.466 0.829 -0.308\nvn  -0.397 0.288 -0.871\nvn  -0.157 0.183 -0.971\nvn  -0.345 0.275 -0.897\nvn  -0.799 0.140 -0.585\nvn  0.955 -0.291 0.051\nvn  0.625 0.537 -0.566\nvn  0.990 0.136 0.046\nvn  0.941 0.328 0.083\nvn  0.932 -0.169 0.319\nvn  0.145 0.355 -0.923\nvn  0.830 0.153 0.536\nvn  0.847 0.094 0.523\nvn  0.791 -0.564 0.237\nvn  0.663 0.255 0.704\nvn  0.931 0.227 0.286\nvn  -0.507 0.477 -0.718\nvn  0.598 0.540 -0.592\nvn  -0.450 -0.025 -0.893\nvn  0.010 0.355 -0.935\nvn  -0.233 -0.283 -0.930\nvn  0.082 0.177 -0.981\nvn  0.155 0.080 -0.985\nvn  -0.359 -0.187 -0.914\nvn  -0.261 -0.007 -0.965\nvn  0.083 0.363 -0.928\nvn  0.584 0.671 -0.457\nvn  -0.450 -0.248 -0.858\nvn  -0.798 0.171 -0.578\nvn  -0.693 0.008 -0.721\nvn  -0.830 -0.113 -0.547\nvn  -0.551 -0.691 -0.467\nvn  -0.914 -0.329 -0.235\nvn  -0.782 -0.506 -0.363\nvn  -0.661 -0.153 -0.735\nvn  -0.674 -0.447 -0.588\nvn  -0.534 -0.666 -0.521\nvn  -0.956 -0.272 -0.113\nvn  -0.791 0.168 -0.588\nvn  0.848 0.071 -0.526\nvn  0.609 -0.175 -0.773\nvn  0.526 0.057 0.849\nvn  0.624 0.051 -0.780\nvn  -0.240 -0.238 -0.941\nvn  -0.053 -0.603 -0.796\nvn  0.556 0.042 -0.830\nvn  -0.561 -0.403 -0.723\nvn  -0.880 -0.141 -0.454\nvn  -0.926 -0.222 -0.305\nvn  -0.489 -0.166 -0.856\nvn  0.200 0.391 -0.898\nvn  -0.734 -0.069 -0.676\nvn  -0.185 0.884 -0.429\nvn  -0.883 0.450 -0.132\nvn  0.098 -0.235 -0.967\nvn  -0.388 0.206 -0.898\nvn  -0.607 0.148 -0.781\nvn  0.100 0.181 -0.978\nvn  -0.637 -0.154 -0.755\nvn  0.510 -0.467 -0.722\nvn  0.114 -0.555 -0.824\nvn  0.396 0.112 -0.911\nvn  -0.515 -0.112 -0.850\nvn  -0.710 -0.440 -0.550\nvn  -0.853 0.293 -0.431\nvn  -0.138 -0.733 -0.666\nvn  -0.005 0.955 -0.297\nvn  -0.841 0.325 -0.433\nvn  -0.604 -0.088 -0.792\nvn  -0.310 -0.012 -0.951\nvn  -0.803 -0.169 -0.572\nvn  0.940 -0.281 -0.195\nvn  0.876 -0.482 -0.015\nvn  0.715 -0.697 0.047\nvn  0.948 -0.075 0.310\nvn  0.295 -0.623 0.724\nvn  -0.372 -0.656 0.657\nvn  -0.294 -0.549 0.783\nvn  0.853 -0.472 -0.225\nvn  0.592 -0.721 0.360\nvn  -0.845 -0.400 0.355\nvn  -0.979 -0.182 -0.096\nvn  -0.547 -0.813 0.200\nvn  -0.696 -0.637 0.330\nvn  -0.461 -0.885 0.058\nvn  -0.465 -0.885 -0.000\nvn  0.004 -0.759 0.652\nvn  -0.145 -0.842 0.520\nvn  0.660 0.632 -0.406\nvn  0.657 0.056 0.752\nvn  0.481 0.032 0.876\nvn  0.807 0.528 0.265\nvn  0.603 0.155 0.782\nvn  0.216 -0.391 0.895\nvn  0.391 -0.546 0.741\nvn  -0.328 -0.682 0.653\nvn  -0.724 -0.434 0.536\nvn  -0.260 -0.677 0.688\nvn  0.341 -0.236 0.910\nvn  0.700 0.350 -0.622\nvn  0.692 0.666 0.280\nvn  0.063 0.406 0.912\nvn  0.486 0.042 -0.873\nvn  0.742 0.141 -0.656\nvn  0.829 0.357 -0.430\nvn  0.817 0.576 0.008\nvn  -0.143 -0.155 -0.978\nvn  0.761 0.266 -0.591\nvn  0.739 0.673 0.040\nvn  0.389 0.340 -0.856\nvn  0.659 0.731 -0.175\nvn  0.399 0.272 -0.876\nvn  0.659 0.748 -0.083\nvn  0.660 0.110 -0.743\nvn  0.866 0.500 0.011\nvn  0.632 -0.110 -0.767\nvn  0.509 -0.306 -0.805\nvn  0.779 0.374 0.503\nvn  0.964 0.099 -0.245\nvn  0.910 0.411 0.048\nvn  0.780 0.054 0.624\nvn  -0.448 0.780 0.437\nvn  0.295 0.362 0.884\nvn  0.389 0.530 0.754\nvn  0.126 0.297 0.946\nvn  0.338 0.484 0.807\nvn  0.103 -0.670 -0.735\nvn  0.569 0.257 0.781\nvn  0.965 -0.070 -0.252\nvn  0.874 -0.484 0.037\nvn  -0.880 0.356 0.314\nvn  -0.888 -0.308 0.341\nvn  -0.736 -0.608 0.298\nvn  -0.912 -0.276 0.302\nvn  -0.692 -0.229 0.684\nvn  0.824 -0.055 -0.563\nvn  0.624 -0.216 -0.751\nvn  0.176 -0.408 -0.896\nvn  0.612 -0.596 -0.520\nvn  -0.165 0.922 0.351\nvn  0.328 0.943 -0.057\nvn  0.835 0.538 -0.117\nvn  0.232 0.972 -0.047\nvn  0.492 0.870 0.024\nvn  0.401 0.850 -0.341\nvn  0.822 0.562 0.097\nvn  -0.196 0.950 0.244\nvn  0.711 0.692 0.123\nvn  0.220 0.904 0.366\nvn  -0.087 0.836 0.541\nvn  0.045 0.980 0.193\nvn  -0.233 0.918 0.320\nvn  -0.113 0.926 0.361\nvn  0.325 0.944 -0.052\nvn  0.647 0.661 -0.380\nvn  0.801 0.578 0.157\nvn  0.206 0.970 0.127\nvn  0.456 0.847 0.272\nvn  0.475 0.876 0.081\nvn  0.292 0.852 0.434\nvn  -0.060 0.985 0.164\nvn  0.671 0.711 -0.211\nvn  0.223 0.969 -0.104\nvn  0.134 0.982 -0.130\nvn  0.251 0.889 0.383\nvn  0.800 0.599 0.043\nvn  0.397 0.836 -0.378\nvn  -0.225 -0.521 -0.823\nvn  -0.144 -0.611 -0.778\nvn  0.377 -0.591 -0.713\nvn  -0.006 -0.321 -0.947\nvn  -0.599 -0.193 0.777\nvn  -0.533 0.055 0.845\nvn  -0.837 -0.538 -0.095\nvn  -0.750 -0.660 -0.033\nvn  -0.303 -0.172 0.937\nvn  -0.613 -0.780 -0.122\nvn  -0.103 0.127 0.987\nvn  -0.664 -0.707 -0.243\nvn  -0.307 -0.088 0.948\nvn  -0.227 -0.282 0.932\nvn  -0.556 -0.821 -0.132\nvn  -0.123 -0.806 0.578\nvn  -0.245 0.912 0.329\nvn  0.641 0.671 0.372\nvn  0.688 0.591 0.421\nvn  -0.157 0.905 0.396\nvn  0.773 0.525 0.357\nvn  -0.143 0.884 0.445\nvn  0.758 0.456 0.467\nvn  -0.245 0.782 0.572\nvn  0.127 0.788 0.602\nvn  0.792 0.429 0.435\nvn  -0.506 0.717 0.479\nvn  -0.986 0.146 0.085\nvn  -0.936 0.345 0.065\nvn  -0.995 -0.067 0.074\nvn  0.303 0.657 0.690\nvn  0.913 0.015 0.408\nvn  -0.621 0.554 0.554\nvn  0.271 0.297 0.915\nvn  0.492 -0.865 0.099\nvn  -0.926 -0.340 0.165\nvn  0.956 -0.229 0.184\nvn  0.938 -0.346 0.017\nvn  -0.539 -0.739 -0.403\nvn  0.317 -0.883 -0.345\nvn  -0.481 -0.854 0.197\nvn  0.212 -0.972 0.096\nvn  -0.878 -0.414 0.242\nvn  0.587 -0.803 0.102\nvn  0.348 -0.925 -0.153\nvn  -0.769 -0.552 -0.324\nvn  0.063 -0.821 0.567\nvn  -0.319 -0.605 0.729\nvn  0.523 0.308 0.795\nvn  -0.758 -0.512 0.403\nvn  -0.076 -0.407 0.910\nvn  -0.534 -0.658 0.531\nvn  0.886 0.085 -0.457\nvn  0.702 -0.091 -0.707\nvn  0.449 -0.108 -0.887\nvn  0.958 0.261 -0.117\nvn  0.408 -0.328 -0.852\nvn  0.998 0.029 -0.048\nvn  0.421 -0.536 -0.732\nvn  0.980 -0.193 0.056\nvn  0.390 -0.477 -0.787\nvn  0.973 -0.208 -0.097\nvn  0.782 -0.488 -0.388\nvn  0.022 -0.601 -0.799\nvn  0.914 -0.128 0.384\nvn  0.946 -0.316 0.070\nvn  0.663 0.255 0.704\nvn  0.790 0.177 0.586\nvn  0.443 0.219 0.870\nvn  0.597 -0.778 -0.198\nvn  -0.481 -0.655 -0.583\nvn  0.629 -0.163 0.760\nvn  0.058 -0.947 0.317\nvn  -0.998 0.060 -0.032\nvn  -0.008 0.388 0.921\nvn  -0.393 -0.383 -0.836\nvn  -0.553 -0.310 -0.774\nvn  -0.647 -0.403 -0.647\nvn  0.276 -0.627 -0.729\nvn  -0.420 0.207 0.884\nvn  -0.095 0.495 0.864\nvn  -0.969 0.244 0.050\nvn  -0.986 -0.037 0.165\nvn  -0.199 0.169 0.965\nvn  -0.993 -0.049 0.104\nvn  -0.984 -0.168 -0.054\nvn  -0.263 0.199 0.944\nvn  -0.340 -0.507 0.792\nvn  -0.636 -0.237 0.734\nvn  0.711 -0.217 -0.669\nvn  0.480 -0.268 -0.835\nvn  0.340 -0.309 -0.888\nvn  0.992 -0.035 -0.125\nvn  0.228 -0.448 -0.864\nvn  0.970 -0.195 -0.143\nvn  0.198 -0.781 -0.592\nvn  0.834 -0.542 0.104\nvn  0.161 -0.877 -0.452\nvn  0.772 -0.566 0.289\nvn  0.419 -0.907 0.037\nvn  -0.168 -0.868 -0.467\nvn  0.753 -0.339 0.563\nvn  0.864 -0.499 -0.064\nvn  0.740 0.070 0.669\nvn  0.665 0.227 0.711\nvn  0.534 0.321 0.782\nvn  0.273 -0.953 0.134\nvn  -0.562 -0.733 -0.384\nvn  0.551 -0.241 0.799\nvn  -0.734 -0.106 0.671\nvn  -0.486 -0.404 -0.775\nvn  -0.629 -0.324 -0.707\nvn  -0.683 -0.377 -0.625\nvn  -0.224 -0.624 -0.749\nvn  -0.289 0.777 0.559\nvn  -0.060 0.817 0.574\nvn  -0.798 0.574 -0.185\nvn  -0.905 0.387 -0.177\nvn  -0.115 0.604 0.789\nvn  -0.963 0.145 -0.228\nvn  -0.993 0.102 -0.060\nvn  -0.100 0.400 0.911\nvn  -0.669 -0.372 0.643\nvn  -0.565 -0.396 0.724\nvn  -0.917 -0.290 -0.274\nvn  -0.884 -0.401 -0.238\nvn  -0.915 -0.401 -0.039\nvn  -0.367 -0.027 -0.930\nvn  0.511 -0.346 -0.787\nvn  0.199 -0.245 -0.949\nvn  0.265 -0.295 -0.918\nvn  0.909 -0.343 -0.236\nvn  0.079 -0.705 -0.705\nvn  0.768 -0.640 -0.027\nvn  -0.348 -0.761 -0.548\nvn  0.407 -0.910 0.081\nvn  -0.563 -0.785 -0.259\nvn  0.176 -0.922 0.346\nvn  -0.414 -0.843 0.342\nvn  -0.906 -0.366 -0.212\nvn  0.269 -0.645 0.716\nvn  0.711 -0.694 0.117\nvn  0.810 -0.274 0.518\nvn  0.731 -0.273 0.626\nvn  0.740 -0.110 0.663\nvn  -0.602 -0.587 0.541\nvn  -0.986 -0.031 -0.165\nvn  0.433 -0.333 0.838\nvn  -0.264 0.740 0.619\nvn  -0.631 -0.103 -0.769\nvn  -0.796 0.087 -0.599\nvn  -0.821 0.297 -0.488\nvn  -0.521 -0.286 -0.804\nvn  0.827 0.498 0.263\nvn  0.635 0.609 0.475\nvn  -0.089 0.947 -0.308\nvn  0.028 0.955 -0.295\nvn  0.690 0.547 0.473\nvn  -0.643 0.694 -0.325\nvn  -0.830 0.546 0.112\nvn  0.276 0.006 0.961\nvn  -0.952 -0.304 0.013\nvn  -0.672 -0.707 0.219\nvn  0.934 -0.149 0.326\nvn  0.985 0.017 0.174\nvn  0.500 0.578 0.645\nvn  0.398 0.039 0.917\nvn  0.334 0.517 0.788\nvn  0.955 -0.164 -0.249\nvn  0.835 -0.550 -0.015\nvn  0.605 0.237 0.760\nvn  0.803 0.445 0.397\nvn  0.924 0.019 -0.383\nvn  0.850 -0.455 -0.265\nvn  0.890 0.361 -0.278\nvn  -0.728 0.410 -0.549\nvn  0.274 0.757 0.593\nvn  0.860 0.509 0.047\nvn  0.862 0.482 0.159\nvn  0.850 0.525 -0.047\nvn  0.755 0.639 -0.147\nvn  0.343 0.737 0.583\nvn  0.923 0.356 -0.144\nvn  0.318 0.865 0.388\nvn  0.910 0.323 -0.259\nvn  0.621 -0.057 -0.782\nvn  0.448 -0.053 -0.893\nvn  0.269 -0.243 -0.932\nvn  0.066 -0.081 -0.995\nvn  -0.700 -0.507 -0.503\nvn  -0.732 -0.441 -0.520\nvn  -0.728 0.332 -0.599\nvn  -0.818 -0.092 -0.568\nvn  -0.531 0.842 0.093\nvn  -0.897 0.406 0.176\nvn  -0.795 0.585 0.163\nvn  -0.987 -0.082 0.140\nvn  -0.959 -0.031 0.283\nvn  -0.250 -0.479 -0.841\nvn  -0.296 0.827 0.478\nvn  -0.487 0.543 0.684\nvn  -0.401 0.614 0.680\nvn  0.116 0.696 -0.709\nvn  0.718 0.651 -0.246\nvn  0.504 0.863 0.034\nvn  0.395 0.836 0.382\nvn  0.511 0.205 -0.835\nvn  0.628 0.647 0.433\nvn  0.680 -0.658 -0.324\nvn  0.674 0.234 0.701\nvn  0.519 -0.843 0.144\nvn  0.473 0.201 0.858\nvn  -0.097 -0.142 0.985\nvn  0.570 -0.772 0.280\nvn  0.213 0.139 0.967\nvn  0.157 0.019 0.987\nvn  -0.383 0.331 0.862\nvn  -0.961 0.187 0.203\nvn  -0.734 0.638 0.235\nvn  0.345 -0.632 -0.694\nvn  0.827 0.027 0.561\nvn  0.766 0.196 0.612\nvn  0.093 -0.902 -0.421\nvn  0.742 0.065 0.667\nvn  0.892 -0.386 -0.235\nvn  -0.356 0.741 0.569\nvn  -0.187 0.922 0.339\nvn  0.093 0.996 -0.012\nvn  0.268 0.600 -0.753\nvn  -0.671 0.566 -0.478\nvn  -0.450 0.881 -0.144\nvn  -0.411 -0.020 -0.911\nvn  -0.403 0.419 -0.814\nvn  -0.046 -0.910 -0.412\nvn  0.747 0.204 0.633\nvn  -0.864 0.404 -0.301\nvn  -0.809 0.495 0.318\nvn  -0.495 0.535 0.685\nvn  0.097 -0.760 -0.642\nvn  -0.223 -0.975 -0.004\nvn  0.591 -0.333 -0.735\nvn  -0.383 -0.783 -0.491\nvn  0.043 -0.563 -0.825\nvn  -0.343 -0.752 -0.563\nvn  -0.372 -0.581 -0.724\nvn  0.354 -0.925 0.141\nvn  -0.325 -0.537 -0.779\nvn  -0.594 0.652 0.470\nvn  -0.636 -0.751 0.178\nvn  0.656 -0.582 -0.480\nvn  -0.110 -0.595 -0.796\nvn  -0.006 -0.206 -0.979\nvn  -0.033 -0.090 -0.995\nvn  0.951 0.194 -0.239\nvn  0.525 -0.349 -0.776\nvn  0.273 -0.239 -0.932\nvn  0.244 0.667 -0.704\nvn  0.804 0.501 0.320\nvn  0.816 0.492 0.303\nvn  0.600 0.754 -0.267\nvn  0.922 0.331 -0.202\nvn  0.951 -0.170 0.258\nvn  -0.121 -0.731 0.672\nvn  -0.882 -0.470 0.025\nvn  -0.937 0.051 -0.344\nvn  -0.464 -0.711 0.529\nvn  -0.495 -0.865 -0.077\n# 2519 vertex normals\n\ng objDiablo3\ns 1\nf 6/1/6 5/2/5 8/3/8\nf 6/1/6 8/3/8 7/4/7\nf 12/5/12 11/6/11 10/7/10\nf 12/5/12 10/7/10 9/8/9\nf 15/9/15 14/10/14 1/11/1\nf 15/9/15 1/11/1 2/12/2\nf 16/13/16 15/9/15 2/12/2\nf 16/13/16 2/12/2 17/14/17\nf 25/15/25 24/16/24 23/17/23\nf 25/15/25 23/17/23 22/18/22\nf 5/2/5 10/7/10 13/19/13\nf 5/2/5 13/19/13 8/3/8\nf 9/8/9 10/7/10 5/2/5\nf 9/8/9 5/2/5 4/20/4\nf 13/19/13 24/16/24 7/4/7\nf 13/19/13 7/4/7 8/3/8\nf 11/6/11 23/17/23 24/16/24\nf 11/6/11 24/16/24 13/19/13\nf 20/21/20 27/22/27 25/15/25\nf 20/21/20 25/15/25 22/18/22\nf 29/23/29 28/24/28 27/22/27\nf 29/23/29 27/22/27 20/21/20\nf 30/25/30 27/22/27 28/24/28\nf 30/25/30 28/24/28 31/26/31\nf 31/26/31 28/24/28 1255/27/1255\nf 31/26/31 1255/27/1255 1265/28/1265\nf 1256/29/1256 1255/27/1255 28/24/28\nf 1256/29/1256 28/24/28 29/23/29\nf 33/30/33 32/31/32 1258/32/1258\nf 33/30/33 1258/32/1258 1262/33/1262\nf 1258/32/1258 32/31/32 31/26/31\nf 1258/32/1258 31/26/31 1265/28/1265\nf 34/34/34 1256/29/1256 29/23/29\nf 34/34/34 29/23/29 35/35/35\nf 35/35/35 29/23/29 20/21/20\nf 35/35/35 20/21/20 36/36/36\nf 37/37/37 34/34/34 35/35/35\nf 37/37/37 35/35/35 38/38/38\nf 35/35/35 36/36/36 39/39/39\nf 35/35/35 39/39/39 38/38/38\nf 40/40/40 37/37/37 38/38/38\nf 40/40/40 38/38/38 41/41/41\nf 41/41/41 38/38/38 39/39/39\nf 41/41/41 39/39/39 42/42/42\nf 43/43/43 37/37/37 40/40/40\nf 43/43/43 40/40/40 44/44/44\nf 45/45/45 12/5/12 9/8/9\nf 45/45/45 9/8/9 46/46/46\nf 41/41/41 42/42/42 12/5/12\nf 41/41/41 12/5/12 45/45/45\nf 47/47/47 44/44/44 40/40/40\nf 47/47/47 40/40/40 45/45/45\nf 48/48/48 50/49/50 18/50/18\nf 48/48/48 18/50/18 19/51/19\nf 52/52/52 1280/53/1280 50/49/50\nf 52/52/52 50/49/50 48/48/48\nf 53/54/53 25/15/25 27/22/27\nf 53/54/53 27/22/27 30/25/30\nf 54/55/54 26/56/26 25/15/25\nf 54/55/54 25/15/25 53/54/53\nf 59/57/59 54/55/54 53/54/53\nf 59/57/59 53/54/53 60/58/60\nf 30/25/30 55/59/55 60/58/60\nf 30/25/30 60/58/60 53/54/53\nf 48/48/48 49/60/49 57/61/57\nf 48/48/48 57/61/57 52/52/52\nf 52/52/52 57/61/57 33/30/33\nf 52/52/52 33/30/33 51/62/51\nf 61/63/61 45/45/45 46/46/46\nf 61/63/61 46/46/46 62/64/62\nf 109/65/109 44/44/44 65/66/65\nf 109/65/109 65/66/65 108/67/108\nf 67/68/67 42/42/42 66/69/66\nf 67/68/67 66/69/66 21/70/21\nf 69/71/69 16/13/16 17/14/17\nf 69/71/69 17/14/17 70/72/70\nf 17/14/17 6/1/6 18/50/18\nf 17/14/17 18/50/18 72/73/72\nf 72/73/72 18/50/18 50/49/50\nf 72/73/72 50/49/50 73/74/73\nf 73/74/73 50/49/50 1280/53/1280\nf 73/74/73 1280/53/1280 74/75/74\nf 75/76/75 72/73/72 73/74/73\nf 75/76/75 73/74/73 76/77/76\nf 76/77/76 73/74/73 74/75/74\nf 76/77/76 74/75/74 77/78/77\nf 75/76/75 76/77/76 79/79/79\nf 75/76/75 79/79/79 78/80/78\nf 84/81/84 81/82/81 83/83/83\nf 84/81/84 83/83/83 82/84/82\nf 85/85/85 79/79/79 87/86/87\nf 85/85/85 87/86/87 86/87/86\nf 79/79/79 80/88/80 88/89/88\nf 79/79/79 88/89/88 87/86/87\nf 85/85/85 83/83/83 81/82/81\nf 85/85/85 81/82/81 78/80/78\nf 92/90/92 91/91/91 90/92/90\nf 92/90/92 90/92/90 68/93/68\nf 92/90/92 86/94/86 93/95/93\nf 92/90/92 93/95/93 91/91/91\nf 82/96/82 83/97/83 94/98/94\nf 82/96/82 94/98/94 92/90/92\nf 86/94/86 89/99/89 95/100/95\nf 86/94/86 95/100/95 93/95/93\nf 96/101/96 89/102/89 87/86/87\nf 96/101/96 87/86/87 88/89/88\nf 100/103/100 99/104/99 98/105/98\nf 100/103/100 98/105/98 97/106/97\nf 97/106/97 98/105/98 104/107/104\nf 97/106/97 104/107/104 103/108/103\nf 97/106/97 107/109/107 106/110/106\nf 97/106/97 106/110/106 100/103/100\nf 101/111/101 109/112/109 108/113/108\nf 101/111/101 108/113/108 103/108/103\nf 103/108/103 111/114/111 107/109/107\nf 103/108/103 107/109/107 97/106/97\nf 112/115/112 113/116/113 115/117/115\nf 112/115/112 115/117/115 114/118/114\nf 194/119/194 126/120/126 115/117/115\nf 194/119/194 115/117/115 196/121/196\nf 117/122/117 112/115/112 114/118/114\nf 117/122/117 114/118/114 118/123/118\nf 146/124/146 117/122/117 118/123/118\nf 146/124/146 118/123/118 174/125/174\nf 113/116/113 127/126/127 128/127/128\nf 113/116/113 128/127/128 129/128/129\nf 127/126/127 120/129/120 132/130/132\nf 127/126/127 132/130/132 130/131/130\nf 139/132/139 138/133/138 137/134/137\nf 139/132/139 137/134/137 140/135/140\nf 120/129/120 144/136/144 141/137/141\nf 120/129/120 141/137/141 132/130/132\nf 143/138/143 141/137/141 144/136/144\nf 143/138/143 144/136/144 145/139/145\nf 139/132/139 135/140/135 157/141/157\nf 139/132/139 157/141/157 136/142/136\nf 131/143/131 134/144/134 150/145/150\nf 131/143/131 150/145/150 149/146/149\nf 134/144/134 157/141/157 151/147/151\nf 134/144/134 151/147/151 150/145/150\nf 152/148/152 153/149/153 159/150/159\nf 152/148/152 159/150/159 155/151/155\nf 157/141/157 158/152/158 160/153/160\nf 157/141/157 160/153/160 159/150/159\nf 143/138/143 145/139/145 162/154/162\nf 143/138/143 162/154/162 178/155/178\nf 153/149/153 151/147/151 157/141/157\nf 153/149/153 157/141/157 159/150/159\nf 167/156/167 161/157/161 168/158/168\nf 167/156/167 168/158/168 169/159/169\nf 171/160/171 190/161/190 191/162/191\nf 171/160/171 191/162/191 173/163/173\nf 189/164/189 148/165/148 174/125/174\nf 189/164/189 174/125/174 188/166/188\nf 116/167/116 179/168/179 123/169/123\nf 116/167/116 123/169/123 115/117/115\nf 125/170/125 179/168/179 184/171/184\nf 125/170/125 184/171/184 183/172/183\nf 179/168/179 116/167/116 182/173/182\nf 179/168/179 182/173/182 184/171/184\nf 181/174/181 126/120/126 194/119/194\nf 181/174/181 194/119/194 185/175/185\nf 186/176/186 201/177/201 187/178/187\nf 186/176/186 187/178/187 172/179/172\nf 172/179/172 191/162/191 190/161/190\nf 172/179/172 190/161/190 186/176/186\nf 129/128/129 208/180/208 197/181/197\nf 129/128/129 197/181/197 196/121/196\nf 199/182/199 147/183/147 146/124/146\nf 199/182/199 146/124/146 198/184/198\nf 200/185/200 162/154/162 145/139/145\nf 200/185/200 145/139/145 199/182/199\nf 200/186/200 225/187/225 175/188/175\nf 200/186/200 175/188/175 162/189/162\nf 186/176/186 190/161/190 204/190/204\nf 186/176/186 204/190/204 203/191/203\nf 205/192/205 210/193/210 235/194/235\nf 205/192/205 235/194/235 234/195/234\nf 206/196/206 207/197/207 205/192/205\nf 206/196/206 205/192/205 203/191/203\nf 207/198/207 206/199/206 208/180/208\nf 207/198/207 208/180/208 129/128/129\nf 205/192/205 207/197/207 209/200/209\nf 205/192/205 209/200/209 210/193/210\nf 339/201/339 219/202/219 233/203/233\nf 339/201/339 233/203/233 338/204/338\nf 213/205/213 212/206/212 337/207/337\nf 213/205/213 337/207/337 340/208/340\nf 214/209/214 215/210/215 217/211/217\nf 214/209/214 217/211/217 216/212/216\nf 224/213/224 211/214/211 214/209/214\nf 224/213/224 214/209/214 220/215/220\nf 214/209/214 216/212/216 222/216/222\nf 214/209/214 222/216/222 220/215/220\nf 216/212/216 260/217/260 258/218/258\nf 216/212/216 258/218/258 222/216/222\nf 225/187/225 221/219/221 224/213/224\nf 225/187/225 224/213/224 223/220/223\nf 238/221/238 226/222/226 225/187/225\nf 238/221/238 225/187/225 223/220/223\nf 231/223/231 213/205/213 340/208/340\nf 231/223/231 340/208/340 341/224/341\nf 230/225/230 231/223/231 341/224/341\nf 230/225/230 341/224/341 229/226/229\nf 232/227/232 213/205/213 231/223/231\nf 232/227/232 231/223/231 240/228/240\nf 212/206/212 213/205/213 232/227/232\nf 212/206/212 232/227/232 215/210/215\nf 202/229/202 233/230/233 187/178/187\nf 202/229/202 187/178/187 201/177/201\nf 202/231/202 337/207/337 338/204/338\nf 202/231/202 338/204/338 233/203/233\nf 202/229/202 201/177/201 234/195/234\nf 202/229/202 234/195/234 235/194/235\nf 232/227/232 240/228/240 237/232/237\nf 232/227/232 237/232/237 236/233/236\nf 236/233/236 237/232/237 248/234/248\nf 236/233/236 248/234/248 250/235/250\nf 215/210/215 232/227/232 236/233/236\nf 215/210/215 236/233/236 217/211/217\nf 227/236/227 226/222/226 238/221/238\nf 227/236/227 238/221/238 239/237/239\nf 245/238/245 227/236/227 239/237/239\nf 245/238/245 239/237/239 247/239/247\nf 242/240/242 206/196/206 203/191/203\nf 242/240/242 203/191/203 204/190/204\nf 243/241/243 181/174/181 193/242/193\nf 243/241/243 193/242/193 244/243/244\nf 208/180/208 242/244/242 244/243/244\nf 208/180/208 244/243/244 193/242/193\nf 228/245/228 245/238/245 230/246/230\nf 228/245/228 230/246/230 229/247/229\nf 246/248/246 237/249/237 240/250/240\nf 246/248/246 240/250/240 247/239/247\nf 249/251/249 253/252/253 261/253/261\nf 249/251/249 261/253/261 259/254/259\nf 254/255/254 246/248/246 247/239/247\nf 254/255/254 247/239/247 239/237/239\nf 238/221/238 255/256/255 254/255/254\nf 238/221/238 254/255/254 239/237/239\nf 255/256/255 238/221/238 223/220/223\nf 255/256/255 223/220/223 220/215/220\nf 261/253/261 262/257/262 250/235/250\nf 261/253/261 250/235/250 259/254/259\nf 257/258/257 260/217/260 262/257/262\nf 257/258/257 262/257/262 261/253/261\nf 251/259/251 257/258/257 261/253/261\nf 251/259/251 261/253/261 253/252/253\nf 264/260/264 263/261/263 265/262/265\nf 264/260/264 265/262/265 266/263/266\nf 273/264/273 283/265/283 271/266/271\nf 273/264/273 271/266/271 274/267/274\nf 274/267/274 265/262/265 263/261/263\nf 274/267/274 263/261/263 275/268/275\nf 270/269/270 284/270/284 276/271/276\nf 270/269/270 276/271/276 277/272/277\nf 268/273/268 271/266/271 283/265/283\nf 268/273/268 283/265/283 284/270/284\nf 278/274/278 279/275/279 282/276/282\nf 278/274/278 282/276/282 281/277/281\nf 279/275/279 273/264/273 298/278/298\nf 279/275/279 298/278/298 282/276/282\nf 273/264/273 274/267/274 275/268/275\nf 273/264/273 275/268/275 298/278/298\nf 269/279/269 402/280/402 295/281/295\nf 269/279/269 295/281/295 286/282/286\nf 286/282/286 295/281/295 288/283/288\nf 286/282/286 288/283/288 287/284/287\nf 287/284/287 288/283/288 290/285/290\nf 287/284/287 290/285/290 289/286/289\nf 292/287/292 289/286/289 290/285/290\nf 292/287/292 290/285/290 293/288/293\nf 255/289/255 256/290/256 289/286/289\nf 255/289/255 289/286/289 292/287/292\nf 263/261/263 254/291/254 297/292/297\nf 263/261/263 297/292/297 298/278/298\nf 292/287/292 293/288/293 297/292/297\nf 292/287/292 297/292/297 254/291/254\nf 296/293/296 387/294/387 288/283/288\nf 296/293/296 288/283/288 295/281/295\nf 286/282/286 251/259/251 253/252/253\nf 286/282/286 253/252/253 269/279/269\nf 287/284/287 289/286/289 256/290/256\nf 287/284/287 256/290/256 252/295/252\nf 251/259/251 286/282/286 287/284/287\nf 251/259/251 287/284/287 252/295/252\nf 266/296/266 267/297/267 253/252/253\nf 266/296/266 253/252/253 249/251/249\nf 293/288/293 291/298/291 299/299/299\nf 293/288/293 299/299/299 297/292/297\nf 299/299/299 291/298/291 300/300/300\nf 299/299/299 300/300/300 301/301/301\nf 301/302/301 300/303/300 302/304/302\nf 301/302/301 302/304/302 303/305/303\nf 303/305/303 302/304/302 304/306/304\nf 303/305/303 304/306/304 305/307/305\nf 305/307/305 304/306/304 306/308/306\nf 305/307/305 306/308/306 307/309/307\nf 306/308/306 308/310/308 315/311/315\nf 306/308/306 315/311/315 307/309/307\nf 310/312/310 314/313/314 316/314/316\nf 310/312/310 316/314/316 334/315/334\nf 316/314/316 317/316/317 312/317/312\nf 316/314/316 312/317/312 334/315/334\nf 309/318/309 336/319/336 316/314/316\nf 309/318/309 316/314/316 314/313/314\nf 336/319/336 311/320/311 317/316/317\nf 336/319/336 317/316/317 316/314/316\nf 323/321/323 327/322/327 308/310/308\nf 323/321/323 308/310/308 306/308/306\nf 305/307/305 319/323/319 324/324/324\nf 305/307/305 324/324/324 303/305/303\nf 299/299/299 301/301/301 320/325/320\nf 299/299/299 320/325/320 321/326/321\nf 303/305/303 324/324/324 320/327/320\nf 303/305/303 320/327/320 301/302/301\nf 300/300/300 291/298/291 344/328/344\nf 300/300/300 344/328/344 322/329/322\nf 302/304/302 300/303/300 322/330/322\nf 302/304/302 322/330/322 323/321/323\nf 319/323/319 315/311/315 325/331/325\nf 319/323/319 325/331/325 349/332/349\nf 325/331/325 315/311/315 318/333/318\nf 325/331/325 318/333/318 326/334/326\nf 320/327/320 324/324/324 349/332/349\nf 320/327/320 349/332/349 432/335/432\nf 332/336/332 308/310/308 327/322/327\nf 332/336/332 327/322/327 333/337/333\nf 333/337/333 327/322/327 328/338/328\nf 333/337/333 328/338/328 329/339/329\nf 325/331/325 326/334/326 329/340/329\nf 325/331/325 329/340/329 328/341/328\nf 326/334/326 318/333/318 330/342/330\nf 326/334/326 330/342/330 331/343/331\nf 331/344/331 330/345/330 332/336/332\nf 331/344/331 332/336/332 333/337/333\nf 330/342/330 345/346/345 334/315/334\nf 330/342/330 334/315/334 335/347/335\nf 336/319/336 346/348/346 330/345/330\nf 336/319/336 330/345/330 335/349/335\nf 312/317/312 313/350/313 335/347/335\nf 312/317/312 335/347/335 334/315/334\nf 335/349/335 313/350/313 311/320/311\nf 335/349/335 311/320/311 336/319/336\nf 337/207/337 212/206/212 218/351/218\nf 337/207/337 218/351/218 338/204/338\nf 338/204/338 218/351/218 211/214/211\nf 338/204/338 211/214/211 339/201/339\nf 202/231/202 235/352/235 340/208/340\nf 202/231/202 340/208/340 337/207/337\nf 235/352/235 210/353/210 341/224/341\nf 235/352/235 341/224/341 340/208/340\nf 342/354/342 290/285/290 288/283/288\nf 342/354/342 288/283/288 387/294/387\nf 328/338/328 327/322/327 347/355/347\nf 328/338/328 347/355/347 348/356/348\nf 325/331/325 328/341/328 348/357/348\nf 325/331/325 348/357/348 349/332/349\nf 348/356/348 347/355/347 351/358/351\nf 348/356/348 351/358/351 352/359/352\nf 349/332/349 348/357/348 352/360/352\nf 349/332/349 352/360/352 350/361/350\nf 347/355/347 323/321/323 322/330/322\nf 347/355/347 322/330/322 351/358/351\nf 354/362/354 344/363/344 343/364/343\nf 354/362/354 343/364/343 353/365/353\nf 354/362/354 353/365/353 355/366/355\nf 354/362/354 355/366/355 356/367/356\nf 356/367/356 355/366/355 357/368/357\nf 356/367/356 357/368/357 358/369/358\nf 357/368/357 359/370/359 360/371/360\nf 357/368/357 360/371/360 358/369/358\nf 362/372/362 361/373/361 363/374/363\nf 362/372/362 363/374/363 364/375/364\nf 365/376/365 366/377/366 363/374/363\nf 365/376/365 363/374/363 361/373/361\nf 368/378/368 369/379/369 359/370/359\nf 368/378/368 359/370/359 357/368/357\nf 362/372/362 371/380/371 374/381/374\nf 362/372/362 374/381/374 360/371/360\nf 356/367/356 372/382/372 373/383/373\nf 356/367/356 373/383/373 354/362/354\nf 372/382/372 360/371/360 374/381/374\nf 372/382/372 374/381/374 383/384/383\nf 370/385/370 369/379/369 376/386/376\nf 370/385/370 376/386/376 375/387/375\nf 374/381/374 371/380/371 375/388/375\nf 374/381/374 375/388/375 376/389/376\nf 377/390/377 379/391/379 364/375/364\nf 377/390/377 364/375/364 381/392/381\nf 366/377/366 380/393/380 377/394/377\nf 366/377/366 377/394/377 381/395/381\nf 376/386/376 369/379/369 368/378/368\nf 376/386/376 368/378/368 382/396/382\nf 374/381/374 376/389/376 382/397/382\nf 374/381/374 382/397/382 383/384/383\nf 294/398/294 342/354/342 386/399/386\nf 294/398/294 386/399/386 385/400/385\nf 353/365/353 343/364/343 385/401/385\nf 353/365/353 385/401/385 368/378/368\nf 296/293/296 295/281/295 402/280/402\nf 296/293/296 402/280/402 388/402/388\nf 387/294/387 296/293/296 388/402/388\nf 387/294/387 388/402/388 389/403/389\nf 352/404/352 351/405/351 395/406/395\nf 352/404/352 395/406/395 390/407/390\nf 350/408/350 352/404/352 390/407/390\nf 350/408/350 390/407/390 434/409/434\nf 390/407/390 395/406/395 394/410/394\nf 390/407/390 394/410/394 392/411/392\nf 434/409/434 390/407/390 392/411/392\nf 434/409/434 392/411/392 391/412/391\nf 392/411/392 394/410/394 386/399/386\nf 392/411/392 386/399/386 393/413/393\nf 391/412/391 392/411/392 393/413/393\nf 391/412/391 393/413/393 396/414/396\nf 359/370/359 369/379/369 370/385/370\nf 359/370/359 370/385/370 365/376/365\nf 394/415/394 395/416/395 382/396/382\nf 394/415/394 382/396/382 368/378/368\nf 297/292/297 321/326/321 397/417/397\nf 297/292/297 397/417/397 298/278/298\nf 281/277/281 282/276/282 398/418/398\nf 281/277/281 398/418/398 396/419/396\nf 433/420/433 391/421/391 400/422/400\nf 433/420/433 400/422/400 399/423/399\nf 396/419/396 398/418/398 400/422/400\nf 396/419/396 400/422/400 391/421/391\nf 298/278/298 397/417/397 398/418/398\nf 298/278/298 398/418/398 282/276/282\nf 321/326/321 403/424/403 401/425/401\nf 321/326/321 401/425/401 397/417/397\nf 395/426/395 384/427/384 383/384/383\nf 395/426/395 383/384/383 382/397/382\nf 280/428/280 281/277/281 396/419/396\nf 280/428/280 396/419/396 389/429/389\nf 280/428/280 389/429/389 388/430/388\nf 280/428/280 388/430/388 277/272/277\nf 402/431/402 270/269/270 277/272/277\nf 402/431/402 277/272/277 388/430/388\nf 403/432/403 404/433/404 405/434/405\nf 403/432/403 405/434/405 401/435/401\nf 404/433/404 407/436/407 406/437/406\nf 404/433/404 406/437/406 405/434/405\nf 406/437/406 407/436/407 409/438/409\nf 406/437/406 409/438/409 408/439/408\nf 412/440/412 410/441/410 411/442/411\nf 412/440/412 411/442/411 413/443/413\nf 415/444/415 410/441/410 412/440/412\nf 415/444/415 412/440/412 416/445/416\nf 417/446/417 406/437/406 408/439/408\nf 417/446/417 408/439/408 418/447/418\nf 411/442/411 409/438/409 420/448/420\nf 411/442/411 420/448/420 419/449/419\nf 421/450/421 422/451/422 420/448/420\nf 421/450/421 420/448/420 409/438/409\nf 424/452/424 423/453/423 425/454/425\nf 424/452/424 425/454/425 418/447/418\nf 420/448/420 425/455/425 423/456/423\nf 420/448/420 423/456/423 419/449/419\nf 426/457/426 430/458/430 413/443/413\nf 426/457/426 413/443/413 428/459/428\nf 416/445/416 430/460/430 426/461/426\nf 416/445/416 426/461/426 429/462/429\nf 425/454/425 431/463/431 417/446/417\nf 425/454/425 417/446/417 418/447/418\nf 420/448/420 422/451/422 431/464/431\nf 420/448/420 431/464/431 425/455/425\nf 408/439/408 415/444/415 424/452/424\nf 408/439/408 424/452/424 418/447/418\nf 431/463/431 435/465/435 433/466/433\nf 431/463/431 433/466/433 417/446/417\nf 435/467/435 431/464/431 422/451/422\nf 435/467/435 422/451/422 432/468/432\nf 243/469/243 244/470/244 437/471/437\nf 243/469/243 437/471/437 436/472/436\nf 436/472/436 437/471/437 439/473/439\nf 436/472/436 439/473/439 438/474/438\nf 436/472/436 438/474/438 444/475/444\nf 436/472/436 444/475/444 440/476/440\nf 436/472/436 440/476/440 441/477/441\nf 436/472/436 441/477/441 243/469/243\nf 184/171/184 243/241/243 441/478/441\nf 184/171/184 441/478/441 442/479/442\nf 441/477/441 440/476/440 443/480/443\nf 441/477/441 443/480/443 558/481/558\nf 443/480/443 440/476/440 444/475/444\nf 443/480/443 444/475/444 445/482/445\nf 441/478/441 558/483/558 447/484/447\nf 441/478/441 447/484/447 446/485/446\nf 446/485/446 447/484/447 122/486/122\nf 446/485/446 122/486/122 121/487/121\nf 439/473/439 437/471/437 451/488/451\nf 439/473/439 451/488/451 1389/489/1389\nf 451/488/451 437/471/437 244/470/244\nf 451/488/451 244/470/244 242/490/242\nf 1389/489/1389 451/488/451 204/491/204\nf 1389/489/1389 204/491/204 1392/492/1392\nf 1392/493/1392 204/494/204 171/495/171\nf 1392/493/1392 171/495/171 452/496/452\nf 452/496/452 171/495/171 483/497/483\nf 452/496/452 483/497/483 453/498/453\nf 453/498/453 483/497/483 454/499/454\nf 453/498/453 454/499/454 455/500/455\nf 455/500/455 454/499/454 456/501/456\nf 455/500/455 456/501/456 457/502/457\nf 457/502/457 456/501/456 458/503/458\nf 457/502/457 458/503/458 459/504/459\nf 459/504/459 458/503/458 460/505/460\nf 459/504/459 460/505/460 461/506/461\nf 461/506/461 460/505/460 462/507/462\nf 461/506/461 462/507/462 463/508/463\nf 463/508/463 462/507/462 464/509/464\nf 463/508/463 464/509/464 465/510/465\nf 465/510/465 464/509/464 466/511/466\nf 465/510/465 466/511/466 467/512/467\nf 458/503/458 456/501/456 468/513/468\nf 458/503/458 468/513/468 528/514/528\nf 460/505/460 458/503/458 469/515/469\nf 460/505/460 469/515/469 470/516/470\nf 462/507/462 460/505/460 470/516/470\nf 462/507/462 470/516/470 471/517/471\nf 464/509/464 462/507/462 471/517/471\nf 464/509/464 471/517/471 472/518/472\nf 466/511/466 464/509/464 472/518/472\nf 466/511/466 472/518/472 473/519/473\nf 468/513/468 456/501/456 454/499/454\nf 468/513/468 454/499/454 474/520/474\nf 468/513/468 474/520/474 475/521/475\nf 468/513/468 475/521/475 498/522/498\nf 475/521/475 474/520/474 476/523/476\nf 475/521/475 476/523/476 477/524/477\nf 476/523/476 474/520/474 479/525/479\nf 476/523/476 479/525/479 480/526/480\nf 482/527/482 479/525/479 483/497/483\nf 482/527/482 483/497/483 484/528/484\nf 482/527/482 484/528/484 486/529/486\nf 482/527/482 486/529/486 519/530/519\nf 487/531/487 488/532/488 490/533/490\nf 487/531/487 490/533/490 489/534/489\nf 487/531/487 489/534/489 492/535/492\nf 487/531/487 492/535/492 491/536/491\nf 492/535/492 489/534/489 493/537/493\nf 492/535/492 493/537/493 494/538/494\nf 488/532/488 498/522/498 495/539/495\nf 488/532/488 495/539/495 496/540/496\nf 490/533/490 488/532/488 496/540/496\nf 490/533/490 496/540/496 497/541/497\nf 171/495/171 173/542/173 484/528/484\nf 171/495/171 484/528/484 483/497/483\nf 479/525/479 474/520/474 454/499/454\nf 479/525/479 454/499/454 483/497/483\nf 489/534/489 490/533/490 497/541/497\nf 489/534/489 497/541/497 493/537/493\nf 499/543/499 475/521/475 505/544/505\nf 499/543/499 505/544/505 503/545/503\nf 507/546/507 502/547/502 508/548/508\nf 507/546/507 508/548/508 509/549/509\nf 481/550/481 519/530/519 508/548/508\nf 481/550/481 508/548/508 502/547/502\nf 503/545/503 514/551/514 537/552/537\nf 503/545/503 537/552/537 501/553/501\nf 511/554/511 510/555/510 514/551/514\nf 511/554/511 514/551/514 503/545/503\nf 515/556/515 486/529/486 484/528/484\nf 515/556/515 484/528/484 173/542/173\nf 513/557/513 514/551/514 510/555/510\nf 513/557/513 510/555/510 521/558/521\nf 520/559/520 542/560/542 546/561/546\nf 520/559/520 546/561/546 522/562/522\nf 470/516/470 469/515/469 523/563/523\nf 470/516/470 523/563/523 524/564/524\nf 471/517/471 470/516/470 524/564/524\nf 471/517/471 524/564/524 525/565/525\nf 472/518/472 471/517/471 525/565/525\nf 472/518/472 525/565/525 526/566/526\nf 531/567/531 491/536/491 492/535/492\nf 531/567/531 492/535/492 533/568/533\nf 541/569/541 515/556/515 538/570/538\nf 541/569/541 538/570/538 539/571/539\nf 539/571/539 540/572/540 543/573/543\nf 539/571/539 543/573/543 541/569/541\nf 542/560/542 545/574/545 547/575/547\nf 542/560/542 547/575/547 546/561/546\nf 550/576/550 551/577/551 552/578/552\nf 550/576/550 552/578/552 445/482/445\nf 551/577/551 549/579/549 555/580/555\nf 551/577/551 555/580/555 557/581/557\nf 548/582/548 600/583/600 555/580/555\nf 548/582/548 555/580/555 549/579/549\nf 450/584/450 568/585/568 189/164/189\nf 450/584/450 189/164/189 188/166/188\nf 568/585/568 572/586/572 573/587/573\nf 568/585/568 573/587/573 571/588/571\nf 569/589/569 578/590/578 586/591/586\nf 569/589/569 586/591/586 577/592/577\nf 448/593/448 564/594/564 591/595/591\nf 448/593/448 591/595/591 590/596/590\nf 561/597/561 743/598/743 744/599/744\nf 561/597/561 744/599/744 595/600/595\nf 600/583/600 593/601/593 598/602/598\nf 600/583/600 598/602/598 599/603/599\nf 559/604/559 599/603/599 594/605/594\nf 559/604/559 594/605/594 601/606/601\nf 594/605/594 598/602/598 593/601/593\nf 594/605/594 593/601/593 592/607/592\nf 555/608/555 600/609/600 605/610/605\nf 555/608/555 605/610/605 604/611/604\nf 604/611/604 590/612/590 591/613/591\nf 604/611/604 591/613/591 555/608/555\nf 605/610/605 600/609/600 599/614/599\nf 605/610/605 599/614/599 559/615/559\nf 635/616/635 930/617/930 936/618/936\nf 635/616/635 936/618/936 603/619/603\nf 993/620/993 994/621/994 610/622/610\nf 993/620/993 610/622/610 607/623/607\nf 610/622/610 995/624/995 618/625/618\nf 610/622/610 618/625/618 617/626/617\nf 619/627/619 620/628/620 618/625/618\nf 619/627/619 618/625/618 995/624/995\nf 648/629/648 618/630/618 620/631/620\nf 648/629/648 620/631/620 643/632/643\nf 547/575/547 545/574/545 627/633/627\nf 547/575/547 627/633/627 625/634/625\nf 624/635/624 628/636/628 627/633/627\nf 624/635/624 627/633/627 626/637/626\nf 581/638/581 628/636/628 624/635/624\nf 581/638/581 624/635/624 580/639/580\nf 581/640/581 610/641/610 617/642/617\nf 581/640/581 617/642/617 628/643/628\nf 555/608/555 591/613/591 556/644/556\nf 555/608/555 556/644/556 557/645/557\nf 630/646/630 629/647/629 631/648/631\nf 630/646/630 631/648/631 632/649/632\nf 560/650/560 630/646/630 634/651/634\nf 560/650/560 634/651/634 635/652/635\nf 632/649/632 631/648/631 633/653/633\nf 632/649/632 633/653/633 634/651/634\nf 603/654/603 638/655/638 637/656/637\nf 603/654/603 637/656/637 636/657/636\nf 559/615/559 638/658/638 606/659/606\nf 559/615/559 606/659/606 605/610/605\nf 643/632/643 644/660/644 647/661/647\nf 643/632/643 647/661/647 646/662/646\nf 647/661/647 644/660/644 676/663/676\nf 647/661/647 676/663/676 649/664/649\nf 641/665/641 640/666/640 651/667/651\nf 641/665/641 651/667/651 652/668/652\nf 639/669/639 641/665/641 654/670/654\nf 639/669/639 654/670/654 653/671/653\nf 641/665/641 652/668/652 655/672/655\nf 641/665/641 655/672/655 654/670/654\nf 673/673/673 653/674/653 656/675/656\nf 673/673/673 656/675/656 657/676/657\nf 654/670/654 655/672/655 658/677/658\nf 654/670/654 658/677/658 656/678/656\nf 656/675/656 662/679/662 663/680/663\nf 656/675/656 663/680/663 657/676/657\nf 656/678/656 658/677/658 664/681/664\nf 656/678/656 664/681/664 662/682/662\nf 662/679/662 665/683/665 660/684/660\nf 662/679/662 660/684/660 663/680/663\nf 661/685/661 665/686/665 662/682/662\nf 661/685/661 662/682/662 664/681/664\nf 673/673/673 657/676/657 667/687/667\nf 673/673/673 667/687/667 672/688/672\nf 658/677/658 655/672/655 666/689/666\nf 658/677/658 666/689/666 668/690/668\nf 663/680/663 660/684/660 669/691/669\nf 663/680/663 669/691/669 670/692/670\nf 664/681/664 658/677/658 668/690/668\nf 664/681/664 668/690/668 671/693/671\nf 657/676/657 663/680/663 670/692/670\nf 657/676/657 670/692/670 667/687/667\nf 661/685/661 664/681/664 671/693/671\nf 661/685/661 671/693/671 669/691/669\nf 671/693/671 668/690/668 667/687/667\nf 671/693/671 667/687/667 670/692/670\nf 668/690/668 674/694/674 672/688/672\nf 668/690/668 672/688/672 667/687/667\nf 674/694/674 666/689/666 675/695/675\nf 674/694/674 675/695/675 677/696/677\nf 675/695/675 666/689/666 655/672/655\nf 675/695/675 655/672/655 652/668/652\nf 673/673/673 672/688/672 678/697/678\nf 673/673/673 678/697/678 676/698/676\nf 915/699/915 679/700/679 680/701/680\nf 915/699/915 680/701/680 767/702/767\nf 915/699/915 682/703/682 683/704/683\nf 915/699/915 683/704/683 679/700/679\nf 681/705/681 680/706/680 684/707/684\nf 681/705/681 684/707/684 685/708/685\nf 681/705/681 685/708/685 687/709/687\nf 681/705/681 687/709/687 699/710/699\nf 686/711/686 683/704/683 689/712/689\nf 686/711/686 689/712/689 711/713/711\nf 687/709/687 690/714/690 698/715/698\nf 687/709/687 698/715/698 699/710/699\nf 693/716/693 694/717/694 696/718/696\nf 693/716/693 696/718/696 697/719/697\nf 688/720/688 701/721/701 697/719/697\nf 688/720/688 697/719/697 696/718/696\nf 691/722/691 688/720/688 699/710/699\nf 691/722/691 699/710/699 698/715/698\nf 697/719/697 701/721/701 703/723/703\nf 697/719/697 703/723/703 704/724/704\nf 706/725/706 689/712/689 683/704/683\nf 706/725/706 683/704/683 682/703/682\nf 707/726/707 708/727/708 749/728/749\nf 707/726/707 749/728/749 750/729/750\nf 679/700/679 683/704/683 686/711/686\nf 679/700/679 686/711/686 710/730/710\nf 685/708/685 684/707/684 712/731/712\nf 685/708/685 712/731/712 713/732/713\nf 710/730/710 686/711/686 714/733/714\nf 710/730/710 714/733/714 716/734/716\nf 715/735/715 687/709/687 685/708/685\nf 715/735/715 685/708/685 713/732/713\nf 711/713/711 690/714/690 722/736/722\nf 711/713/711 722/736/722 717/737/717\nf 690/714/690 687/709/687 715/735/715\nf 690/714/690 715/735/715 722/736/722\nf 684/738/684 710/730/710 716/734/716\nf 684/738/684 716/734/716 712/739/712\nf 686/711/686 711/713/711 717/737/717\nf 686/711/686 717/737/717 714/733/714\nf 712/739/712 716/734/716 720/740/720\nf 712/739/712 720/740/720 718/741/718\nf 715/735/715 713/732/713 718/742/718\nf 715/735/715 718/742/718 723/743/723\nf 714/733/714 717/737/717 721/744/721\nf 714/733/714 721/744/721 720/740/720\nf 721/744/721 717/737/717 722/736/722\nf 721/744/721 722/736/722 719/745/719\nf 723/743/723 719/745/719 722/736/722\nf 723/743/723 722/736/722 715/735/715\nf 718/742/718 724/746/724 727/747/727\nf 718/742/718 727/747/727 723/743/723\nf 720/740/720 721/744/721 725/748/725\nf 720/740/720 725/748/725 724/749/724\nf 721/744/721 719/745/719 726/750/726\nf 721/744/721 726/750/726 725/748/725\nf 723/743/723 727/747/727 726/750/726\nf 723/743/723 726/750/726 719/745/719\nf 772/751/772 729/752/729 771/753/771\nf 772/751/772 771/753/771 681/705/681\nf 649/754/649 676/755/676 732/756/732\nf 649/754/649 732/756/732 731/757/731\nf 729/758/729 700/759/700 733/760/733\nf 729/758/729 733/760/733 734/761/734\nf 678/762/678 730/763/730 734/761/734\nf 678/762/678 734/761/734 732/756/732\nf 732/756/732 737/764/737 736/765/736\nf 732/756/732 736/765/736 731/757/731\nf 734/761/734 733/760/733 738/766/738\nf 734/761/734 738/766/738 739/767/739\nf 734/761/734 739/767/739 737/764/737\nf 734/761/734 737/764/737 732/756/732\nf 743/598/743 561/597/561 740/768/740\nf 743/598/743 740/768/740 742/769/742\nf 743/598/743 603/654/603 636/657/636\nf 743/598/743 636/657/636 744/599/744\nf 744/599/744 596/770/596 601/606/601\nf 744/599/744 601/606/601 745/771/745\nf 757/772/757 752/773/752 759/774/759\nf 757/772/757 759/774/759 761/775/761\nf 760/776/760 757/772/757 761/775/761\nf 760/776/760 761/775/761 762/777/762\nf 677/778/677 921/779/921 922/780/922\nf 677/778/677 922/780/922 730/781/730\nf 681/705/681 696/718/696 692/782/692\nf 681/705/681 692/782/692 772/751/772\nf 763/783/763 758/784/758 773/785/773\nf 763/783/763 773/785/773 775/786/775\nf 760/776/760 762/777/762 773/785/773\nf 760/776/760 773/785/773 758/784/758\nf 777/787/777 754/788/754 787/789/787\nf 777/787/777 787/789/787 776/790/776\nf 756/791/756 782/792/782 784/793/784\nf 756/791/756 784/793/784 783/794/783\nf 791/795/791 794/796/794 801/797/801\nf 791/795/791 801/797/801 800/798/800\nf 786/799/786 781/800/781 779/801/779\nf 786/799/786 779/801/779 806/802/806\nf 774/803/774 799/804/799 810/805/810\nf 774/803/774 810/805/810 809/806/809\nf 811/807/811 807/808/807 809/806/809\nf 811/807/811 809/806/809 810/805/810\nf 808/809/808 811/807/811 810/805/810\nf 808/809/808 810/805/810 819/810/819\nf 814/811/814 808/809/808 819/810/819\nf 814/811/814 819/810/819 820/812/820\nf 830/813/830 822/814/822 801/797/801\nf 830/813/830 801/797/801 829/815/829\nf 839/816/839 838/817/838 841/818/841\nf 839/816/839 841/818/841 840/819/840\nf 838/817/838 839/816/839 848/820/848\nf 838/817/838 848/820/848 847/821/847\nf 842/822/842 838/817/838 847/821/847\nf 842/822/842 847/821/847 849/823/849\nf 847/821/847 848/820/848 859/824/859\nf 847/821/847 859/824/859 850/825/850\nf 849/823/849 847/821/847 850/825/850\nf 849/823/849 850/825/850 851/826/851\nf 852/827/852 845/828/845 842/822/842\nf 852/827/852 842/822/842 849/823/849\nf 845/828/845 852/827/852 854/829/854\nf 845/828/845 854/829/854 853/830/853\nf 852/827/852 873/831/873 871/832/871\nf 852/827/852 871/832/871 854/829/854\nf 863/833/863 825/834/825 840/819/840\nf 863/833/863 840/819/840 841/818/841\nf 863/833/863 841/818/841 843/835/843\nf 863/833/863 843/835/843 844/836/844\nf 843/835/843 862/837/862 864/838/864\nf 843/835/843 864/838/864 844/836/844\nf 857/839/857 855/840/855 883/841/883\nf 857/839/857 883/841/883 884/842/884\nf 856/843/856 857/839/857 884/842/884\nf 856/843/856 884/842/884 1380/844/1380\nf 869/845/869 870/846/870 871/832/871\nf 869/845/869 871/832/871 873/831/873\nf 851/826/851 850/825/850 855/840/855\nf 851/826/851 855/840/855 857/839/857\nf 881/847/881 876/848/876 877/849/877\nf 881/847/881 877/849/877 868/850/868\nf 877/849/877 876/848/876 878/851/878\nf 877/849/877 878/851/878 879/852/879\nf 879/852/879 878/851/878 892/853/892\nf 879/852/879 892/853/892 880/854/880\nf 881/847/881 868/850/868 883/841/883\nf 881/847/881 883/841/883 882/855/882\nf 868/850/868 946/856/946 884/842/884\nf 868/850/868 884/842/884 883/841/883\nf 887/857/887 886/858/886 890/859/890\nf 887/857/887 890/859/890 891/860/891\nf 885/861/885 887/857/887 891/860/891\nf 885/861/885 891/860/891 889/862/889\nf 896/863/896 860/864/860 888/865/888\nf 896/863/896 888/865/888 895/866/895\nf 878/851/878 876/848/876 893/867/893\nf 878/851/878 893/867/893 892/853/892\nf 876/848/876 881/847/881 894/868/894\nf 876/848/876 894/868/894 893/867/893\nf 881/847/881 885/861/885 889/862/889\nf 881/847/881 889/862/889 894/868/894\nf 875/869/875 877/849/877 879/852/879\nf 875/869/875 879/852/879 880/854/880\nf 895/866/895 890/859/890 886/858/886\nf 895/866/895 886/858/886 896/863/896\nf 861/870/861 848/820/848 839/816/839\nf 861/870/861 839/816/839 927/871/927\nf 825/834/825 914/872/914 913/873/913\nf 825/834/825 913/873/913 840/819/840\nf 520/559/520 522/562/522 521/558/521\nf 520/559/520 521/558/521 510/555/510\nf 615/874/615 613/875/613 897/876/897\nf 615/874/615 897/876/897 898/877/898\nf 901/878/901 900/879/900 898/877/898\nf 901/878/901 898/877/898 897/876/897\nf 615/880/615 898/881/898 903/882/903\nf 615/880/615 903/882/903 902/883/902\nf 903/882/903 919/884/919 910/885/910\nf 903/882/903 910/885/910 908/886/908\nf 902/883/902 903/882/903 908/886/908\nf 902/883/902 908/886/908 907/887/907\nf 675/695/675 652/668/652 904/888/904\nf 675/695/675 904/888/904 905/889/905\nf 905/890/905 904/891/904 906/892/906\nf 905/890/905 906/892/906 909/893/909\nf 910/885/910 911/894/911 907/887/907\nf 910/885/910 907/887/907 908/886/908\nf 910/885/910 919/884/919 909/893/909\nf 910/885/910 909/893/909 911/895/911\nf 913/873/913 914/872/914 915/896/915\nf 913/873/913 915/896/915 916/897/916\nf 912/898/912 900/899/900 916/897/916\nf 912/898/912 916/897/916 915/896/915\nf 914/872/914 828/900/828 827/901/827\nf 914/872/914 827/901/827 682/902/682\nf 768/903/768 769/904/769 918/905/918\nf 768/903/768 918/905/918 917/906/917\nf 912/907/912 768/903/768 917/906/917\nf 912/907/912 917/906/917 919/908/919\nf 921/779/921 677/778/677 675/909/675\nf 921/779/921 675/909/675 923/910/923\nf 905/911/905 909/912/909 923/913/923\nf 905/911/905 923/913/923 675/914/675\nf 919/908/919 917/906/917 923/913/923\nf 919/908/919 923/913/923 909/912/909\nf 768/903/768 915/915/915 767/916/767\nf 768/903/768 767/916/767 924/917/924\nf 930/617/930 633/918/633 932/919/932\nf 930/617/930 932/919/932 931/920/931\nf 853/830/853 854/829/854 934/921/934\nf 853/830/853 934/921/934 935/922/935\nf 854/829/854 871/832/871 933/923/933\nf 854/829/854 933/923/933 953/924/953\nf 930/617/930 931/920/931 937/925/937\nf 930/617/930 937/925/937 936/618/936\nf 853/830/853 937/925/937 846/926/846\nf 853/830/853 846/926/846 845/828/845\nf 953/924/953 938/927/938 954/928/954\nf 953/924/953 954/928/954 934/921/934\nf 941/929/941 895/866/895 888/865/888\nf 941/929/941 888/865/888 938/930/938\nf 939/931/939 954/932/954 938/930/938\nf 939/931/939 938/930/938 888/865/888\nf 861/870/861 927/871/927 928/933/928\nf 861/870/861 928/933/928 939/931/939\nf 939/931/939 928/933/928 901/934/901\nf 939/931/939 901/934/901 954/932/954\nf 890/859/890 895/866/895 941/929/941\nf 890/859/890 941/929/941 940/935/940\nf 892/853/892 893/867/893 942/936/942\nf 892/853/892 942/936/942 1151/937/1151\nf 1151/938/1151 942/939/942 944/940/944\nf 1151/938/1151 944/940/944 992/941/992\nf 942/939/942 943/942/943 945/943/945\nf 942/939/942 945/943/945 944/940/944\nf 944/940/944 948/944/948 959/945/959\nf 944/940/944 959/945/959 992/941/992\nf 948/944/948 944/940/944 952/946/952\nf 948/944/948 952/946/952 947/947/947\nf 947/947/947 950/948/950 872/949/872\nf 947/947/947 872/949/872 1380/844/1380\nf 951/950/951 950/948/950 947/947/947\nf 951/950/951 947/947/947 952/946/952\nf 945/943/945 955/951/955 956/952/956\nf 945/943/945 956/952/956 951/950/951\nf 870/846/870 869/845/869 872/949/872\nf 870/846/870 872/949/872 950/948/950\nf 951/950/951 956/952/956 870/846/870\nf 951/950/951 870/846/870 950/948/950\nf 940/953/940 941/954/941 955/951/955\nf 940/953/940 955/951/955 945/943/945\nf 955/951/955 941/954/941 938/927/938\nf 955/951/955 938/927/938 953/924/953\nf 954/928/954 901/955/901 899/956/899\nf 954/928/954 899/956/899 934/921/934\nf 949/957/949 875/869/875 957/958/957\nf 949/957/949 957/958/957 958/959/958\nf 949/957/949 958/959/958 979/960/979\nf 949/957/949 979/960/979 959/945/959\nf 961/961/961 957/958/957 880/854/880\nf 961/961/961 880/854/880 960/962/960\nf 963/963/963 958/959/958 957/958/957\nf 963/963/963 957/958/957 962/964/962\nf 1152/965/1152 964/966/964 960/962/960\nf 1152/965/1152 960/962/960 880/854/880\nf 1077/967/1077 962/964/962 961/961/961\nf 1077/967/1077 961/961/961 1078/968/1078\nf 961/961/961 960/962/960 1115/969/1115\nf 961/961/961 1115/969/1115 1114/970/1114\nf 963/963/963 962/964/962 965/971/965\nf 963/963/963 965/971/965 966/972/966\nf 960/962/960 964/966/964 1154/973/1154\nf 960/962/960 1154/973/1154 1153/974/1153\nf 966/972/966 965/971/965 967/975/967\nf 966/972/966 967/975/967 968/976/968\nf 968/976/968 967/975/967 969/977/969\nf 968/976/968 969/977/969 970/978/970\nf 970/978/970 969/977/969 971/979/971\nf 970/978/970 971/979/971 972/980/972\nf 972/980/972 971/979/971 973/981/973\nf 972/980/972 973/981/973 977/982/977\nf 958/959/958 1042/983/1042 1041/984/1041\nf 958/959/958 1041/984/1041 979/960/979\nf 966/972/966 968/976/968 981/985/981\nf 966/972/966 981/985/981 980/986/980\nf 972/980/972 977/982/977 983/987/983\nf 972/980/972 983/987/983 981/985/981\nf 983/987/983 977/982/977 975/988/975\nf 983/987/983 975/988/975 982/989/982\nf 986/990/986 976/991/976 974/992/974\nf 986/990/986 974/992/974 984/993/984\nf 975/988/975 976/991/976 986/990/986\nf 975/988/975 986/990/986 985/994/985\nf 987/995/987 986/990/986 984/993/984\nf 987/995/987 984/993/984 1036/996/1036\nf 985/994/985 986/990/986 987/995/987\nf 985/994/985 987/995/987 1035/997/1035\nf 979/960/979 1041/984/1041 1052/998/1052\nf 979/960/979 1052/998/1052 988/999/988\nf 992/941/992 959/945/959 979/960/979\nf 992/941/992 979/960/979 988/999/988\nf 608/1000/608 611/1001/611 994/621/994\nf 608/1000/608 994/621/994 993/620/993\nf 995/624/995 994/621/994 611/1001/611\nf 995/624/995 611/1001/611 642/1002/642\nf 1000/1003/1000 816/1004/816 814/811/814\nf 1000/1003/1000 814/811/814 997/1005/997\nf 830/813/830 1010/1006/1010 1009/1007/1009\nf 830/813/830 1009/1007/1009 822/814/822\nf 837/1008/837 832/1009/832 1010/1006/1010\nf 837/1008/837 1010/1006/1010 830/813/830\nf 1003/1010/1003 844/836/844 865/1011/865\nf 1003/1010/1003 865/1011/865 1013/1012/1013\nf 1016/1013/1016 1007/1014/1007 1022/1015/1022\nf 1016/1013/1016 1022/1015/1022 1015/1016/1015\nf 865/1011/865 999/1017/999 1019/1018/1019\nf 865/1011/865 1019/1018/1019 1023/1019/1023\nf 824/1020/824 1012/1021/1012 835/1022/835\nf 824/1020/824 835/1022/835 836/1023/836\nf 1028/1024/1028 1025/1025/1025 973/981/973\nf 1028/1024/1028 973/981/973 971/979/971\nf 1025/1025/1025 1026/1026/1026 974/992/974\nf 1025/1025/1025 974/992/974 973/981/973\nf 1027/1027/1027 1028/1024/1028 967/975/967\nf 1027/1027/1027 967/975/967 965/971/965\nf 1029/1028/1029 1030/1029/1030 983/987/983\nf 1029/1028/1029 983/987/983 982/989/982\nf 1031/1030/1031 1032/1031/1032 1026/1026/1026\nf 1031/1030/1031 1026/1026/1026 1025/1025/1025\nf 1030/1032/1030 1029/1033/1029 1032/1034/1032\nf 1030/1032/1030 1032/1034/1032 1031/1035/1031\nf 1033/1036/1033 1034/1037/1034 1032/1034/1032\nf 1033/1036/1033 1032/1034/1032 1029/1033/1029\nf 1035/1038/1035 1036/1039/1036 1034/1037/1034\nf 1035/1038/1035 1034/1037/1034 1033/1036/1033\nf 1039/1040/1039 1037/1041/1037 1030/1032/1030\nf 1039/1040/1039 1030/1032/1030 1031/1035/1031\nf 1112/1042/1112 1038/1043/1038 1037/1041/1037\nf 1112/1042/1112 1037/1041/1037 1039/1040/1039\nf 1028/1024/1028 1039/1044/1039 1031/1030/1031\nf 1028/1024/1028 1031/1030/1031 1025/1025/1025\nf 1027/1027/1027 1112/1045/1112 1039/1044/1039\nf 1027/1027/1027 1039/1044/1039 1028/1024/1028\nf 1038/1046/1038 980/986/980 981/985/981\nf 1038/1046/1038 981/985/981 1037/1047/1037\nf 1041/984/1041 1042/983/1042 1043/1048/1043\nf 1041/984/1041 1043/1048/1043 1044/1049/1044\nf 1044/1049/1044 1043/1048/1043 1045/1050/1045\nf 1044/1049/1044 1045/1050/1045 1046/1051/1046\nf 1046/1051/1046 1045/1050/1045 1047/1052/1047\nf 1046/1051/1046 1047/1052/1047 1048/1053/1048\nf 1041/984/1041 1044/1049/1044 1053/1054/1053\nf 1041/984/1041 1053/1054/1053 1052/998/1052\nf 1053/1054/1053 1048/1053/1048 1051/1055/1051\nf 1053/1054/1053 1051/1055/1051 1054/1056/1054\nf 1055/1057/1055 1049/1058/1049 1050/1059/1050\nf 1055/1057/1055 1050/1059/1050 1056/1060/1056\nf 1051/1055/1051 1049/1058/1049 1055/1057/1055\nf 1051/1055/1051 1055/1057/1055 1057/1061/1057\nf 1058/1062/1058 1055/1057/1055 1056/1060/1056\nf 1058/1062/1058 1056/1060/1056 1059/1063/1059\nf 1057/1061/1057 1055/1057/1055 1058/1062/1058\nf 1057/1061/1057 1058/1062/1058 1060/1064/1060\nf 1061/1065/1061 1062/1066/1062 1050/1059/1050\nf 1061/1065/1061 1050/1059/1050 1047/1052/1047\nf 978/1067/978 1061/1065/1061 1043/1048/1043\nf 978/1067/978 1043/1048/1043 1042/983/1042\nf 1063/1068/1063 1070/1069/1070 1053/1054/1053\nf 1063/1068/1063 1053/1054/1053 1054/1056/1054\nf 1069/1070/1069 1064/1071/1064 1062/1066/1062\nf 1069/1070/1069 1062/1066/1062 1061/1065/1061\nf 1070/1072/1070 1063/1073/1063 1064/1074/1064\nf 1070/1072/1070 1064/1074/1064 1069/1075/1069\nf 1065/1076/1065 1066/1077/1066 1064/1074/1064\nf 1065/1076/1065 1064/1074/1064 1063/1073/1063\nf 1067/1078/1067 1068/1079/1068 1066/1077/1066\nf 1067/1078/1067 1066/1077/1066 1065/1076/1065\nf 1060/1080/1060 1059/1081/1059 1068/1079/1068\nf 1060/1080/1060 1068/1079/1068 1067/1078/1067\nf 1071/1082/1071 1187/1083/1187 1070/1072/1070\nf 1071/1082/1071 1070/1072/1070 1069/1075/1069\nf 1061/1065/1061 978/1067/978 1071/1084/1071\nf 1061/1065/1061 1071/1084/1071 1069/1070/1069\nf 1187/1085/1187 1052/998/1052 1053/1054/1053\nf 1187/1085/1187 1053/1054/1053 1070/1069/1070\nf 1073/1086/1073 963/963/963 966/972/966\nf 1073/1086/1073 966/972/966 980/986/980\nf 1076/1087/1076 1074/1088/1074 990/1089/990\nf 1076/1087/1076 990/1089/990 1187/1090/1187\nf 1073/1086/1073 980/986/980 1038/1046/1038\nf 1073/1086/1073 1038/1046/1038 1075/1091/1075\nf 1075/1092/1075 1038/1043/1038 1112/1042/1112\nf 1075/1092/1075 1112/1042/1112 1076/1087/1076\nf 981/985/981 983/987/983 1030/1029/1030\nf 981/985/981 1030/1029/1030 1037/1047/1037\nf 1077/967/1077 1078/968/1078 1079/1093/1079\nf 1077/967/1077 1079/1093/1079 1080/1094/1080\nf 1080/1094/1080 1079/1093/1079 1081/1095/1081\nf 1080/1094/1080 1081/1095/1081 1082/1096/1082\nf 1082/1096/1082 1081/1095/1081 1083/1097/1083\nf 1082/1096/1082 1083/1097/1083 1084/1098/1084\nf 1084/1098/1084 1083/1097/1083 1085/1099/1085\nf 1084/1098/1084 1085/1099/1085 1086/1100/1086\nf 1077/967/1077 1080/1094/1080 1091/1101/1091\nf 1077/967/1077 1091/1101/1091 1090/1102/1090\nf 1084/1098/1084 1086/1100/1086 1092/1103/1092\nf 1084/1098/1084 1092/1103/1092 1091/1101/1091\nf 1092/1103/1092 1086/1100/1086 1089/1104/1089\nf 1092/1103/1092 1089/1104/1089 1093/1105/1093\nf 1094/1106/1094 1087/1107/1087 1088/1108/1088\nf 1094/1106/1094 1088/1108/1088 1095/1109/1095\nf 1089/1104/1089 1087/1107/1087 1094/1106/1094\nf 1089/1104/1089 1094/1106/1094 1096/1110/1096\nf 1097/1111/1097 1094/1106/1094 1095/1109/1095\nf 1097/1111/1097 1095/1109/1095 1098/1112/1098\nf 1096/1110/1096 1094/1106/1094 1097/1111/1097\nf 1096/1110/1096 1097/1111/1097 1099/1113/1099\nf 1100/1114/1100 1101/1115/1101 1085/1099/1085\nf 1100/1114/1100 1085/1099/1085 1083/1097/1083\nf 1101/1115/1101 1102/1116/1102 1088/1108/1088\nf 1101/1115/1101 1088/1108/1088 1085/1099/1085\nf 1103/1117/1103 1100/1114/1100 1079/1093/1079\nf 1103/1117/1103 1079/1093/1079 1078/968/1078\nf 1093/1105/1093 1104/1118/1104 1105/1119/1105\nf 1093/1105/1093 1105/1119/1105 1092/1103/1092\nf 1106/1120/1106 1107/1121/1107 1102/1116/1102\nf 1106/1120/1106 1102/1116/1102 1101/1115/1101\nf 1105/1122/1105 1104/1123/1104 1107/1124/1107\nf 1105/1122/1105 1107/1124/1107 1106/1125/1106\nf 1108/1126/1108 1109/1127/1109 1107/1124/1107\nf 1108/1126/1108 1107/1124/1107 1104/1123/1104\nf 1099/1128/1099 1098/1129/1098 1109/1127/1109\nf 1099/1128/1099 1109/1127/1109 1108/1126/1108\nf 1110/1130/1110 1111/1131/1111 1105/1122/1105\nf 1110/1130/1110 1105/1122/1105 1106/1125/1106\nf 1148/1132/1148 1112/1042/1112 1111/1131/1111\nf 1148/1132/1148 1111/1131/1111 1110/1130/1110\nf 1100/1114/1100 1110/1133/1110 1106/1120/1106\nf 1100/1114/1100 1106/1120/1106 1101/1115/1101\nf 1103/1117/1103 1148/1134/1148 1110/1133/1110\nf 1103/1117/1103 1110/1133/1110 1100/1114/1100\nf 1112/1045/1112 1090/1102/1090 1091/1101/1091\nf 1112/1045/1112 1091/1101/1091 1111/1135/1111\nf 1091/1101/1091 1092/1103/1092 1105/1119/1105\nf 1091/1101/1091 1105/1119/1105 1111/1135/1111\nf 1077/967/1077 1090/1102/1090 1027/1027/1027\nf 1077/967/1077 1027/1027/1027 965/971/965\nf 1114/970/1114 1115/969/1115 1116/1136/1116\nf 1114/970/1114 1116/1136/1116 1117/1137/1117\nf 1117/1137/1117 1116/1136/1116 1118/1138/1118\nf 1117/1137/1117 1118/1138/1118 1119/1139/1119\nf 1119/1139/1119 1118/1138/1118 1120/1140/1120\nf 1119/1139/1119 1120/1140/1120 1121/1141/1121\nf 1121/1141/1121 1120/1140/1120 1122/1142/1122\nf 1121/1141/1121 1122/1142/1122 1123/1143/1123\nf 1114/970/1114 1117/1137/1117 1128/1144/1128\nf 1114/970/1114 1128/1144/1128 1127/1145/1127\nf 1121/1141/1121 1123/1143/1123 1129/1146/1129\nf 1121/1141/1121 1129/1146/1129 1128/1144/1128\nf 1129/1146/1129 1123/1143/1123 1126/1147/1126\nf 1129/1146/1129 1126/1147/1126 1130/1148/1130\nf 1131/1149/1131 1124/1150/1124 1125/1151/1125\nf 1131/1149/1131 1125/1151/1125 1132/1152/1132\nf 1126/1147/1126 1124/1150/1124 1131/1149/1131\nf 1126/1147/1126 1131/1149/1131 1133/1153/1133\nf 1135/1154/1135 1136/1155/1136 1122/1142/1122\nf 1135/1154/1135 1122/1142/1122 1120/1140/1120\nf 1136/1155/1136 1137/1156/1137 1125/1151/1125\nf 1136/1155/1136 1125/1151/1125 1122/1142/1122\nf 1138/1157/1138 1135/1154/1135 1116/1136/1116\nf 1138/1157/1138 1116/1136/1116 1115/969/1115\nf 1139/1158/1139 1140/1159/1140 1129/1146/1129\nf 1139/1158/1139 1129/1146/1129 1130/1148/1130\nf 1141/1160/1141 1142/1161/1142 1137/1156/1137\nf 1141/1160/1141 1137/1156/1137 1136/1155/1136\nf 1140/1162/1140 1139/1163/1139 1142/1164/1142\nf 1140/1162/1140 1142/1164/1142 1141/1165/1141\nf 1143/1166/1143 1144/1167/1144 1142/1164/1142\nf 1143/1166/1143 1142/1164/1142 1139/1163/1139\nf 1145/1168/1145 1146/1169/1146 1140/1162/1140\nf 1145/1168/1145 1140/1162/1140 1141/1165/1141\nf 1147/1170/1147 1148/1171/1148 1146/1169/1146\nf 1147/1170/1147 1146/1169/1146 1145/1168/1145\nf 1135/1154/1135 1145/1172/1145 1141/1160/1141\nf 1135/1154/1135 1141/1160/1141 1136/1155/1136\nf 1138/1157/1138 1147/1173/1147 1145/1172/1145\nf 1138/1157/1138 1145/1172/1145 1135/1154/1135\nf 1148/1134/1148 1127/1145/1127 1128/1144/1128\nf 1148/1134/1148 1128/1144/1128 1146/1174/1146\nf 1128/1144/1128 1129/1146/1129 1140/1159/1140\nf 1128/1144/1128 1140/1159/1140 1146/1174/1146\nf 1103/1117/1103 1078/968/1078 1114/970/1114\nf 1103/1117/1103 1114/970/1114 1127/1145/1127\nf 1148/1132/1148 1074/1088/1074 1076/1087/1076\nf 1148/1132/1148 1076/1087/1076 1112/1042/1112\nf 1150/1175/1150 1149/1176/1149 989/1177/989\nf 1150/1175/1150 989/1177/989 1074/1178/1074\nf 1149/1179/1149 1152/965/1152 892/853/892\nf 1149/1179/1149 892/853/892 1151/937/1151\nf 964/966/964 1152/965/1152 1149/1179/1149\nf 964/966/964 1149/1179/1149 1150/1180/1150\nf 606/659/606 638/658/638 603/1181/603\nf 606/659/606 603/1181/603 936/1182/936\nf 1153/974/1153 1154/973/1154 1155/1183/1155\nf 1153/974/1153 1155/1183/1155 1156/1184/1156\nf 1156/1184/1156 1155/1183/1155 1157/1185/1157\nf 1156/1184/1156 1157/1185/1157 1158/1186/1158\nf 1158/1186/1158 1157/1185/1157 1159/1187/1159\nf 1158/1186/1158 1159/1187/1159 1160/1188/1160\nf 1160/1188/1160 1159/1187/1159 1161/1189/1161\nf 1160/1188/1160 1161/1189/1161 1162/1190/1162\nf 1153/974/1153 1156/1184/1156 1167/1191/1167\nf 1153/974/1153 1167/1191/1167 1166/1192/1166\nf 1160/1188/1160 1162/1190/1162 1168/1193/1168\nf 1160/1188/1160 1168/1193/1168 1167/1191/1167\nf 1168/1193/1168 1162/1190/1162 1165/1194/1165\nf 1168/1193/1168 1165/1194/1165 1169/1195/1169\nf 1170/1196/1170 1163/1197/1163 1164/1198/1164\nf 1170/1196/1170 1164/1198/1164 1171/1199/1171\nf 1165/1194/1165 1163/1197/1163 1170/1196/1170\nf 1165/1194/1165 1170/1196/1170 1172/1200/1172\nf 1174/1201/1174 1175/1202/1175 1161/1189/1161\nf 1174/1201/1174 1161/1189/1161 1159/1187/1159\nf 1175/1202/1175 1176/1203/1176 1164/1198/1164\nf 1175/1202/1175 1164/1198/1164 1161/1189/1161\nf 1177/1204/1177 1174/1201/1174 1155/1183/1155\nf 1177/1204/1177 1155/1183/1155 1154/973/1154\nf 1178/1205/1178 1179/1206/1179 1168/1193/1168\nf 1178/1205/1178 1168/1193/1168 1169/1195/1169\nf 1180/1207/1180 1181/1208/1181 1176/1203/1176\nf 1180/1207/1180 1176/1203/1176 1175/1202/1175\nf 1179/1209/1179 1178/1210/1178 1181/1211/1181\nf 1179/1209/1179 1181/1211/1181 1180/1212/1180\nf 1182/1213/1182 1183/1214/1183 1181/1211/1181\nf 1182/1213/1182 1181/1211/1181 1178/1210/1178\nf 1184/1215/1184 1185/1216/1185 1179/1209/1179\nf 1184/1215/1184 1179/1209/1179 1180/1212/1180\nf 1186/1217/1186 1147/1170/1147 1185/1216/1185\nf 1186/1217/1186 1185/1216/1185 1184/1215/1184\nf 1174/1201/1174 1184/1218/1184 1180/1207/1180\nf 1174/1201/1174 1180/1207/1180 1175/1202/1175\nf 1177/1204/1177 1186/1219/1186 1184/1218/1184\nf 1177/1204/1177 1184/1218/1184 1174/1201/1174\nf 1147/1173/1147 1166/1192/1166 1167/1191/1167\nf 1147/1173/1147 1167/1191/1167 1185/1220/1185\nf 1167/1191/1167 1168/1193/1168 1179/1206/1179\nf 1167/1191/1167 1179/1206/1179 1185/1220/1185\nf 1138/1157/1138 1115/969/1115 1153/974/1153\nf 1138/1157/1138 1153/974/1153 1166/1192/1166\nf 1074/1178/1074 1148/1171/1148 1147/1170/1147\nf 1074/1178/1074 1147/1170/1147 1186/1217/1186\nf 1177/1204/1177 964/966/964 1150/1180/1150\nf 1177/1204/1177 1150/1180/1150 1186/1219/1186\nf 963/963/963 1073/1086/1073 978/1067/978\nf 963/963/963 978/1067/978 1042/983/1042\nf 1075/1091/1075 1071/1084/1071 978/1067/978\nf 1075/1091/1075 978/1067/978 1073/1086/1073\nf 807/808/807 1189/1221/1189 1197/1222/1197\nf 807/808/807 1197/1222/1197 809/806/809\nf 1195/1223/1195 1196/1224/1196 1190/1225/1190\nf 1195/1223/1195 1190/1225/1190 1192/1226/1192\nf 812/1227/812 562/1228/562 1192/1226/1192\nf 812/1227/812 1192/1226/1192 1190/1225/1190\nf 1194/1229/1194 1193/1230/1193 1188/1231/1188\nf 1194/1229/1194 1188/1231/1188 1191/1232/1191\nf 1195/1223/1195 1191/1232/1191 1188/1231/1188\nf 1195/1223/1195 1188/1231/1188 1189/1221/1189\nf 1196/1224/1196 1195/1223/1195 1189/1221/1189\nf 1196/1224/1196 1189/1221/1189 807/808/807\nf 1200/1233/1200 1331/1234/1331 783/1235/783\nf 1200/1233/1200 783/1235/783 784/1236/784\nf 1202/1237/1202 1203/1238/1203 1204/1239/1204\nf 1202/1237/1202 1204/1239/1204 1201/1240/1201\nf 1206/1241/1206 1207/1242/1207 1205/1243/1205\nf 1206/1241/1206 1205/1243/1205 1201/1240/1201\nf 1206/1241/1206 1208/1244/1208 1209/1245/1209\nf 1206/1241/1206 1209/1245/1209 1207/1242/1207\nf 1211/1246/1211 1210/1247/1210 1202/1237/1202\nf 1211/1246/1211 1202/1237/1202 1205/1243/1205\nf 1212/1248/1212 1211/1246/1211 1205/1243/1205\nf 1212/1248/1212 1205/1243/1205 1207/1242/1207\nf 1209/1245/1209 1213/1249/1213 1212/1248/1212\nf 1209/1245/1209 1212/1248/1212 1207/1242/1207\nf 1202/1237/1202 1210/1247/1210 786/1250/786\nf 1202/1237/1202 786/1250/786 1203/1238/1203\nf 784/1251/784 1223/1252/1223 1214/1253/1214\nf 784/1251/784 1214/1253/1214 1200/1254/1200\nf 1218/1255/1218 1219/1256/1219 1217/1257/1217\nf 1218/1255/1218 1217/1257/1217 1216/1258/1216\nf 1219/1256/1219 1222/1259/1222 1215/1260/1215\nf 1219/1256/1219 1215/1260/1215 1217/1257/1217\nf 1222/1259/1222 1221/1261/1221 1214/1253/1214\nf 1222/1259/1222 1214/1253/1214 1215/1260/1215\nf 1221/1261/1221 1220/1262/1220 1200/1254/1200\nf 1221/1261/1221 1200/1254/1200 1214/1253/1214\nf 1215/1260/1215 1223/1252/1223 1211/1263/1211\nf 1215/1260/1215 1211/1263/1211 1212/1264/1212\nf 1206/1241/1206 1201/1240/1201 1225/1265/1225\nf 1206/1241/1206 1225/1265/1225 1226/1266/1226\nf 1206/1241/1206 1226/1266/1226 1218/1255/1218\nf 1206/1241/1206 1218/1255/1218 1208/1244/1208\nf 1228/1267/1228 1229/1268/1229 1198/1269/1198\nf 1228/1267/1228 1198/1269/1198 1193/1230/1193\nf 1233/1270/1233 1250/1271/1250 1248/1272/1248\nf 1233/1270/1233 1248/1272/1248 1231/1273/1231\nf 1235/1274/1235 1236/1275/1236 1232/1276/1232\nf 1235/1274/1235 1232/1276/1232 1252/1277/1252\nf 1230/1278/1230 1237/1279/1237 1229/1280/1229\nf 1230/1278/1230 1229/1280/1229 1228/1281/1228\nf 1238/1282/1238 1362/1283/1362 1237/1279/1237\nf 1238/1282/1238 1237/1279/1237 1230/1278/1230\nf 1242/1284/1242 1241/1285/1241 1253/1286/1253\nf 1242/1284/1242 1253/1286/1253 1234/1287/1234\nf 1248/1272/1248 1250/1271/1250 1251/1288/1251\nf 1248/1272/1248 1251/1288/1251 1232/1276/1232\nf 1236/1275/1236 1249/1289/1249 1248/1272/1248\nf 1236/1275/1236 1248/1272/1248 1232/1276/1232\nf 1251/1288/1251 1250/1271/1250 1247/1290/1247\nf 1251/1288/1251 1247/1290/1247 1234/1287/1234\nf 1252/1277/1252 1251/1288/1251 1234/1287/1234\nf 1252/1277/1252 1234/1287/1234 1253/1286/1253\nf 1254/1291/1254 1241/1285/1241 1242/1284/1242\nf 1254/1291/1254 1242/1284/1242 1239/1292/1239\nf 1261/1293/1261 1254/1291/1254 1239/1292/1239\nf 1261/1293/1261 1239/1292/1239 1260/1294/1260\nf 1282/1295/1282 1259/1296/1259 1260/1294/1260\nf 1282/1295/1282 1260/1294/1260 1239/1292/1239\nf 1259/1296/1259 1265/28/1265 1255/27/1255\nf 1259/1296/1259 1255/27/1255 1260/1294/1260\nf 1256/29/1256 1261/1293/1261 1260/1294/1260\nf 1256/29/1256 1260/1294/1260 1255/27/1255\nf 1263/1297/1263 1262/33/1262 1258/32/1258\nf 1263/1297/1263 1258/32/1258 1264/1298/1264\nf 1258/32/1258 1265/28/1265 1259/1296/1259\nf 1258/32/1258 1259/1296/1259 1264/1298/1264\nf 34/34/34 1267/1299/1267 1261/1293/1261\nf 34/34/34 1261/1293/1261 1256/29/1256\nf 1267/1299/1267 1266/1300/1266 1254/1291/1254\nf 1267/1299/1267 1254/1291/1254 1261/1293/1261\nf 1269/1301/1269 1270/1302/1270 1267/1299/1267\nf 1269/1301/1269 1267/1299/1267 34/34/34\nf 1267/1299/1267 1270/1302/1270 1268/1303/1268\nf 1267/1299/1267 1268/1303/1268 1266/1300/1266\nf 1272/1304/1272 1273/1305/1273 1270/1302/1270\nf 1272/1304/1272 1270/1302/1270 1269/1301/1269\nf 1273/1305/1273 1271/1306/1271 1268/1303/1268\nf 1273/1305/1273 1268/1303/1268 1270/1302/1270\nf 43/43/43 1274/1307/1274 1272/1304/1272\nf 43/43/43 1272/1304/1272 1269/1301/1269\nf 1203/1308/1203 1275/1309/1275 1276/1310/1276\nf 1203/1308/1203 1276/1310/1276 1204/1311/1204\nf 1277/1312/1277 1304/1313/1304 1236/1275/1236\nf 1277/1312/1277 1236/1275/1236 1235/1274/1235\nf 1273/1305/1273 1277/1312/1277 1235/1274/1235\nf 1273/1305/1273 1235/1274/1235 1271/1306/1271\nf 1329/1314/1329 1277/1312/1277 1272/1304/1272\nf 1329/1314/1329 1272/1304/1272 1274/1307/1274\nf 1244/1315/1244 1243/1316/1243 1245/1317/1245\nf 1244/1315/1244 1245/1317/1245 1246/1318/1246\nf 1278/1319/1278 1244/1315/1244 1246/1318/1246\nf 1278/1319/1278 1246/1318/1246 1280/53/1280\nf 1283/1320/1283 1282/1295/1282 1239/1292/1239\nf 1283/1320/1283 1239/1292/1239 1242/1284/1242\nf 1284/1321/1284 1283/1320/1283 1242/1284/1242\nf 1284/1321/1284 1242/1284/1242 1257/1322/1257\nf 1287/1323/1287 1288/1324/1288 1283/1320/1283\nf 1287/1323/1287 1283/1320/1283 1284/1321/1284\nf 1282/1295/1282 1283/1320/1283 1288/1324/1288\nf 1282/1295/1282 1288/1324/1288 1290/1325/1290\nf 1244/1315/1244 1278/1319/1278 1279/1326/1279\nf 1244/1315/1244 1279/1326/1279 1285/1327/1285\nf 1278/1319/1278 1291/1328/1291 1263/1297/1263\nf 1278/1319/1278 1263/1297/1263 1279/1326/1279\nf 1325/1329/1325 1306/1330/1306 1304/1313/1304\nf 1325/1329/1325 1304/1313/1304 1277/1312/1277\nf 1292/1331/1292 1330/1332/1330 1204/1311/1204\nf 1292/1331/1292 1204/1311/1204 1276/1310/1276\nf 1295/1333/1295 1293/1334/1293 1436/1335/1436\nf 1295/1333/1295 1436/1335/1436 1437/1336/1437\nf 1438/1337/1438 1297/1338/1297 1295/1333/1295\nf 1438/1337/1438 1295/1333/1295 1437/1336/1437\nf 1298/1339/1298 1301/1340/1301 1302/1341/1302\nf 1298/1339/1298 1302/1341/1302 1299/1342/1299\nf 1300/1343/1300 1302/1341/1302 1301/1340/1301\nf 1300/1343/1300 1301/1340/1301 1352/1344/1352\nf 1295/1333/1295 1305/1345/1305 1303/1346/1303\nf 1295/1333/1295 1303/1346/1303 1293/1334/1293\nf 1299/1342/1299 1354/1347/1354 1305/1345/1305\nf 1299/1342/1299 1305/1345/1305 1297/1338/1297\nf 1300/1343/1300 1307/1348/1307 1308/1349/1308\nf 1300/1343/1300 1308/1349/1308 1302/1341/1302\nf 1302/1341/1302 1308/1349/1308 1354/1347/1354\nf 1302/1341/1302 1354/1347/1354 1299/1342/1299\nf 1310/1350/1310 1309/1351/1309 1204/1352/1204\nf 1310/1350/1310 1204/1352/1204 1311/1353/1311\nf 1313/1354/1313 1312/1355/1312 1309/1351/1309\nf 1313/1354/1313 1309/1351/1309 1310/1350/1310\nf 1315/1356/1315 1316/1357/1316 1310/1350/1310\nf 1315/1356/1315 1310/1350/1310 1311/1353/1311\nf 1316/1357/1316 1317/1358/1317 1313/1354/1313\nf 1316/1357/1316 1313/1354/1313 1310/1350/1310\nf 1326/1359/1326 1319/1360/1319 1316/1357/1316\nf 1326/1359/1326 1316/1357/1316 1315/1356/1315\nf 1316/1357/1316 1319/1360/1319 1322/1361/1322\nf 1316/1357/1316 1322/1361/1322 1317/1358/1317\nf 1326/1359/1326 1320/1362/1320 1321/1363/1321\nf 1326/1359/1326 1321/1363/1321 1319/1360/1319\nf 1323/1364/1323 1312/1355/1312 1313/1354/1313\nf 1323/1364/1323 1313/1354/1313 1324/1365/1324\nf 1317/1358/1317 1318/1366/1318 1324/1365/1324\nf 1317/1358/1317 1324/1365/1324 1313/1354/1313\nf 1325/1367/1325 1328/1368/1328 1315/1356/1315\nf 1325/1367/1325 1315/1356/1315 1311/1353/1311\nf 1332/1369/1332 1331/1234/1331 1220/1370/1220\nf 1332/1369/1332 1220/1370/1220 1224/1371/1224\nf 106/1372/106 1332/1369/1332 1224/1371/1224\nf 106/1372/106 1224/1371/1224 1327/1373/1327\nf 1333/1374/1333 1334/1375/1334 1335/1376/1335\nf 1333/1374/1333 1335/1376/1335 1338/1377/1338\nf 109/65/109 1334/1375/1334 1274/1307/1274\nf 109/65/109 1274/1307/1274 43/43/43\nf 1315/1356/1315 1328/1368/1328 1327/1378/1327\nf 1315/1356/1315 1327/1378/1327 1326/1359/1326\nf 1333/1374/1333 1338/1377/1338 1337/1379/1337\nf 1333/1374/1333 1337/1379/1337 1336/1380/1336\nf 100/1381/100 1339/1382/1339 1340/1383/1340\nf 100/1381/100 1340/1383/1340 99/1384/99\nf 1339/1382/1339 1341/1385/1341 1342/1386/1342\nf 1339/1382/1339 1342/1386/1342 1340/1383/1340\nf 1339/1382/1339 100/1381/100 106/1387/106\nf 1339/1382/1339 106/1387/106 1337/1388/1337\nf 101/111/101 1341/1385/1341 1335/1389/1335\nf 101/111/101 1335/1389/1335 109/112/109\nf 1341/1385/1341 1339/1382/1339 1337/1388/1337\nf 1341/1385/1341 1337/1388/1337 1338/1390/1338\nf 1344/1391/1344 1240/1392/1240 1343/1393/1343\nf 1344/1391/1344 1343/1393/1343 1271/1306/1271\nf 1346/1394/1346 1345/1395/1345 1198/1396/1198\nf 1346/1394/1346 1198/1396/1198 1229/1397/1229\nf 1197/1398/1197 1345/1399/1345 1294/1400/1294\nf 1197/1398/1197 1294/1400/1294 1275/1401/1275\nf 1350/1402/1350 1296/1403/1296 1347/1404/1347\nf 1350/1402/1350 1347/1404/1347 1348/1405/1348\nf 1346/1394/1346 1229/1397/1229 1249/1406/1249\nf 1346/1394/1346 1249/1406/1249 1439/1407/1439\nf 1442/1408/1442 1440/1409/1440 1348/1405/1348\nf 1442/1408/1442 1348/1405/1348 1443/1410/1443\nf 1301/1411/1301 1298/1412/1298 1350/1402/1350\nf 1301/1411/1301 1350/1402/1350 1351/1413/1351\nf 1353/1414/1353 1352/1415/1352 1301/1411/1301\nf 1353/1414/1353 1301/1411/1301 1351/1413/1351\nf 1351/1413/1351 1308/1349/1308 1307/1348/1307\nf 1351/1413/1351 1307/1348/1307 1353/1414/1353\nf 1441/1416/1441 1308/1349/1308 1351/1413/1351\nf 1441/1416/1441 1351/1413/1351 1350/1402/1350\nf 1440/1409/1440 1441/1416/1441 1350/1402/1350\nf 1440/1409/1440 1350/1402/1350 1348/1405/1348\nf 1356/1417/1356 1357/1418/1357 1194/1229/1194\nf 1356/1417/1356 1194/1229/1194 1191/1232/1191\nf 90/1419/90 1358/1420/1358 1194/1229/1194\nf 90/1419/90 1194/1229/1194 1357/1418/1357\nf 1359/1421/1359 1360/1422/1360 1362/1283/1362\nf 1359/1421/1359 1362/1283/1362 1238/1282/1238\nf 1362/1283/1362 1363/1423/1363 1245/1317/1245\nf 1362/1283/1362 1245/1317/1245 1233/1270/1233\nf 1363/1423/1363 1364/1424/1364 1246/1318/1246\nf 1363/1423/1363 1246/1318/1246 1245/1317/1245\nf 1364/1424/1364 74/75/74 1280/53/1280\nf 1364/1424/1364 1280/53/1280 1246/1318/1246\nf 1366/1425/1366 1365/1426/1365 1364/1424/1364\nf 1366/1425/1366 1364/1424/1364 1363/1423/1363\nf 1365/1426/1365 77/78/77 74/75/74\nf 1365/1426/1365 74/75/74 1364/1424/1364\nf 1366/1425/1366 1367/1427/1367 1372/1428/1372\nf 1366/1425/1366 1372/1428/1372 1365/1426/1365\nf 1371/1429/1371 1368/1430/1368 1369/1431/1369\nf 1371/1429/1371 1369/1431/1369 1370/1432/1370\nf 1373/1433/1373 1372/1428/1372 1374/1434/1374\nf 1373/1433/1373 1374/1434/1374 1375/1435/1375\nf 1372/1428/1372 1373/1433/1373 88/89/88\nf 1372/1428/1372 88/89/88 80/88/80\nf 1374/1434/1374 1367/1427/1367 1370/1432/1370\nf 1374/1434/1374 1370/1432/1370 1369/1431/1369\nf 1376/1436/1376 1358/1437/1358 90/1438/90\nf 1376/1436/1376 90/1438/90 91/1439/91\nf 1376/1436/1376 91/1439/91 93/1440/93\nf 1376/1436/1376 93/1440/93 1375/1441/1375\nf 1368/1442/1368 1376/1436/1376 1377/1443/1377\nf 1368/1442/1368 1377/1443/1377 1369/1444/1369\nf 95/1445/95 1378/1446/1378 1375/1441/1375\nf 95/1445/95 1375/1441/1375 93/1440/93\nf 1373/1433/1373 1378/1447/1378 96/101/96\nf 1373/1433/1373 96/101/96 88/89/88\nf 948/944/948 1379/1448/1379 949/957/949\nf 948/944/948 949/957/949 959/945/959\nf 947/947/947 1380/844/1380 1379/1448/1379\nf 947/947/947 1379/1448/1379 948/944/948\nf 1381/1449/1381 1382/1450/1382 1383/1451/1383\nf 1381/1449/1381 1383/1451/1383 1384/1452/1384\nf 1382/1450/1382 438/1453/438 439/1454/439\nf 1382/1450/1382 439/1454/439 1383/1451/1383\nf 1382/1450/1382 1385/1455/1385 444/1456/444\nf 1382/1450/1382 444/1456/444 438/1453/438\nf 1382/1450/1382 1381/1449/1381 1386/1457/1386\nf 1382/1450/1382 1386/1457/1386 1385/1455/1385\nf 1386/1457/1386 1387/1458/1387 1388/1459/1388\nf 1386/1457/1386 1388/1459/1388 1385/1455/1385\nf 1388/1459/1388 445/1460/445 444/1456/444\nf 1388/1459/1388 444/1456/444 1385/1455/1385\nf 439/1454/439 1389/1461/1389 1390/1462/1390\nf 439/1454/439 1390/1462/1390 1383/1451/1383\nf 1390/1462/1390 1391/1463/1391 1384/1452/1384\nf 1390/1462/1390 1384/1452/1384 1383/1451/1383\nf 1389/1461/1389 1392/1464/1392 1393/1465/1393\nf 1389/1461/1389 1393/1465/1393 1390/1462/1390\nf 550/1466/550 445/1460/445 1398/1467/1398\nf 550/1466/550 1398/1467/1398 1397/1468/1397\nf 1397/1468/1397 1401/1469/1401 1402/1470/1402\nf 1397/1468/1397 1402/1470/1402 1395/1471/1395\nf 1396/1472/1396 1395/1471/1395 1402/1470/1402\nf 1396/1472/1396 1402/1470/1402 1404/1473/1404\nf 561/1474/561 595/1475/595 1411/1476/1411\nf 561/1474/561 1411/1476/1411 1412/1477/1412\nf 1404/1473/1404 1417/1478/1417 1416/1479/1416\nf 1404/1473/1404 1416/1479/1416 1405/1480/1405\nf 1418/1481/1418 1410/1482/1410 1409/1483/1409\nf 1418/1481/1418 1409/1483/1409 1417/1478/1417\nf 1409/1483/1409 1394/1484/1394 1405/1480/1405\nf 1409/1483/1409 1405/1480/1405 1416/1479/1416\nf 1421/1485/1421 1422/1486/1422 1423/1487/1423\nf 1421/1485/1421 1423/1487/1423 1424/1488/1424\nf 1425/1489/1425 1426/1490/1426 1427/1491/1427\nf 1425/1489/1425 1427/1491/1427 1421/1485/1421\nf 1422/1486/1422 1427/1491/1427 1428/1492/1428\nf 1422/1486/1422 1428/1492/1428 1423/1487/1423\nf 1429/1493/1429 1415/1494/1415 1420/1495/1420\nf 1429/1493/1429 1420/1495/1420 1419/1496/1419\nf 1412/1477/1412 1430/1497/1430 740/1498/740\nf 1412/1477/1412 740/1498/740 561/1474/561\nf 1412/1477/1412 1411/1476/1411 1415/1494/1415\nf 1412/1477/1412 1415/1494/1415 1429/1493/1429\nf 1411/1476/1411 745/1499/745 1410/1482/1410\nf 1411/1476/1411 1410/1482/1410 1413/1500/1413\nf 1434/1501/1434 111/1502/111 108/67/108\nf 1434/1501/1434 108/67/108 65/66/65\nf 1434/1501/1434 1435/1503/1435 107/1504/107\nf 1434/1501/1434 107/1504/107 111/1502/111\nf 1437/1336/1437 1436/1335/1436 1294/1400/1294\nf 1437/1336/1437 1294/1400/1294 1347/1505/1347\nf 1296/1506/1296 1438/1337/1438 1437/1336/1437\nf 1296/1506/1296 1437/1336/1437 1347/1505/1347\nf 1303/1346/1303 1439/1407/1439 1249/1406/1249\nf 1303/1346/1303 1249/1406/1249 1304/1507/1304\nf 1354/1347/1354 1441/1416/1441 1440/1409/1440\nf 1354/1347/1354 1440/1409/1440 1305/1345/1305\nf 1447/1508/1447 1449/1509/1449 1450/1510/1450\nf 1447/1508/1447 1450/1510/1450 1448/1511/1448\nf 1529/1512/1529 1531/1513/1531 1450/1510/1450\nf 1529/1512/1529 1450/1510/1450 1461/1514/1461\nf 1452/1515/1452 1453/1516/1453 1449/1509/1449\nf 1452/1515/1452 1449/1509/1449 1447/1508/1447\nf 1481/1517/1481 1509/1518/1509 1453/1516/1453\nf 1481/1517/1481 1453/1516/1453 1452/1515/1452\nf 1448/1511/1448 1464/1519/1464 1463/1520/1463\nf 1448/1511/1448 1463/1520/1463 1462/1521/1462\nf 1462/1521/1462 1465/1522/1465 1467/1523/1467\nf 1462/1521/1462 1467/1523/1467 1455/1524/1455\nf 1474/1525/1474 1475/1526/1475 1472/1527/1472\nf 1474/1525/1474 1472/1527/1472 1473/1528/1473\nf 1455/1524/1455 1467/1523/1467 1476/1529/1476\nf 1455/1524/1455 1476/1529/1476 1479/1530/1479\nf 1478/1531/1478 1480/1532/1480 1479/1530/1479\nf 1478/1531/1478 1479/1530/1479 1476/1529/1476\nf 1474/1525/1474 1471/1533/1471 1492/1534/1492\nf 1474/1525/1474 1492/1534/1492 1470/1535/1470\nf 1466/1536/1466 1484/1537/1484 1485/1538/1485\nf 1466/1536/1466 1485/1538/1485 1469/1539/1469\nf 1469/1539/1469 1485/1538/1485 1486/1540/1486\nf 1469/1539/1469 1486/1540/1486 1492/1534/1492\nf 1487/1541/1487 1490/1542/1490 1494/1543/1494\nf 1487/1541/1487 1494/1543/1494 1488/1544/1488\nf 1492/1534/1492 1494/1543/1494 1495/1545/1495\nf 1492/1534/1492 1495/1545/1495 1493/1546/1493\nf 1478/1531/1478 1513/1547/1513 1497/1548/1497\nf 1478/1531/1478 1497/1548/1497 1480/1532/1480\nf 1488/1544/1488 1494/1543/1494 1492/1534/1492\nf 1488/1544/1488 1492/1534/1492 1486/1540/1486\nf 1502/1549/1502 1504/1550/1504 1503/1551/1503\nf 1502/1549/1502 1503/1551/1503 1496/1552/1496\nf 1506/1553/1506 1508/1554/1508 1526/1555/1526\nf 1506/1553/1506 1526/1555/1526 1525/1556/1525\nf 1524/1557/1524 1523/1558/1523 1509/1518/1509\nf 1524/1557/1524 1509/1518/1509 1483/1559/1483\nf 1451/1560/1451 1450/1510/1450 1458/1561/1458\nf 1451/1560/1451 1458/1561/1458 1514/1562/1514\nf 1460/1563/1460 1518/1564/1518 1519/1565/1519\nf 1460/1563/1460 1519/1565/1519 1514/1562/1514\nf 1514/1562/1514 1519/1565/1519 1517/1566/1517\nf 1514/1562/1514 1517/1566/1517 1451/1560/1451\nf 1516/1567/1516 1520/1568/1520 1529/1512/1529\nf 1516/1567/1516 1529/1512/1529 1461/1514/1461\nf 1521/1569/1521 1507/1570/1507 1522/1571/1522\nf 1521/1569/1521 1522/1571/1522 1536/1572/1536\nf 1507/1570/1507 1521/1569/1521 1525/1556/1525\nf 1507/1570/1507 1525/1556/1525 1526/1555/1526\nf 1464/1519/1464 1531/1513/1531 1532/1573/1532\nf 1464/1519/1464 1532/1573/1532 1542/1574/1542\nf 1534/1575/1534 1533/1576/1533 1481/1517/1481\nf 1534/1575/1534 1481/1517/1481 1482/1577/1482\nf 1535/1578/1535 1534/1575/1534 1480/1532/1480\nf 1535/1578/1535 1480/1532/1480 1497/1548/1497\nf 1535/1579/1535 1497/1580/1497 1510/1581/1510\nf 1535/1579/1535 1510/1581/1510 1559/1582/1559\nf 1521/1569/1521 1538/1583/1538 1393/1584/1393\nf 1521/1569/1521 1393/1584/1393 1525/1556/1525\nf 1539/1585/1539 1568/1586/1568 1569/1587/1569\nf 1539/1585/1539 1569/1587/1569 1544/1588/1544\nf 1540/1589/1540 1538/1583/1538 1539/1585/1539\nf 1540/1589/1540 1539/1585/1539 1541/1590/1541\nf 1541/1591/1541 1464/1519/1464 1542/1574/1542\nf 1541/1591/1541 1542/1574/1542 1540/1592/1540\nf 1539/1585/1539 1544/1588/1544 1543/1593/1543\nf 1539/1585/1539 1543/1593/1543 1541/1590/1541\nf 1670/1594/1670 1669/1595/1669 1567/1596/1567\nf 1670/1594/1670 1567/1596/1567 1553/1597/1553\nf 1547/1598/1547 1671/1599/1671 1668/1600/1668\nf 1547/1598/1547 1668/1600/1668 1546/1601/1546\nf 1548/1602/1548 1550/1603/1550 1551/1604/1551\nf 1548/1602/1548 1551/1604/1551 1549/1605/1549\nf 1558/1606/1558 1554/1607/1554 1548/1602/1548\nf 1558/1606/1558 1548/1602/1548 1545/1608/1545\nf 1548/1602/1548 1554/1607/1554 1556/1609/1556\nf 1548/1602/1548 1556/1609/1556 1550/1603/1550\nf 1550/1603/1550 1556/1609/1556 1589/1610/1589\nf 1550/1603/1550 1589/1610/1589 1591/1611/1591\nf 1559/1582/1559 1557/1612/1557 1558/1606/1558\nf 1559/1582/1559 1558/1606/1558 1555/1613/1555\nf 1572/1614/1572 1557/1612/1557 1559/1582/1559\nf 1572/1614/1572 1559/1582/1559 1560/1615/1560\nf 1565/1616/1565 1672/1617/1672 1671/1599/1671\nf 1565/1616/1565 1671/1599/1671 1547/1598/1547\nf 1564/1618/1564 1563/1619/1563 1672/1617/1672\nf 1564/1618/1564 1672/1617/1672 1565/1616/1565\nf 1566/1620/1566 1574/1621/1574 1565/1616/1565\nf 1566/1620/1566 1565/1616/1565 1547/1598/1547\nf 1546/1601/1546 1549/1605/1549 1566/1620/1566\nf 1546/1601/1546 1566/1620/1566 1547/1598/1547\nf 1537/1622/1537 1536/1572/1536 1522/1571/1522\nf 1537/1622/1537 1522/1571/1522 1567/1623/1567\nf 1537/1624/1537 1567/1596/1567 1669/1595/1669\nf 1537/1624/1537 1669/1595/1669 1668/1600/1668\nf 1537/1622/1537 1569/1587/1569 1568/1586/1568\nf 1537/1622/1537 1568/1586/1568 1536/1572/1536\nf 1566/1620/1566 1570/1625/1570 1571/1626/1571\nf 1566/1620/1566 1571/1626/1571 1574/1621/1574\nf 1570/1625/1570 1581/1627/1581 1579/1628/1579\nf 1570/1625/1570 1579/1628/1579 1571/1626/1571\nf 1549/1605/1549 1551/1604/1551 1570/1625/1570\nf 1549/1605/1549 1570/1625/1570 1566/1620/1566\nf 1561/1629/1561 1573/1630/1573 1572/1614/1572\nf 1561/1629/1561 1572/1614/1572 1560/1615/1560\nf 1576/1631/1576 1578/1632/1578 1573/1630/1573\nf 1576/1631/1576 1573/1630/1573 1561/1629/1561\nf 1391/1633/1391 1393/1584/1393 1538/1583/1538\nf 1391/1633/1391 1538/1583/1538 1540/1589/1540\nf 1381/1634/1381 1384/1635/1384 1528/1636/1528\nf 1381/1634/1381 1528/1636/1528 1516/1567/1516\nf 1542/1574/1542 1528/1636/1528 1384/1635/1384\nf 1542/1574/1542 1384/1635/1384 1391/1637/1391\nf 1562/1638/1562 1563/1639/1563 1564/1640/1564\nf 1562/1638/1562 1564/1640/1564 1576/1631/1576\nf 1577/1641/1577 1578/1632/1578 1574/1642/1574\nf 1577/1641/1577 1574/1642/1574 1571/1643/1571\nf 1580/1644/1580 1590/1645/1590 1592/1646/1592\nf 1580/1644/1580 1592/1646/1592 1584/1647/1584\nf 1585/1648/1585 1573/1630/1573 1578/1632/1578\nf 1585/1648/1585 1578/1632/1578 1577/1641/1577\nf 1572/1614/1572 1573/1630/1573 1585/1648/1585\nf 1572/1614/1572 1585/1648/1585 1586/1649/1586\nf 1586/1649/1586 1554/1607/1554 1557/1612/1557\nf 1586/1649/1586 1557/1612/1557 1572/1614/1572\nf 1592/1646/1592 1590/1645/1590 1581/1627/1581\nf 1592/1646/1592 1581/1627/1581 1593/1650/1593\nf 1588/1651/1588 1592/1646/1592 1593/1650/1593\nf 1588/1651/1588 1593/1650/1593 1591/1611/1591\nf 1582/1652/1582 1584/1647/1584 1592/1646/1592\nf 1582/1652/1582 1592/1646/1592 1588/1651/1588\nf 1595/1653/1595 1597/1654/1597 1596/1655/1596\nf 1595/1653/1595 1596/1655/1596 1594/1656/1594\nf 1604/1657/1604 1605/1658/1605 1602/1659/1602\nf 1604/1657/1604 1602/1659/1602 1614/1660/1614\nf 1605/1658/1605 1606/1661/1606 1594/1656/1594\nf 1605/1658/1605 1594/1656/1594 1596/1655/1596\nf 1601/1662/1601 1608/1663/1608 1607/1664/1607\nf 1601/1662/1601 1607/1664/1607 1615/1665/1615\nf 1599/1666/1599 1615/1665/1615 1614/1660/1614\nf 1599/1666/1599 1614/1660/1614 1602/1659/1602\nf 1609/1667/1609 1612/1668/1612 1613/1669/1613\nf 1609/1667/1609 1613/1669/1613 1610/1670/1610\nf 1610/1670/1610 1613/1669/1613 1629/1671/1629\nf 1610/1670/1610 1629/1671/1629 1604/1657/1604\nf 1604/1657/1604 1629/1671/1629 1606/1661/1606\nf 1604/1657/1604 1606/1661/1606 1605/1658/1605\nf 1600/1672/1600 1617/1673/1617 1626/1674/1626\nf 1600/1672/1600 1626/1674/1626 1733/1675/1733\nf 1617/1673/1617 1618/1676/1618 1619/1677/1619\nf 1617/1673/1617 1619/1677/1619 1626/1674/1626\nf 1618/1676/1618 1620/1678/1620 1621/1679/1621\nf 1618/1676/1618 1621/1679/1621 1619/1677/1619\nf 1623/1680/1623 1624/1681/1624 1621/1679/1621\nf 1623/1680/1623 1621/1679/1621 1620/1678/1620\nf 1586/1682/1586 1623/1680/1623 1620/1678/1620\nf 1586/1682/1586 1620/1678/1620 1587/1683/1587\nf 1594/1656/1594 1629/1671/1629 1628/1684/1628\nf 1594/1656/1594 1628/1684/1628 1585/1685/1585\nf 1623/1680/1623 1585/1685/1585 1628/1684/1628\nf 1623/1680/1623 1628/1684/1628 1624/1681/1624\nf 1627/1686/1627 1626/1674/1626 1619/1677/1619\nf 1627/1686/1627 1619/1677/1619 1718/1687/1718\nf 1617/1673/1617 1600/1672/1600 1584/1647/1584\nf 1617/1673/1617 1584/1647/1584 1582/1652/1582\nf 1618/1676/1618 1583/1688/1583 1587/1683/1587\nf 1618/1676/1618 1587/1683/1587 1620/1678/1620\nf 1582/1652/1582 1583/1688/1583 1618/1676/1618\nf 1582/1652/1582 1618/1676/1618 1617/1673/1617\nf 1597/1689/1597 1580/1644/1580 1584/1647/1584\nf 1597/1689/1597 1584/1647/1584 1598/1690/1598\nf 1624/1681/1624 1628/1684/1628 1630/1691/1630\nf 1624/1681/1624 1630/1691/1630 1622/1692/1622\nf 1630/1691/1630 1632/1693/1632 1631/1694/1631\nf 1630/1691/1630 1631/1694/1631 1622/1692/1622\nf 1632/1695/1632 1634/1696/1634 1633/1697/1633\nf 1632/1695/1632 1633/1697/1633 1631/1698/1631\nf 1634/1696/1634 1636/1699/1636 1635/1700/1635\nf 1634/1696/1634 1635/1700/1635 1633/1697/1633\nf 1636/1699/1636 1638/1701/1638 1637/1702/1637\nf 1636/1699/1636 1637/1702/1637 1635/1700/1635\nf 1637/1702/1637 1638/1701/1638 1646/1703/1646\nf 1637/1702/1637 1646/1703/1646 1639/1704/1639\nf 1641/1705/1641 1665/1706/1665 1647/1707/1647\nf 1641/1705/1641 1647/1707/1647 1645/1708/1645\nf 1647/1707/1647 1665/1706/1665 1643/1709/1643\nf 1647/1707/1647 1643/1709/1643 1648/1710/1648\nf 1640/1711/1640 1645/1708/1645 1647/1707/1647\nf 1640/1711/1640 1647/1707/1647 1667/1712/1667\nf 1667/1712/1667 1647/1707/1647 1648/1710/1648\nf 1667/1712/1667 1648/1710/1648 1642/1713/1642\nf 1654/1714/1654 1637/1702/1637 1639/1704/1639\nf 1654/1714/1654 1639/1704/1639 1658/1715/1658\nf 1636/1699/1636 1634/1696/1634 1655/1716/1655\nf 1636/1699/1636 1655/1716/1655 1650/1717/1650\nf 1630/1691/1630 1652/1718/1652 1651/1719/1651\nf 1630/1691/1630 1651/1719/1651 1632/1693/1632\nf 1634/1696/1634 1632/1695/1632 1651/1720/1651\nf 1634/1696/1634 1651/1720/1651 1655/1716/1655\nf 1631/1694/1631 1653/1721/1653 1675/1722/1675\nf 1631/1694/1631 1675/1722/1675 1622/1692/1622\nf 1633/1697/1633 1654/1714/1654 1653/1723/1653\nf 1633/1697/1633 1653/1723/1653 1631/1698/1631\nf 1650/1717/1650 1680/1724/1680 1656/1725/1656\nf 1650/1717/1650 1656/1725/1656 1646/1703/1646\nf 1656/1725/1656 1657/1726/1657 1649/1727/1649\nf 1656/1725/1656 1649/1727/1649 1646/1703/1646\nf 1651/1720/1651 1763/1728/1763 1680/1724/1680\nf 1651/1720/1651 1680/1724/1680 1655/1716/1655\nf 1663/1729/1663 1664/1730/1664 1658/1715/1658\nf 1663/1729/1663 1658/1715/1658 1639/1704/1639\nf 1664/1730/1664 1660/1731/1660 1659/1732/1659\nf 1664/1730/1664 1659/1732/1659 1658/1715/1658\nf 1656/1725/1656 1659/1733/1659 1660/1734/1660\nf 1656/1725/1656 1660/1734/1660 1657/1726/1657\nf 1657/1726/1657 1662/1735/1662 1661/1736/1661\nf 1657/1726/1657 1661/1736/1661 1649/1727/1649\nf 1662/1737/1662 1664/1730/1664 1663/1729/1663\nf 1662/1737/1662 1663/1729/1663 1661/1738/1661\nf 1661/1736/1661 1666/1739/1666 1665/1706/1665\nf 1661/1736/1661 1665/1706/1665 1676/1740/1676\nf 1667/1712/1667 1666/1741/1666 1661/1738/1661\nf 1667/1712/1667 1661/1738/1661 1677/1742/1677\nf 1643/1709/1643 1665/1706/1665 1666/1739/1666\nf 1643/1709/1643 1666/1739/1666 1644/1743/1644\nf 1666/1741/1666 1667/1712/1667 1642/1713/1642\nf 1666/1741/1666 1642/1713/1642 1644/1743/1644\nf 1668/1600/1668 1669/1595/1669 1552/1744/1552\nf 1668/1600/1668 1552/1744/1552 1546/1601/1546\nf 1669/1595/1669 1670/1594/1670 1545/1608/1545\nf 1669/1595/1669 1545/1608/1545 1552/1744/1552\nf 1537/1624/1537 1668/1600/1668 1671/1599/1671\nf 1537/1624/1537 1671/1599/1671 1569/1745/1569\nf 1569/1745/1569 1671/1599/1671 1672/1617/1672\nf 1569/1745/1569 1672/1617/1672 1544/1746/1544\nf 1673/1747/1673 1718/1687/1718 1619/1677/1619\nf 1673/1747/1673 1619/1677/1619 1621/1679/1621\nf 1659/1732/1659 1679/1748/1679 1678/1749/1678\nf 1659/1732/1659 1678/1749/1678 1658/1715/1658\nf 1656/1725/1656 1680/1724/1680 1679/1750/1679\nf 1656/1725/1656 1679/1750/1679 1659/1733/1659\nf 1679/1748/1679 1683/1751/1683 1682/1752/1682\nf 1679/1748/1679 1682/1752/1682 1678/1749/1678\nf 1680/1724/1680 1681/1753/1681 1683/1754/1683\nf 1680/1724/1680 1683/1754/1683 1679/1750/1679\nf 1678/1749/1678 1682/1752/1682 1653/1723/1653\nf 1678/1749/1678 1653/1723/1653 1654/1714/1654\nf 1685/1755/1685 1684/1756/1684 1674/1757/1674\nf 1685/1755/1685 1674/1757/1674 1675/1758/1675\nf 1685/1755/1685 1687/1759/1687 1686/1760/1686\nf 1685/1755/1685 1686/1760/1686 1684/1756/1684\nf 1687/1759/1687 1689/1761/1689 1688/1762/1688\nf 1687/1759/1687 1688/1762/1688 1686/1760/1686\nf 1688/1762/1688 1689/1761/1689 1691/1763/1691\nf 1688/1762/1688 1691/1763/1691 1690/1764/1690\nf 1693/1765/1693 1695/1766/1695 1694/1767/1694\nf 1693/1765/1693 1694/1767/1694 1692/1768/1692\nf 1696/1769/1696 1692/1768/1692 1694/1767/1694\nf 1696/1769/1696 1694/1767/1694 1697/1770/1697\nf 1699/1771/1699 1688/1762/1688 1690/1764/1690\nf 1699/1771/1699 1690/1764/1690 1700/1772/1700\nf 1693/1765/1693 1691/1763/1691 1705/1773/1705\nf 1693/1765/1693 1705/1773/1705 1702/1774/1702\nf 1687/1759/1687 1685/1755/1685 1704/1775/1704\nf 1687/1759/1687 1704/1775/1704 1703/1776/1703\nf 1703/1776/1703 1714/1777/1714 1705/1773/1705\nf 1703/1776/1703 1705/1773/1705 1691/1763/1691\nf 1701/1778/1701 1706/1779/1706 1707/1780/1707\nf 1701/1778/1701 1707/1780/1707 1700/1772/1700\nf 1705/1773/1705 1707/1781/1707 1706/1782/1706\nf 1705/1773/1705 1706/1782/1706 1702/1774/1702\nf 1708/1783/1708 1712/1784/1712 1695/1766/1695\nf 1708/1783/1708 1695/1766/1695 1710/1785/1710\nf 1697/1770/1697 1712/1786/1712 1708/1787/1708\nf 1697/1770/1697 1708/1787/1708 1711/1788/1711\nf 1707/1780/1707 1713/1789/1713 1699/1771/1699\nf 1707/1780/1707 1699/1771/1699 1700/1772/1700\nf 1705/1773/1705 1714/1777/1714 1713/1790/1713\nf 1705/1773/1705 1713/1790/1713 1707/1781/1707\nf 1625/1791/1625 1716/1792/1716 1717/1793/1717\nf 1625/1791/1625 1717/1793/1717 1673/1747/1673\nf 1684/1756/1684 1699/1771/1699 1716/1794/1716\nf 1684/1756/1684 1716/1794/1716 1674/1757/1674\nf 1627/1686/1627 1719/1795/1719 1733/1675/1733\nf 1627/1686/1627 1733/1675/1733 1626/1674/1626\nf 1718/1687/1718 1720/1796/1720 1719/1795/1719\nf 1718/1687/1718 1719/1795/1719 1627/1686/1627\nf 1683/1797/1683 1721/1798/1721 1726/1799/1726\nf 1683/1797/1683 1726/1799/1726 1682/1800/1682\nf 1681/1801/1681 1765/1802/1765 1721/1798/1721\nf 1681/1801/1681 1721/1798/1721 1683/1797/1683\nf 1721/1798/1721 1723/1803/1723 1725/1804/1725\nf 1721/1798/1721 1725/1804/1725 1726/1799/1726\nf 1765/1802/1765 1722/1805/1722 1723/1803/1723\nf 1765/1802/1765 1723/1803/1723 1721/1798/1721\nf 1723/1803/1723 1724/1806/1724 1717/1793/1717\nf 1723/1803/1723 1717/1793/1717 1725/1804/1725\nf 1722/1805/1722 1727/1807/1727 1724/1806/1724\nf 1722/1805/1722 1724/1806/1724 1723/1803/1723\nf 1690/1764/1690 1696/1769/1696 1701/1778/1701\nf 1690/1764/1690 1701/1778/1701 1700/1772/1700\nf 1725/1808/1725 1699/1771/1699 1713/1789/1713\nf 1725/1808/1725 1713/1789/1713 1726/1809/1726\nf 1628/1684/1628 1629/1671/1629 1728/1810/1728\nf 1628/1684/1628 1728/1810/1728 1652/1718/1652\nf 1612/1668/1612 1727/1811/1727 1729/1812/1729\nf 1612/1668/1612 1729/1812/1729 1613/1669/1613\nf 1764/1813/1764 1730/1814/1730 1731/1815/1731\nf 1764/1813/1764 1731/1815/1731 1722/1816/1722\nf 1727/1811/1727 1722/1816/1722 1731/1815/1731\nf 1727/1811/1727 1731/1815/1731 1729/1812/1729\nf 1629/1671/1629 1613/1669/1613 1729/1812/1729\nf 1629/1671/1629 1729/1812/1729 1728/1810/1728\nf 1652/1718/1652 1728/1810/1728 1732/1817/1732\nf 1652/1718/1652 1732/1817/1732 1734/1818/1734\nf 1726/1819/1726 1713/1790/1713 1714/1777/1714\nf 1726/1819/1726 1714/1777/1714 1715/1820/1715\nf 1611/1821/1611 1720/1822/1720 1727/1811/1727\nf 1611/1821/1611 1727/1811/1727 1612/1668/1612\nf 1611/1821/1611 1608/1663/1608 1719/1823/1719\nf 1611/1821/1611 1719/1823/1719 1720/1822/1720\nf 1733/1824/1733 1719/1823/1719 1608/1663/1608\nf 1733/1824/1733 1608/1663/1608 1601/1662/1601\nf 1734/1825/1734 1732/1826/1732 1736/1827/1736\nf 1734/1825/1734 1736/1827/1736 1735/1828/1735\nf 1735/1828/1735 1736/1827/1736 1737/1829/1737\nf 1735/1828/1735 1737/1829/1737 1738/1830/1738\nf 1737/1829/1737 1739/1831/1739 1740/1832/1740\nf 1737/1829/1737 1740/1832/1740 1738/1830/1738\nf 1743/1833/1743 1744/1834/1744 1742/1835/1742\nf 1743/1833/1743 1742/1835/1742 1741/1836/1741\nf 1746/1837/1746 1747/1838/1747 1743/1833/1743\nf 1746/1837/1746 1743/1833/1743 1741/1836/1741\nf 1748/1839/1748 1749/1840/1749 1739/1831/1739\nf 1748/1839/1748 1739/1831/1739 1737/1829/1737\nf 1742/1835/1742 1750/1841/1750 1751/1842/1751\nf 1742/1835/1742 1751/1842/1751 1740/1832/1740\nf 1752/1843/1752 1740/1832/1740 1751/1842/1751\nf 1752/1843/1752 1751/1842/1751 1753/1844/1753\nf 1755/1845/1755 1749/1840/1749 1756/1846/1756\nf 1755/1845/1755 1756/1846/1756 1754/1847/1754\nf 1751/1842/1751 1750/1841/1750 1754/1848/1754\nf 1751/1842/1751 1754/1848/1754 1756/1849/1756\nf 1757/1850/1757 1759/1851/1759 1744/1834/1744\nf 1757/1850/1757 1744/1834/1744 1761/1852/1761\nf 1747/1838/1747 1760/1853/1760 1757/1854/1757\nf 1747/1838/1747 1757/1854/1757 1761/1855/1761\nf 1756/1846/1756 1749/1840/1749 1748/1839/1748\nf 1756/1846/1756 1748/1839/1748 1762/1856/1762\nf 1751/1842/1751 1756/1849/1756 1762/1857/1762\nf 1751/1842/1751 1762/1857/1762 1753/1844/1753\nf 1739/1831/1739 1749/1840/1749 1755/1845/1755\nf 1739/1831/1739 1755/1845/1755 1746/1837/1746\nf 1762/1856/1762 1748/1839/1748 1764/1858/1764\nf 1762/1856/1762 1764/1858/1764 1766/1859/1766\nf 1766/1860/1766 1763/1861/1763 1753/1844/1753\nf 1766/1860/1766 1753/1844/1753 1762/1857/1762\nf 1519/1565/1519 1767/1862/1767 1386/1863/1386\nf 1519/1565/1519 1386/1863/1386 1381/1634/1381\nf 1386/1863/1386 1768/1864/1768 1769/1865/1769\nf 1386/1863/1386 1769/1865/1769 1387/1866/1387\nf 1768/1864/1768 1456/1867/1456 1457/1868/1457\nf 1768/1864/1768 1457/1868/1457 1769/1865/1769\nf 1392/1869/1392 452/1870/452 1506/1871/1506\nf 1392/1869/1392 1506/1871/1506 1393/1872/1393\nf 452/1870/452 453/1873/453 1794/1874/1794\nf 452/1870/452 1794/1874/1794 1506/1871/1506\nf 453/1873/453 455/1875/455 1773/1876/1773\nf 453/1873/453 1773/1876/1773 1794/1874/1794\nf 455/1875/455 457/1877/457 1774/1878/1774\nf 455/1875/455 1774/1878/1774 1773/1876/1773\nf 457/1877/457 459/1879/459 1775/1880/1775\nf 457/1877/457 1775/1880/1775 1774/1878/1774\nf 459/1879/459 461/1881/461 1776/1882/1776\nf 459/1879/459 1776/1882/1776 1775/1880/1775\nf 461/1881/461 463/1883/463 1777/1884/1777\nf 461/1881/461 1777/1884/1777 1776/1882/1776\nf 463/1883/463 465/1885/465 1778/1886/1778\nf 463/1883/463 1778/1886/1778 1777/1884/1777\nf 465/1885/465 467/1887/467 1779/1888/1779\nf 465/1885/465 1779/1888/1779 1778/1886/1778\nf 1775/1880/1775 1829/1889/1829 1780/1890/1780\nf 1775/1880/1775 1780/1890/1780 1774/1878/1774\nf 1776/1882/1776 1782/1891/1782 1781/1892/1781\nf 1776/1882/1776 1781/1892/1781 1775/1880/1775\nf 1777/1884/1777 1783/1893/1783 1782/1891/1782\nf 1777/1884/1777 1782/1891/1782 1776/1882/1776\nf 1778/1886/1778 1784/1894/1784 1783/1893/1783\nf 1778/1886/1778 1783/1893/1783 1777/1884/1777\nf 1779/1888/1779 473/1895/473 1784/1894/1784\nf 1779/1888/1779 1784/1894/1784 1778/1886/1778\nf 1780/1890/1780 1785/1896/1785 1773/1876/1773\nf 1780/1890/1780 1773/1876/1773 1774/1878/1774\nf 1780/1890/1780 1806/1897/1806 1786/1898/1786\nf 1780/1890/1780 1786/1898/1786 1785/1896/1785\nf 1786/1898/1786 1788/1899/1788 1787/1900/1787\nf 1786/1898/1786 1787/1900/1787 1785/1896/1785\nf 1787/1900/1787 1791/1901/1791 1790/1902/1790\nf 1787/1900/1787 1790/1902/1790 1785/1896/1785\nf 1793/1903/1793 1795/1904/1795 1794/1874/1794\nf 1793/1903/1793 1794/1874/1794 1790/1902/1790\nf 1793/1903/1793 1826/1905/1826 1797/1906/1797\nf 1793/1903/1793 1797/1906/1797 1795/1904/1795\nf 1798/1907/1798 1800/1908/1800 1801/1909/1801\nf 1798/1907/1798 1801/1909/1801 1799/1910/1799\nf 1798/1907/1798 1802/1911/1802 1803/1912/1803\nf 1798/1907/1798 1803/1912/1803 1800/1908/1800\nf 1803/1912/1803 494/1913/494 493/1914/493\nf 1803/1912/1803 493/1914/493 1800/1908/1800\nf 1799/1910/1799 1804/1915/1804 495/1916/495\nf 1799/1910/1799 495/1916/495 1806/1897/1806\nf 1801/1909/1801 1805/1917/1805 1804/1915/1804\nf 1801/1909/1801 1804/1915/1804 1799/1910/1799\nf 1506/1871/1506 1794/1874/1794 1795/1904/1795\nf 1506/1871/1506 1795/1904/1795 1508/1918/1508\nf 1790/1902/1790 1794/1874/1794 1773/1876/1773\nf 1790/1902/1790 1773/1876/1773 1785/1896/1785\nf 1800/1908/1800 493/1914/493 1805/1917/1805\nf 1800/1908/1800 1805/1917/1805 1801/1909/1801\nf 1807/1919/1807 1811/1920/1811 1813/1921/1813\nf 1807/1919/1807 1813/1921/1813 1786/1898/1786\nf 1815/1922/1815 1817/1923/1817 1816/1924/1816\nf 1815/1922/1815 1816/1924/1816 1810/1925/1810\nf 1792/1926/1792 1810/1925/1810 1816/1924/1816\nf 1792/1926/1792 1816/1924/1816 1826/1905/1826\nf 1811/1920/1811 1809/1927/1809 1833/1928/1833\nf 1811/1920/1811 1833/1928/1833 1821/1929/1821\nf 1819/1930/1819 1811/1920/1811 1821/1929/1821\nf 1819/1930/1819 1821/1929/1821 1818/1931/1818\nf 1822/1932/1822 1508/1918/1508 1795/1904/1795\nf 1822/1932/1822 1795/1904/1795 1797/1906/1797\nf 513/1933/513 521/1934/521 1818/1931/1818\nf 513/1933/513 1818/1931/1818 1821/1929/1821\nf 1827/1935/1827 522/1936/522 546/1937/546\nf 1827/1935/1827 546/1937/546 1838/1938/1838\nf 1782/1891/1782 524/1939/524 523/1940/523\nf 1782/1891/1782 523/1940/523 1781/1892/1781\nf 1783/1893/1783 525/1941/525 524/1939/524\nf 1783/1893/1783 524/1939/524 1782/1891/1782\nf 1784/1894/1784 526/1942/526 525/1941/525\nf 1784/1894/1784 525/1941/525 1783/1893/1783\nf 1831/1943/1831 1832/1944/1832 1803/1912/1803\nf 1831/1943/1831 1803/1912/1803 1802/1911/1802\nf 1837/1945/1837 1835/1946/1835 1834/1947/1834\nf 1837/1945/1837 1834/1947/1834 1822/1932/1822\nf 1835/1946/1835 1837/1945/1837 1839/1948/1839\nf 1835/1946/1835 1839/1948/1839 1836/1949/1836\nf 1838/1938/1838 546/1937/546 547/1950/547\nf 1838/1938/1838 547/1950/547 1841/1951/1841\nf 1772/1952/1772 1523/1558/1523 1524/1557/1524\nf 1772/1952/1772 1524/1557/1524 1847/1953/1847\nf 1847/1953/1847 1850/1954/1850 1852/1955/1852\nf 1847/1953/1847 1852/1955/1852 1851/1956/1851\nf 1848/1957/1848 1856/1958/1856 1865/1959/1865\nf 1848/1957/1848 1865/1959/1865 1857/1960/1857\nf 1770/1961/1770 1869/1962/1869 1870/1963/1870\nf 1770/1961/1770 1870/1963/1870 1843/1964/1843\nf 1402/1965/1402 1871/1966/1871 1872/1967/1872\nf 1402/1965/1402 1872/1967/1872 1404/1968/1404\nf 1871/1966/1871 1402/1965/1402 1870/1969/1870\nf 1871/1966/1871 1870/1969/1870 1869/1970/1869\nf 1872/1967/1872 1418/1971/1418 1417/1972/1417\nf 1872/1967/1872 1417/1972/1417 1404/1968/1404\nf 1426/1973/1426 1429/1974/1429 2164/1975/2164\nf 1426/1973/1426 2164/1975/2164 2158/1976/2158\nf 2221/1977/2221 1874/1978/1874 1877/1979/1877\nf 2221/1977/2221 1877/1979/1877 2222/1980/2222\nf 1877/1979/1877 1884/1981/1884 1885/1982/1885\nf 1877/1979/1877 1885/1982/1885 2223/1983/2223\nf 1886/1984/1886 2223/1983/2223 1885/1982/1885\nf 1886/1984/1886 1885/1982/1885 1887/1985/1887\nf 1901/1986/1901 1898/1987/1898 1887/1988/1887\nf 1901/1986/1901 1887/1988/1887 1885/1989/1885\nf 547/1950/547 625/1990/625 1892/1991/1892\nf 547/1950/547 1892/1991/1892 1841/1951/1841\nf 1890/1992/1890 1891/1993/1891 1892/1991/1892\nf 1890/1992/1890 1892/1991/1892 1893/1994/1893\nf 1860/1995/1860 1859/1996/1859 1890/1992/1890\nf 1860/1995/1860 1890/1992/1890 1893/1994/1893\nf 1860/1997/1860 1893/1998/1893 1884/1999/1884\nf 1860/1997/1860 1884/1999/1884 1877/2000/1877\nf 1402/1965/1402 1401/2001/1401 1403/2002/1403\nf 1402/1965/1402 1403/2002/1403 1870/1969/1870\nf 1418/1971/1418 1872/1967/1872 1873/2003/1873\nf 1418/1971/1418 1873/2003/1873 1419/2004/1419\nf 1898/1987/1898 646/2005/646 647/2006/647\nf 1898/1987/1898 647/2006/647 1899/2007/1899\nf 647/2006/647 649/2008/649 1928/2009/1928\nf 647/2006/647 1928/2009/1928 1899/2007/1899\nf 1896/2010/1896 1904/2011/1904 1903/2012/1903\nf 1896/2010/1896 1903/2012/1903 1895/2013/1895\nf 1894/2014/1894 1905/2015/1905 1906/2016/1906\nf 1894/2014/1894 1906/2016/1906 1896/2010/1896\nf 1896/2010/1896 1906/2016/1906 1907/2017/1907\nf 1896/2010/1896 1907/2017/1907 1904/2011/1904\nf 1925/2018/1925 1909/2019/1909 1908/2020/1908\nf 1925/2018/1925 1908/2020/1908 1905/2021/1905\nf 1906/2016/1906 1908/2022/1908 1910/2023/1910\nf 1906/2016/1906 1910/2023/1910 1907/2017/1907\nf 1908/2020/1908 1909/2019/1909 1915/2024/1915\nf 1908/2020/1908 1915/2024/1915 1914/2025/1914\nf 1908/2022/1908 1914/2026/1914 1916/2027/1916\nf 1908/2022/1908 1916/2027/1916 1910/2023/1910\nf 1914/2025/1914 1915/2024/1915 1912/2028/1912\nf 1914/2025/1914 1912/2028/1912 1917/2029/1917\nf 1913/2030/1913 1916/2027/1916 1914/2026/1914\nf 1913/2030/1913 1914/2026/1914 1917/2031/1917\nf 1925/2018/1925 1924/2032/1924 1919/2033/1919\nf 1925/2018/1925 1919/2033/1919 1909/2019/1909\nf 1910/2023/1910 1920/2034/1920 1918/2035/1918\nf 1910/2023/1910 1918/2035/1918 1907/2017/1907\nf 1915/2024/1915 1922/2036/1922 1921/2037/1921\nf 1915/2024/1915 1921/2037/1921 1912/2028/1912\nf 1916/2027/1916 1923/2038/1923 1920/2034/1920\nf 1916/2027/1916 1920/2034/1920 1910/2023/1910\nf 1909/2019/1909 1919/2033/1919 1922/2036/1922\nf 1909/2019/1909 1922/2036/1922 1915/2024/1915\nf 1913/2030/1913 1921/2037/1921 1923/2038/1923\nf 1913/2030/1913 1923/2038/1923 1916/2027/1916\nf 1923/2038/1923 1922/2036/1922 1919/2033/1919\nf 1923/2038/1923 1919/2033/1919 1920/2034/1920\nf 1920/2034/1920 1919/2033/1919 1924/2032/1924\nf 1920/2034/1920 1924/2032/1924 1926/2039/1926\nf 1926/2039/1926 1929/2040/1929 1927/2041/1927\nf 1926/2039/1926 1927/2041/1927 1918/2035/1918\nf 1927/2041/1927 1904/2011/1904 1907/2017/1907\nf 1927/2041/1927 1907/2017/1907 1918/2035/1918\nf 1925/2018/1925 1928/2042/1928 1930/2043/1930\nf 1925/2018/1925 1930/2043/1930 1924/2032/1924\nf 2143/2044/2143 2000/2045/2000 1932/2046/1932\nf 2143/2044/2143 1932/2046/1932 1931/2047/1931\nf 2143/2044/2143 1931/2047/1931 1935/2048/1935\nf 2143/2044/2143 1935/2048/1935 1934/2049/1934\nf 1933/2050/1933 1937/2051/1937 1936/2052/1936\nf 1933/2050/1933 1936/2052/1936 1932/2053/1932\nf 1933/2050/1933 1949/2054/1949 1939/2055/1939\nf 1933/2050/1933 1939/2055/1939 1937/2051/1937\nf 1938/2056/1938 1960/2057/1960 1941/2058/1941\nf 1938/2056/1938 1941/2058/1941 1935/2048/1935\nf 1939/2055/1939 1949/2054/1949 1948/2059/1948\nf 1939/2055/1939 1948/2059/1948 1942/2060/1942\nf 1944/2061/1944 1947/2062/1947 1946/2063/1946\nf 1944/2061/1944 1946/2063/1946 1945/2064/1945\nf 1940/2065/1940 1946/2063/1946 1947/2062/1947\nf 1940/2065/1940 1947/2062/1947 1950/2066/1950\nf 1943/2067/1943 1948/2059/1948 1949/2054/1949\nf 1943/2067/1943 1949/2054/1949 1940/2065/1940\nf 1947/2062/1947 1953/2068/1953 1952/2069/1952\nf 1947/2062/1947 1952/2069/1952 1950/2066/1950\nf 1955/2070/1955 1934/2049/1934 1935/2048/1935\nf 1955/2070/1955 1935/2048/1935 1941/2058/1941\nf 1956/2071/1956 1986/2072/1986 1985/2073/1985\nf 1956/2071/1956 1985/2073/1985 1957/2074/1957\nf 1931/2047/1931 1959/2075/1959 1938/2056/1938\nf 1931/2047/1931 1938/2056/1938 1935/2048/1935\nf 1937/2051/1937 1962/2076/1962 1961/2077/1961\nf 1937/2051/1937 1961/2077/1961 1936/2052/1936\nf 1959/2075/1959 1965/2078/1965 1963/2079/1963\nf 1959/2075/1959 1963/2079/1963 1938/2056/1938\nf 1964/2080/1964 1962/2076/1962 1937/2051/1937\nf 1964/2080/1964 1937/2051/1937 1939/2055/1939\nf 1960/2057/1960 1966/2081/1966 1971/2082/1971\nf 1960/2057/1960 1971/2082/1971 1942/2060/1942\nf 1942/2060/1942 1971/2082/1971 1964/2080/1964\nf 1942/2060/1942 1964/2080/1964 1939/2055/1939\nf 1936/2083/1936 1961/2084/1961 1965/2078/1965\nf 1936/2083/1936 1965/2078/1965 1959/2075/1959\nf 1938/2056/1938 1963/2079/1963 1966/2081/1966\nf 1938/2056/1938 1966/2081/1966 1960/2057/1960\nf 1961/2084/1961 1967/2085/1967 1969/2086/1969\nf 1961/2084/1961 1969/2086/1969 1965/2078/1965\nf 1964/2080/1964 1972/2087/1972 1967/2088/1967\nf 1964/2080/1964 1967/2088/1967 1962/2076/1962\nf 1963/2079/1963 1969/2086/1969 1970/2089/1970\nf 1963/2079/1963 1970/2089/1970 1966/2081/1966\nf 1970/2089/1970 1968/2090/1968 1971/2082/1971\nf 1970/2089/1970 1971/2082/1971 1966/2081/1966\nf 1972/2087/1972 1964/2080/1964 1971/2082/1971\nf 1972/2087/1972 1971/2082/1971 1968/2090/1968\nf 1967/2088/1967 1972/2087/1972 1976/2091/1976\nf 1967/2088/1967 1976/2091/1976 1973/2092/1973\nf 1969/2086/1969 1973/2093/1973 1974/2094/1974\nf 1969/2086/1969 1974/2094/1974 1970/2089/1970\nf 1970/2089/1970 1974/2094/1974 1975/2095/1975\nf 1970/2089/1970 1975/2095/1975 1968/2090/1968\nf 1972/2087/1972 1968/2090/1968 1975/2095/1975\nf 1972/2087/1972 1975/2095/1975 1976/2091/1976\nf 2005/2096/2005 1933/2050/1933 2004/2097/2004\nf 2005/2096/2005 2004/2097/2004 1978/2098/1978\nf 649/2099/649 731/2100/731 1980/2101/1980\nf 649/2099/649 1980/2101/1980 1928/2102/1928\nf 1978/2103/1978 1981/2104/1981 733/2105/733\nf 1978/2103/1978 733/2105/733 700/2106/700\nf 1930/2107/1930 1980/2101/1980 1981/2104/1981\nf 1930/2107/1930 1981/2104/1981 1979/2108/1979\nf 1980/2101/1980 731/2100/731 736/2109/736\nf 1980/2101/1980 736/2109/736 1982/2110/1982\nf 1981/2104/1981 1983/2111/1983 738/2112/738\nf 1981/2104/1981 738/2112/738 733/2105/733\nf 1981/2104/1981 1980/2101/1980 1982/2110/1982\nf 1981/2104/1981 1982/2110/1982 1983/2111/1983\nf 1990/2113/1990 1994/2114/1994 1992/2115/1992\nf 1990/2113/1990 1992/2115/1992 1987/2116/1987\nf 1993/2117/1993 1995/2118/1995 1994/2114/1994\nf 1993/2117/1993 1994/2114/1994 1990/2113/1990\nf 1929/2119/1929 1979/2120/1979 2150/2121/2150\nf 1929/2119/1929 2150/2121/2150 2149/2122/2149\nf 1933/2050/1933 2005/2096/2005 692/2123/692\nf 1933/2050/1933 692/2123/692 1946/2063/1946\nf 1996/2124/1996 2008/2125/2008 2006/2126/2006\nf 1996/2124/1996 2006/2126/2006 1991/2127/1991\nf 1993/2117/1993 1991/2127/1991 2006/2126/2006\nf 1993/2117/1993 2006/2126/2006 1995/2118/1995\nf 777/2128/777 2009/2129/2009 2018/2130/2018\nf 777/2128/777 2018/2130/2018 754/2131/754\nf 756/2132/756 783/2133/783 2015/2134/2015\nf 756/2132/756 2015/2134/2015 2014/2135/2014\nf 2022/2136/2022 2031/2137/2031 2032/2138/2032\nf 2022/2136/2022 2032/2138/2032 2025/2139/2025\nf 2017/2140/2017 2037/2141/2037 2011/2142/2011\nf 2017/2140/2017 2011/2142/2011 2013/2143/2013\nf 2007/2144/2007 2040/2145/2040 2041/2146/2041\nf 2007/2144/2007 2041/2146/2041 2030/2147/2030\nf 2042/2148/2042 2041/2146/2041 2040/2145/2040\nf 2042/2148/2042 2040/2145/2040 2038/2149/2038\nf 2039/2150/2039 2048/2151/2048 2041/2146/2041\nf 2039/2150/2039 2041/2146/2041 2042/2148/2042\nf 2043/2152/2043 2049/2153/2049 2048/2151/2048\nf 2043/2152/2043 2048/2151/2048 2039/2150/2039\nf 2059/2154/2059 2058/2155/2058 2032/2138/2032\nf 2059/2154/2059 2032/2138/2032 2051/2156/2051\nf 2068/2157/2068 2069/2158/2069 2070/2159/2070\nf 2068/2157/2068 2070/2159/2070 2067/2160/2067\nf 2067/2160/2067 2076/2161/2076 2077/2162/2077\nf 2067/2160/2067 2077/2162/2077 2068/2157/2068\nf 2071/2163/2071 2078/2164/2078 2076/2161/2076\nf 2071/2163/2071 2076/2161/2076 2067/2160/2067\nf 2076/2161/2076 2079/2165/2079 2088/2166/2088\nf 2076/2161/2076 2088/2166/2088 2077/2162/2077\nf 2078/2164/2078 2080/2167/2080 2079/2165/2079\nf 2078/2164/2078 2079/2165/2079 2076/2161/2076\nf 2081/2168/2081 2078/2164/2078 2071/2163/2071\nf 2081/2168/2081 2071/2163/2071 2074/2169/2074\nf 2074/2169/2074 2082/2170/2082 2083/2171/2083\nf 2074/2169/2074 2083/2171/2083 2081/2168/2081\nf 2081/2168/2081 2083/2171/2083 2099/2172/2099\nf 2081/2168/2081 2099/2172/2099 2101/2173/2101\nf 2092/2174/2092 2070/2159/2070 2069/2158/2069\nf 2092/2174/2092 2069/2158/2069 2054/2175/2054\nf 2092/2174/2092 2073/2176/2073 2072/2177/2072\nf 2092/2174/2092 2072/2177/2072 2070/2159/2070\nf 2072/2177/2072 2073/2176/2073 2093/2178/2093\nf 2072/2177/2072 2093/2178/2093 2091/2179/2091\nf 2086/2180/2086 2112/2181/2112 2111/2182/2111\nf 2086/2180/2086 2111/2182/2111 2084/2183/2084\nf 2085/2184/2085 2511/2185/2511 2112/2181/2112\nf 2085/2184/2085 2112/2181/2112 2086/2180/2086\nf 2097/2186/2097 2101/2173/2101 2099/2172/2099\nf 2097/2186/2097 2099/2172/2099 2098/2187/2098\nf 2080/2167/2080 2086/2180/2086 2084/2183/2084\nf 2080/2167/2080 2084/2183/2084 2079/2165/2079\nf 2109/2188/2109 2096/2189/2096 2105/2190/2105\nf 2109/2188/2109 2105/2190/2105 2104/2191/2104\nf 2105/2190/2105 2107/2192/2107 2106/2193/2106\nf 2105/2190/2105 2106/2193/2106 2104/2191/2104\nf 2107/2192/2107 2108/2194/2108 2120/2195/2120\nf 2107/2192/2107 2120/2195/2120 2106/2193/2106\nf 2109/2188/2109 2110/2196/2110 2111/2182/2111\nf 2109/2188/2109 2111/2182/2111 2096/2189/2096\nf 2096/2189/2096 2111/2182/2111 2112/2181/2112\nf 2096/2189/2096 2112/2181/2112 2174/2197/2174\nf 2115/2198/2115 2119/2199/2119 2118/2200/2118\nf 2115/2198/2115 2118/2200/2118 2114/2201/2114\nf 2113/2202/2113 2117/2203/2117 2119/2199/2119\nf 2113/2202/2113 2119/2199/2119 2115/2198/2115\nf 2124/2204/2124 2123/2205/2123 2116/2206/2116\nf 2124/2204/2124 2116/2206/2116 2089/2207/2089\nf 2106/2193/2106 2120/2195/2120 2121/2208/2121\nf 2106/2193/2106 2121/2208/2121 2104/2191/2104\nf 2104/2191/2104 2121/2208/2121 2122/2209/2122\nf 2104/2191/2104 2122/2209/2122 2109/2188/2109\nf 2109/2188/2109 2122/2209/2122 2117/2203/2117\nf 2109/2188/2109 2117/2203/2117 2113/2202/2113\nf 2103/2210/2103 2108/2194/2108 2107/2192/2107\nf 2103/2210/2103 2107/2192/2107 2105/2190/2105\nf 2123/2205/2123 2124/2204/2124 2114/2201/2114\nf 2123/2205/2123 2114/2201/2114 2118/2200/2118\nf 2090/2211/2090 2155/2212/2155 2068/2157/2068\nf 2090/2211/2090 2068/2157/2068 2077/2162/2077\nf 2054/2175/2054 2069/2158/2069 2141/2213/2141\nf 2054/2175/2054 2141/2213/2141 2142/2214/2142\nf 1827/1935/1827 1818/1931/1818 521/1934/521\nf 1827/1935/1827 521/1934/521 522/1936/522\nf 1882/2215/1882 2126/2216/2126 2125/2217/2125\nf 1882/2215/1882 2125/2217/2125 1880/2218/1880\nf 2129/2219/2129 2125/2217/2125 2126/2216/2126\nf 2129/2219/2129 2126/2216/2126 2128/2220/2128\nf 1882/2221/1882 2130/2222/2130 2131/2223/2131\nf 1882/2221/1882 2131/2223/2131 2126/2224/2126\nf 2131/2223/2131 2136/2225/2136 2138/2226/2138\nf 2131/2223/2131 2138/2226/2138 2147/2227/2147\nf 2130/2222/2130 2135/2228/2135 2136/2225/2136\nf 2130/2222/2130 2136/2225/2136 2131/2223/2131\nf 1927/2041/1927 2133/2229/2133 2132/2230/2132\nf 1927/2041/1927 2132/2230/2132 1904/2011/1904\nf 2133/2231/2133 2137/2232/2137 2134/2233/2134\nf 2133/2231/2133 2134/2233/2134 2132/2234/2132\nf 2138/2226/2138 2136/2225/2136 2135/2228/2135\nf 2138/2226/2138 2135/2228/2135 2139/2235/2139\nf 2138/2226/2138 2139/2236/2139 2137/2232/2137\nf 2138/2226/2138 2137/2232/2137 2147/2227/2147\nf 2141/2213/2141 2144/2237/2144 2143/2238/2143\nf 2141/2213/2141 2143/2238/2143 2142/2214/2142\nf 2140/2239/2140 2143/2238/2143 2144/2237/2144\nf 2140/2239/2140 2144/2237/2144 2128/2240/2128\nf 2142/2214/2142 1934/2241/1934 2056/2242/2056\nf 2142/2214/2142 2056/2242/2056 2057/2243/2057\nf 2001/2244/2001 2145/2245/2145 2146/2246/2146\nf 2001/2244/2001 2146/2246/2146 2002/2247/2002\nf 2140/2248/2140 2147/2249/2147 2145/2245/2145\nf 2140/2248/2140 2145/2245/2145 2001/2244/2001\nf 2149/2122/2149 2151/2250/2151 1927/2251/1927\nf 2149/2122/2149 1927/2251/1927 1929/2119/1929\nf 2147/2249/2147 2137/2252/2137 2151/2253/2151\nf 2147/2249/2147 2151/2253/2151 2145/2245/2145\nf 2133/2254/2133 1927/2255/1927 2151/2253/2151\nf 2133/2254/2133 2151/2253/2151 2137/2252/2137\nf 2001/2244/2001 2152/2256/2152 2000/2257/2000\nf 2001/2244/2001 2000/2257/2000 2143/2258/2143\nf 2158/1976/2158 2159/2259/2159 2160/2260/2160\nf 2158/1976/2158 2160/2260/2160 1428/2261/1428\nf 2082/2170/2082 2163/2262/2163 2162/2263/2162\nf 2082/2170/2082 2162/2263/2162 2083/2171/2083\nf 2083/2171/2083 2181/2264/2181 2161/2265/2161\nf 2083/2171/2083 2161/2265/2161 2099/2172/2099\nf 2158/1976/2158 2164/1975/2164 2165/2266/2165\nf 2158/1976/2158 2165/2266/2165 2159/2259/2159\nf 2082/2170/2082 2074/2169/2074 2075/2267/2075\nf 2082/2170/2082 2075/2267/2075 2165/2266/2165\nf 2181/2264/2181 2162/2263/2162 2182/2268/2182\nf 2181/2264/2181 2182/2268/2182 2166/2269/2166\nf 2169/2270/2169 2166/2271/2166 2116/2206/2116\nf 2169/2270/2169 2116/2206/2116 2123/2205/2123\nf 2167/2272/2167 2116/2206/2116 2166/2271/2166\nf 2167/2272/2167 2166/2271/2166 2182/2273/2182\nf 2090/2211/2090 2167/2272/2167 2156/2274/2156\nf 2090/2211/2090 2156/2274/2156 2155/2212/2155\nf 2167/2272/2167 2182/2273/2182 2129/2275/2129\nf 2167/2272/2167 2129/2275/2129 2156/2274/2156\nf 2118/2200/2118 2168/2276/2168 2169/2270/2169\nf 2118/2200/2118 2169/2270/2169 2123/2205/2123\nf 2120/2195/2120 2379/2277/2379 2170/2278/2170\nf 2120/2195/2120 2170/2278/2170 2121/2208/2121\nf 2379/2279/2379 2220/2280/2220 2172/2281/2172\nf 2379/2279/2379 2172/2281/2172 2170/2282/2170\nf 2170/2282/2170 2172/2281/2172 2173/2283/2173\nf 2170/2282/2170 2173/2283/2173 2171/2284/2171\nf 2172/2281/2172 2220/2280/2220 2187/2285/2187\nf 2172/2281/2172 2187/2285/2187 2176/2286/2176\nf 2176/2286/2176 2175/2287/2175 2180/2288/2180\nf 2176/2286/2176 2180/2288/2180 2172/2281/2172\nf 2175/2287/2175 2511/2185/2511 2100/2289/2100\nf 2175/2287/2175 2100/2289/2100 2178/2290/2178\nf 2179/2291/2179 2180/2288/2180 2175/2287/2175\nf 2179/2291/2179 2175/2287/2175 2178/2290/2178\nf 2173/2283/2173 2179/2291/2179 2184/2292/2184\nf 2173/2283/2173 2184/2292/2184 2183/2293/2183\nf 2098/2187/2098 2178/2290/2178 2100/2289/2100\nf 2098/2187/2098 2100/2289/2100 2097/2186/2097\nf 2179/2291/2179 2178/2290/2178 2098/2187/2098\nf 2179/2291/2179 2098/2187/2098 2184/2292/2184\nf 2168/2294/2168 2173/2283/2173 2183/2293/2183\nf 2168/2294/2168 2183/2293/2183 2169/2295/2169\nf 2183/2293/2183 2181/2264/2181 2166/2269/2166\nf 2183/2293/2183 2166/2269/2166 2169/2295/2169\nf 2182/2268/2182 2162/2263/2162 2127/2296/2127\nf 2182/2268/2182 2127/2296/2127 2129/2297/2129\nf 2177/2298/2177 2186/2299/2186 2185/2300/2185\nf 2177/2298/2177 2185/2300/2185 2103/2210/2103\nf 2177/2298/2177 2187/2285/2187 2207/2301/2207\nf 2177/2298/2177 2207/2301/2207 2186/2299/2186\nf 2189/2302/2189 2188/2303/2188 2108/2194/2108\nf 2189/2302/2189 2108/2194/2108 2185/2300/2185\nf 2191/2304/2191 2190/2305/2190 2185/2300/2185\nf 2191/2304/2191 2185/2300/2185 2186/2299/2186\nf 2380/2306/2380 2108/2194/2108 2188/2303/2188\nf 2380/2306/2380 2188/2303/2188 2192/2307/2192\nf 2305/2308/2305 2306/2309/2306 2189/2302/2189\nf 2305/2308/2305 2189/2302/2189 2190/2305/2190\nf 2189/2302/2189 2342/2310/2342 2343/2311/2343\nf 2189/2302/2189 2343/2311/2343 2188/2303/2188\nf 2191/2304/2191 2194/2312/2194 2193/2313/2193\nf 2191/2304/2191 2193/2313/2193 2190/2305/2190\nf 2188/2303/2188 2381/2314/2381 2382/2315/2382\nf 2188/2303/2188 2382/2315/2382 2192/2307/2192\nf 2194/2312/2194 2196/2316/2196 2195/2317/2195\nf 2194/2312/2194 2195/2317/2195 2193/2313/2193\nf 2196/2316/2196 2198/2318/2198 2197/2319/2197\nf 2196/2316/2196 2197/2319/2197 2195/2317/2195\nf 2198/2318/2198 2200/2320/2200 2199/2321/2199\nf 2198/2318/2198 2199/2321/2199 2197/2319/2197\nf 2200/2320/2200 2205/2322/2205 2201/2323/2201\nf 2200/2320/2200 2201/2323/2201 2199/2321/2199\nf 2186/2299/2186 2207/2301/2207 2269/2324/2269\nf 2186/2299/2186 2269/2324/2269 2270/2325/2270\nf 2194/2312/2194 2208/2326/2208 2209/2327/2209\nf 2194/2312/2194 2209/2327/2209 2196/2316/2196\nf 2200/2320/2200 2209/2327/2209 2211/2328/2211\nf 2200/2320/2200 2211/2328/2211 2205/2322/2205\nf 2211/2328/2211 2210/2329/2210 2203/2330/2203\nf 2211/2328/2211 2203/2330/2203 2205/2322/2205\nf 2214/2331/2214 2212/2332/2212 2202/2333/2202\nf 2214/2331/2214 2202/2333/2202 2204/2334/2204\nf 2203/2330/2203 2213/2335/2213 2214/2331/2214\nf 2203/2330/2203 2214/2331/2214 2204/2334/2204\nf 2215/2336/2215 2264/2337/2264 2212/2332/2212\nf 2215/2336/2215 2212/2332/2212 2214/2331/2214\nf 2213/2335/2213 2263/2338/2263 2215/2336/2215\nf 2213/2335/2213 2215/2336/2215 2214/2331/2214\nf 2207/2301/2207 2216/2339/2216 2280/2340/2280\nf 2207/2301/2207 2280/2340/2280 2269/2324/2269\nf 2220/2280/2220 2216/2339/2216 2207/2301/2207\nf 2220/2280/2220 2207/2301/2207 2187/2285/2187\nf 1875/2341/1875 2221/1977/2221 2222/1980/2222\nf 1875/2341/1875 2222/1980/2222 1878/2342/1878\nf 2223/1983/2223 1897/2343/1897 1878/2342/1878\nf 2223/1983/2223 1878/2342/1878 2222/1980/2222\nf 2228/2344/2228 2225/2345/2225 2043/2152/2043\nf 2228/2344/2228 2043/2152/2043 2045/2346/2045\nf 2059/2154/2059 2051/2156/2051 2237/2347/2237\nf 2059/2154/2059 2237/2347/2237 2238/2348/2238\nf 2066/2349/2066 2059/2154/2059 2238/2348/2238\nf 2066/2349/2066 2238/2348/2238 2061/2350/2061\nf 2231/2351/2231 2241/2352/2241 2094/2353/2094\nf 2231/2351/2231 2094/2353/2094 2073/2176/2073\nf 2244/2354/2244 2243/2355/2243 2250/2356/2250\nf 2244/2354/2244 2250/2356/2250 2235/2357/2235\nf 2094/2353/2094 2251/2358/2251 2247/2359/2247\nf 2094/2353/2094 2247/2359/2247 2227/2360/2227\nf 2053/2361/2053 2065/2362/2065 2064/2363/2064\nf 2053/2361/2053 2064/2363/2064 2240/2364/2240\nf 2256/2365/2256 2199/2321/2199 2201/2323/2201\nf 2256/2365/2256 2201/2323/2201 2253/2366/2253\nf 2253/2366/2253 2201/2323/2201 2202/2333/2202\nf 2253/2366/2253 2202/2333/2202 2254/2367/2254\nf 2255/2368/2255 2193/2313/2193 2195/2317/2195\nf 2255/2368/2255 2195/2317/2195 2256/2365/2256\nf 2257/2369/2257 2210/2329/2210 2211/2328/2211\nf 2257/2369/2257 2211/2328/2211 2258/2370/2258\nf 2259/2371/2259 2253/2366/2253 2254/2367/2254\nf 2259/2371/2259 2254/2367/2254 2260/2372/2260\nf 2258/2373/2258 2259/2374/2259 2260/2375/2260\nf 2258/2373/2258 2260/2375/2260 2257/2376/2257\nf 2261/2377/2261 2257/2376/2257 2260/2375/2260\nf 2261/2377/2261 2260/2375/2260 2262/2378/2262\nf 2263/2379/2263 2261/2377/2261 2262/2378/2262\nf 2263/2379/2263 2262/2378/2262 2264/2380/2264\nf 2267/2381/2267 2259/2374/2259 2258/2373/2258\nf 2267/2381/2267 2258/2373/2258 2265/2382/2265\nf 2340/2383/2340 2267/2381/2267 2265/2382/2265\nf 2340/2383/2340 2265/2382/2265 2266/2384/2266\nf 2256/2365/2256 2253/2366/2253 2259/2371/2259\nf 2256/2365/2256 2259/2371/2259 2267/2385/2267\nf 2255/2368/2255 2256/2365/2256 2267/2385/2267\nf 2255/2368/2255 2267/2385/2267 2340/2386/2340\nf 2266/2387/2266 2265/2388/2265 2209/2327/2209\nf 2266/2387/2266 2209/2327/2209 2208/2326/2208\nf 2269/2324/2269 2272/2389/2272 2271/2390/2271\nf 2269/2324/2269 2271/2390/2271 2270/2325/2270\nf 2272/2389/2272 2274/2391/2274 2273/2392/2273\nf 2272/2389/2272 2273/2392/2273 2271/2390/2271\nf 2274/2391/2274 2276/2393/2276 2275/2394/2275\nf 2274/2391/2274 2275/2394/2275 2273/2392/2273\nf 2269/2324/2269 2280/2340/2280 2281/2395/2281\nf 2269/2324/2269 2281/2395/2281 2272/2389/2272\nf 2281/2395/2281 2282/2396/2282 2279/2397/2279\nf 2281/2395/2281 2279/2397/2279 2276/2393/2276\nf 2283/2398/2283 2284/2399/2284 2278/2400/2278\nf 2283/2398/2283 2278/2400/2278 2277/2401/2277\nf 2279/2397/2279 2285/2402/2285 2283/2398/2283\nf 2279/2397/2279 2283/2398/2283 2277/2401/2277\nf 2286/2403/2286 2287/2404/2287 2284/2399/2284\nf 2286/2403/2286 2284/2399/2284 2283/2398/2283\nf 2285/2402/2285 2288/2405/2288 2286/2403/2286\nf 2285/2402/2285 2286/2403/2286 2283/2398/2283\nf 2289/2406/2289 2275/2394/2275 2278/2400/2278\nf 2289/2406/2289 2278/2400/2278 2290/2407/2290\nf 2206/2408/2206 2270/2325/2270 2271/2390/2271\nf 2206/2408/2206 2271/2390/2271 2289/2406/2289\nf 2291/2409/2291 2282/2396/2282 2281/2395/2281\nf 2291/2409/2291 2281/2395/2281 2298/2410/2298\nf 2297/2411/2297 2289/2406/2289 2290/2407/2290\nf 2297/2411/2297 2290/2407/2290 2292/2412/2292\nf 2298/2413/2298 2297/2414/2297 2292/2415/2292\nf 2298/2413/2298 2292/2415/2292 2291/2416/2291\nf 2293/2417/2293 2291/2416/2291 2292/2415/2292\nf 2293/2417/2293 2292/2415/2292 2294/2418/2294\nf 2295/2419/2295 2293/2417/2293 2294/2418/2294\nf 2295/2419/2295 2294/2418/2294 2296/2420/2296\nf 2288/2421/2288 2295/2419/2295 2296/2420/2296\nf 2288/2421/2288 2296/2420/2296 2287/2422/2287\nf 2299/2423/2299 2297/2414/2297 2298/2413/2298\nf 2299/2423/2299 2298/2413/2298 2415/2424/2415\nf 2289/2406/2289 2297/2411/2297 2299/2425/2299\nf 2289/2406/2289 2299/2425/2299 2206/2408/2206\nf 2415/2426/2415 2298/2410/2298 2281/2395/2281\nf 2415/2426/2415 2281/2395/2281 2280/2340/2280\nf 2301/2427/2301 2208/2326/2208 2194/2312/2194\nf 2301/2427/2301 2194/2312/2194 2191/2304/2191\nf 2304/2428/2304 2415/2429/2415 2218/2430/2218\nf 2304/2428/2304 2218/2430/2218 2302/2431/2302\nf 2301/2427/2301 2303/2432/2303 2266/2387/2266\nf 2301/2427/2301 2266/2387/2266 2208/2326/2208\nf 2303/2433/2303 2304/2428/2304 2340/2383/2340\nf 2303/2433/2303 2340/2383/2340 2266/2384/2266\nf 2209/2327/2209 2265/2388/2265 2258/2370/2258\nf 2209/2327/2209 2258/2370/2258 2211/2328/2211\nf 2305/2308/2305 2308/2434/2308 2307/2435/2307\nf 2305/2308/2305 2307/2435/2307 2306/2309/2306\nf 2308/2434/2308 2310/2436/2310 2309/2437/2309\nf 2308/2434/2308 2309/2437/2309 2307/2435/2307\nf 2310/2436/2310 2312/2438/2312 2311/2439/2311\nf 2310/2436/2310 2311/2439/2311 2309/2437/2309\nf 2312/2438/2312 2314/2440/2314 2313/2441/2313\nf 2312/2438/2312 2313/2441/2313 2311/2439/2311\nf 2305/2308/2305 2318/2442/2318 2319/2443/2319\nf 2305/2308/2305 2319/2443/2319 2308/2434/2308\nf 2312/2438/2312 2319/2443/2319 2320/2444/2320\nf 2312/2438/2312 2320/2444/2320 2314/2440/2314\nf 2320/2444/2320 2321/2445/2321 2317/2446/2317\nf 2320/2444/2320 2317/2446/2317 2314/2440/2314\nf 2322/2447/2322 2323/2448/2323 2316/2449/2316\nf 2322/2447/2322 2316/2449/2316 2315/2450/2315\nf 2317/2446/2317 2324/2451/2324 2322/2447/2322\nf 2317/2446/2317 2322/2447/2322 2315/2450/2315\nf 2325/2452/2325 2326/2453/2326 2323/2448/2323\nf 2325/2452/2325 2323/2448/2323 2322/2447/2322\nf 2324/2451/2324 2327/2454/2327 2325/2452/2325\nf 2324/2451/2324 2325/2452/2325 2322/2447/2322\nf 2328/2455/2328 2311/2439/2311 2313/2441/2313\nf 2328/2455/2328 2313/2441/2313 2329/2456/2329\nf 2329/2456/2329 2313/2441/2313 2316/2449/2316\nf 2329/2456/2329 2316/2449/2316 2330/2457/2330\nf 2331/2458/2331 2306/2309/2306 2307/2435/2307\nf 2331/2458/2331 2307/2435/2307 2328/2455/2328\nf 2321/2445/2321 2320/2444/2320 2333/2459/2333\nf 2321/2445/2321 2333/2459/2333 2332/2460/2332\nf 2334/2461/2334 2329/2456/2329 2330/2457/2330\nf 2334/2461/2334 2330/2457/2330 2335/2462/2335\nf 2333/2463/2333 2334/2464/2334 2335/2465/2335\nf 2333/2463/2333 2335/2465/2335 2332/2466/2332\nf 2336/2467/2336 2332/2466/2332 2335/2465/2335\nf 2336/2467/2336 2335/2465/2335 2337/2468/2337\nf 2327/2469/2327 2336/2467/2336 2337/2468/2337\nf 2327/2469/2327 2337/2468/2337 2326/2470/2326\nf 2338/2471/2338 2334/2464/2334 2333/2463/2333\nf 2338/2471/2338 2333/2463/2333 2339/2472/2339\nf 2376/2473/2376 2338/2471/2338 2339/2472/2339\nf 2376/2473/2376 2339/2472/2339 2340/2383/2340\nf 2328/2455/2328 2329/2456/2329 2334/2461/2334\nf 2328/2455/2328 2334/2461/2334 2338/2474/2338\nf 2331/2458/2331 2328/2455/2328 2338/2474/2338\nf 2331/2458/2331 2338/2474/2338 2376/2475/2376\nf 2340/2386/2340 2339/2476/2339 2319/2443/2319\nf 2340/2386/2340 2319/2443/2319 2318/2442/2318\nf 2319/2443/2319 2339/2476/2339 2333/2459/2333\nf 2319/2443/2319 2333/2459/2333 2320/2444/2320\nf 2305/2308/2305 2193/2313/2193 2255/2368/2255\nf 2305/2308/2305 2255/2368/2255 2318/2442/2318\nf 2342/2310/2342 2345/2477/2345 2344/2478/2344\nf 2342/2310/2342 2344/2478/2344 2343/2311/2343\nf 2345/2477/2345 2347/2479/2347 2346/2480/2346\nf 2345/2477/2345 2346/2480/2346 2344/2478/2344\nf 2347/2479/2347 2349/2481/2349 2348/2482/2348\nf 2347/2479/2347 2348/2482/2348 2346/2480/2346\nf 2349/2481/2349 2351/2483/2351 2350/2484/2350\nf 2349/2481/2349 2350/2484/2350 2348/2482/2348\nf 2342/2310/2342 2355/2485/2355 2356/2486/2356\nf 2342/2310/2342 2356/2486/2356 2345/2477/2345\nf 2349/2481/2349 2356/2486/2356 2357/2487/2357\nf 2349/2481/2349 2357/2487/2357 2351/2483/2351\nf 2357/2487/2357 2358/2488/2358 2354/2489/2354\nf 2357/2487/2357 2354/2489/2354 2351/2483/2351\nf 2359/2490/2359 2360/2491/2360 2353/2492/2353\nf 2359/2490/2359 2353/2492/2353 2352/2493/2352\nf 2354/2489/2354 2361/2494/2361 2359/2490/2359\nf 2354/2489/2354 2359/2490/2359 2352/2493/2352\nf 2363/2495/2363 2348/2482/2348 2350/2484/2350\nf 2363/2495/2363 2350/2484/2350 2364/2496/2364\nf 2364/2496/2364 2350/2484/2350 2353/2492/2353\nf 2364/2496/2364 2353/2492/2353 2365/2497/2365\nf 2366/2498/2366 2343/2311/2343 2344/2478/2344\nf 2366/2498/2366 2344/2478/2344 2363/2495/2363\nf 2367/2499/2367 2358/2488/2358 2357/2487/2357\nf 2367/2499/2367 2357/2487/2357 2368/2500/2368\nf 2369/2501/2369 2364/2496/2364 2365/2497/2365\nf 2369/2501/2369 2365/2497/2365 2370/2502/2370\nf 2368/2503/2368 2369/2504/2369 2370/2505/2370\nf 2368/2503/2368 2370/2505/2370 2367/2506/2367\nf 2371/2507/2371 2367/2506/2367 2370/2505/2370\nf 2371/2507/2371 2370/2505/2370 2372/2508/2372\nf 2373/2509/2373 2369/2504/2369 2368/2503/2368\nf 2373/2509/2373 2368/2503/2368 2374/2510/2374\nf 2375/2511/2375 2373/2509/2373 2374/2510/2374\nf 2375/2511/2375 2374/2510/2374 2376/2512/2376\nf 2363/2495/2363 2364/2496/2364 2369/2501/2369\nf 2363/2495/2363 2369/2501/2369 2373/2513/2373\nf 2366/2498/2366 2363/2495/2363 2373/2513/2373\nf 2366/2498/2366 2373/2513/2373 2375/2514/2375\nf 2376/2475/2376 2374/2515/2374 2356/2486/2356\nf 2376/2475/2376 2356/2486/2356 2355/2485/2355\nf 2356/2486/2356 2374/2515/2374 2368/2500/2368\nf 2356/2486/2356 2368/2500/2368 2357/2487/2357\nf 2331/2458/2331 2355/2485/2355 2342/2310/2342\nf 2331/2458/2331 2342/2310/2342 2306/2309/2306\nf 2376/2473/2376 2340/2383/2340 2304/2428/2304\nf 2376/2473/2376 2304/2428/2304 2302/2431/2302\nf 2378/2516/2378 2302/2517/2302 2217/2518/2217\nf 2378/2516/2378 2217/2518/2217 2377/2519/2377\nf 2377/2520/2377 2379/2277/2379 2120/2195/2120\nf 2377/2520/2377 2120/2195/2120 2380/2306/2380\nf 2192/2307/2192 2378/2521/2378 2377/2520/2377\nf 2192/2307/2192 2377/2520/2377 2380/2306/2380\nf 1873/2003/1873 2164/2522/2164 1429/2523/1429\nf 1873/2003/1873 1429/2523/1429 1419/2004/1419\nf 2381/2314/2381 2384/2524/2384 2383/2525/2383\nf 2381/2314/2381 2383/2525/2383 2382/2315/2382\nf 2384/2524/2384 2386/2526/2386 2385/2527/2385\nf 2384/2524/2384 2385/2527/2385 2383/2525/2383\nf 2386/2526/2386 2388/2528/2388 2387/2529/2387\nf 2386/2526/2386 2387/2529/2387 2385/2527/2385\nf 2388/2528/2388 2390/2530/2390 2389/2531/2389\nf 2388/2528/2388 2389/2531/2389 2387/2529/2387\nf 2381/2314/2381 2394/2532/2394 2395/2533/2395\nf 2381/2314/2381 2395/2533/2395 2384/2524/2384\nf 2388/2528/2388 2395/2533/2395 2396/2534/2396\nf 2388/2528/2388 2396/2534/2396 2390/2530/2390\nf 2396/2534/2396 2397/2535/2397 2393/2536/2393\nf 2396/2534/2396 2393/2536/2393 2390/2530/2390\nf 2398/2537/2398 2399/2538/2399 2392/2539/2392\nf 2398/2537/2398 2392/2539/2392 2391/2540/2391\nf 2393/2536/2393 2400/2541/2400 2398/2537/2398\nf 2393/2536/2393 2398/2537/2398 2391/2540/2391\nf 2402/2542/2402 2387/2529/2387 2389/2531/2389\nf 2402/2542/2402 2389/2531/2389 2403/2543/2403\nf 2403/2543/2403 2389/2531/2389 2392/2539/2392\nf 2403/2543/2403 2392/2539/2392 2404/2544/2404\nf 2405/2545/2405 2382/2315/2382 2383/2525/2383\nf 2405/2545/2405 2383/2525/2383 2402/2542/2402\nf 2406/2546/2406 2397/2535/2397 2396/2534/2396\nf 2406/2546/2406 2396/2534/2396 2407/2547/2407\nf 2408/2548/2408 2403/2543/2403 2404/2544/2404\nf 2408/2548/2408 2404/2544/2404 2409/2549/2409\nf 2407/2550/2407 2408/2551/2408 2409/2552/2409\nf 2407/2550/2407 2409/2552/2409 2406/2553/2406\nf 2410/2554/2410 2406/2553/2406 2409/2552/2409\nf 2410/2554/2410 2409/2552/2409 2411/2555/2411\nf 2412/2556/2412 2408/2551/2408 2407/2550/2407\nf 2412/2556/2412 2407/2550/2407 2413/2557/2413\nf 2414/2558/2414 2412/2556/2412 2413/2557/2413\nf 2414/2558/2414 2413/2557/2413 2375/2511/2375\nf 2402/2542/2402 2403/2543/2403 2408/2548/2408\nf 2402/2542/2402 2408/2548/2408 2412/2559/2412\nf 2405/2545/2405 2402/2542/2402 2412/2559/2412\nf 2405/2545/2405 2412/2559/2412 2414/2560/2414\nf 2375/2514/2375 2413/2561/2413 2395/2533/2395\nf 2375/2514/2375 2395/2533/2395 2394/2532/2394\nf 2395/2533/2395 2413/2561/2413 2407/2547/2407\nf 2395/2533/2395 2407/2547/2407 2396/2534/2396\nf 2366/2498/2366 2394/2532/2394 2381/2314/2381\nf 2366/2498/2366 2381/2314/2381 2343/2311/2343\nf 2302/2517/2302 2414/2558/2414 2375/2511/2375\nf 2302/2517/2302 2375/2511/2375 2376/2512/2376\nf 2405/2545/2405 2414/2560/2414 2378/2521/2378\nf 2405/2545/2405 2378/2521/2378 2192/2307/2192\nf 2191/2304/2191 2270/2325/2270 2206/2408/2206\nf 2191/2304/2191 2206/2408/2206 2301/2427/2301\nf 2303/2432/2303 2301/2427/2301 2206/2408/2206\nf 2303/2432/2303 2206/2408/2206 2299/2425/2299\nf 2038/2149/2038 2040/2145/2040 2425/2562/2425\nf 2038/2149/2038 2425/2562/2425 2417/2563/2417\nf 2423/2564/2423 2420/2565/2420 2418/2566/2418\nf 2423/2564/2423 2418/2566/2418 2424/2567/2424\nf 1406/2568/1406 2418/2566/2418 2420/2565/2420\nf 1406/2568/1406 2420/2565/2420 562/2569/562\nf 2422/2570/2422 2419/2571/2419 2416/2572/2416\nf 2422/2570/2422 2416/2572/2416 2421/2573/2421\nf 2423/2564/2423 2417/2563/2417 2416/2572/2416\nf 2423/2564/2423 2416/2572/2416 2419/2571/2419\nf 2424/2567/2424 2038/2149/2038 2417/2563/2417\nf 2424/2567/2424 2417/2563/2417 2423/2564/2423\nf 2428/2574/2428 2015/2575/2015 783/2576/783\nf 2428/2574/2428 783/2576/783 1331/2577/1331\nf 2430/2578/2430 2429/2579/2429 2432/2580/2432\nf 2430/2578/2430 2432/2580/2432 2431/2581/2431\nf 2434/2582/2434 2429/2579/2429 2433/2583/2433\nf 2434/2582/2434 2433/2583/2433 2435/2584/2435\nf 2434/2582/2434 2435/2584/2435 2437/2585/2437\nf 2434/2582/2434 2437/2585/2437 2436/2586/2436\nf 2439/2587/2439 2433/2583/2433 2430/2578/2430\nf 2439/2587/2439 2430/2578/2430 2438/2588/2438\nf 2440/2589/2440 2435/2584/2435 2433/2583/2433\nf 2440/2589/2440 2433/2583/2433 2439/2587/2439\nf 2437/2585/2437 2435/2584/2435 2440/2589/2440\nf 2437/2585/2437 2440/2589/2440 2441/2590/2441\nf 2430/2578/2430 2431/2581/2431 2017/2591/2017\nf 2430/2578/2430 2017/2591/2017 2438/2588/2438\nf 2015/2592/2015 2428/2593/2428 2442/2594/2442\nf 2015/2592/2015 2442/2594/2442 2451/2595/2451\nf 2446/2596/2446 2444/2597/2444 2445/2598/2445\nf 2446/2596/2446 2445/2598/2445 2447/2599/2447\nf 2447/2599/2447 2445/2598/2445 2443/2600/2443\nf 2447/2599/2447 2443/2600/2443 2450/2601/2450\nf 2450/2601/2450 2443/2600/2443 2442/2594/2442\nf 2450/2601/2450 2442/2594/2442 2449/2602/2449\nf 2449/2602/2449 2442/2594/2442 2428/2593/2428\nf 2449/2602/2449 2428/2593/2428 2448/2603/2448\nf 2443/2600/2443 2440/2604/2440 2439/2605/2439\nf 2443/2600/2443 2439/2605/2439 2451/2595/2451\nf 2434/2582/2434 2454/2606/2454 2453/2607/2453\nf 2434/2582/2434 2453/2607/2453 2429/2579/2429\nf 2434/2582/2434 2436/2586/2436 2446/2596/2446\nf 2434/2582/2434 2446/2596/2446 2454/2606/2454\nf 14/2608/14 2421/2573/2421 2426/2609/2426\nf 14/2608/14 2426/2609/2426 1/2610/1\nf 2431/2611/2431 2432/2612/2432 2457/2613/2457\nf 2431/2611/2431 2457/2613/2457 2456/2614/2456\nf 63/2615/63 2457/2613/2457 2432/2612/2432\nf 63/2615/63 2432/2612/2432 64/2616/64\nf 2460/2617/2460 2513/2618/2513 2512/2619/2512\nf 2460/2617/2460 2512/2619/2512 2458/2620/2458\nf 2514/2621/2514 2513/2618/2513 2460/2617/2460\nf 2514/2621/2514 2460/2617/2460 2462/2622/2462\nf 2463/2623/2463 2464/2624/2464 2467/2625/2467\nf 2463/2623/2463 2467/2625/2467 2466/2626/2466\nf 2465/2627/2465 2498/2628/2498 2466/2626/2466\nf 2465/2627/2465 2466/2626/2466 2467/2625/2467\nf 2460/2617/2460 2458/2620/2458 2468/2629/2468\nf 2460/2617/2460 2468/2629/2468 2469/2630/2469\nf 2464/2624/2464 2462/2622/2462 2469/2630/2469\nf 2464/2624/2464 2469/2630/2469 2500/2631/2500\nf 2465/2627/2465 2467/2625/2467 2471/2632/2471\nf 2465/2627/2465 2471/2632/2471 2470/2633/2470\nf 2467/2625/2467 2464/2624/2464 2500/2631/2500\nf 2467/2625/2467 2500/2631/2500 2471/2632/2471\nf 2473/2634/2473 2474/2635/2474 2432/2636/2432\nf 2473/2634/2473 2432/2636/2432 2472/2637/2472\nf 2476/2638/2476 2473/2634/2473 2472/2637/2472\nf 2476/2638/2476 2472/2637/2472 2475/2639/2475\nf 2478/2640/2478 2474/2635/2474 2473/2634/2473\nf 2478/2640/2478 2473/2634/2473 2479/2641/2479\nf 2479/2641/2479 2473/2634/2473 2476/2638/2476\nf 2479/2641/2479 2476/2638/2476 2480/2642/2480\nf 2488/2643/2488 2478/2640/2478 2479/2641/2479\nf 2488/2643/2488 2479/2641/2479 2482/2644/2482\nf 2479/2641/2479 2480/2642/2480 2485/2645/2485\nf 2479/2641/2479 2485/2645/2485 2482/2644/2482\nf 2488/2643/2488 2482/2644/2482 2484/2646/2484\nf 2488/2643/2488 2484/2646/2484 2483/2647/2483\nf 2486/2648/2486 2487/2649/2487 2476/2638/2476\nf 2486/2648/2486 2476/2638/2476 2475/2639/2475\nf 2480/2642/2480 2476/2638/2476 2487/2649/2487\nf 2480/2642/2480 2487/2649/2487 2481/2650/2481\nf 61/2651/61 2474/2635/2474 2478/2640/2478\nf 61/2651/61 2478/2640/2478 2490/2652/2490\nf 1332/2653/1332 2452/2654/2452 2448/2655/2448\nf 1332/2653/1332 2448/2655/2448 1331/2577/1331\nf 106/2656/106 2489/2657/2489 2452/2654/2452\nf 106/2656/106 2452/2654/2452 1332/2653/1332\nf 2478/2640/2478 2488/2643/2488 2489/2658/2489\nf 2478/2640/2478 2489/2658/2489 2490/2652/2490\nf 2492/2659/2492 1/2660/1 2426/2661/2426\nf 2492/2659/2492 2426/2661/2426 2491/2662/2491\nf 2425/2663/2425 2459/2664/2459 2491/2665/2491\nf 2425/2663/2425 2491/2665/2491 2426/2666/2426\nf 2496/2667/2496 2493/2668/2493 2461/2669/2461\nf 2496/2667/2496 2461/2669/2461 2463/2670/2463\nf 2492/2659/2492 2515/2671/2515 4/2672/4\nf 2492/2659/2492 4/2672/4 1/2660/1\nf 2518/2673/2518 2519/2674/2519 2494/2675/2494\nf 2518/2673/2518 2494/2675/2494 2516/2676/2516\nf 2466/2677/2466 2497/2678/2497 2496/2667/2496\nf 2466/2677/2466 2496/2667/2496 2463/2670/2463\nf 2499/2679/2499 2497/2678/2497 2466/2677/2466\nf 2499/2679/2499 2466/2677/2466 2498/2680/2498\nf 2497/2678/2497 2499/2679/2499 2470/2633/2470\nf 2497/2678/2497 2470/2633/2470 2471/2632/2471\nf 2517/2681/2517 2496/2667/2496 2497/2678/2497\nf 2517/2681/2517 2497/2678/2497 2471/2632/2471\nf 2516/2676/2516 2494/2675/2494 2496/2667/2496\nf 2516/2676/2516 2496/2667/2496 2517/2681/2517\nf 1356/2682/1356 2419/2571/2419 2422/2570/2422\nf 1356/2682/1356 2422/2570/2422 1357/2683/1357\nf 90/2684/90 1357/2683/1357 2422/2570/2422\nf 90/2684/90 2422/2570/2422 2502/2685/2502\nf 2507/2686/2507 1444/2687/1444 90/2688/90\nf 2507/2686/2507 90/2688/90 2502/2689/2502\nf 2507/2686/2507 2506/2690/2506 1445/2691/1445\nf 2507/2686/2507 1445/2691/1445 1444/2687/1444\nf 2504/2692/2504 2505/2693/2505 2508/2694/2508\nf 2504/2692/2504 2508/2694/2508 2507/2686/2507\nf 1446/2695/1446 1445/2691/1445 2506/2690/2506\nf 1446/2695/1446 2506/2690/2506 2509/2696/2509\nf 2176/2286/2176 2187/2285/2187 2177/2298/2177\nf 2176/2286/2176 2177/2298/2177 2510/2697/2510\nf 2175/2287/2175 2176/2286/2176 2510/2697/2510\nf 2175/2287/2175 2510/2697/2510 2511/2185/2511\nf 2513/2618/2513 2493/2698/2493 2459/2664/2459\nf 2513/2618/2513 2459/2664/2459 2512/2619/2512\nf 2461/2699/2461 2493/2698/2493 2513/2618/2513\nf 2461/2699/2461 2513/2618/2513 2514/2621/2514\nf 2468/2629/2468 46/2700/46 4/2672/4\nf 2468/2629/2468 4/2672/4 2515/2671/2515\nf 2500/2631/2500 2469/2630/2469 2516/2676/2516\nf 2500/2631/2500 2516/2676/2516 2517/2681/2517\nf 1/11/1 3/2701/3 2/12/2\nf 1/11/1 4/20/4 3/2701/3\nf 3/2701/3 4/20/4 5/2/5\nf 5/2/5 6/1/6 3/2701/3\nf 10/7/10 11/6/11 13/19/13\nf 7/4/7 19/51/19 18/50/18\nf 2/12/2 3/2701/3 6/1/6\nf 20/21/20 22/18/22 21/70/21\nf 25/15/25 26/56/26 24/16/24\nf 19/51/19 7/4/7 24/16/24\nf 24/16/24 26/56/26 19/51/19\nf 37/37/37 43/43/43 34/34/34\nf 46/46/46 9/8/9 4/20/4\nf 41/41/41 45/45/45 40/40/40\nf 26/56/26 49/60/49 48/48/48\nf 19/51/19 26/56/26 48/48/48\nf 1262/33/1262 51/62/51 33/30/33\nf 1262/33/1262 1281/2702/1281 51/62/51\nf 52/52/52 1281/2702/1281 1280/53/1280\nf 49/60/49 26/56/26 54/55/54\nf 31/26/31 55/59/55 30/25/30\nf 32/31/32 56/2703/56 31/26/31\nf 33/30/33 56/2703/56 32/31/32\nf 57/61/57 58/2704/58 56/2703/56\nf 57/61/57 56/2703/56 33/30/33\nf 54/55/54 59/57/59 49/60/49\nf 58/2704/58 60/58/60 56/2703/56\nf 60/58/60 58/2704/58 59/57/59\nf 58/2704/58 49/60/49 59/57/59\nf 58/2704/58 57/61/57 49/60/49\nf 60/58/60 55/59/55 56/2703/56\nf 55/59/55 31/26/31 56/2703/56\nf 51/62/51 1281/2702/1281 52/52/52\nf 63/2705/63 61/63/61 62/64/62\nf 63/2705/63 64/2706/64 61/63/61\nf 45/45/45 61/63/61 47/47/47\nf 47/47/47 65/66/65 44/44/44\nf 109/65/109 43/43/43 44/44/44\nf 21/70/21 36/36/36 20/21/20\nf 21/70/21 66/69/66 36/36/36\nf 39/39/39 66/69/66 42/42/42\nf 36/36/36 66/69/66 39/39/39\nf 12/5/12 67/68/67 11/6/11\nf 11/6/11 67/68/67 23/17/23\nf 22/18/22 67/68/67 21/70/21\nf 23/17/23 67/68/67 22/18/22\nf 42/42/42 67/68/67 12/5/12\nf 68/2707/68 14/10/14 15/9/15\nf 68/2707/68 15/9/15 16/13/16\nf 69/71/69 71/2708/71 16/13/16\nf 2/12/2 6/1/6 17/14/17\nf 77/78/77 80/88/80 79/79/79\nf 77/78/77 79/79/79 76/77/76\nf 72/73/72 70/72/70 17/14/17\nf 70/72/70 72/73/72 75/76/75\nf 75/76/75 81/82/81 70/72/70\nf 84/81/84 70/72/70 81/82/81\nf 84/81/84 69/71/69 70/72/70\nf 81/82/81 75/76/75 78/80/78\nf 86/87/86 87/86/87 89/102/89\nf 79/79/79 85/85/85 78/80/78\nf 7/4/7 18/50/18 6/1/6\nf 92/2709/92 69/71/69 84/81/84\nf 69/71/69 92/2709/92 71/2708/71\nf 82/84/82 92/2709/92 84/81/84\nf 86/87/86 94/2710/94 85/85/85\nf 92/90/92 94/98/94 86/94/86\nf 85/85/85 94/2710/94 83/83/83\nf 89/102/89 96/101/96 95/2711/95\nf 68/93/68 71/2712/71 92/90/92\nf 71/2708/71 68/2707/68 16/13/16\nf 101/111/101 103/108/103 102/2713/102\nf 102/2713/102 103/108/103 104/107/104\nf 98/105/98 99/104/99 105/2714/105\nf 110/2715/110 104/107/104 105/2714/105\nf 102/2713/102 104/107/104 110/2715/110\nf 103/108/103 108/113/108 111/114/111\nf 105/2714/105 104/107/104 98/105/98\nf 114/118/114 121/487/121 122/486/122\nf 126/120/126 116/167/116 115/117/115\nf 113/116/113 112/115/112 127/126/127\nf 112/115/112 117/122/117 120/129/120\nf 122/486/122 119/2716/119 118/123/118\nf 446/485/446 121/487/121 124/2717/124\nf 114/118/114 115/117/115 123/169/123\nf 121/487/121 125/170/125 124/2717/124\nf 121/487/121 123/169/123 125/170/125\nf 118/123/118 119/2716/119 174/125/174\nf 174/125/174 148/165/148 146/124/146\nf 127/126/127 130/131/130 131/143/131\nf 130/131/130 132/130/132 133/2718/133\nf 133/2718/133 136/142/136 130/131/130\nf 134/144/134 131/143/131 130/131/130\nf 136/142/136 133/2718/133 139/132/139\nf 157/141/157 134/144/134 136/142/136\nf 136/142/136 134/144/134 130/131/130\nf 132/130/132 137/134/137 138/133/138\nf 138/133/138 133/2718/133 132/130/132\nf 140/135/140 135/140/135 139/132/139\nf 133/2718/133 138/133/138 139/132/139\nf 137/134/137 132/130/132 141/137/141\nf 141/137/141 143/138/143 142/2719/142\nf 142/2719/142 137/134/137 141/137/141\nf 145/139/145 144/136/144 199/182/199\nf 117/122/117 146/124/146 147/183/147\nf 147/183/147 120/129/120 117/122/117\nf 144/136/144 120/129/120 147/183/147\nf 119/2716/119 188/166/188 174/125/174\nf 149/146/149 150/145/150 154/2720/154\nf 150/145/150 151/147/151 154/2720/154\nf 153/149/153 152/148/152 154/2720/154\nf 149/146/149 154/2720/154 152/148/152\nf 153/149/153 154/2720/154 151/147/151\nf 159/150/159 161/157/161 155/151/155\nf 149/146/149 152/148/152 165/2721/165\nf 157/141/157 135/140/135 158/152/158\nf 160/153/160 177/2722/177 161/157/161\nf 137/134/137 142/2719/142 140/135/140\nf 142/2719/142 143/138/143 164/2723/164\nf 140/135/140 142/2719/142 164/2723/164\nf 140/135/140 164/2723/164 135/140/135\nf 178/155/178 162/154/162 163/2724/163\nf 158/152/158 135/140/135 241/2725/241\nf 135/140/135 164/2723/164 241/2725/241\nf 160/153/160 158/152/158 241/2725/241\nf 152/148/152 155/151/155 165/2721/165\nf 131/143/131 149/146/149 165/2721/165\nf 165/2721/165 156/2726/156 131/143/131\nf 165/2721/165 155/151/155 166/2727/166\nf 166/2727/166 155/151/155 167/156/167\nf 155/151/155 161/157/161 167/156/167\nf 169/159/169 166/2727/166 167/156/167\nf 169/159/169 165/2721/165 166/2727/166\nf 156/2726/156 165/2721/165 168/158/168\nf 165/2721/165 169/159/169 168/158/168\nf 156/2726/156 170/2728/170 128/127/128\nf 156/2726/156 168/158/168 170/2728/170\nf 131/143/131 128/127/128 127/126/127\nf 571/588/571 173/163/173 191/162/191\nf 118/123/118 114/118/114 122/486/122\nf 172/179/172 148/165/148 189/164/189\nf 161/2729/161 177/2730/177 227/236/227\nf 176/2731/176 177/2722/177 164/2723/164\nf 163/2724/163 162/154/162 176/2731/176\nf 162/154/162 175/2732/175 176/2731/176\nf 176/2731/176 175/2732/175 177/2722/177\nf 163/2724/163 164/2723/164 178/155/178\nf 178/155/178 164/2723/164 143/138/143\nf 164/2723/164 163/2724/163 176/2731/176\nf 121/487/121 114/118/114 123/169/123\nf 125/170/125 123/169/123 179/168/179\nf 116/167/116 126/120/126 180/2733/180\nf 116/167/116 180/2733/180 182/173/182\nf 180/2733/180 181/174/181 182/173/182\nf 180/2733/180 126/120/126 181/174/181\nf 124/2717/124 125/170/125 183/172/183\nf 185/175/185 194/119/194 192/2734/192\nf 148/165/148 172/179/172 187/178/187\nf 568/585/568 571/588/571 189/164/189\nf 191/162/191 189/164/189 571/588/571\nf 194/119/194 195/2735/195 192/2734/192\nf 185/175/185 192/2734/192 193/242/193\nf 192/2734/192 195/2735/195 193/242/193\nf 113/116/113 129/128/129 196/121/196\nf 197/181/197 208/180/208 193/242/193\nf 181/174/181 185/175/185 193/242/193\nf 115/117/115 113/116/113 196/121/196\nf 193/242/193 195/2735/195 197/181/197\nf 197/181/197 195/2735/195 194/119/194\nf 197/181/197 194/119/194 196/121/196\nf 198/184/198 219/2736/219 200/185/200\nf 200/185/200 199/182/199 198/184/198\nf 148/165/148 198/184/198 146/124/146\nf 148/165/148 219/2736/219 198/184/198\nf 148/165/148 187/178/187 219/2736/219\nf 219/2736/219 187/178/187 233/230/233\nf 186/176/186 203/191/203 234/195/234\nf 129/128/129 128/127/128 207/198/207\nf 207/198/207 128/127/128 209/2737/209\nf 128/127/128 170/2728/170 209/2737/209\nf 209/200/209 170/2738/170 210/193/210\nf 218/351/218 212/206/212 215/210/215\nf 216/212/216 217/211/217 262/257/262\nf 214/209/214 211/214/211 218/351/218\nf 211/214/211 224/213/224 221/219/221\nf 220/215/220 223/220/223 224/213/224\nf 219/202/219 339/201/339 200/186/200\nf 225/187/225 226/222/226 175/188/175\nf 226/222/226 177/2730/177 175/188/175\nf 168/2739/168 228/245/228 170/2740/170\nf 168/2739/168 161/2729/161 228/245/228\nf 228/245/228 227/236/227 245/238/245\nf 228/245/228 229/247/229 170/2740/170\nf 231/223/231 230/225/230 240/228/240\nf 203/191/203 205/192/205 234/195/234\nf 234/195/234 201/177/201 186/176/186\nf 217/211/217 236/233/236 250/235/250\nf 230/246/230 247/239/247 240/250/240\nf 164/2723/164 177/2722/177 241/2725/241\nf 241/2725/241 177/2722/177 160/153/160\nf 161/157/161 159/150/159 160/153/160\nf 191/162/191 172/179/172 189/164/189\nf 243/241/243 182/173/182 181/174/181\nf 243/241/243 184/171/184 182/173/182\nf 206/199/206 242/244/242 208/180/208\nf 161/2729/161 227/236/227 228/245/228\nf 247/239/247 230/246/230 245/238/245\nf 226/222/226 227/236/227 177/2730/177\nf 246/2741/246 264/260/264 237/2742/237\nf 248/234/248 264/2743/264 249/251/249\nf 250/235/250 262/257/262 217/211/217\nf 216/212/216 262/257/262 260/217/260\nf 248/234/248 249/251/249 259/254/259\nf 257/258/257 251/259/251 252/295/252\nf 260/217/260 257/258/257 258/218/258\nf 220/215/220 222/216/222 255/256/255\nf 222/216/222 256/290/256 255/289/255\nf 258/218/258 252/295/252 256/290/256\nf 257/258/257 252/295/252 258/218/258\nf 250/235/250 248/234/248 259/254/259\nf 218/351/218 215/210/215 214/209/214\nf 246/2741/246 263/261/263 264/260/264\nf 266/263/266 265/262/265 285/2744/285\nf 267/2745/267 285/2744/285 269/2746/269\nf 269/2746/269 268/273/268 402/431/402\nf 271/266/271 265/262/265 274/267/274\nf 270/269/270 268/273/268 284/270/284\nf 246/2741/246 254/291/254 263/261/263\nf 273/264/273 276/271/276 272/2747/272\nf 276/271/276 273/264/273 279/275/279\nf 284/270/284 272/2747/272 276/271/276\nf 277/272/277 278/274/278 280/428/280\nf 278/274/278 281/277/281 280/428/280\nf 279/275/279 278/274/278 276/271/276\nf 276/271/276 278/274/278 277/272/277\nf 273/264/273 272/2747/272 283/265/283\nf 283/265/283 272/2747/272 284/270/284\nf 285/2744/285 265/262/265 271/266/271\nf 285/2744/285 271/266/271 268/273/268\nf 285/2744/285 267/2745/267 266/263/266\nf 285/2744/285 268/273/268 269/2746/269\nf 254/291/254 255/289/255 292/287/292\nf 290/285/290 342/354/342 294/398/294\nf 294/398/294 291/298/291 290/285/290\nf 298/278/298 275/268/275 263/261/263\nf 290/285/290 291/298/291 293/288/293\nf 249/251/249 264/2743/264 266/296/266\nf 267/297/267 269/279/269 253/252/253\nf 308/310/308 314/313/314 315/311/315\nf 312/317/312 317/316/317 313/350/313\nf 308/310/308 309/318/309 314/313/314\nf 314/313/314 310/312/310 315/311/315\nf 317/316/317 311/320/311 313/350/313\nf 306/308/306 304/306/304 323/321/323\nf 309/318/309 308/310/308 332/336/332\nf 315/311/315 310/312/310 318/333/318\nf 305/307/305 307/309/307 319/323/319\nf 307/309/307 315/311/315 319/323/319\nf 320/325/320 403/424/403 321/326/321\nf 323/321/323 304/306/304 302/304/302\nf 324/324/324 319/323/319 349/332/349\nf 403/424/403 320/325/320 432/2748/432\nf 331/344/331 333/337/333 329/339/329\nf 329/340/329 326/334/326 331/343/331\nf 318/333/318 310/312/310 345/346/345\nf 336/319/336 309/318/309 346/348/346\nf 339/201/339 211/214/211 221/219/221\nf 339/201/339 221/219/221 200/186/200\nf 221/219/221 225/187/225 200/186/200\nf 170/2749/170 341/224/341 210/353/210\nf 291/298/291 343/2750/343 344/328/344\nf 310/312/310 334/315/334 345/346/345\nf 309/318/309 332/336/332 346/348/346\nf 330/342/330 318/333/318 345/346/345\nf 346/348/346 332/336/332 330/345/330\nf 347/355/347 327/322/327 323/321/323\nf 322/329/322 384/2751/384 351/2752/351\nf 344/328/344 384/2751/384 322/329/322\nf 359/370/359 361/373/361 360/371/360\nf 363/374/363 367/2753/367 364/375/364\nf 359/370/359 365/376/365 361/373/361\nf 361/373/361 362/372/362 360/371/360\nf 366/377/366 367/2753/367 363/374/363\nf 357/368/357 355/366/355 368/378/368\nf 356/367/356 358/369/358 372/382/372\nf 358/369/358 360/371/360 372/382/372\nf 368/378/368 355/366/355 353/365/353\nf 373/383/373 372/382/372 383/384/383\nf 371/380/371 377/390/377 378/2754/378\nf 378/2755/378 377/394/377 370/385/370\nf 378/2755/378 370/385/370 375/387/375\nf 375/388/375 371/380/371 378/2754/378\nf 371/380/371 362/372/362 379/391/379\nf 366/377/366 365/376/365 380/393/380\nf 367/2753/367 381/392/381 364/375/364\nf 381/395/381 367/2753/367 366/377/366\nf 362/372/362 364/375/364 379/391/379\nf 365/376/365 370/385/370 380/393/380\nf 377/390/377 371/380/371 379/391/379\nf 380/393/380 370/385/370 377/394/377\nf 373/383/373 383/384/383 384/427/384\nf 344/363/344 354/362/354 373/383/373\nf 373/383/373 384/427/384 344/363/344\nf 343/2750/343 294/398/294 385/400/385\nf 291/298/291 294/398/294 343/2750/343\nf 386/399/386 342/354/342 387/294/387\nf 351/405/351 384/2756/384 395/406/395\nf 349/332/349 350/361/350 432/335/432\nf 393/413/393 386/399/386 387/294/387\nf 396/414/396 393/413/393 389/403/389\nf 385/400/385 386/399/386 394/410/394\nf 393/413/393 387/294/387 389/403/389\nf 297/292/297 299/299/299 321/326/321\nf 434/2757/434 391/421/391 433/420/433\nf 400/422/400 398/418/398 397/417/397\nf 397/417/397 399/423/399 400/422/400\nf 368/378/368 385/401/385 394/415/394\nf 401/425/401 399/423/399 397/417/397\nf 268/273/268 270/269/270 402/431/402\nf 408/439/408 409/438/409 410/441/410\nf 412/440/412 413/443/413 414/2758/414\nf 408/439/408 410/441/410 415/444/415\nf 410/441/410 409/438/409 411/442/411\nf 416/445/416 412/440/412 414/2758/414\nf 406/437/406 417/446/417 405/434/405\nf 404/433/404 421/450/421 407/436/407\nf 407/436/407 421/450/421 409/438/409\nf 419/449/419 427/2759/427 426/457/426\nf 427/2760/427 424/452/424 426/461/426\nf 427/2760/427 423/453/423 424/452/424\nf 423/456/423 427/2759/427 419/449/419\nf 419/449/419 428/459/428 411/442/411\nf 416/445/416 429/462/429 415/444/415\nf 413/443/413 430/458/430 414/2758/414\nf 430/460/430 416/445/416 414/2758/414\nf 411/442/411 428/459/428 413/443/413\nf 415/444/415 429/462/429 424/452/424\nf 426/457/426 428/459/428 419/449/419\nf 429/462/429 426/461/426 424/452/424\nf 421/450/421 432/468/432 422/451/422\nf 403/432/403 421/450/421 404/433/404\nf 421/450/421 403/432/403 432/468/432\nf 405/434/405 417/446/417 399/2761/399\nf 417/446/417 433/466/433 399/2761/399\nf 405/434/405 399/2761/399 401/435/401\nf 432/2762/432 350/2763/350 435/2764/435\nf 435/2764/435 434/2757/434 433/420/433\nf 350/2763/350 434/2757/434 435/2764/435\nf 441/478/441 446/485/446 442/479/442\nf 183/172/183 442/479/442 124/2717/124\nf 183/172/183 184/171/184 442/479/442\nf 442/479/442 446/485/446 124/2717/124\nf 588/2765/588 564/594/564 119/2716/119\nf 447/484/447 558/483/558 449/2766/449\nf 449/2766/449 122/486/122 447/484/447\nf 451/488/451 242/490/242 204/491/204\nf 477/524/477 476/523/476 478/2767/478\nf 478/2767/478 480/526/480 481/550/481\nf 478/2767/478 476/523/476 480/526/480\nf 481/550/481 480/526/480 485/2768/485\nf 480/526/480 479/525/479 482/527/482\nf 480/526/480 482/527/482 485/2768/485\nf 482/527/482 519/530/519 485/2768/485\nf 498/522/498 488/532/488 487/531/487\nf 487/531/487 468/513/468 498/522/498\nf 468/513/468 487/531/487 491/536/491\nf 497/541/497 496/540/496 493/537/493\nf 171/160/171 204/190/204 190/161/190\nf 475/521/475 499/543/499 498/522/498\nf 498/522/498 501/553/501 500/2769/500\nf 499/543/499 503/545/503 501/553/501\nf 475/521/475 477/524/477 505/544/505\nf 477/524/477 478/2767/478 505/544/505\nf 478/2767/478 481/550/481 505/544/505\nf 481/550/481 504/2770/504 505/544/505\nf 481/550/481 502/547/502 504/2770/504\nf 504/2770/504 503/545/503 505/544/505\nf 504/2770/504 506/2771/506 512/2772/512\nf 504/2770/504 502/547/502 506/2771/506\nf 506/2771/506 502/547/502 507/546/507\nf 506/2771/506 507/546/507 510/555/510\nf 510/555/510 512/2772/512 506/2771/506\nf 507/546/507 509/549/509 510/555/510\nf 481/550/481 485/2768/485 519/530/519\nf 503/545/503 504/2770/504 511/554/511\nf 504/2770/504 512/2772/512 511/554/511\nf 510/555/510 511/554/511 512/2772/512\nf 514/551/514 513/557/513 537/552/537\nf 500/2769/500 501/553/501 537/552/537\nf 498/522/498 499/543/499 501/553/501\nf 516/2773/516 517/2774/517 519/530/519\nf 517/2774/517 508/548/508 519/530/519\nf 517/2774/517 516/2773/516 518/2775/518\nf 519/530/519 515/556/515 516/2773/516\nf 486/529/486 515/556/515 519/530/519\nf 515/556/515 173/542/173 538/570/538\nf 173/163/173 571/588/571 538/2776/538\nf 508/548/508 517/2774/517 520/559/520\nf 520/559/520 509/549/509 508/548/508\nf 517/2774/517 518/2775/518 520/559/520\nf 520/559/520 510/555/510 509/549/509\nf 518/2775/518 516/2773/516 542/560/542\nf 542/560/542 520/559/520 518/2775/518\nf 526/566/526 473/519/473 472/518/472\nf 532/2777/532 523/563/523 527/2778/527\nf 523/563/523 469/515/469 527/2778/527\nf 534/2779/534 527/2778/527 529/2780/529\nf 529/2780/529 528/514/528 531/567/531\nf 527/2778/527 469/515/469 528/514/528\nf 529/2780/529 531/567/531 533/568/533\nf 530/2781/530 492/535/492 494/538/494\nf 534/2779/534 532/2777/532 527/2778/527\nf 492/535/492 530/2781/530 533/568/533\nf 533/568/533 530/2781/530 529/2780/529\nf 528/514/528 469/515/469 458/503/458\nf 529/2780/529 530/2781/530 534/2779/534\nf 468/513/468 491/536/491 531/567/531\nf 531/567/531 528/514/528 468/513/468\nf 528/514/528 529/2780/529 527/2778/527\nf 535/2782/535 467/512/467 466/511/466\nf 466/511/466 473/519/473 535/2782/535\nf 496/540/496 495/539/495 493/537/493\nf 498/522/498 500/2769/500 536/2783/536\nf 500/2769/500 537/552/537 536/2783/536\nf 513/557/513 536/2783/536 537/552/537\nf 495/539/495 498/522/498 536/2783/536\nf 516/2773/516 515/556/515 541/569/541\nf 541/569/541 542/560/542 516/2773/516\nf 541/569/541 543/573/543 542/560/542\nf 543/573/543 540/572/540 544/2784/544\nf 543/573/543 544/2784/544 545/574/545\nf 542/560/542 543/573/543 545/574/545\nf 592/607/592 548/582/548 549/579/549\nf 549/579/549 551/577/551 550/576/550\nf 552/578/552 443/480/443 445/482/445\nf 552/578/552 551/577/551 553/2785/553\nf 554/2786/554 558/481/558 443/480/443\nf 443/480/443 552/578/552 554/2786/554\nf 557/581/557 553/2785/553 551/577/551\nf 553/2785/553 557/581/557 556/2787/556\nf 554/2786/554 552/578/552 556/2787/556\nf 556/2787/556 552/578/552 553/2785/553\nf 556/2787/556 558/481/558 554/2786/554\nf 558/483/558 556/2788/556 449/2766/449\nf 548/582/548 592/607/592 593/601/593\nf 812/2789/812 813/2790/813 741/2791/741\nf 565/2792/565 450/584/450 188/166/188\nf 564/594/564 448/593/448 119/2716/119\nf 119/2716/119 448/593/448 589/2793/589\nf 119/2716/119 589/2793/589 188/166/188\nf 563/2794/563 565/2792/565 188/166/188\nf 563/2794/563 567/2795/567 587/2796/587\nf 565/2792/565 587/2796/587 566/2797/566\nf 566/2797/566 450/584/450 565/2792/565\nf 587/2796/587 565/2792/565 563/2794/563\nf 569/589/569 571/588/571 573/587/573\nf 568/585/568 570/2798/570 572/586/572\nf 570/2798/570 585/2799/585 572/586/572\nf 572/586/572 583/2800/583 573/587/573\nf 573/587/573 583/2800/583 569/589/569\nf 576/2801/576 579/2802/579 575/2803/575\nf 571/588/571 569/589/569 574/2804/574\nf 579/2802/579 539/571/539 575/2803/575\nf 539/571/539 538/570/538 575/2803/575\nf 575/2803/575 538/570/538 576/2801/576\nf 576/2805/576 574/2804/574 577/592/577\nf 577/592/577 574/2804/574 569/589/569\nf 538/2776/538 574/2804/574 576/2805/576\nf 574/2804/574 538/2776/538 571/588/571\nf 576/2801/576 582/2806/582 579/2802/579\nf 586/591/586 581/2807/581 580/2808/580\nf 578/590/578 581/2807/581 586/591/586\nf 576/2801/576 580/639/580 582/2806/582\nf 580/2808/580 576/2805/576 577/592/577\nf 569/589/569 584/2809/584 578/590/578\nf 578/590/578 584/2809/584 570/2798/570\nf 569/589/569 583/2800/583 584/2809/584\nf 583/2800/583 572/586/572 585/2799/585\nf 570/2798/570 584/2809/584 585/2799/585\nf 585/2799/585 584/2809/584 583/2800/583\nf 580/2808/580 577/592/577 586/591/586\nf 570/2798/570 568/585/568 450/584/450\nf 450/584/450 566/2797/566 607/2810/607\nf 566/2797/566 587/2796/587 607/2810/607\nf 607/2810/607 570/2798/570 450/584/450\nf 607/2810/607 578/590/578 570/2798/570\nf 587/2796/587 567/2795/567 590/596/590\nf 567/2795/567 448/593/448 590/596/590\nf 119/2716/119 122/486/122 588/2765/588\nf 448/593/448 567/2795/567 589/2793/589\nf 589/2793/589 567/2795/567 563/2794/563\nf 589/2793/589 563/2794/563 188/166/188\nf 122/486/122 449/2766/449 588/2765/588\nf 564/594/564 588/2765/588 591/595/591\nf 449/2766/449 556/2788/556 588/2765/588\nf 549/579/549 550/576/550 592/607/592\nf 550/576/550 602/2811/602 592/607/592\nf 602/2811/602 601/606/601 594/605/594\nf 745/771/745 595/600/595 744/599/744\nf 596/770/596 636/657/636 597/2812/597\nf 598/602/598 594/605/594 599/603/599\nf 548/582/548 593/601/593 600/583/600\nf 596/770/596 559/604/559 601/606/601\nf 559/604/559 596/770/596 638/655/638\nf 602/2811/602 594/605/594 592/607/592\nf 607/2810/607 587/2796/587 590/596/590\nf 607/623/607 590/612/590 604/611/604\nf 638/655/638 597/2812/597 637/656/637\nf 637/656/637 597/2812/597 636/657/636\nf 604/611/604 993/620/993 607/623/607\nf 605/610/605 606/659/606 609/2813/609\nf 604/611/604 605/610/605 608/1000/608\nf 578/2814/578 607/2815/607 610/641/610\nf 610/641/610 581/640/581 578/2814/578\nf 610/622/610 994/621/994 995/624/995\nf 609/2813/609 897/876/897 613/875/613\nf 996/2816/996 621/2817/621 611/1001/611\nf 611/1001/611 621/2817/621 614/2818/614\nf 609/2813/609 613/875/613 996/2816/996\nf 609/2813/609 608/1000/608 605/610/605\nf 642/1002/642 650/2819/650 619/627/619\nf 619/627/619 616/2820/616 620/628/620\nf 613/875/613 615/874/615 621/2817/621\nf 621/2817/621 615/874/615 622/2821/622\nf 614/2818/614 621/2817/621 622/2821/622\nf 614/2818/614 642/1002/642 611/1001/611\nf 619/627/619 995/624/995 642/1002/642\nf 616/2822/616 645/2823/645 643/632/643\nf 650/2819/650 642/1002/642 645/2824/645\nf 617/642/617 618/630/618 648/629/648\nf 620/631/620 616/2822/616 643/632/643\nf 628/636/628 625/634/625 627/633/627\nf 624/635/624 626/637/626 540/572/540\nf 626/637/626 545/574/545 544/2784/544\nf 626/637/626 544/2784/544 540/572/540\nf 624/635/624 540/572/540 539/571/539\nf 539/571/539 579/2802/579 624/635/624\nf 579/2802/579 582/2806/582 624/635/624\nf 545/574/545 626/637/626 627/633/627\nf 624/635/624 582/2806/582 580/639/580\nf 591/595/591 588/2765/588 556/2788/556\nf 630/646/630 632/649/632 634/651/634\nf 603/654/603 560/650/560 635/652/635\nf 936/1182/936 612/2825/612 606/659/606\nf 596/770/596 597/2812/597 638/655/638\nf 630/646/630 560/650/560 603/654/603\nf 614/2818/614 622/2821/622 640/2826/640\nf 622/2821/622 651/2827/651 640/2826/640\nf 622/2821/622 615/874/615 651/2827/651\nf 614/2818/614 639/2828/639 642/1002/642\nf 639/2828/639 645/2824/645 642/1002/642\nf 614/2818/614 640/2826/640 641/2829/641\nf 639/2830/639 644/660/644 645/2823/645\nf 644/660/644 643/632/643 645/2823/645\nf 623/2831/623 643/632/643 646/662/646\nf 643/632/643 623/2831/623 648/629/648\nf 625/2832/625 628/643/628 617/642/617\nf 648/629/648 623/2831/623 625/2832/625\nf 617/642/617 648/629/648 625/2832/625\nf 645/2824/645 616/2820/616 650/2819/650\nf 650/2819/650 616/2820/616 619/627/619\nf 614/2818/614 641/2829/641 639/2828/639\nf 644/2833/644 639/2834/639 653/674/653\nf 644/2833/644 653/674/653 673/673/673\nf 653/671/653 654/670/654 656/678/656\nf 665/683/665 659/2835/659 660/684/660\nf 661/685/661 659/2835/659 665/686/665\nf 661/685/661 669/691/669 659/2835/659\nf 669/691/669 660/684/660 659/2835/659\nf 671/693/671 670/692/670 669/691/669\nf 668/690/668 666/689/666 674/694/674\nf 673/673/673 676/698/676 644/2833/644\nf 672/688/672 674/694/674 677/696/677\nf 672/688/672 677/696/677 678/697/678\nf 729/2836/729 730/2837/730 771/2838/771\nf 680/701/680 679/700/679 684/738/684\nf 679/700/679 710/730/710 684/738/684\nf 690/714/690 703/723/703 698/715/698\nf 705/2839/705 702/2840/702 704/2841/704\nf 705/2839/705 706/2842/706 682/902/682\nf 692/2843/692 694/2844/694 695/2845/695\nf 681/705/681 699/710/699 696/718/696\nf 699/710/699 688/720/688 696/718/696\nf 696/718/696 694/717/694 692/782/692\nf 688/720/688 691/722/691 701/721/701\nf 701/721/701 691/722/691 703/723/703\nf 703/723/703 691/722/691 698/715/698\nf 704/724/704 703/723/703 689/712/689\nf 706/2842/706 705/2839/705 704/2841/704\nf 694/2844/694 693/2846/693 709/2847/709\nf 704/724/704 689/712/689 706/725/706\nf 708/727/708 695/2845/695 694/2844/694\nf 693/2846/693 750/729/750 709/2847/709\nf 694/2844/694 749/728/749 708/727/708\nf 689/712/689 690/714/690 711/713/711\nf 720/740/720 716/734/716 714/733/714\nf 718/742/718 713/732/713 712/731/712\nf 690/714/690 689/712/689 703/723/703\nf 718/741/718 720/740/720 724/749/724\nf 724/749/724 725/748/725 728/2848/728\nf 725/748/725 726/750/726 728/2848/728\nf 726/750/726 727/747/727 728/2848/728\nf 727/747/727 724/746/724 728/2848/728\nf 730/781/730 678/2849/678 677/778/677\nf 676/755/676 678/762/678 732/756/732\nf 730/763/730 729/758/729 734/761/734\nf 737/764/737 735/2850/735 736/765/736\nf 738/766/738 735/2850/735 739/767/739\nf 739/767/739 735/2850/735 737/764/737\nf 609/2813/609 606/659/606 612/2825/612\nf 629/647/629 742/769/742 741/2791/741\nf 813/2790/813 746/2851/746 741/2791/741\nf 741/2791/741 740/768/740 562/2852/562\nf 629/647/629 630/646/630 742/769/742\nf 742/769/742 740/768/740 741/2791/741\nf 742/769/742 630/646/630 743/598/743\nf 743/598/743 630/646/630 603/654/603\nf 744/599/744 636/657/636 596/770/596\nf 601/606/601 602/2811/602 745/771/745\nf 741/2791/741 562/2852/562 812/2789/812\nf 746/2851/746 629/647/629 741/2791/741\nf 813/2853/813 747/2854/747 748/2855/748\nf 748/2856/748 746/2851/746 813/2790/813\nf 629/647/629 746/2851/746 748/2856/748\nf 694/2844/694 709/2847/709 749/728/749\nf 749/728/749 709/2847/709 750/729/750\nf 693/2846/693 704/2841/704 750/729/750\nf 693/716/693 697/719/697 704/724/704\nf 704/2841/704 702/2840/702 750/729/750\nf 702/2840/702 707/726/707 750/729/750\nf 695/2845/695 708/727/708 751/2857/751\nf 751/2857/751 753/2858/753 754/788/754\nf 753/2858/753 755/2859/755 754/788/754\nf 788/2860/788 776/790/776 787/789/787\nf 751/2857/751 752/773/752 753/2858/753\nf 753/2858/753 752/773/752 758/784/758\nf 752/773/752 757/772/757 758/784/758\nf 752/773/752 707/726/707 759/774/759\nf 758/784/758 757/772/757 760/776/760\nf 755/2859/755 753/2858/753 763/783/763\nf 753/2858/753 758/784/758 763/783/763\nf 763/783/763 774/803/774 764/2861/764\nf 759/774/759 707/726/707 765/2862/765\nf 765/2862/765 707/726/707 702/2840/702\nf 702/2840/702 705/2839/705 766/2863/766\nf 765/2862/765 702/2840/702 766/2863/766\nf 705/2839/705 765/2862/765 766/2863/766\nf 765/2862/765 761/775/761 759/774/759\nf 771/2838/771 730/2837/730 920/2864/920\nf 924/917/924 769/904/769 768/903/768\nf 767/702/767 680/701/680 771/2838/771\nf 771/753/771 680/706/680 681/705/681\nf 692/782/692 700/2865/700 772/751/772\nf 772/751/772 700/2865/700 729/752/729\nf 708/727/708 707/726/707 751/2857/751\nf 707/726/707 752/773/752 751/2857/751\nf 763/783/763 799/804/799 774/803/774\nf 775/786/775 773/785/773 762/777/762\nf 763/783/763 775/786/775 799/804/799\nf 776/790/776 780/2866/780 777/787/777\nf 764/2861/764 788/2860/788 787/789/787\nf 788/2860/788 764/2861/764 778/2867/778\nf 764/2861/764 774/803/774 778/2867/778\nf 764/2861/764 755/2859/755 763/783/763\nf 788/2860/788 778/2867/778 805/2868/805\nf 805/2868/805 776/790/776 788/2860/788\nf 804/2869/804 780/2866/780 805/2868/805\nf 780/2866/780 776/790/776 805/2868/805\nf 782/792/782 756/791/756 780/2866/780\nf 780/2866/780 756/791/756 777/787/777\nf 782/792/782 803/2870/803 784/793/784\nf 785/2871/785 782/792/782 781/800/781\nf 785/2871/785 781/800/781 802/2872/802\nf 754/788/754 755/2859/755 787/789/787\nf 787/789/787 755/2859/755 764/2861/764\nf 761/775/761 795/2873/795 789/2874/789\nf 762/777/762 789/2874/789 790/2875/790\nf 775/786/775 762/777/762 798/2876/798\nf 790/2875/790 789/2874/789 791/795/791\nf 761/775/761 765/2862/765 792/2877/792\nf 789/2874/789 762/777/762 761/775/761\nf 761/775/761 792/2877/792 795/2873/795\nf 762/777/762 790/2875/790 798/2876/798\nf 798/2876/798 799/804/799 775/786/775\nf 790/2875/790 793/2878/793 798/2876/798\nf 790/2875/790 791/795/791 793/2878/793\nf 795/2873/795 796/2879/796 789/2874/789\nf 795/2873/795 792/2877/792 796/2879/796\nf 796/2879/796 792/2877/792 794/796/794\nf 796/2879/796 794/796/794 797/2880/797\nf 797/2880/797 789/2874/789 796/2879/796\nf 794/796/794 791/795/791 797/2880/797\nf 797/2880/797 791/795/791 789/2874/789\nf 792/2877/792 765/2862/765 826/2881/826\nf 798/2876/798 793/2878/793 799/804/799\nf 802/2872/802 803/2870/803 785/2871/785\nf 803/2870/803 802/2872/802 784/793/784\nf 804/2869/804 805/2868/805 806/802/806\nf 780/2866/780 779/801/779 781/800/781\nf 804/2869/804 779/801/779 780/2866/780\nf 780/2866/780 781/800/781 782/792/782\nf 779/801/779 804/2869/804 806/802/806\nf 806/802/806 805/2868/805 778/2867/778\nf 800/798/800 793/2878/793 791/795/791\nf 799/804/799 793/2878/793 810/805/810\nf 793/2878/793 800/798/800 810/805/810\nf 809/806/809 806/802/806 778/2867/778\nf 811/807/811 812/1227/812 1196/1224/1196\nf 813/2853/813 811/807/811 815/2882/815\nf 808/809/808 814/811/814 815/2882/815\nf 815/2882/815 814/811/814 816/1004/816\nf 815/2882/815 816/1004/816 817/2883/817\nf 747/2854/747 813/2853/813 815/2882/815\nf 747/2854/747 815/2882/815 818/2884/818\nf 815/2882/815 817/2883/817 818/2884/818\nf 818/2884/818 748/2855/748 747/2854/747\nf 820/812/820 819/810/819 821/2885/821\nf 821/2885/821 819/810/819 800/798/800\nf 800/798/800 801/797/801 821/2885/821\nf 822/814/822 820/812/820 821/2885/821\nf 821/2885/821 801/797/801 822/814/822\nf 765/2862/765 705/2839/705 826/2881/826\nf 705/2839/705 823/2886/823 826/2881/826\nf 824/1020/824 823/2886/823 828/900/828\nf 828/900/828 825/834/825 824/1020/824\nf 833/2887/833 823/2886/823 836/1023/836\nf 825/834/825 828/900/828 914/872/914\nf 823/2886/823 827/901/827 828/900/828\nf 827/901/827 823/2886/823 705/2839/705\nf 826/2881/826 830/813/830 829/815/829\nf 829/815/829 801/797/801 794/796/794\nf 792/2877/792 826/2881/826 829/815/829\nf 829/815/829 794/796/794 792/2877/792\nf 830/813/830 826/2881/826 831/2888/831\nf 830/813/830 831/2888/831 837/1008/837\nf 831/2888/831 833/2887/833 837/1008/837\nf 837/1008/837 833/2887/833 834/2889/834\nf 832/1009/832 834/2889/834 835/1022/835\nf 835/1022/835 834/2889/834 836/1023/836\nf 823/2886/823 824/1020/824 836/1023/836\nf 836/1023/836 834/2889/834 833/2887/833\nf 834/2889/834 832/1009/832 837/1008/837\nf 831/2888/831 826/2881/826 833/2887/833\nf 833/2887/833 826/2881/826 823/2886/823\nf 824/1020/824 825/834/825 863/833/863\nf 841/818/841 838/817/838 843/835/843\nf 824/1020/824 863/833/863 1024/2890/1024\nf 865/1011/865 844/836/844 864/838/864\nf 862/837/862 842/822/842 845/828/845\nf 846/926/846 867/2891/867 862/837/862\nf 862/837/862 845/828/845 846/926/846\nf 851/826/851 873/831/873 852/827/852\nf 849/823/849 851/826/851 852/827/852\nf 858/2892/858 855/840/855 874/2893/874\nf 857/839/857 856/843/856 873/831/873\nf 859/824/859 861/870/861 926/2894/926\nf 859/824/859 848/820/848 861/870/861\nf 838/817/838 842/822/842 843/835/843\nf 843/835/843 842/822/842 862/837/862\nf 867/2891/867 864/838/864 862/837/862\nf 927/871/927 839/816/839 840/819/840\nf 840/819/840 913/873/913 927/871/927\nf 864/838/864 818/2884/818 865/1011/865\nf 865/1011/865 818/2884/818 817/2883/817\nf 748/2855/748 818/2884/818 866/2895/866\nf 629/2896/629 748/2855/748 866/2895/866\nf 866/2897/866 633/653/633 631/648/631\nf 631/648/631 629/647/629 866/2897/866\nf 866/2895/866 867/2891/867 932/919/932\nf 855/840/855 858/2892/858 883/841/883\nf 858/2892/858 882/855/882 883/841/883\nf 873/831/873 872/949/872 869/845/869\nf 872/949/872 856/843/856 1380/844/1380\nf 856/843/856 872/949/872 873/831/873\nf 873/831/873 851/826/851 857/839/857\nf 855/840/855 850/825/850 874/2893/874\nf 874/2893/874 850/825/850 860/864/860\nf 946/856/946 868/850/868 875/869/875\nf 946/856/946 875/869/875 949/957/949\nf 877/849/877 875/869/875 868/850/868\nf 882/855/882 858/2892/858 885/861/885\nf 885/861/885 881/847/881 882/855/882\nf 946/856/946 1380/844/1380 884/842/884\nf 858/2892/858 887/857/887 885/861/885\nf 874/2893/874 886/858/886 887/857/887\nf 887/857/887 858/2892/858 874/2893/874\nf 860/864/860 926/2894/926 888/865/888\nf 896/863/896 874/2893/874 860/864/860\nf 896/863/896 886/858/886 874/2893/874\nf 897/876/897 899/2898/899 901/878/901\nf 898/881/898 900/2899/900 903/882/903\nf 900/2899/900 919/884/919 903/882/903\nf 902/883/902 651/2900/651 615/880/615\nf 651/2900/651 902/883/902 906/2901/906\nf 902/883/902 907/887/907 906/2901/906\nf 906/2901/906 904/2902/904 651/2900/651\nf 904/888/904 652/668/652 651/667/651\nf 906/2901/906 907/887/907 911/894/911\nf 911/895/911 909/893/909 906/892/906\nf 919/884/919 900/2899/900 912/2903/912\nf 927/871/927 913/873/913 916/897/916\nf 915/915/915 768/903/768 912/907/912\nf 827/901/827 705/2839/705 682/902/682\nf 915/896/915 914/872/914 682/902/682\nf 769/904/769 770/2904/770 918/2905/918\nf 770/2904/770 921/779/921 923/910/923\nf 918/2905/918 770/2904/770 923/910/923\nf 767/916/767 920/2906/920 922/780/922\nf 920/2864/920 767/702/767 771/2838/771\nf 921/779/921 925/2907/925 922/780/922\nf 922/780/922 925/2907/925 767/916/767\nf 923/913/923 917/906/917 918/905/918\nf 922/780/922 920/2906/920 730/781/730\nf 770/2904/770 769/904/769 925/2907/925\nf 925/2907/925 769/904/769 924/917/924\nf 925/2907/925 924/917/924 767/916/767\nf 921/779/921 770/2904/770 925/2907/925\nf 900/899/900 901/934/901 928/933/928\nf 928/933/928 927/871/927 916/897/916\nf 928/933/928 916/897/916 900/899/900\nf 899/2898/899 897/876/897 612/2825/612\nf 899/2898/899 612/2825/612 929/2908/929\nf 612/2825/612 936/1182/936 929/2908/929\nf 609/2813/609 612/2825/612 897/876/897\nf 634/2909/634 633/918/633 930/617/930\nf 635/616/635 634/2909/634 930/617/930\nf 932/919/932 867/2891/867 931/920/931\nf 867/2891/867 846/926/846 931/920/931\nf 932/919/932 633/918/633 866/2895/866\nf 811/807/811 813/2853/813 812/1227/812\nf 854/829/854 953/924/953 934/921/934\nf 937/925/937 931/920/931 846/926/846\nf 853/830/853 935/922/935 937/925/937\nf 936/618/936 937/925/937 929/2910/929\nf 933/923/933 955/951/955 953/924/953\nf 888/865/888 926/2894/926 939/931/939\nf 926/2894/926 861/870/861 939/931/939\nf 933/923/933 871/832/871 870/846/870\nf 889/862/889 940/935/940 943/2911/943\nf 891/860/891 890/859/890 940/935/940\nf 889/862/889 891/860/891 940/935/940\nf 894/868/894 889/862/889 943/2911/943\nf 893/867/893 894/868/894 942/936/942\nf 894/868/894 943/2911/943 942/936/942\nf 946/856/946 1379/1448/1379 1380/844/1380\nf 1379/1448/1379 946/856/946 949/957/949\nf 945/943/945 943/942/943 940/953/940\nf 952/946/952 945/943/945 951/950/951\nf 944/940/944 945/943/945 952/946/952\nf 955/951/955 933/923/933 956/952/956\nf 956/952/956 933/923/933 870/846/870\nf 935/922/935 899/956/899 929/2910/929\nf 929/2910/929 937/925/937 935/922/935\nf 935/922/935 934/921/934 899/956/899\nf 875/869/875 880/854/880 957/958/957\nf 957/958/957 961/961/961 962/964/962\nf 1115/969/1115 960/962/960 1153/974/1153\nf 1078/968/1078 961/961/961 1114/970/1114\nf 965/971/965 962/964/962 1077/967/1077\nf 973/981/973 976/991/976 977/982/977\nf 973/981/973 974/992/974 976/991/976\nf 976/991/976 975/988/975 977/982/977\nf 968/976/968 970/978/970 981/985/981\nf 970/978/970 972/980/972 981/985/981\nf 969/977/969 967/975/967 1028/1024/1028\nf 971/979/971 969/977/969 1028/1024/1028\nf 988/999/988 1052/998/1052 991/2912/991\nf 988/999/988 991/2912/991 992/941/992\nf 1187/1090/1187 990/1089/990 991/2913/991\nf 1052/998/1052 1187/1085/1187 991/2912/991\nf 991/2913/991 990/1089/990 989/2914/989\nf 991/2912/991 989/2915/989 992/941/992\nf 604/611/604 608/1000/608 993/620/993\nf 611/1001/611 608/1000/608 996/2816/996\nf 996/2816/996 608/1000/608 609/2813/609\nf 996/2816/996 613/875/613 621/2817/621\nf 997/1005/997 998/2916/998 1000/1003/1000\nf 1000/1003/1000 817/2883/817 816/1004/816\nf 814/811/814 820/812/820 997/1005/997\nf 998/2916/998 999/1017/999 1000/1003/1000\nf 1000/1003/1000 999/1017/999 817/2883/817\nf 999/1017/999 865/1011/865 817/2883/817\nf 1002/2917/1002 844/836/844 1003/1010/1003\nf 1004/2918/1004 1011/2919/1011 1005/2920/1005\nf 1011/2919/1011 1001/2921/1001 1005/2920/1005\nf 1004/2918/1004 1005/2920/1005 1008/2922/1008\nf 1005/2920/1005 1006/2923/1006 1008/2922/1008\nf 1006/2923/1006 1022/1015/1022 1008/2922/1008\nf 1022/1015/1022 1007/1014/1007 1008/2922/1008\nf 1008/2922/1008 1009/1007/1009 1004/2918/1004\nf 1008/2922/1008 1007/1014/1007 1009/1007/1009\nf 1004/2918/1004 1010/1006/1010 1011/2919/1011\nf 1004/2918/1004 1009/1007/1009 1010/1006/1010\nf 1009/1007/1009 1007/1014/1007 822/814/822\nf 1010/1006/1010 832/1009/832 1011/2919/1011\nf 1001/2921/1001 1011/2919/1011 1012/1021/1012\nf 1012/1021/1012 1011/2919/1011 835/1022/835\nf 832/1009/832 835/1022/835 1011/2919/1011\nf 1023/1019/1023 1019/1018/1019 1020/2924/1020\nf 1003/1010/1003 1013/1012/1013 1014/2925/1014\nf 1001/2921/1001 1003/1010/1003 1014/2925/1014\nf 1003/1010/1003 1001/2921/1001 1002/2917/1002\nf 1014/2925/1014 1006/2923/1006 1001/2921/1001\nf 1006/2923/1006 1005/2920/1005 1001/2921/1001\nf 1014/2925/1014 1013/1012/1013 1006/2923/1006\nf 1006/2923/1006 1021/2926/1021 1022/1015/1022\nf 1022/1015/1022 998/2916/998 997/1005/997\nf 1022/1015/1022 997/1005/997 1015/1016/1015\nf 997/1005/997 820/812/820 1015/1016/1015\nf 822/814/822 1007/1014/1007 1016/1013/1016\nf 1016/1013/1016 1017/2927/1017 1018/2928/1018\nf 1016/1013/1016 1015/1016/1015 1017/2927/1017\nf 1015/1016/1015 820/812/820 1017/2927/1017\nf 1017/2927/1017 820/812/820 1018/2928/1018\nf 820/812/820 822/814/822 1018/2928/1018\nf 1018/2928/1018 822/814/822 1016/1013/1016\nf 1019/1018/1019 999/1017/999 998/2916/998\nf 1019/1018/1019 998/2916/998 1021/2926/1021\nf 1021/2926/1021 998/2916/998 1022/1015/1022\nf 1023/1019/1023 1013/1012/1013 865/1011/865\nf 1020/2924/1020 1019/1018/1019 1021/2926/1021\nf 1023/1019/1023 1020/2924/1020 1013/1012/1013\nf 1013/1012/1013 1020/2924/1020 1006/2923/1006\nf 1006/2923/1006 1020/2924/1020 1021/2926/1021\nf 844/836/844 1002/2917/1002 1024/2890/1024\nf 1001/2921/1001 1012/1021/1012 1024/2890/1024\nf 1024/2890/1024 1012/1021/1012 824/1020/824\nf 1024/2890/1024 1002/2917/1002 1001/2921/1001\nf 844/836/844 1024/2890/1024 863/833/863\nf 811/807/811 808/809/808 815/2882/815\nf 926/2894/926 860/864/860 859/824/859\nf 860/864/860 850/825/850 859/824/859\nf 1026/1026/1026 984/993/984 974/992/974\nf 985/994/985 982/989/982 975/988/975\nf 1026/1026/1026 1032/1031/1032 1034/2929/1034\nf 984/993/984 1026/1026/1026 1034/2929/1034\nf 984/993/984 1034/2929/1034 1036/996/1036\nf 1035/997/1035 1033/2930/1033 985/994/985\nf 1033/2930/1033 1029/1028/1029 982/989/982\nf 982/989/982 985/994/985 1033/2930/1033\nf 987/995/987 1036/996/1036 1040/2931/1040\nf 1035/997/1035 987/995/987 1040/2931/1040\nf 1036/1039/1036 1035/1038/1035 1040/2932/1040\nf 1047/1052/1047 1049/1058/1049 1048/1053/1048\nf 1047/1052/1047 1050/1059/1050 1049/1058/1049\nf 1049/1058/1049 1051/1055/1051 1048/1053/1048\nf 1044/1049/1044 1046/1051/1046 1053/1054/1053\nf 1046/1051/1046 1048/1053/1048 1053/1054/1053\nf 1045/1050/1045 1043/1048/1043 1061/1065/1061\nf 1047/1052/1047 1045/1050/1045 1061/1065/1061\nf 1062/1066/1062 1056/1060/1056 1050/1059/1050\nf 1057/1061/1057 1054/1056/1054 1051/1055/1051\nf 1062/1066/1062 1064/1071/1064 1066/2933/1066\nf 1056/1060/1056 1062/1066/1062 1068/2934/1068\nf 1056/1060/1056 1068/2934/1068 1059/1063/1059\nf 1060/1064/1060 1067/2935/1067 1057/1061/1057\nf 1054/1056/1054 1067/2935/1067 1065/2936/1065\nf 1065/2936/1065 1063/1068/1063 1054/1056/1054\nf 1054/1056/1054 1057/1061/1057 1067/2935/1067\nf 1062/1066/1062 1066/2933/1066 1068/2934/1068\nf 1058/1062/1058 1059/1063/1059 1072/2937/1072\nf 1060/1064/1060 1058/1062/1058 1072/2937/1072\nf 1059/1081/1059 1060/1080/1060 1072/2938/1072\nf 989/2914/989 990/1089/990 1074/1088/1074\nf 1085/1099/1085 1087/1107/1087 1086/1100/1086\nf 1085/1099/1085 1088/1108/1088 1087/1107/1087\nf 1087/1107/1087 1089/1104/1089 1086/1100/1086\nf 1080/1094/1080 1082/1096/1082 1091/1101/1091\nf 1082/1096/1082 1084/1098/1084 1091/1101/1091\nf 1081/1095/1081 1079/1093/1079 1100/1114/1100\nf 1083/1097/1083 1081/1095/1081 1100/1114/1100\nf 1102/1116/1102 1095/1109/1095 1088/1108/1088\nf 1096/1110/1096 1093/1105/1093 1089/1104/1089\nf 1102/1116/1102 1107/1121/1107 1109/2939/1109\nf 1095/1109/1095 1102/1116/1102 1109/2939/1109\nf 1095/1109/1095 1109/2939/1109 1098/1112/1098\nf 1099/1113/1099 1108/2940/1108 1096/1110/1096\nf 1108/2940/1108 1104/1118/1104 1093/1105/1093\nf 1093/1105/1093 1096/1110/1096 1108/2940/1108\nf 1097/1111/1097 1098/1112/1098 1113/2941/1113\nf 1099/1113/1099 1097/1111/1097 1113/2941/1113\nf 1098/1129/1098 1099/1128/1099 1113/2942/1113\nf 1090/1102/1090 1112/1045/1112 1027/1027/1027\nf 1122/1142/1122 1124/1150/1124 1123/1143/1123\nf 1122/1142/1122 1125/1151/1125 1124/1150/1124\nf 1124/1150/1124 1126/1147/1126 1123/1143/1123\nf 1117/1137/1117 1119/1139/1119 1128/1144/1128\nf 1119/1139/1119 1121/1141/1121 1128/1144/1128\nf 1134/2943/1134 1131/1149/1131 1132/1152/1132\nf 1133/1153/1133 1131/1149/1131 1134/2943/1134\nf 1118/1138/1118 1116/1136/1116 1135/1154/1135\nf 1120/1140/1120 1118/1138/1118 1135/1154/1135\nf 1137/1156/1137 1132/1152/1132 1125/1151/1125\nf 1133/1153/1133 1130/1148/1130 1126/1147/1126\nf 1144/1167/1144 1143/1166/1143 1134/2944/1134\nf 1137/1156/1137 1142/1161/1142 1144/2945/1144\nf 1132/1152/1132 1137/1156/1137 1144/2945/1144\nf 1132/1152/1132 1144/2945/1144 1134/2943/1134\nf 1134/2943/1134 1143/2946/1143 1133/1153/1133\nf 1143/2946/1143 1139/1158/1139 1130/1148/1130\nf 1130/1148/1130 1133/1153/1133 1143/2946/1143\nf 1127/1145/1127 1148/1134/1148 1103/1117/1103\nf 1186/1217/1186 1150/1175/1150 1074/1178/1074\nf 992/941/992 989/2915/989 1151/938/1151\nf 989/1177/989 1149/1176/1149 1151/2947/1151\nf 880/854/880 892/853/892 1152/965/1152\nf 144/136/144 147/183/147 199/182/199\nf 222/216/222 258/218/258 256/290/256\nf 264/2743/264 248/234/248 237/232/237\nf 229/226/229 341/224/341 170/2749/170\nf 128/127/128 131/143/131 156/2726/156\nf 112/115/112 120/129/120 127/126/127\nf 864/838/864 867/2891/867 818/2884/818\nf 867/2891/867 866/2895/866 818/2884/818\nf 1161/1189/1161 1163/1197/1163 1162/1190/1162\nf 1161/1189/1161 1164/1198/1164 1163/1197/1163\nf 1163/1197/1163 1165/1194/1165 1162/1190/1162\nf 1156/1184/1156 1158/1186/1158 1167/1191/1167\nf 1158/1186/1158 1160/1188/1160 1167/1191/1167\nf 1173/2948/1173 1170/1196/1170 1171/1199/1171\nf 1172/1200/1172 1170/1196/1170 1173/2948/1173\nf 1157/1185/1157 1155/1183/1155 1174/1201/1174\nf 1159/1187/1159 1157/1185/1157 1174/1201/1174\nf 1176/1203/1176 1171/1199/1171 1164/1198/1164\nf 1172/1200/1172 1169/1195/1169 1165/1194/1165\nf 1183/1214/1183 1182/1213/1182 1173/2949/1173\nf 1176/1203/1176 1181/1208/1181 1183/2950/1183\nf 1171/1199/1171 1176/1203/1176 1183/2950/1183\nf 1171/1199/1171 1183/2950/1183 1173/2948/1173\nf 1173/2948/1173 1182/2951/1182 1172/1200/1172\nf 1182/2951/1182 1178/1205/1178 1169/1195/1169\nf 1169/1195/1169 1172/1200/1172 1182/2951/1182\nf 1166/1192/1166 1147/1173/1147 1138/1157/1138\nf 1177/1204/1177 1154/973/1154 964/966/964\nf 1071/2952/1071 1075/1092/1075 1076/1087/1076\nf 1071/2952/1071 1076/1087/1076 1187/1090/1187\nf 1042/983/1042 958/959/958 963/963/963\nf 1189/1221/1189 1188/1231/1188 1197/1222/1197\nf 1195/1223/1195 1192/1226/1192 1191/1232/1191\nf 812/1227/812 1190/1225/1190 1196/1224/1196\nf 562/1228/562 1191/1232/1191 1192/1226/1192\nf 1196/1224/1196 807/808/807 811/807/811\nf 1188/1231/1188 1198/1269/1198 1197/1222/1197\nf 1188/1231/1188 1193/1230/1193 1198/1269/1198\nf 786/799/786 806/802/806 1199/2953/1199\nf 1199/2954/1199 1197/2955/1197 1275/1309/1275\nf 1203/1308/1203 786/2956/786 1199/2954/1199\nf 1199/2954/1199 1275/1309/1275 1203/1308/1203\nf 809/806/809 1197/1222/1197 1199/2953/1199\nf 1199/2953/1199 806/802/806 809/806/809\nf 1202/1237/1202 1201/1240/1201 1205/1243/1205\nf 784/2957/784 802/2958/802 1210/2959/1210\nf 1215/1260/1215 1214/1253/1214 1223/1252/1223\nf 1210/2960/1210 1211/1263/1211 784/1251/784\nf 782/792/782 785/2871/785 803/2870/803\nf 1212/1264/1212 1217/1257/1217 1215/1260/1215\nf 1213/2961/1213 1216/1258/1216 1217/1257/1217\nf 1217/1257/1217 1212/1264/1212 1213/2961/1213\nf 784/1251/784 1211/1263/1211 1223/1252/1223\nf 1201/1240/1201 1320/2962/1320 1225/1265/1225\nf 1224/2963/1224 1220/1262/1220 1225/1265/1225\nf 1225/1265/1225 1220/1262/1220 1221/1261/1221\nf 1225/1265/1225 1221/1261/1221 1222/1259/1222\nf 1225/1265/1225 1222/1259/1222 1226/1266/1226\nf 1226/1266/1226 1222/1259/1222 1219/1256/1219\nf 1226/1266/1226 1219/1256/1219 1218/1255/1218\nf 1209/1245/1209 1208/1244/1208 1227/2964/1227\nf 1213/1249/1213 1209/1245/1209 1227/2964/1227\nf 1216/1258/1216 1213/2961/1213 1227/2964/1227\nf 1218/1255/1218 1216/1258/1216 1227/2964/1227\nf 1208/1244/1208 1218/1255/1218 1227/2964/1227\nf 1331/1234/1331 1200/1233/1200 1220/1370/1220\nf 1229/1280/1229 1237/1279/1237 1231/1273/1231\nf 1229/1280/1229 1231/1273/1231 1249/1289/1249\nf 1231/1273/1231 1248/1272/1248 1249/1289/1249\nf 1233/1270/1233 1247/1290/1247 1250/1271/1250\nf 1232/1276/1232 1251/1288/1251 1252/1277/1252\nf 1247/1290/1247 1245/1317/1245 1243/1316/1243\nf 1237/1279/1237 1233/1270/1233 1231/1273/1231\nf 1254/1291/1254 1240/1392/1240 1241/1285/1241\nf 1242/1284/1242 1234/1287/1234 1257/1322/1257\nf 1243/1316/1243 1234/1287/1234 1247/1290/1247\nf 1234/1287/1234 1243/1316/1243 1257/1322/1257\nf 1269/1301/1269 34/34/34 43/43/43\nf 1201/1240/1201 1204/1239/1204 1320/2962/1320\nf 1320/2962/1320 1224/2963/1224 1225/1265/1225\nf 1304/1313/1304 1249/1289/1249 1236/1275/1236\nf 1273/1305/1273 1272/1304/1272 1277/1312/1277\nf 1257/1322/1257 1244/1315/1244 1285/1327/1285\nf 1243/1316/1243 1244/1315/1244 1257/1322/1257\nf 1262/33/1262 1263/1297/1263 1291/1328/1291\nf 1262/33/1262 1291/1328/1291 1281/2702/1281\nf 1278/1319/1278 1280/53/1280 1281/2702/1281\nf 1285/1327/1285 1284/1321/1284 1257/1322/1257\nf 1259/1296/1259 1282/1295/1282 1290/1325/1290\nf 1264/1298/1264 1259/1296/1259 1286/2965/1286\nf 1263/1297/1263 1264/1298/1264 1286/2965/1286\nf 1279/1326/1279 1286/2965/1286 1289/2966/1289\nf 1279/1326/1279 1263/1297/1263 1286/2965/1286\nf 1284/1321/1284 1285/1327/1285 1287/1323/1287\nf 1289/2966/1289 1286/2965/1286 1288/1324/1288\nf 1288/1324/1288 1287/1323/1287 1289/2966/1289\nf 1289/2966/1289 1287/1323/1287 1285/1327/1285\nf 1289/2966/1289 1285/1327/1285 1279/1326/1279\nf 1288/1324/1288 1286/2965/1286 1290/1325/1290\nf 1290/1325/1290 1286/2965/1286 1259/1296/1259\nf 1291/1328/1291 1278/1319/1278 1281/2702/1281\nf 1292/2967/1292 1306/1330/1306 1325/1329/1325\nf 1276/2968/1276 1275/1401/1275 1436/1335/1436\nf 1292/2969/1292 1276/2968/1276 1293/1334/1293\nf 1438/1337/1438 1298/1339/1298 1299/1342/1299\nf 1293/1334/1293 1303/1346/1303 1306/2970/1306\nf 1295/1333/1295 1297/1338/1297 1305/1345/1305\nf 1292/2969/1292 1293/1334/1293 1306/2970/1306\nf 1204/1352/1204 1330/2971/1330 1311/1353/1311\nf 1324/1365/1324 1314/2972/1314 1323/1364/1323\nf 1314/2972/1314 1324/1365/1324 1318/1366/1318\nf 1319/1360/1319 1321/1363/1321 1322/1361/1322\nf 1321/1363/1321 1320/1362/1320 1204/2973/1204\nf 1204/2973/1204 1309/2974/1309 1321/1363/1321\nf 1322/1361/1322 1321/1363/1321 1309/2974/1309\nf 1309/2974/1309 1312/2975/1312 1322/1361/1322\nf 1322/1361/1322 1318/1366/1318 1317/1358/1317\nf 1312/2975/1312 1318/1366/1318 1322/1361/1322\nf 1323/2976/1323 1314/2972/1314 1318/1366/1318\nf 1318/1366/1318 1312/2975/1312 1323/2976/1323\nf 1328/1368/1328 1333/2977/1333 1336/2978/1336\nf 1320/1362/1320 1326/1359/1326 1327/1378/1327\nf 1224/1371/1224 1320/2979/1320 1327/1373/1327\nf 1329/2980/1329 1333/2977/1333 1328/1368/1328\nf 1328/1368/1328 1325/1367/1325 1329/2980/1329\nf 1292/2967/1292 1325/1329/1325 1330/2981/1330\nf 1330/2971/1330 1325/1367/1325 1311/1353/1311\nf 106/1372/106 1336/2982/1336 1337/2983/1337\nf 1333/1374/1333 1329/1314/1329 1334/1375/1334\nf 1277/1312/1277 1329/1314/1329 1325/1329/1325\nf 1329/1314/1329 1274/1307/1274 1334/1375/1334\nf 1334/1375/1334 109/65/109 1335/1376/1335\nf 106/1372/106 1327/1373/1327 1336/2982/1336\nf 1336/2978/1336 1327/1378/1327 1328/1368/1328\nf 101/111/101 102/2713/102 1341/1385/1341\nf 102/2713/102 1342/1386/1342 1341/1385/1341\nf 1340/1383/1340 105/2714/105 99/1384/99\nf 110/2715/110 105/2714/105 1342/1386/1342\nf 102/2713/102 110/2715/110 1342/1386/1342\nf 1341/1385/1341 1338/1390/1338 1335/1389/1335\nf 105/2714/105 1340/1383/1340 1342/1386/1342\nf 1240/1392/1240 1254/1291/1254 1266/1300/1266\nf 1240/1392/1240 1266/1300/1266 1343/1393/1343\nf 1268/1303/1268 1271/1306/1271 1343/1393/1343\nf 1266/1300/1266 1268/1303/1268 1343/1393/1343\nf 1235/1274/1235 1252/1277/1252 1344/1391/1344\nf 1252/1277/1252 1253/1286/1253 1344/1391/1344\nf 1241/1285/1241 1240/1392/1240 1344/1391/1344\nf 1253/1286/1253 1241/1285/1241 1344/1391/1344\nf 1271/1306/1271 1235/1274/1235 1344/1391/1344\nf 1443/1410/1443 1348/1405/1348 1345/1395/1345\nf 1348/1405/1348 1347/1404/1347 1349/2984/1349\nf 1349/2985/1349 1347/1505/1347 1294/1400/1294\nf 1294/1400/1294 1345/1399/1345 1349/2985/1349\nf 1345/1399/1345 1197/1398/1197 1198/2986/1198\nf 1350/1402/1350 1298/1412/1298 1296/1403/1296\nf 1300/1343/1300 1352/1344/1352 1355/2987/1355\nf 1307/1348/1307 1300/1343/1300 1355/2987/1355\nf 1352/1415/1352 1353/1414/1353 1355/2987/1355\nf 1353/1414/1353 1307/1348/1307 1355/2987/1355\nf 1191/1232/1191 562/1228/562 1356/1417/1356\nf 1193/1230/1193 1194/1229/1194 1358/1420/1358\nf 1358/1420/1358 1228/1267/1228 1193/1230/1193\nf 1358/2988/1358 1230/1278/1230 1228/1281/1228\nf 1358/2988/1358 1238/1282/1238 1230/1278/1230\nf 1359/1421/1359 1238/1282/1238 1361/2989/1361\nf 1237/1279/1237 1362/1283/1362 1233/1270/1233\nf 77/78/77 1372/1428/1372 80/88/80\nf 77/78/77 1365/1426/1365 1372/1428/1372\nf 1363/1423/1363 1362/1283/1362 1360/1422/1360\nf 1360/1422/1360 1366/1425/1366 1363/1423/1363\nf 1366/1425/1366 1360/1422/1360 1370/1432/1370\nf 1371/1429/1371 1370/1432/1370 1360/1422/1360\nf 1371/1429/1371 1360/1422/1360 1359/1421/1359\nf 1370/1432/1370 1367/1427/1367 1366/1425/1366\nf 1375/1435/1375 1378/1447/1378 1373/1433/1373\nf 1372/1428/1372 1367/1427/1367 1374/1434/1374\nf 1247/1290/1247 1233/1270/1233 1245/1317/1245\nf 1376/2990/1376 1371/1429/1371 1359/1421/1359\nf 1359/1421/1359 1361/2989/1361 1376/2990/1376\nf 1368/1430/1368 1371/1429/1371 1376/2990/1376\nf 1375/1435/1375 1374/1434/1374 1377/2991/1377\nf 1376/1436/1376 1375/1441/1375 1377/1443/1377\nf 1374/1434/1374 1369/1431/1369 1377/2991/1377\nf 1378/1447/1378 95/2711/95 96/101/96\nf 810/805/810 800/798/800 819/810/819\nf 781/800/781 786/799/786 802/2872/802\nf 802/2958/802 786/2992/786 1210/2959/1210\nf 809/806/809 778/2867/778 774/803/774\nf 1358/1437/1358 1376/1436/1376 1361/2993/1361\nf 1361/2989/1361 1238/1282/1238 1358/2988/1358\nf 1390/1462/1390 1393/1465/1393 1391/1463/1391\nf 1394/1484/1394 1395/1471/1395 1396/1472/1396\nf 1395/1471/1395 550/1466/550 1397/1468/1397\nf 1398/1467/1398 445/1460/445 1388/1459/1388\nf 1398/1467/1398 1399/2994/1399 1397/1468/1397\nf 1400/2995/1400 1388/1459/1388 1387/1458/1387\nf 1388/1459/1388 1400/2995/1400 1398/1467/1398\nf 1401/1469/1401 1397/1468/1397 1399/2994/1399\nf 1399/2994/1399 1403/2996/1403 1401/1469/1401\nf 1400/2995/1400 1403/2996/1403 1398/1467/1398\nf 1403/2996/1403 1399/2994/1399 1398/1467/1398\nf 1403/2996/1403 1400/2995/1400 1387/1458/1387\nf 1396/1472/1396 1405/1480/1405 1394/1484/1394\nf 1406/2997/1406 1407/2998/1407 1408/2999/1408\nf 1395/1471/1395 1394/1484/1394 550/1466/550\nf 550/1466/550 1394/1484/1394 602/3000/602\nf 602/3000/602 1409/1483/1409 1410/1482/1410\nf 745/1499/745 1411/1476/1411 595/1475/595\nf 1413/1500/1413 1414/3001/1414 1415/1494/1415\nf 1416/1479/1416 1417/1478/1417 1409/1483/1409\nf 1396/1472/1396 1404/1473/1404 1405/1480/1405\nf 1413/1500/1413 1410/1482/1410 1418/1481/1418\nf 1418/1481/1418 1419/1496/1419 1413/1500/1413\nf 602/3000/602 1394/1484/1394 1409/1483/1409\nf 1419/1496/1419 1420/1495/1420 1414/3001/1414\nf 1420/1495/1420 1415/1494/1415 1414/3001/1414\nf 1421/1485/1421 1427/1491/1427 1422/1486/1422\nf 1429/1493/1429 1426/1490/1426 1425/1489/1425\nf 1413/1500/1413 1419/1496/1419 1414/3001/1414\nf 1421/1485/1421 1429/1493/1429 1425/1489/1425\nf 1424/1488/1424 1407/2998/1407 1430/1497/1430\nf 1408/2999/1408 1407/2998/1407 1431/3002/1431\nf 1407/2998/1407 562/3003/562 740/1498/740\nf 1424/1488/1424 1430/1497/1430 1421/1485/1421\nf 1430/1497/1430 1407/2998/1407 740/1498/740\nf 1430/1497/1430 1412/1477/1412 1421/1485/1421\nf 1412/1477/1412 1429/1493/1429 1421/1485/1421\nf 1411/1476/1411 1413/1500/1413 1415/1494/1415\nf 1410/1482/1410 745/1499/745 602/3000/602\nf 1407/2998/1407 1406/2997/1406 562/3003/562\nf 1431/3002/1431 1407/2998/1407 1424/1488/1424\nf 1432/3004/1432 1408/2999/1408 1431/3002/1431\nf 1424/1488/1424 1432/3004/1432 1431/3002/1431\nf 1433/3005/1433 1423/1487/1423 1428/1492/1428\nf 1423/1487/1423 1433/3005/1433 1424/1488/1424\nf 1434/1501/1434 65/66/65 47/47/47\nf 1436/1335/1436 1293/1334/1293 1276/2968/1276\nf 1275/1401/1275 1294/1400/1294 1436/1335/1436\nf 1438/1337/1438 1296/1506/1296 1298/1339/1298\nf 1299/1342/1299 1297/1338/1297 1438/1337/1438\nf 1303/1346/1303 1304/1507/1304 1306/2970/1306\nf 1439/1407/1439 1303/1346/1303 1442/1408/1442\nf 1441/1416/1441 1354/1347/1354 1308/1349/1308\nf 1305/1345/1305 1440/1409/1440 1442/1408/1442\nf 1442/1408/1442 1303/1346/1303 1305/1345/1305\nf 1346/1394/1346 1439/1407/1439 1442/1408/1442\nf 1345/1395/1345 1346/1394/1346 1443/1410/1443\nf 1443/1410/1443 1346/1394/1346 1442/1408/1442\nf 1348/1405/1348 1349/2984/1349 1345/1395/1345\nf 1449/1509/1449 1457/1868/1457 1456/1867/1456\nf 1461/1514/1461 1450/1510/1450 1451/1560/1451\nf 1448/1511/1448 1462/1521/1462 1447/1508/1447\nf 1447/1508/1447 1455/1524/1455 1452/1515/1452\nf 1457/1868/1457 1453/1516/1453 1454/3006/1454\nf 1768/1864/1768 1459/3007/1459 1456/1867/1456\nf 1449/1509/1449 1458/1561/1458 1450/1510/1450\nf 1456/1867/1456 1459/3007/1459 1460/1563/1460\nf 1456/1867/1456 1460/1563/1460 1458/1561/1458\nf 1453/1516/1453 1509/1518/1509 1454/3006/1454\nf 1509/1518/1509 1481/1517/1481 1483/1559/1483\nf 1462/1521/1462 1466/1536/1466 1465/1522/1465\nf 1465/1522/1465 1468/3008/1468 1467/1523/1467\nf 1468/3008/1468 1465/1522/1465 1471/1533/1471\nf 1469/1539/1469 1465/1522/1465 1466/1536/1466\nf 1471/1533/1471 1474/1525/1474 1468/3008/1468\nf 1492/1534/1492 1471/1533/1471 1469/1539/1469\nf 1471/1533/1471 1465/1522/1465 1469/1539/1469\nf 1467/1523/1467 1473/1528/1473 1472/1527/1472\nf 1473/1528/1473 1467/1523/1467 1468/3008/1468\nf 1475/1526/1475 1474/1525/1474 1470/1535/1470\nf 1468/3008/1468 1474/1525/1474 1473/1528/1473\nf 1472/1527/1472 1476/1529/1476 1467/1523/1467\nf 1476/1529/1476 1477/3009/1477 1478/1531/1478\nf 1477/3009/1477 1476/1529/1476 1472/1527/1472\nf 1480/1532/1480 1534/1575/1534 1479/1530/1479\nf 1452/1515/1452 1482/1577/1482 1481/1517/1481\nf 1482/1577/1482 1452/1515/1452 1455/1524/1455\nf 1479/1530/1479 1482/1577/1482 1455/1524/1455\nf 1454/3006/1454 1509/1518/1509 1523/1558/1523\nf 1484/1537/1484 1489/3010/1489 1485/1538/1485\nf 1485/1538/1485 1489/3010/1489 1486/1540/1486\nf 1488/1544/1488 1489/3010/1489 1487/1541/1487\nf 1484/1537/1484 1487/1541/1487 1489/3010/1489\nf 1488/1544/1488 1486/1540/1486 1489/3010/1489\nf 1494/1543/1494 1490/1542/1490 1496/1552/1496\nf 1484/1537/1484 1500/3011/1500 1487/1541/1487\nf 1492/1534/1492 1493/1546/1493 1470/1535/1470\nf 1495/1545/1495 1496/1552/1496 1512/3012/1512\nf 1472/1527/1472 1475/1526/1475 1477/3009/1477\nf 1477/3009/1477 1499/3013/1499 1478/1531/1478\nf 1475/1526/1475 1499/3013/1499 1477/3009/1477\nf 1475/1526/1475 1470/1535/1470 1499/3013/1499\nf 1513/1547/1513 1498/3014/1498 1497/1548/1497\nf 1493/1546/1493 1575/3015/1575 1470/1535/1470\nf 1470/1535/1470 1575/3015/1575 1499/3013/1499\nf 1495/1545/1495 1575/3015/1575 1493/1546/1493\nf 1487/1541/1487 1500/3011/1500 1490/1542/1490\nf 1466/1536/1466 1500/3011/1500 1484/1537/1484\nf 1500/3011/1500 1466/1536/1466 1491/3016/1491\nf 1500/3011/1500 1501/3017/1501 1490/1542/1490\nf 1501/3017/1501 1502/1549/1502 1490/1542/1490\nf 1490/1542/1490 1502/1549/1502 1496/1552/1496\nf 1504/1550/1504 1502/1549/1502 1501/3017/1501\nf 1504/1550/1504 1501/3017/1501 1500/3011/1500\nf 1491/3016/1491 1503/1551/1503 1500/3011/1500\nf 1500/3011/1500 1503/1551/1503 1504/1550/1504\nf 1491/3016/1491 1463/1520/1463 1505/3018/1505\nf 1491/3016/1491 1505/3018/1505 1503/1551/1503\nf 1466/1536/1466 1462/1521/1462 1463/1520/1463\nf 1850/1954/1850 1526/1555/1526 1508/1554/1508\nf 1453/1516/1453 1457/1868/1457 1449/1509/1449\nf 1507/1570/1507 1524/1557/1524 1483/1559/1483\nf 1496/3019/1496 1561/1629/1561 1512/3020/1512\nf 1511/3021/1511 1499/3013/1499 1512/3012/1512\nf 1498/3014/1498 1511/3021/1511 1497/1548/1497\nf 1497/1548/1497 1511/3021/1511 1510/3022/1510\nf 1511/3021/1511 1512/3012/1512 1510/3022/1510\nf 1498/3014/1498 1513/1547/1513 1499/3013/1499\nf 1513/1547/1513 1478/1531/1478 1499/3013/1499\nf 1499/3013/1499 1511/3021/1511 1498/3014/1498\nf 1456/1867/1456 1458/1561/1458 1449/1509/1449\nf 1460/1563/1460 1514/1562/1514 1458/1561/1458\nf 1451/1560/1451 1515/3023/1515 1461/1514/1461\nf 1451/1560/1451 1517/1566/1517 1515/3023/1515\nf 1515/3023/1515 1517/1566/1517 1516/1567/1516\nf 1515/3023/1515 1516/1567/1516 1461/1514/1461\nf 1459/3007/1459 1518/1564/1518 1460/1563/1460\nf 1520/1568/1520 1527/3024/1527 1529/1512/1529\nf 1483/1559/1483 1522/1571/1522 1507/1570/1507\nf 1847/1953/1847 1524/1557/1524 1850/1954/1850\nf 1526/1555/1526 1850/1954/1850 1524/1557/1524\nf 1529/1512/1529 1527/3024/1527 1530/3025/1530\nf 1520/1568/1520 1528/1636/1528 1527/3024/1527\nf 1527/3024/1527 1528/1636/1528 1530/3025/1530\nf 1448/1511/1448 1531/1513/1531 1464/1519/1464\nf 1532/1573/1532 1528/1636/1528 1542/1574/1542\nf 1516/1567/1516 1528/1636/1528 1520/1568/1520\nf 1450/1510/1450 1531/1513/1531 1448/1511/1448\nf 1528/1636/1528 1532/1573/1532 1530/3025/1530\nf 1532/1573/1532 1529/1512/1529 1530/3025/1530\nf 1532/1573/1532 1531/1513/1531 1529/1512/1529\nf 1533/1576/1533 1535/1578/1535 1553/3026/1553\nf 1535/1578/1535 1533/1576/1533 1534/1575/1534\nf 1483/1559/1483 1481/1517/1481 1533/1576/1533\nf 1483/1559/1483 1533/1576/1533 1553/3026/1553\nf 1483/1559/1483 1553/3026/1553 1522/1571/1522\nf 1553/3026/1553 1567/1623/1567 1522/1571/1522\nf 1521/1569/1521 1568/1586/1568 1538/1583/1538\nf 1464/1519/1464 1541/1591/1541 1463/1520/1463\nf 1541/1591/1541 1543/3027/1543 1463/1520/1463\nf 1463/1520/1463 1543/3027/1543 1505/3018/1505\nf 1543/1593/1543 1544/1588/1544 1505/3028/1505\nf 1552/1744/1552 1549/1605/1549 1546/1601/1546\nf 1550/1603/1550 1593/1650/1593 1551/1604/1551\nf 1548/1602/1548 1552/1744/1552 1545/1608/1545\nf 1545/1608/1545 1555/1613/1555 1558/1606/1558\nf 1554/1607/1554 1558/1606/1558 1557/1612/1557\nf 1553/1597/1553 1535/1579/1535 1670/1594/1670\nf 1559/1582/1559 1510/1581/1510 1560/1615/1560\nf 1560/1615/1560 1510/1581/1510 1512/3020/1512\nf 1503/3029/1503 1505/3030/1505 1562/1638/1562\nf 1503/3029/1503 1562/1638/1562 1496/3019/1496\nf 1562/1638/1562 1576/1631/1576 1561/1629/1561\nf 1562/1638/1562 1505/3030/1505 1563/1639/1563\nf 1565/1616/1565 1574/1621/1574 1564/1618/1564\nf 1538/1583/1538 1568/1586/1568 1539/1585/1539\nf 1568/1586/1568 1521/1569/1521 1536/1572/1536\nf 1551/1604/1551 1581/1627/1581 1570/1625/1570\nf 1564/1640/1564 1574/1642/1574 1578/1632/1578\nf 1499/3013/1499 1575/3015/1575 1512/3012/1512\nf 1575/3015/1575 1495/1545/1495 1512/3012/1512\nf 1496/1552/1496 1495/1545/1495 1494/1543/1494\nf 1526/1555/1526 1524/1557/1524 1507/1570/1507\nf 1381/1634/1381 1516/1567/1516 1517/1566/1517\nf 1381/1634/1381 1517/1566/1517 1519/1565/1519\nf 1540/1592/1540 1542/1574/1542 1391/1637/1391\nf 1496/3019/1496 1562/1638/1562 1561/1629/1561\nf 1578/1632/1578 1576/1631/1576 1564/1640/1564\nf 1560/1615/1560 1512/3020/1512 1561/1629/1561\nf 1577/3031/1577 1571/3032/1571 1595/1653/1595\nf 1579/1628/1579 1580/1644/1580 1595/3033/1595\nf 1581/1627/1581 1551/1604/1551 1593/1650/1593\nf 1550/1603/1550 1591/1611/1591 1593/1650/1593\nf 1579/1628/1579 1590/1645/1590 1580/1644/1580\nf 1588/1651/1588 1583/1688/1583 1582/1652/1582\nf 1591/1611/1591 1589/1610/1589 1588/1651/1588\nf 1554/1607/1554 1586/1649/1586 1556/1609/1556\nf 1556/1609/1556 1586/1682/1586 1587/1683/1587\nf 1589/1610/1589 1587/1683/1587 1583/1688/1583\nf 1588/1651/1588 1589/1610/1589 1583/1688/1583\nf 1581/1627/1581 1590/1645/1590 1579/1628/1579\nf 1552/1744/1552 1548/1602/1548 1549/1605/1549\nf 1577/3031/1577 1595/1653/1595 1594/1656/1594\nf 1597/1654/1597 1616/3034/1616 1596/1655/1596\nf 1598/3035/1598 1600/3036/1600 1616/3034/1616\nf 1600/3036/1600 1733/1824/1733 1599/1666/1599\nf 1602/1659/1602 1605/1658/1605 1596/1655/1596\nf 1601/1662/1601 1615/1665/1615 1599/1666/1599\nf 1577/3031/1577 1594/1656/1594 1585/1685/1585\nf 1604/1657/1604 1603/3037/1603 1607/1664/1607\nf 1607/1664/1607 1610/1670/1610 1604/1657/1604\nf 1615/1665/1615 1607/1664/1607 1603/3037/1603\nf 1608/1663/1608 1611/1821/1611 1609/1667/1609\nf 1609/1667/1609 1611/1821/1611 1612/1668/1612\nf 1610/1670/1610 1607/1664/1607 1609/1667/1609\nf 1607/1664/1607 1608/1663/1608 1609/1667/1609\nf 1604/1657/1604 1614/1660/1614 1603/3037/1603\nf 1614/1660/1614 1615/1665/1615 1603/3037/1603\nf 1616/3034/1616 1602/1659/1602 1596/1655/1596\nf 1616/3034/1616 1599/1666/1599 1602/1659/1602\nf 1616/3034/1616 1597/1654/1597 1598/3035/1598\nf 1616/3034/1616 1600/3036/1600 1599/1666/1599\nf 1585/1685/1585 1623/1680/1623 1586/1682/1586\nf 1621/1679/1621 1625/1791/1625 1673/1747/1673\nf 1625/1791/1625 1621/1679/1621 1622/1692/1622\nf 1629/1671/1629 1594/1656/1594 1606/1661/1606\nf 1621/1679/1621 1624/1681/1624 1622/1692/1622\nf 1580/1644/1580 1597/1689/1597 1595/3033/1595\nf 1598/1690/1598 1584/1647/1584 1600/1672/1600\nf 1639/1704/1639 1646/1703/1646 1645/1708/1645\nf 1643/1709/1643 1644/1743/1644 1648/1710/1648\nf 1639/1704/1639 1645/1708/1645 1640/1711/1640\nf 1645/1708/1645 1646/1703/1646 1641/1705/1641\nf 1648/1710/1648 1644/1743/1644 1642/1713/1642\nf 1637/1702/1637 1654/1714/1654 1635/1700/1635\nf 1640/1711/1640 1663/1729/1663 1639/1704/1639\nf 1646/1703/1646 1649/1727/1649 1641/1705/1641\nf 1636/1699/1636 1650/1717/1650 1638/1701/1638\nf 1638/1701/1638 1650/1717/1650 1646/1703/1646\nf 1651/1719/1651 1652/1718/1652 1734/1818/1734\nf 1654/1714/1654 1633/1697/1633 1635/1700/1635\nf 1655/1716/1655 1680/1724/1680 1650/1717/1650\nf 1734/1818/1734 1763/3038/1763 1651/1719/1651\nf 1662/1737/1662 1660/1731/1660 1664/1730/1664\nf 1660/1734/1660 1662/1735/1662 1657/1726/1657\nf 1649/1727/1649 1676/1740/1676 1641/1705/1641\nf 1667/1712/1667 1677/1742/1677 1640/1711/1640\nf 1670/1594/1670 1555/1613/1555 1545/1608/1545\nf 1670/1594/1670 1535/1579/1535 1555/1613/1555\nf 1555/1613/1555 1535/1579/1535 1559/1582/1559\nf 1505/3039/1505 1544/1746/1544 1672/1617/1672\nf 1622/1692/1622 1675/1722/1675 1674/3040/1674\nf 1641/1705/1641 1676/1740/1676 1665/1706/1665\nf 1640/1711/1640 1677/1742/1677 1663/1729/1663\nf 1661/1736/1661 1676/1740/1676 1649/1727/1649\nf 1677/1742/1677 1661/1738/1661 1663/1729/1663\nf 1678/1749/1678 1654/1714/1654 1658/1715/1658\nf 1653/1721/1653 1682/3041/1682 1715/3042/1715\nf 1675/1722/1675 1653/1721/1653 1715/3042/1715\nf 1690/1764/1690 1691/1763/1691 1692/1768/1692\nf 1694/1767/1694 1695/1766/1695 1698/3043/1698\nf 1690/1764/1690 1692/1768/1692 1696/1769/1696\nf 1692/1768/1692 1691/1763/1691 1693/1765/1693\nf 1697/1770/1697 1694/1767/1694 1698/3043/1698\nf 1688/1762/1688 1699/1771/1699 1686/1760/1686\nf 1687/1759/1687 1703/1776/1703 1689/1761/1689\nf 1689/1761/1689 1703/1776/1703 1691/1763/1691\nf 1699/1771/1699 1684/1756/1684 1686/1760/1686\nf 1704/1775/1704 1714/1777/1714 1703/1776/1703\nf 1702/1774/1702 1709/3044/1709 1708/1783/1708\nf 1709/3045/1709 1701/1778/1701 1708/1787/1708\nf 1709/3045/1709 1706/1779/1706 1701/1778/1701\nf 1706/1782/1706 1709/3044/1709 1702/1774/1702\nf 1702/1774/1702 1710/1785/1710 1693/1765/1693\nf 1697/1770/1697 1711/1788/1711 1696/1769/1696\nf 1698/3043/1698 1695/1766/1695 1712/1784/1712\nf 1712/1786/1712 1697/1770/1697 1698/3043/1698\nf 1693/1765/1693 1710/1785/1710 1695/1766/1695\nf 1696/1769/1696 1711/1788/1711 1701/1778/1701\nf 1708/1783/1708 1710/1785/1710 1702/1774/1702\nf 1711/1788/1711 1708/1787/1708 1701/1778/1701\nf 1704/1775/1704 1715/1820/1715 1714/1777/1714\nf 1675/1758/1675 1704/1775/1704 1685/1755/1685\nf 1704/1775/1704 1675/1758/1675 1715/1820/1715\nf 1674/3040/1674 1716/1792/1716 1625/1791/1625\nf 1622/1692/1622 1674/3040/1674 1625/1791/1625\nf 1717/1793/1717 1718/1687/1718 1673/1747/1673\nf 1682/1800/1682 1726/1799/1726 1715/3046/1715\nf 1680/1724/1680 1763/1728/1763 1681/1753/1681\nf 1724/1806/1724 1718/1687/1718 1717/1793/1717\nf 1727/1807/1727 1720/1796/1720 1724/1806/1724\nf 1716/1792/1716 1725/1804/1725 1717/1793/1717\nf 1724/1806/1724 1720/1796/1720 1718/1687/1718\nf 1628/1684/1628 1652/1718/1652 1630/1691/1630\nf 1765/3047/1765 1764/1813/1764 1722/1816/1722\nf 1731/1815/1731 1728/1810/1728 1729/1812/1729\nf 1728/1810/1728 1731/1815/1731 1730/1814/1730\nf 1699/1771/1699 1725/1808/1725 1716/1794/1716\nf 1732/1817/1732 1728/1810/1728 1730/1814/1730\nf 1599/1666/1599 1733/1824/1733 1601/1662/1601\nf 1739/1831/1739 1741/1836/1741 1740/1832/1740\nf 1743/1833/1743 1745/3048/1745 1744/1834/1744\nf 1739/1831/1739 1746/1837/1746 1741/1836/1741\nf 1741/1836/1741 1742/1835/1742 1740/1832/1740\nf 1747/1838/1747 1745/3048/1745 1743/1833/1743\nf 1737/1829/1737 1736/1827/1736 1748/1839/1748\nf 1735/1828/1735 1738/1830/1738 1752/1843/1752\nf 1738/1830/1738 1740/1832/1740 1752/1843/1752\nf 1750/1841/1750 1757/1850/1757 1758/3049/1758\nf 1758/3050/1758 1757/1854/1757 1755/1845/1755\nf 1758/3050/1758 1755/1845/1755 1754/1847/1754\nf 1754/1848/1754 1750/1841/1750 1758/3049/1758\nf 1750/1841/1750 1742/1835/1742 1759/1851/1759\nf 1747/1838/1747 1746/1837/1746 1760/1853/1760\nf 1744/1834/1744 1745/3048/1745 1761/1852/1761\nf 1761/1855/1761 1745/3048/1745 1747/1838/1747\nf 1742/1835/1742 1744/1834/1744 1759/1851/1759\nf 1746/1837/1746 1755/1845/1755 1760/1853/1760\nf 1757/1850/1757 1750/1841/1750 1759/1851/1759\nf 1760/1853/1760 1755/1845/1755 1757/1854/1757\nf 1752/1843/1752 1753/1844/1753 1763/1861/1763\nf 1734/1825/1734 1735/1828/1735 1752/1843/1752\nf 1752/1843/1752 1763/1861/1763 1734/1825/1734\nf 1736/1827/1736 1730/3051/1730 1748/1839/1748\nf 1748/1839/1748 1730/3051/1730 1764/1858/1764\nf 1736/1827/1736 1732/1826/1732 1730/3051/1730\nf 1763/3052/1763 1766/3053/1766 1681/3054/1681\nf 1766/3053/1766 1764/1813/1764 1765/3047/1765\nf 1681/3054/1681 1766/3053/1766 1765/3047/1765\nf 1386/1863/1386 1767/1862/1767 1768/1864/1768\nf 1518/1564/1518 1459/3007/1459 1767/1862/1767\nf 1518/1564/1518 1767/1862/1767 1519/1565/1519\nf 1767/1862/1767 1459/3007/1459 1768/1864/1768\nf 1867/3055/1867 1454/3006/1454 1843/1964/1843\nf 1769/1865/1769 1771/3056/1771 1387/1866/1387\nf 1771/3056/1771 1769/1865/1769 1457/1868/1457\nf 1788/1899/1788 1789/3057/1789 1787/1900/1787\nf 1789/3057/1789 1792/1926/1792 1791/1901/1791\nf 1789/3057/1789 1791/1901/1791 1787/1900/1787\nf 1792/1926/1792 1796/3058/1796 1791/1901/1791\nf 1791/1901/1791 1793/1903/1793 1790/1902/1790\nf 1791/1901/1791 1796/3058/1796 1793/1903/1793\nf 1793/1903/1793 1796/3058/1796 1826/1905/1826\nf 1806/1897/1806 1798/1907/1798 1799/1910/1799\nf 1798/1907/1798 1806/1897/1806 1780/1890/1780\nf 1780/1890/1780 1802/1911/1802 1798/1907/1798\nf 1805/1917/1805 493/1914/493 1804/1915/1804\nf 1506/1553/1506 1525/1556/1525 1393/1584/1393\nf 1786/1898/1786 1806/1897/1806 1807/1919/1807\nf 1806/1897/1806 1808/3059/1808 1809/1927/1809\nf 1807/1919/1807 1809/1927/1809 1811/1920/1811\nf 1786/1898/1786 1813/1921/1813 1788/1899/1788\nf 1788/1899/1788 1813/1921/1813 1789/3057/1789\nf 1789/3057/1789 1813/1921/1813 1792/1926/1792\nf 1792/1926/1792 1813/1921/1813 1812/3060/1812\nf 1792/1926/1792 1812/3060/1812 1810/1925/1810\nf 1812/3060/1812 1813/1921/1813 1811/1920/1811\nf 1812/3060/1812 1820/3061/1820 1814/3062/1814\nf 1812/3060/1812 1814/3062/1814 1810/1925/1810\nf 1814/3062/1814 1815/1922/1815 1810/1925/1810\nf 1814/3062/1814 1818/1931/1818 1815/1922/1815\nf 1818/1931/1818 1814/3062/1814 1820/3061/1820\nf 1815/1922/1815 1818/1931/1818 1817/1923/1817\nf 1792/1926/1792 1826/1905/1826 1796/3058/1796\nf 1811/1920/1811 1819/1930/1819 1812/3060/1812\nf 1812/3060/1812 1819/1930/1819 1820/3061/1820\nf 1818/1931/1818 1820/3061/1820 1819/1930/1819\nf 1821/1929/1821 1833/1928/1833 513/1933/513\nf 1808/3059/1808 1833/1928/1833 1809/1927/1809\nf 1806/1897/1806 1809/1927/1809 1807/1919/1807\nf 1823/3063/1823 1826/1905/1826 1824/3064/1824\nf 1824/3064/1824 1826/1905/1826 1816/1924/1816\nf 1824/3064/1824 1825/3065/1825 1823/3063/1823\nf 1826/1905/1826 1823/3063/1823 1822/1932/1822\nf 1797/1906/1797 1826/1905/1826 1822/1932/1822\nf 1822/1932/1822 1834/1947/1834 1508/1918/1508\nf 1508/1554/1508 1834/3066/1834 1850/1954/1850\nf 1816/1924/1816 1827/1935/1827 1824/3064/1824\nf 1827/1935/1827 1816/1924/1816 1817/1923/1817\nf 1824/3064/1824 1827/1935/1827 1825/3065/1825\nf 1827/1935/1827 1817/1923/1817 1818/1931/1818\nf 1825/3065/1825 1838/1938/1838 1823/3063/1823\nf 1838/1938/1838 1825/3065/1825 1827/1935/1827\nf 526/1942/526 1784/1894/1784 473/1895/473\nf 532/3067/532 1828/3068/1828 523/1940/523\nf 523/1940/523 1828/3068/1828 1781/1892/1781\nf 534/3069/534 1830/3070/1830 1828/3068/1828\nf 1830/3070/1830 1831/1943/1831 1829/1889/1829\nf 1828/3068/1828 1829/1889/1829 1781/1892/1781\nf 1830/3070/1830 1832/1944/1832 1831/1943/1831\nf 530/3071/530 494/1913/494 1803/1912/1803\nf 534/3069/534 1828/3068/1828 532/3067/532\nf 1803/1912/1803 1832/1944/1832 530/3071/530\nf 1832/1944/1832 1830/3070/1830 530/3071/530\nf 1829/1889/1829 1775/1880/1775 1781/1892/1781\nf 1830/3070/1830 534/3069/534 530/3071/530\nf 1780/1890/1780 1831/1943/1831 1802/1911/1802\nf 1831/1943/1831 1780/1890/1780 1829/1889/1829\nf 1829/1889/1829 1828/3068/1828 1830/3070/1830\nf 535/3072/535 1779/1888/1779 467/1887/467\nf 1779/1888/1779 535/3072/535 473/1895/473\nf 1804/1915/1804 493/1914/493 495/1916/495\nf 1806/1897/1806 536/3073/536 1808/3059/1808\nf 1808/3059/1808 536/3073/536 1833/1928/1833\nf 513/1933/513 1833/1928/1833 536/3073/536\nf 495/1916/495 536/3073/536 1806/1897/1806\nf 1823/3063/1823 1837/1945/1837 1822/1932/1822\nf 1837/1945/1837 1823/3063/1823 1838/1938/1838\nf 1837/1945/1837 1838/1938/1838 1839/1948/1839\nf 1839/1948/1839 1840/3074/1840 1836/1949/1836\nf 1839/1948/1839 1841/1951/1841 1840/3074/1840\nf 1838/1938/1838 1841/1951/1841 1839/1948/1839\nf 1387/1866/1387 1771/3056/1771 1403/3075/1403\nf 1844/3076/1844 1523/1558/1523 1772/1952/1772\nf 1843/1964/1843 1454/3006/1454 1770/1961/1770\nf 1454/3006/1454 1868/3077/1868 1770/1961/1770\nf 1454/3006/1454 1523/1558/1523 1868/3077/1868\nf 1842/3078/1842 1523/1558/1523 1844/3076/1844\nf 1842/3078/1842 1866/3079/1866 1846/3080/1846\nf 1844/3076/1844 1845/3081/1845 1866/3079/1866\nf 1845/3081/1845 1844/3076/1844 1772/1952/1772\nf 1866/3079/1866 1842/3078/1842 1844/3076/1844\nf 1848/1957/1848 1852/1955/1852 1850/1954/1850\nf 1847/1953/1847 1851/1956/1851 1849/3082/1849\nf 1849/3082/1849 1851/1956/1851 1864/3083/1864\nf 1851/1956/1851 1852/1955/1852 1862/3084/1862\nf 1852/1955/1852 1848/1957/1848 1862/3084/1862\nf 1855/3085/1855 1854/3086/1854 1858/3087/1858\nf 1850/1954/1850 1853/3088/1853 1848/1957/1848\nf 1858/3087/1858 1854/3086/1854 1835/1946/1835\nf 1835/1946/1835 1854/3086/1854 1834/1947/1834\nf 1854/3086/1854 1855/3085/1855 1834/1947/1834\nf 1855/3089/1855 1856/1958/1856 1853/3088/1853\nf 1856/1958/1856 1848/1957/1848 1853/3088/1853\nf 1834/3066/1834 1855/3089/1855 1853/3088/1853\nf 1853/3088/1853 1850/1954/1850 1834/3066/1834\nf 1855/3085/1855 1858/3087/1858 1861/3090/1861\nf 1865/1959/1865 1859/3091/1859 1860/3092/1860\nf 1857/1960/1857 1865/1959/1865 1860/3092/1860\nf 1855/3085/1855 1861/3090/1861 1859/1996/1859\nf 1859/3091/1859 1856/1958/1856 1855/3089/1855\nf 1848/1957/1848 1857/1960/1857 1863/3093/1863\nf 1857/1960/1857 1849/3082/1849 1863/3093/1863\nf 1848/1957/1848 1863/3093/1863 1862/3084/1862\nf 1862/3084/1862 1864/3083/1864 1851/1956/1851\nf 1849/3082/1849 1864/3083/1864 1863/3093/1863\nf 1864/3083/1864 1862/3084/1862 1863/3093/1863\nf 1859/3091/1859 1865/1959/1865 1856/1958/1856\nf 1849/3082/1849 1772/1952/1772 1847/1953/1847\nf 1772/1952/1772 1874/3094/1874 1845/3081/1845\nf 1845/3081/1845 1874/3094/1874 1866/3079/1866\nf 1874/3094/1874 1772/1952/1772 1849/3082/1849\nf 1874/3094/1874 1849/3082/1849 1857/1960/1857\nf 1866/3079/1866 1869/1962/1869 1846/3080/1846\nf 1846/3080/1846 1869/1962/1869 1770/1961/1770\nf 1454/3006/1454 1867/3055/1867 1457/1868/1457\nf 1770/1961/1770 1868/3077/1868 1846/3080/1846\nf 1868/3077/1868 1842/3078/1842 1846/3080/1846\nf 1868/3077/1868 1523/1558/1523 1842/3078/1842\nf 1457/1868/1457 1867/3055/1867 1771/3056/1771\nf 1843/1964/1843 1870/1963/1870 1867/3055/1867\nf 1771/3056/1771 1867/3055/1867 1403/3075/1403\nf 1874/3094/1874 1869/1962/1869 1866/3079/1866\nf 1874/1978/1874 1871/1966/1871 1869/1970/1869\nf 1871/1966/1871 1874/1978/1874 2221/1977/2221\nf 1872/1967/1872 1876/3095/1876 1873/2003/1873\nf 1871/1966/1871 1875/2341/1875 1872/1967/1872\nf 1857/3096/1857 1877/2000/1877 1874/3097/1874\nf 1877/2000/1877 1857/3096/1857 1860/1997/1860\nf 1877/1979/1877 2223/1983/2223 2222/1980/2222\nf 1876/3095/1876 1880/2218/1880 2125/2217/2125\nf 2224/3098/2224 1878/2342/1878 1888/3099/1888\nf 1878/2342/1878 1881/3100/1881 1888/3099/1888\nf 1876/3095/1876 2224/3098/2224 1880/2218/1880\nf 1876/3095/1876 1872/1967/1872 1875/2341/1875\nf 1897/2343/1897 1886/1984/1886 1902/3101/1902\nf 1886/1984/1886 1887/1985/1887 1883/3102/1883\nf 1880/2218/1880 1888/3099/1888 1882/2215/1882\nf 1888/3099/1888 1889/3103/1889 1882/2215/1882\nf 1881/3100/1881 1889/3103/1889 1888/3099/1888\nf 1881/3100/1881 1878/2342/1878 1897/2343/1897\nf 1886/1984/1886 1897/2343/1897 2223/1983/2223\nf 1883/3104/1883 1898/1987/1898 1900/3105/1900\nf 1902/3101/1902 1900/3106/1900 1897/2343/1897\nf 1884/1999/1884 1901/1986/1901 1885/1989/1885\nf 1887/1988/1887 1898/1987/1898 1883/3104/1883\nf 1893/1994/1893 1892/1991/1892 625/1990/625\nf 1890/1992/1890 1836/1949/1836 1891/1993/1891\nf 1891/1993/1891 1840/3074/1840 1841/1951/1841\nf 1891/1993/1891 1836/1949/1836 1840/3074/1840\nf 1890/1992/1890 1835/1946/1835 1836/1949/1836\nf 1835/1946/1835 1890/1992/1890 1858/3087/1858\nf 1858/3087/1858 1890/1992/1890 1861/3090/1861\nf 1841/1951/1841 1892/1991/1892 1891/1993/1891\nf 1890/1992/1890 1859/1996/1859 1861/3090/1861\nf 1870/1963/1870 1403/3075/1403 1867/3055/1867\nf 2164/2522/2164 1873/2003/1873 1879/3107/1879\nf 1881/3100/1881 1895/3108/1895 1889/3103/1889\nf 1889/3103/1889 1895/3108/1895 1903/3109/1903\nf 1889/3103/1889 1903/3109/1903 1882/2215/1882\nf 1881/3100/1881 1897/2343/1897 1894/3110/1894\nf 1894/3110/1894 1897/2343/1897 1900/3106/1900\nf 1881/3100/1881 1896/3111/1896 1895/3108/1895\nf 1894/3112/1894 1900/3105/1900 1899/2007/1899\nf 1899/2007/1899 1900/3105/1900 1898/1987/1898\nf 623/3113/623 646/2005/646 1898/1987/1898\nf 1898/1987/1898 1901/1986/1901 623/3113/623\nf 625/3114/625 1884/1999/1884 1893/1998/1893\nf 1901/1986/1901 625/3114/625 623/3113/623\nf 1884/1999/1884 625/3114/625 1901/1986/1901\nf 1900/3106/1900 1902/3101/1902 1883/3102/1883\nf 1902/3101/1902 1886/1984/1886 1883/3102/1883\nf 1881/3100/1881 1894/3110/1894 1896/3111/1896\nf 1899/3115/1899 1905/2021/1905 1894/3116/1894\nf 1899/3115/1899 1925/2018/1925 1905/2021/1905\nf 1905/2015/1905 1908/2022/1908 1906/2016/1906\nf 1917/2029/1917 1912/2028/1912 1911/3117/1911\nf 1913/2030/1913 1917/2031/1917 1911/3117/1911\nf 1913/2030/1913 1911/3117/1911 1921/2037/1921\nf 1921/2037/1921 1911/3117/1911 1912/2028/1912\nf 1923/2038/1923 1921/2037/1921 1922/2036/1922\nf 1920/2034/1920 1926/2039/1926 1918/2035/1918\nf 1925/2018/1925 1899/3115/1899 1928/2042/1928\nf 1924/2032/1924 1929/2040/1929 1926/2039/1926\nf 1924/2032/1924 1930/2043/1930 1929/2040/1929\nf 1978/3118/1978 2004/3119/2004 1979/3120/1979\nf 1932/2046/1932 1936/2083/1936 1931/2047/1931\nf 1931/2047/1931 1936/2083/1936 1959/2075/1959\nf 1942/2060/1942 1948/2059/1948 1952/2069/1952\nf 1954/3121/1954 1953/3122/1953 1951/3123/1951\nf 1954/3121/1954 1934/2241/1934 1955/3124/1955\nf 692/3125/692 695/3126/695 1945/3127/1945\nf 1933/2050/1933 1946/2063/1946 1949/2054/1949\nf 1949/2054/1949 1946/2063/1946 1940/2065/1940\nf 1946/2063/1946 692/2123/692 1945/2064/1945\nf 1940/2065/1940 1950/2066/1950 1943/2067/1943\nf 1950/2066/1950 1952/2069/1952 1943/2067/1943\nf 1952/2069/1952 1948/2059/1948 1943/2067/1943\nf 1953/2068/1953 1941/2058/1941 1952/2069/1952\nf 1955/3124/1955 1953/3122/1953 1954/3121/1954\nf 1945/3127/1945 1958/3128/1958 1944/3129/1944\nf 1953/2068/1953 1955/2070/1955 1941/2058/1941\nf 1957/2074/1957 1945/3127/1945 695/3126/695\nf 1944/3129/1944 1958/3128/1958 1986/2072/1986\nf 1945/3127/1945 1957/2074/1957 1985/2073/1985\nf 1941/2058/1941 1960/2057/1960 1942/2060/1942\nf 1969/2086/1969 1963/2079/1963 1965/2078/1965\nf 1967/2088/1967 1961/2077/1961 1962/2076/1962\nf 1942/2060/1942 1952/2069/1952 1941/2058/1941\nf 1967/2085/1967 1973/2093/1973 1969/2086/1969\nf 1973/2093/1973 1977/3130/1977 1974/2094/1974\nf 1974/2094/1974 1977/3130/1977 1975/2095/1975\nf 1975/2095/1975 1977/3130/1977 1976/2091/1976\nf 1976/2091/1976 1977/3130/1977 1973/2092/1973\nf 1979/2120/1979 1929/2119/1929 1930/3131/1930\nf 1928/2102/1928 1980/2101/1980 1930/2107/1930\nf 1979/2108/1979 1981/2104/1981 1978/2103/1978\nf 1982/2110/1982 736/2109/736 735/3132/735\nf 738/2112/738 1983/2111/1983 735/3132/735\nf 1983/2111/1983 1982/2110/1982 735/3132/735\nf 1876/3095/1876 1879/3107/1879 1873/2003/1873\nf 1408/3133/1408 1432/3134/1432 1984/3135/1984\nf 1945/3127/1945 1985/2073/1985 1958/3128/1958\nf 1985/2073/1985 1986/2072/1986 1958/3128/1958\nf 1944/3129/1944 1986/2072/1986 1953/3122/1953\nf 1944/2061/1944 1953/2068/1953 1947/2062/1947\nf 1953/3122/1953 1986/2072/1986 1951/3123/1951\nf 1951/3123/1951 1986/2072/1986 1956/2071/1956\nf 695/3126/695 751/3136/751 1957/2074/1957\nf 751/3136/751 754/2131/754 1988/3137/1988\nf 1988/3137/1988 754/2131/754 1989/3138/1989\nf 2019/3139/2019 2018/2130/2018 2009/2129/2009\nf 751/3136/751 1988/3137/1988 1987/2116/1987\nf 1988/3137/1988 1991/2127/1991 1987/2116/1987\nf 1987/2116/1987 1991/2127/1991 1990/2113/1990\nf 1987/2116/1987 1992/2115/1992 1956/2071/1956\nf 1991/2127/1991 1993/2117/1993 1990/2113/1990\nf 1989/3138/1989 1996/2124/1996 1988/3137/1988\nf 1988/3137/1988 1996/2124/1996 1991/2127/1991\nf 1996/2124/1996 1997/3140/1997 2007/2144/2007\nf 1992/2115/1992 1998/3141/1998 1956/2071/1956\nf 1998/3141/1998 1951/3123/1951 1956/2071/1956\nf 1951/3123/1951 1999/3142/1999 1954/3121/1954\nf 1998/3141/1998 1999/3142/1999 1951/3123/1951\nf 1954/3121/1954 1999/3142/1999 1998/3141/1998\nf 1998/3141/1998 1992/2115/1992 1994/2114/1994\nf 2004/3119/2004 2148/3143/2148 1979/3120/1979\nf 2152/2256/2152 2001/2244/2001 2002/2247/2002\nf 2000/2045/2000 2004/3119/2004 1932/2046/1932\nf 2004/2097/2004 1933/2050/1933 1932/2053/1932\nf 692/2123/692 2005/2096/2005 700/3144/700\nf 2005/2096/2005 1978/2098/1978 700/3144/700\nf 1957/2074/1957 751/3136/751 1956/2071/1956\nf 1956/2071/1956 751/3136/751 1987/2116/1987\nf 1996/2124/1996 2007/2144/2007 2030/2147/2030\nf 2008/2125/2008 1995/2118/1995 2006/2126/2006\nf 1996/2124/1996 2030/2147/2030 2008/2125/2008\nf 2009/2129/2009 777/2128/777 2012/3145/2012\nf 1997/3140/1997 2018/2130/2018 2019/3139/2019\nf 2019/3139/2019 2010/3146/2010 1997/3140/1997\nf 1997/3140/1997 2010/3146/2010 2007/2144/2007\nf 1997/3140/1997 1996/2124/1996 1989/3138/1989\nf 2019/3139/2019 2036/3147/2036 2010/3146/2010\nf 2036/3147/2036 2019/3139/2019 2009/2129/2009\nf 2035/3148/2035 2036/3147/2036 2012/3145/2012\nf 2012/3145/2012 2036/3147/2036 2009/2129/2009\nf 2014/2135/2014 2012/3145/2012 756/2132/756\nf 2012/3145/2012 777/2128/777 756/2132/756\nf 2014/2135/2014 2015/2134/2015 2034/3149/2034\nf 2016/3150/2016 2013/2143/2013 2014/2135/2014\nf 2016/3150/2016 2033/3151/2033 2013/2143/2013\nf 754/2131/754 2018/2130/2018 1989/3138/1989\nf 2018/2130/2018 1997/3140/1997 1989/3138/1989\nf 1994/2114/1994 2020/3152/2020 2026/3153/2026\nf 1995/2118/1995 2021/3154/2021 2020/3152/2020\nf 2008/2125/2008 2029/3155/2029 1995/2118/1995\nf 2021/3154/2021 2022/2136/2022 2020/3152/2020\nf 1994/2114/1994 2023/3156/2023 1998/3141/1998\nf 2020/3152/2020 1994/2114/1994 1995/2118/1995\nf 1994/2114/1994 2026/3153/2026 2023/3156/2023\nf 1995/2118/1995 2029/3155/2029 2021/3154/2021\nf 2029/3155/2029 2008/2125/2008 2030/2147/2030\nf 2021/3154/2021 2029/3155/2029 2024/3157/2024\nf 2021/3154/2021 2024/3157/2024 2022/2136/2022\nf 2026/3153/2026 2020/3152/2020 2027/3158/2027\nf 2026/3153/2026 2027/3158/2027 2023/3156/2023\nf 2027/3158/2027 2025/2139/2025 2023/3156/2023\nf 2027/3158/2027 2028/3159/2028 2025/2139/2025\nf 2028/3159/2028 2027/3158/2027 2020/3152/2020\nf 2025/2139/2025 2028/3159/2028 2022/2136/2022\nf 2028/3159/2028 2020/3152/2020 2022/2136/2022\nf 2023/3156/2023 2055/3160/2055 1998/3141/1998\nf 2029/3155/2029 2030/2147/2030 2024/3157/2024\nf 2033/3151/2033 2016/3150/2016 2034/3149/2034\nf 2034/3149/2034 2015/2134/2015 2033/3151/2033\nf 2035/3148/2035 2037/2141/2037 2036/3147/2036\nf 2012/3145/2012 2013/2143/2013 2011/2142/2011\nf 2035/3148/2035 2012/3145/2012 2011/2142/2011\nf 2012/3145/2012 2014/2135/2014 2013/2143/2013\nf 2011/2142/2011 2037/2141/2037 2035/3148/2035\nf 2037/2141/2037 2010/3146/2010 2036/3147/2036\nf 2031/2137/2031 2022/2136/2022 2024/3157/2024\nf 2030/2147/2030 2041/2146/2041 2024/3157/2024\nf 2024/3157/2024 2041/2146/2041 2031/2137/2031\nf 2040/2145/2040 2010/3146/2010 2037/2141/2037\nf 2042/2148/2042 2424/2567/2424 1406/2568/1406\nf 1408/3133/1408 2044/3161/2044 2042/2148/2042\nf 2039/2150/2039 2044/3161/2044 2043/2152/2043\nf 2044/3161/2044 2045/2346/2045 2043/2152/2043\nf 2044/3161/2044 2046/3162/2046 2045/2346/2045\nf 1984/3135/1984 2044/3161/2044 1408/3133/1408\nf 1984/3135/1984 2047/3163/2047 2044/3161/2044\nf 2044/3161/2044 2047/3163/2047 2046/3162/2046\nf 2047/3163/2047 1984/3135/1984 1432/3134/1432\nf 2049/2153/2049 2050/3164/2050 2048/2151/2048\nf 2050/3164/2050 2031/2137/2031 2048/2151/2048\nf 2031/2137/2031 2050/3164/2050 2032/2138/2032\nf 2051/2156/2051 2050/3164/2050 2049/2153/2049\nf 2050/3164/2050 2051/2156/2051 2032/2138/2032\nf 1998/3141/1998 2055/3160/2055 1954/3121/1954\nf 1954/3121/1954 2055/3160/2055 2052/3165/2052\nf 2053/2361/2053 2057/2243/2057 2052/3165/2052\nf 2057/2243/2057 2053/2361/2053 2054/2175/2054\nf 2062/3166/2062 2065/2362/2065 2052/3165/2052\nf 2054/2175/2054 2142/2214/2142 2057/2243/2057\nf 2052/3165/2052 2057/2243/2057 2056/2242/2056\nf 2056/2242/2056 1954/3121/1954 2052/3165/2052\nf 2055/3160/2055 2058/2155/2058 2059/2154/2059\nf 2058/2155/2058 2025/2139/2025 2032/2138/2032\nf 2023/3156/2023 2058/2155/2058 2055/3160/2055\nf 2058/2155/2058 2023/3156/2023 2025/2139/2025\nf 2059/2154/2059 2060/3167/2060 2055/3160/2055\nf 2059/2154/2059 2066/2349/2066 2060/3167/2060\nf 2060/3167/2060 2066/2349/2066 2062/3166/2062\nf 2066/2349/2066 2063/3168/2063 2062/3166/2062\nf 2061/2350/2061 2064/2363/2064 2063/3168/2063\nf 2064/2363/2064 2065/2362/2065 2063/3168/2063\nf 2052/3165/2052 2065/2362/2065 2053/2361/2053\nf 2065/2362/2065 2062/3166/2062 2063/3168/2063\nf 2063/3168/2063 2066/2349/2066 2061/2350/2061\nf 2060/3167/2060 2062/3166/2062 2055/3160/2055\nf 2062/3166/2062 2052/3165/2052 2055/3160/2055\nf 2053/2361/2053 2092/2174/2092 2054/2175/2054\nf 2070/2159/2070 2072/2177/2072 2067/2160/2067\nf 2053/2361/2053 2252/3169/2252 2092/2174/2092\nf 2094/2353/2094 2093/2178/2093 2073/2176/2073\nf 2091/2179/2091 2074/2169/2074 2071/2163/2071\nf 2075/2267/2075 2091/2179/2091 2095/3170/2095\nf 2091/2179/2091 2075/2267/2075 2074/2169/2074\nf 2080/2167/2080 2081/2168/2081 2101/2173/2101\nf 2078/2164/2078 2081/2168/2081 2080/2167/2080\nf 2087/3171/2087 2102/3172/2102 2084/2183/2084\nf 2086/2180/2086 2101/2173/2101 2085/2184/2085\nf 2088/2166/2088 2154/3173/2154 2090/2211/2090\nf 2088/2166/2088 2090/2211/2090 2077/2162/2077\nf 2067/2160/2067 2072/2177/2072 2071/2163/2071\nf 2072/2177/2072 2091/2179/2091 2071/2163/2071\nf 2095/3170/2095 2091/2179/2091 2093/2178/2093\nf 2155/2212/2155 2069/2158/2069 2068/2157/2068\nf 2069/2158/2069 2155/2212/2155 2141/2213/2141\nf 2093/2178/2093 2094/2353/2094 2047/3163/2047\nf 2094/2353/2094 2046/3162/2046 2047/3163/2047\nf 1432/3134/1432 1433/3174/1433 2047/3163/2047\nf 1424/3175/1424 1433/3174/1433 1432/3134/1432\nf 1433/3174/1433 2160/2260/2160 2095/3170/2095\nf 2084/2183/2084 2111/2182/2111 2087/3171/2087\nf 2087/3171/2087 2111/2182/2111 2110/2196/2110\nf 2101/2173/2101 2097/2186/2097 2100/2289/2100\nf 2100/2289/2100 2511/2185/2511 2085/2184/2085\nf 2085/2184/2085 2101/2173/2101 2100/2289/2100\nf 2101/2173/2101 2086/2180/2086 2080/2167/2080\nf 2084/2183/2084 2102/3172/2102 2079/2165/2079\nf 2102/3172/2102 2089/2207/2089 2079/2165/2079\nf 2174/2197/2174 2103/2210/2103 2096/2189/2096\nf 2174/2197/2174 2177/2298/2177 2103/2210/2103\nf 2105/2190/2105 2096/2189/2096 2103/2210/2103\nf 2110/2196/2110 2113/2202/2113 2087/3171/2087\nf 2113/2202/2113 2110/2196/2110 2109/2188/2109\nf 2174/2197/2174 2112/2181/2112 2511/2185/2511\nf 2087/3171/2087 2113/2202/2113 2115/2198/2115\nf 2102/3172/2102 2115/2198/2115 2114/2201/2114\nf 2115/2198/2115 2102/3172/2102 2087/3171/2087\nf 2089/2207/2089 2116/2206/2116 2154/3173/2154\nf 2124/2204/2124 2089/2207/2089 2102/3172/2102\nf 2124/2204/2124 2102/3172/2102 2114/2201/2114\nf 2125/2217/2125 2129/2219/2129 2127/3176/2127\nf 2126/2224/2126 2131/2223/2131 2128/3177/2128\nf 2128/3177/2128 2131/2223/2131 2147/2227/2147\nf 2130/2222/2130 1882/2221/1882 1903/3178/1903\nf 1903/3178/1903 2134/3179/2134 2130/2222/2130\nf 2130/2222/2130 2134/3179/2134 2135/2228/2135\nf 2134/3179/2134 1903/3178/1903 2132/3180/2132\nf 2132/2230/2132 1903/2012/1903 1904/2011/1904\nf 2134/3179/2134 2139/2235/2139 2135/2228/2135\nf 2139/2236/2139 2134/2233/2134 2137/2232/2137\nf 2147/2227/2147 2140/3181/2140 2128/3177/2128\nf 2155/2212/2155 2144/2237/2144 2141/2213/2141\nf 2143/2258/2143 2140/2248/2140 2001/2244/2001\nf 2056/2242/2056 1934/2241/1934 1954/3121/1954\nf 2143/2238/2143 1934/2241/1934 2142/2214/2142\nf 2002/2247/2002 2146/3182/2146 2003/3183/2003\nf 2003/3183/2003 2151/2250/2151 2149/2122/2149\nf 2146/3182/2146 2151/2250/2151 2003/3183/2003\nf 2000/2257/2000 2150/2121/2150 2148/3184/2148\nf 2148/3143/2148 2004/3119/2004 2000/2045/2000\nf 2149/2122/2149 2150/2121/2150 2153/3185/2153\nf 2150/2121/2150 2000/2257/2000 2153/3185/2153\nf 2151/2253/2151 2146/2246/2146 2145/2245/2145\nf 2150/2121/2150 1979/2120/1979 2148/3184/2148\nf 2003/3183/2003 2153/3185/2153 2002/2247/2002\nf 2153/3185/2153 2152/2256/2152 2002/2247/2002\nf 2153/3185/2153 2000/2257/2000 2152/2256/2152\nf 2149/2122/2149 2153/3185/2153 2003/3183/2003\nf 2128/2240/2128 2156/2274/2156 2129/2275/2129\nf 2156/2274/2156 2144/2237/2144 2155/2212/2155\nf 2156/2274/2156 2128/2240/2128 2144/2237/2144\nf 2127/3176/2127 1879/3107/1879 2125/2217/2125\nf 2127/3176/2127 2157/3186/2157 1879/3107/1879\nf 1879/3107/1879 2157/3186/2157 2164/2522/2164\nf 1876/3095/1876 2125/2217/2125 1879/3107/1879\nf 1427/3187/1427 2158/1976/2158 1428/2261/1428\nf 1426/1973/1426 2158/1976/2158 1427/3187/1427\nf 2160/2260/2160 2159/2259/2159 2095/3170/2095\nf 2095/3170/2095 2159/2259/2159 2075/2267/2075\nf 2160/2260/2160 1433/3174/1433 1428/2261/1428\nf 2042/2148/2042 1406/2568/1406 1408/3133/1408\nf 2083/2171/2083 2162/2263/2162 2181/2264/2181\nf 2165/2266/2165 2075/2267/2075 2159/2259/2159\nf 2082/2170/2082 2165/2266/2165 2163/2262/2163\nf 2164/1975/2164 2157/3188/2157 2165/2266/2165\nf 2161/2265/2161 2181/2264/2181 2183/2293/2183\nf 2116/2206/2116 2167/2272/2167 2154/3173/2154\nf 2154/3173/2154 2167/2272/2167 2090/2211/2090\nf 2161/2265/2161 2098/2187/2098 2099/2172/2099\nf 2117/2203/2117 2171/3189/2171 2168/2276/2168\nf 2119/2199/2119 2168/2276/2168 2118/2200/2118\nf 2117/2203/2117 2168/2276/2168 2119/2199/2119\nf 2122/2209/2122 2171/3189/2171 2117/2203/2117\nf 2121/2208/2121 2170/2278/2170 2122/2209/2122\nf 2122/2209/2122 2170/2278/2170 2171/3189/2171\nf 2174/2197/2174 2511/2185/2511 2510/2697/2510\nf 2510/2697/2510 2177/2298/2177 2174/2197/2174\nf 2173/2283/2173 2168/2294/2168 2171/2284/2171\nf 2180/2288/2180 2179/2291/2179 2173/2283/2173\nf 2172/2281/2172 2180/2288/2180 2173/2283/2173\nf 2183/2293/2183 2184/2292/2184 2161/2265/2161\nf 2184/2292/2184 2098/2187/2098 2161/2265/2161\nf 2163/2262/2163 2157/3188/2157 2127/2296/2127\nf 2157/3188/2157 2163/2262/2163 2165/2266/2165\nf 2163/2262/2163 2127/2296/2127 2162/2263/2162\nf 2103/2210/2103 2185/2300/2185 2108/2194/2108\nf 2185/2300/2185 2190/2305/2190 2189/2302/2189\nf 2343/2311/2343 2381/2314/2381 2188/2303/2188\nf 2306/2309/2306 2342/2310/2342 2189/2302/2189\nf 2193/2313/2193 2305/2308/2305 2190/2305/2190\nf 2201/2323/2201 2205/2322/2205 2204/2334/2204\nf 2201/2323/2201 2204/2334/2204 2202/2333/2202\nf 2204/2334/2204 2205/2322/2205 2203/2330/2203\nf 2196/2316/2196 2209/2327/2209 2198/2318/2198\nf 2198/2318/2198 2209/2327/2209 2200/2320/2200\nf 2197/2319/2197 2256/2365/2256 2195/2317/2195\nf 2199/2321/2199 2256/2365/2256 2197/2319/2197\nf 2216/2339/2216 2219/3190/2219 2280/2340/2280\nf 2216/2339/2216 2220/2280/2220 2219/3190/2219\nf 2415/2429/2415 2219/3191/2219 2218/2430/2218\nf 2280/2340/2280 2219/3190/2219 2415/2426/2415\nf 2219/3191/2219 2217/3192/2217 2218/2430/2218\nf 2219/3190/2219 2220/2280/2220 2217/3193/2217\nf 1871/1966/1871 2221/1977/2221 1875/2341/1875\nf 1878/2342/1878 2224/3098/2224 1875/2341/1875\nf 2224/3098/2224 1876/3095/1876 1875/2341/1875\nf 2224/3098/2224 1888/3099/1888 1880/2218/1880\nf 2225/2345/2225 2228/2344/2228 2226/3194/2226\nf 2228/2344/2228 2045/2346/2045 2046/3162/2046\nf 2043/2152/2043 2225/2345/2225 2049/2153/2049\nf 2226/3194/2226 2228/2344/2228 2227/2360/2227\nf 2228/2344/2228 2046/3162/2046 2227/2360/2227\nf 2227/2360/2227 2046/3162/2046 2094/2353/2094\nf 2230/3195/2230 2231/2351/2231 2073/2176/2073\nf 2232/3196/2232 2233/3197/2233 2239/3198/2239\nf 2239/3198/2239 2233/3197/2233 2229/3199/2229\nf 2232/3196/2232 2236/3200/2236 2233/3197/2233\nf 2233/3197/2233 2236/3200/2236 2234/3201/2234\nf 2234/3201/2234 2236/3200/2236 2250/2356/2250\nf 2250/2356/2250 2236/3200/2236 2235/2357/2235\nf 2236/3200/2236 2232/3196/2232 2237/2347/2237\nf 2236/3200/2236 2237/2347/2237 2235/2357/2235\nf 2232/3196/2232 2239/3198/2239 2238/2348/2238\nf 2232/3196/2232 2238/2348/2238 2237/2347/2237\nf 2237/2347/2237 2051/2156/2051 2235/2357/2235\nf 2238/2348/2238 2239/3198/2239 2061/2350/2061\nf 2229/3199/2229 2240/2364/2240 2239/3198/2239\nf 2240/2364/2240 2064/2363/2064 2239/3198/2239\nf 2061/2350/2061 2239/3198/2239 2064/2363/2064\nf 2251/2358/2251 2248/3202/2248 2247/2359/2247\nf 2231/2351/2231 2242/3203/2242 2241/2352/2241\nf 2229/3199/2229 2242/3203/2242 2231/2351/2231\nf 2231/2351/2231 2230/3195/2230 2229/3199/2229\nf 2242/3203/2242 2229/3199/2229 2234/3201/2234\nf 2234/3201/2234 2229/3199/2229 2233/3197/2233\nf 2242/3203/2242 2234/3201/2234 2241/2352/2241\nf 2234/3201/2234 2250/2356/2250 2249/3204/2249\nf 2250/2356/2250 2225/2345/2225 2226/3194/2226\nf 2250/2356/2250 2243/2355/2243 2225/2345/2225\nf 2225/2345/2225 2243/2355/2243 2049/2153/2049\nf 2051/2156/2051 2244/2354/2244 2235/2357/2235\nf 2244/2354/2244 2246/3205/2246 2245/3206/2245\nf 2244/2354/2244 2245/3206/2245 2243/2355/2243\nf 2243/2355/2243 2245/3206/2245 2049/2153/2049\nf 2245/3206/2245 2246/3205/2246 2049/2153/2049\nf 2049/2153/2049 2246/3205/2246 2051/2156/2051\nf 2246/3205/2246 2244/2354/2244 2051/2156/2051\nf 2247/2359/2247 2226/3194/2226 2227/2360/2227\nf 2247/2359/2247 2249/3204/2249 2226/3194/2226\nf 2249/3204/2249 2250/2356/2250 2226/3194/2226\nf 2251/2358/2251 2094/2353/2094 2241/2352/2241\nf 2248/3202/2248 2249/3204/2249 2247/2359/2247\nf 2251/2358/2251 2241/2352/2241 2248/3202/2248\nf 2241/2352/2241 2234/3201/2234 2248/3202/2248\nf 2234/3201/2234 2249/3204/2249 2248/3202/2248\nf 2073/2176/2073 2252/3169/2252 2230/3195/2230\nf 2229/3199/2229 2252/3169/2252 2240/2364/2240\nf 2252/3169/2252 2053/2361/2053 2240/2364/2240\nf 2252/3169/2252 2229/3199/2229 2230/3195/2230\nf 2073/2176/2073 2092/2174/2092 2252/3169/2252\nf 2042/2148/2042 2044/3161/2044 2039/2150/2039\nf 2154/3173/2154 2088/2166/2088 2089/2207/2089\nf 2089/2207/2089 2088/2166/2088 2079/2165/2079\nf 2254/2367/2254 2202/2333/2202 2212/2332/2212\nf 2213/2335/2213 2203/2330/2203 2210/2329/2210\nf 2254/2367/2254 2262/3207/2262 2260/2372/2260\nf 2212/2332/2212 2262/3207/2262 2254/2367/2254\nf 2212/2332/2212 2264/2337/2264 2262/3207/2262\nf 2263/2338/2263 2213/2335/2213 2261/3208/2261\nf 2261/3208/2261 2210/2329/2210 2257/2369/2257\nf 2210/2329/2210 2261/3208/2261 2213/2335/2213\nf 2215/2336/2215 2268/3209/2268 2264/2337/2264\nf 2263/2338/2263 2268/3209/2268 2215/2336/2215\nf 2264/2380/2264 2268/3210/2268 2263/2379/2263\nf 2275/2394/2275 2276/2393/2276 2277/2401/2277\nf 2275/2394/2275 2277/2401/2277 2278/2400/2278\nf 2277/2401/2277 2276/2393/2276 2279/2397/2279\nf 2272/2389/2272 2281/2395/2281 2274/2391/2274\nf 2274/2391/2274 2281/2395/2281 2276/2393/2276\nf 2273/2392/2273 2289/2406/2289 2271/2390/2271\nf 2275/2394/2275 2289/2406/2289 2273/2392/2273\nf 2290/2407/2290 2278/2400/2278 2284/2399/2284\nf 2285/2402/2285 2279/2397/2279 2282/2396/2282\nf 2290/2407/2290 2294/3211/2294 2292/2412/2292\nf 2284/2399/2284 2296/3212/2296 2290/2407/2290\nf 2284/2399/2284 2287/2404/2287 2296/3212/2296\nf 2288/2405/2288 2285/2402/2285 2295/3213/2295\nf 2282/2396/2282 2293/3214/2293 2295/3213/2295\nf 2293/3214/2293 2282/2396/2282 2291/2409/2291\nf 2282/2396/2282 2295/3213/2295 2285/2402/2285\nf 2290/2407/2290 2296/3212/2296 2294/3211/2294\nf 2286/2403/2286 2300/3215/2300 2287/2404/2287\nf 2288/2405/2288 2300/3215/2300 2286/2403/2286\nf 2287/2422/2287 2300/3216/2300 2288/2421/2288\nf 2217/3192/2217 2302/2431/2302 2218/2430/2218\nf 2313/2441/2313 2314/2440/2314 2315/2450/2315\nf 2313/2441/2313 2315/2450/2315 2316/2449/2316\nf 2315/2450/2315 2314/2440/2314 2317/2446/2317\nf 2308/2434/2308 2319/2443/2319 2310/2436/2310\nf 2310/2436/2310 2319/2443/2319 2312/2438/2312\nf 2309/2437/2309 2328/2455/2328 2307/2435/2307\nf 2311/2439/2311 2328/2455/2328 2309/2437/2309\nf 2330/2457/2330 2316/2449/2316 2323/2448/2323\nf 2324/2451/2324 2317/2446/2317 2321/2445/2321\nf 2330/2457/2330 2337/3217/2337 2335/2462/2335\nf 2323/2448/2323 2337/3217/2337 2330/2457/2330\nf 2323/2448/2323 2326/2453/2326 2337/3217/2337\nf 2327/2454/2327 2324/2451/2324 2336/3218/2336\nf 2336/3218/2336 2321/2445/2321 2332/2460/2332\nf 2321/2445/2321 2336/3218/2336 2324/2451/2324\nf 2325/2452/2325 2341/3219/2341 2326/2453/2326\nf 2327/2454/2327 2341/3219/2341 2325/2452/2325\nf 2326/2470/2326 2341/3220/2341 2327/2469/2327\nf 2318/2442/2318 2255/2368/2255 2340/2386/2340\nf 2350/2484/2350 2351/2483/2351 2352/2493/2352\nf 2350/2484/2350 2352/2493/2352 2353/2492/2353\nf 2352/2493/2352 2351/2483/2351 2354/2489/2354\nf 2345/2477/2345 2356/2486/2356 2347/2479/2347\nf 2347/2479/2347 2356/2486/2356 2349/2481/2349\nf 2362/3221/2362 2360/2491/2360 2359/2490/2359\nf 2361/2494/2361 2362/3221/2362 2359/2490/2359\nf 2346/2480/2346 2363/2495/2363 2344/2478/2344\nf 2348/2482/2348 2363/2495/2363 2346/2480/2346\nf 2365/2497/2365 2353/2492/2353 2360/2491/2360\nf 2361/2494/2361 2354/2489/2354 2358/2488/2358\nf 2372/2508/2372 2362/3222/2362 2371/2507/2371\nf 2365/2497/2365 2372/3223/2372 2370/2502/2370\nf 2360/2491/2360 2372/3223/2372 2365/2497/2365\nf 2360/2491/2360 2362/3221/2362 2372/3223/2372\nf 2362/3221/2362 2361/2494/2361 2371/3224/2371\nf 2371/3224/2371 2358/2488/2358 2367/2499/2367\nf 2358/2488/2358 2371/3224/2371 2361/2494/2361\nf 2355/2485/2355 2331/2458/2331 2376/2475/2376\nf 2414/2558/2414 2302/2517/2302 2378/2516/2378\nf 2220/2280/2220 2379/2279/2379 2217/3193/2217\nf 2217/2518/2217 2379/3225/2379 2377/2519/2377\nf 2108/2194/2108 2380/2306/2380 2120/2195/2120\nf 1479/1530/1479 1534/1575/1534 1482/1577/1482\nf 1556/1609/1556 1587/1683/1587 1589/1610/1589\nf 1595/3033/1595 1571/1626/1571 1579/1628/1579\nf 1563/1619/1563 1505/3039/1505 1672/1617/1672\nf 1463/1520/1463 1491/3016/1491 1466/1536/1466\nf 1447/1508/1447 1462/1521/1462 1455/1524/1455\nf 2093/2178/2093 2047/3163/2047 2095/3170/2095\nf 2095/3170/2095 2047/3163/2047 1433/3174/1433\nf 2389/2531/2389 2390/2530/2390 2391/2540/2391\nf 2389/2531/2389 2391/2540/2391 2392/2539/2392\nf 2391/2540/2391 2390/2530/2390 2393/2536/2393\nf 2384/2524/2384 2395/2533/2395 2386/2526/2386\nf 2386/2526/2386 2395/2533/2395 2388/2528/2388\nf 2401/3226/2401 2399/2538/2399 2398/2537/2398\nf 2400/2541/2400 2401/3226/2401 2398/2537/2398\nf 2385/2527/2385 2402/2542/2402 2383/2525/2383\nf 2387/2529/2387 2402/2542/2402 2385/2527/2385\nf 2404/2544/2404 2392/2539/2392 2399/2538/2399\nf 2400/2541/2400 2393/2536/2393 2397/2535/2397\nf 2411/2555/2411 2401/3227/2401 2410/2554/2410\nf 2404/2544/2404 2411/3228/2411 2409/2549/2409\nf 2399/2538/2399 2411/3228/2411 2404/2544/2404\nf 2399/2538/2399 2401/3226/2401 2411/3228/2411\nf 2401/3226/2401 2400/2541/2400 2410/3229/2410\nf 2410/3229/2410 2397/2535/2397 2406/2546/2406\nf 2397/2535/2397 2410/3229/2410 2400/2541/2400\nf 2394/2532/2394 2366/2498/2366 2375/2514/2375\nf 2405/2545/2405 2192/2307/2192 2382/2315/2382\nf 2299/3230/2299 2304/2428/2304 2303/2433/2303\nf 2299/3230/2299 2415/2429/2415 2304/2428/2304\nf 2270/2325/2270 2191/2304/2191 2186/2299/2186\nf 2417/2563/2417 2425/2562/2425 2416/2572/2416\nf 2423/2564/2423 2419/2571/2419 2420/2565/2420\nf 1406/2568/1406 2424/2567/2424 2418/2566/2418\nf 562/2569/562 2420/2565/2420 2419/2571/2419\nf 2424/2567/2424 2042/2148/2042 2038/2149/2038\nf 2416/2572/2416 2425/2562/2425 2426/2609/2426\nf 2416/2572/2416 2426/2609/2426 2421/2573/2421\nf 2017/2140/2017 2427/3231/2427 2037/2141/2037\nf 2427/3232/2427 2456/2614/2456 2425/3233/2425\nf 2431/2611/2431 2427/3232/2427 2017/3234/2017\nf 2427/3232/2427 2431/2611/2431 2456/2614/2456\nf 2040/2145/2040 2427/3231/2427 2425/2562/2425\nf 2427/3231/2427 2040/2145/2040 2037/2141/2037\nf 2430/2578/2430 2433/2583/2433 2429/2579/2429\nf 2015/3235/2015 2438/3236/2438 2033/3237/2033\nf 2443/2600/2443 2451/2595/2451 2442/2594/2442\nf 2438/3238/2438 2015/2592/2015 2439/2605/2439\nf 2014/2135/2014 2034/3149/2034 2016/3150/2016\nf 2440/2604/2440 2443/2600/2443 2445/2598/2445\nf 2441/3239/2441 2445/2598/2445 2444/2597/2444\nf 2445/2598/2445 2441/3239/2441 2440/2604/2440\nf 2015/2592/2015 2451/2595/2451 2439/2605/2439\nf 2429/2579/2429 2453/2607/2453 2483/3240/2483\nf 2452/3241/2452 2453/2607/2453 2448/2603/2448\nf 2453/2607/2453 2449/2602/2449 2448/2603/2448\nf 2453/2607/2453 2450/2601/2450 2449/2602/2449\nf 2453/2607/2453 2454/2606/2454 2450/2601/2450\nf 2454/2606/2454 2447/2599/2447 2450/2601/2450\nf 2454/2606/2454 2446/2596/2446 2447/2599/2447\nf 2437/2585/2437 2455/3242/2455 2436/2586/2436\nf 2441/2590/2441 2455/3242/2455 2437/2585/2437\nf 2444/2597/2444 2455/3242/2455 2441/3239/2441\nf 2446/2596/2446 2455/3242/2455 2444/2597/2444\nf 2436/2586/2436 2455/3242/2455 2446/2596/2446\nf 1331/2577/1331 2448/2655/2448 2428/2574/2428\nf 2429/2579/2429 2483/3240/2483 2432/2580/2432\nf 2483/3240/2483 2453/2607/2453 2452/3241/2452\nf 2457/3243/2457 2512/2619/2512 2456/3244/2456\nf 63/3245/63 2458/2620/2458 2457/3243/2457\nf 2514/2621/2514 2464/2624/2464 2463/2623/2463\nf 2458/2620/2458 62/3246/62 2468/2629/2468\nf 2460/2617/2460 2469/2630/2469 2462/2622/2462\nf 63/3245/63 62/3246/62 2458/2620/2458\nf 2432/2636/2432 2474/2635/2474 64/3247/64\nf 2487/2649/2487 2486/2648/2486 2477/3248/2477\nf 2477/3248/2477 2481/2650/2481 2487/2649/2487\nf 2482/2644/2482 2485/2645/2485 2484/2646/2484\nf 2484/2646/2484 2432/3249/2432 2483/2647/2483\nf 2432/3249/2432 2484/2646/2484 2472/3250/2472\nf 2485/2645/2485 2472/3250/2472 2484/2646/2484\nf 2472/3250/2472 2485/2645/2485 2475/3251/2475\nf 2485/2645/2485 2480/2642/2480 2481/2650/2481\nf 2475/3251/2475 2485/2645/2485 2481/2650/2481\nf 2486/3252/2486 2481/2650/2481 2477/3248/2477\nf 2481/2650/2481 2486/3252/2486 2475/3251/2475\nf 2490/2652/2490 1435/3253/1435 1434/3254/1434\nf 2483/2647/2483 2489/2658/2489 2488/2643/2488\nf 2452/2654/2452 2489/2657/2489 2483/3255/2483\nf 47/3256/47 2490/2652/2490 1434/3254/1434\nf 2490/2652/2490 47/3256/47 61/2651/61\nf 64/3247/64 2474/2635/2474 61/2651/61\nf 106/2656/106 107/3257/107 1435/3258/1435\nf 106/2656/106 1435/3258/1435 2489/2657/2489\nf 1435/3253/1435 2490/2652/2490 2489/2658/2489\nf 2519/2674/2519 2491/2662/2491 2494/2675/2494\nf 2494/2675/2494 2495/3259/2495 2493/2668/2493\nf 2495/3260/2495 2459/2664/2459 2493/2698/2493\nf 2459/2664/2459 2495/3260/2495 2491/2665/2491\nf 2425/2663/2425 2456/3244/2456 2459/2664/2459\nf 2493/2668/2493 2496/2667/2496 2494/2675/2494\nf 2465/2627/2465 2501/3261/2501 2498/2628/2498\nf 2470/2633/2470 2501/3261/2501 2465/2627/2465\nf 2498/2680/2498 2501/3261/2501 2499/2679/2499\nf 2499/2679/2499 2501/3261/2501 2470/2633/2470\nf 2419/2571/2419 1356/2682/1356 562/2569/562\nf 2421/2573/2421 2502/2685/2502 2422/2570/2422\nf 2502/2685/2502 2421/2573/2421 14/2608/14\nf 2507/2686/2507 2508/2694/2508 2506/2690/2506\nf 2041/2146/2041 2048/2151/2048 2031/2137/2031\nf 2013/2143/2013 2033/3151/2033 2017/2140/2017\nf 2033/3237/2033 2438/3236/2438 2017/3262/2017\nf 2040/2145/2040 2007/2144/2007 2010/3146/2010\nf 2502/2689/2502 2503/3263/2503 2507/2686/2507\nf 2512/2619/2512 2457/3243/2457 2458/2620/2458\nf 2456/3244/2456 2512/2619/2512 2459/2664/2459\nf 2514/2621/2514 2463/2623/2463 2461/2699/2461\nf 2464/2624/2464 2514/2621/2514 2462/2622/2462\nf 2468/2629/2468 62/3246/62 46/2700/46\nf 2515/2671/2515 2518/2673/2518 2468/2629/2468\nf 2517/2681/2517 2471/2632/2471 2500/2631/2500\nf 2469/2630/2469 2518/2673/2518 2516/2676/2516\nf 2518/2673/2518 2469/2630/2469 2468/2629/2468\nf 2492/2659/2492 2518/2673/2518 2515/2671/2515\nf 2491/2662/2491 2519/2674/2519 2492/2659/2492\nf 2519/2674/2519 2518/2673/2518 2492/2659/2492\nf 2494/2675/2494 2491/2662/2491 2495/3259/2495\n# 5022 faces\n\ng\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/Geometry.csx",
    "content": "struct Vec2f\n{\n\tpublic float x;\n\tpublic float y;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tif (i == 0) return x;\n\t\t\tif (i == 1) return y;\n\t\t\tthrow new InvalidOperationException ();\n\t\t}\n\t\tset {\n\t\t\tif (i == 0) x = value;\n\t\t\telse if (i == 1) y = value;\n\t\t\telse throw new InvalidOperationException ();\n\t\t}\n\t}\n\n\tpublic Vec2f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y);\n\t}\n\n\tpublic static Vec2f operator / (Vec2f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator * (Vec2f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec2f operator - (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x - b.x, y = a.y - b.y };\n\t}\n\n\tpublic static Vec2f operator + (Vec2f a, Vec2f b)\n\t{\n\t\treturn new Vec2f { x = a.x + b.x, y = a.y + b.y };\n\t}\n}\n\npublic struct Vec3f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\tcase 0: return x;\n\t\t\tcase 1: return y;\n\t\t\tcase 2: return z;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\tcase 0: x = value; break;\n\t\t\tcase 1: y = value; break;\n\t\t\tcase 2: z = value; break;\n\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec3f Normalize ()\n\t{\n\t\treturn this / Norm ();\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z);\n\t}\n\n\tpublic static Vec3f operator - (Vec3f a, Vec3f b)\n\t{\n\t\treturn new Vec3f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n\n\tpublic static Vec3f operator / (Vec3f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\n\t\treturn v;\n\t}\n\n\tpublic static Vec3f operator * (Vec3f v, float num)\n\t{\n\t\tv.x *= num;\n\t\tv.y *= num;\n\t\tv.z *= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec4f\n{\n\tpublic float x;\n\tpublic float y;\n\tpublic float z;\n\tpublic float h;\n\n\tpublic float this [int i] {\n\t\tget {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: return x;\n\t\t\t\tcase 1: return y;\n\t\t\t\tcase 2: return z;\n\t\t\t\tcase 3: return h;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t\tset {\n\t\t\tswitch (i) {\n\t\t\t\tcase 0: x = value; break;\n\t\t\t\tcase 1: y = value; break;\n\t\t\t\tcase 2: z = value; break;\n\t\t\t\tcase 3: h = value; break;\n\t\t\t\tdefault: throw new InvalidOperationException ();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic Vec4f Normalize ()\n\t{\n\t\tvar len = Norm ();\n\t\treturn this / len;\n\t}\n\n\tpublic float Norm ()\n\t{\n\t\treturn (float)Math.Sqrt (x * x + y * y + z * z + h * h);\n\t}\n\n\tpublic static Vec4f operator - (Vec4f a, Vec4f b)\n\t{\n\t\treturn new Vec4f { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z, h = a.h - b.h };\n\t}\n\n\tpublic static Vec4f operator / (Vec4f v, float num)\n\t{\n\t\tv.x /= num;\n\t\tv.y /= num;\n\t\tv.z /= num;\n\t\tv.h /= num;\n\n\t\treturn v;\n\t}\n}\n\nstruct Vec2i\n{\n\tpublic int x;\n\tpublic int y;\n\n\tpublic static Vec2i operator - (Vec2i a, Vec2i b)\n\t{\n\t\treturn new Vec2i { x = a.x - b.x, y = a.y - b.y };\n\t}\n}\n\nstruct Vec3i\n{\n\tpublic int x;\n\tpublic int y;\n\tpublic int z;\n\n\tpublic static Vec3i operator - (Vec3i a, Vec3i b)\n\t{\n\t\treturn new Vec3i { x = a.x - b.x, y = a.y - b.y, z = a.z - b.z };\n\t}\n}\n\nstatic class Geometry\n{\n\tpublic static Vec3f Cross (Vec3f l, Vec3f r)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = l.y * r.z - l.z * r.y,\n\t\t\ty = l.z * r.x - l.x * r.z,\n\t\t\tz = l.x * r.y - l.y * r.x\n\t\t};\n\t}\n\n\tpublic static float Dot (Vec3f l, Vec3f r)\n\t{\n\t\treturn l.x * r.x + l.y * r.y + l.z * r.z;\n\t}\n\n\tpublic static Vec4f Embed4D (Vec3f v, float fill = 1)\n\t{\n\t\treturn new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n\t}\n\n\tpublic static Vec2f Project2D (Vec3f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec2f Project2D (Vec4f v)\n\t{\n\t\treturn new Vec2f { x = v.x, y = v.y };\n\t}\n\n\tpublic static Vec3f Project3D (Vec4f v)\n\t{\n\t\treturn new Vec3f { x = v.x, y = v.y, z = v.z };\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/Image.csx",
    "content": "using System.IO;\n\nenum Format\n{\n\tGRAYSCALE = 1,\n\tBGR = 3,\n\tBGRA = 4\n}\n\nstruct Color\n{\n\t// the value stored as little endian:\n\t// ARGB -> BGRA\n\t// xRGB -> BGRx\n\tpublic readonly int value;\n\tpublic readonly Format format;\n\n\tpublic byte this [int offset] {\n\t\tget {\n\t\t\tif (offset > 3) // int has only 4 bytes (0, 1, 2, 3)\n\t\t\t\tthrow new ArgumentOutOfRangeException ();\n\t\t\treturn (byte)(value >> 8 * (3 - offset));\n\t\t}\n\t}\n\n\tpublic static Color Red = new Color (red: 255, green: 0, blue: 0, alpha: 255);\n\tpublic static Color Green = new Color (red: 0, green: 255, blue: 0, alpha: 255);\n\tpublic static Color Blue = new Color (red: 0, green: 0, blue: 255, alpha: 255);\n\tpublic static Color Black = new Color (red: 0, green: 0, blue: 0, alpha: 255);\n\tpublic static Color White = new Color (red: 255, green: 255, blue: 255, alpha: 255);\n\tpublic static Color Yellow = new Color (red: 225, green: 225, blue: 0, alpha: 255);\n\n\tpublic Color (byte red, byte green, byte blue, byte alpha)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | alpha, Format.BGRA)\n\t{\n\t}\n\n\tpublic Color (byte red, byte green, byte blue)\n\t\t: this ((blue << 24) | (green << 16) | (red << 8) | 0xFF, Format.BGR)\n\t{\n\t}\n\n\tpublic Color (byte value)\n\t\t: this (value, Format.GRAYSCALE)\n\t{\n\t}\n\n\tpublic Color (int value, Format format)\n\t{\n\t\tthis.value = value;\n\t\tthis.format = format;\n\t}\n\n\tpublic static Color operator * (Color color, float intensivity)\n\t{\n\t\tintensivity = Math.Max (0f, Math.Min (1f, intensivity));\n\t\tvar ch0 = (byte)(color [0] * intensivity);\n\t\tvar ch1 = (byte)(color [1] * intensivity);\n\t\tvar ch2 = (byte)(color [2] * intensivity);\n\t\tvar ch3 = color [3];\n\t\treturn new Color (ch0 << 24 | ch1 << 16 | ch2 << 8 | ch3, color.format);\n\t}\n}\n\nclass Image\n{\n\tinternal byte [] buffer;\n\n\tpublic int Width { get; }\n\tpublic int Height { get; }\n\tpublic Format Format { get; }\n\n\tpublic int BytesPerRow {\n\t\tget {\n\t\t\treturn Width * (int)Format;\n\t\t}\n\t}\n\n\tpublic Image (int width, int height, Format format)\n\t{\n\t\tWidth = width;\n\t\tHeight = height;\n\t\tFormat = format;\n\n\t\tbuffer = new byte [height * BytesPerRow];\n\t}\n\n\tpublic void VerticalFlip ()\n\t{\n\t\tvar bpp = (int)Format;\n\t\tint bytesPerLine = Width * bpp;\n\n\t\tvar half = Height >> 1;\n\t\tfor (int l = 0; l < half; l++) {\n\t\t\tvar l1 = l * bytesPerLine;\n\t\t\tvar l2 = (Height - 1 - l) * bytesPerLine;\n\n\t\t\tfor (int i = 0; i < bytesPerLine; i++) {\n\t\t\t\tbyte pixel = buffer [l1 + i];\n\t\t\t\tbuffer [l1 + i] = buffer [l2 + i];\n\t\t\t\tbuffer [l2 + i] = pixel;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void Clear ()\n\t{\n\t\tfor (int i = 0; i < buffer.Length; i++)\n\t\t\tbuffer [i] = 0;\n\t}\n\n\tpublic Color this [int x, int y] {\n\t\tget {\n\t\t\tif (x < 0 || x >= Width) throw new ArgumentException (\"x\");\n\t\t\tif (y < 0 || y >= Height) throw new ArgumentException (\"y\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar len = (int)Format;\n\t\t\tint value = 0;\n\t\t\tfor (var ch = 0; ch < 4; ch++)\n\t\t\t\tvalue = (value << 8) | (ch < len ? buffer [offset++] : 0xFF);\n\n\t\t\treturn new Color (value, Format);\n\t\t}\n\t\tset {\n\t\t\tif (x < 0 || x >= Width) return; //throw new ArgumentException ($\"{nameof(x)}={x} {nameof(Width)}={Width}\");\n\t\t\tif (y < 0 || y >= Height) return; // throw new ArgumentException ($\"{nameof(y)}={y} {nameof(Height)}={Height}\");\n\n\t\t\tvar offset = GetOffset (x, y);\n\t\t\tvar v = value.value;\n\t\t\tvar len = (int)Format;\n\t\t\tfor (int ch = 0; ch < len; ch++)                   // 0123\n\t\t\t\tbuffer [offset++] = (byte)(v >> (3 - ch) * 8); // BGRA\n\t\t}\n\t}\n\n\tint GetOffset (int x, int y)\n\t{\n\t\treturn y * BytesPerRow + x * (int)Format;\n\t}\n\n\tpublic bool WriteToFile (string path, bool rle = true)\n\t{\n\t\tvar bpp = (int)Format;\n\t\tusing (var writer = new BinaryWriter (File.Create (path))) {\n\t\t\tvar header = new TGAHeader {\n\t\t\t\tIdLength = 0, // The IDLength set to 0 indicates that there is no image identification field in the TGA file\n\t\t\t\tColorMapType = 0, // a value of 0 indicates that no palette is included\n\t\t\t\tBitsPerPixel = (byte)(bpp * 8),\n\t\t\t\tWidth = (short)Width,\n\t\t\t\tHeight = (short)Height,\n\t\t\t\tDataTypeCode = DataTypeFor (bpp, rle),\n\t\t\t\tImageDescriptor = (byte)(0x20 | (Format == Format.BGRA ? 8 : 0)) // top-left origin\n\t\t\t};\n\t\t\tWriteTo (writer, header);\n\t\t\tif (!rle)\n\t\t\t\twriter.Write (buffer);\n\t\t\telse\n\t\t\t\tUnloadRleData (writer);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static Image Load (string path)\n\t{\n\t\tusing (var reader = new BinaryReader (File.OpenRead (path))) {\n\t\t\tvar header = ReadHeader (reader);\n\n\t\t\tvar height = header.Height;\n\t\t\tvar width = header.Width;\n\t\t\tvar bytespp = header.BitsPerPixel >> 3;\n\t\t\tvar format = (Format)bytespp;\n\n\t\t\tif (width <= 0 || height <= 0)\n\t\t\t\tthrow new InvalidProgramException ($\"bad image size: width={width} height={height}\");\n\t\t\tif (format != Format.BGR && format != Format.BGRA && format != Format.GRAYSCALE)\n\t\t\t\tthrow new InvalidProgramException ($\"unknown format {format}\");\n\n\t\t\tvar img = new Image (width, height, format);\n\n\t\t\tswitch (header.DataTypeCode) {\n\t\t\tcase DataType.UncompressedTrueColorImage:\n\t\t\tcase DataType.UncompressedBlackAndWhiteImage:\n\t\t\t\treader.Read (img.buffer, 0, img.buffer.Length);\n\t\t\t\tbreak;\n\t\t\tcase DataType.RleTrueColorImage:\n\t\t\tcase DataType.RleBlackAndWhiteImage:\n\t\t\t\timg.LoadRleData (reader);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidProgramException ($\"unsupported image format {header.DataTypeCode}\");\n\t\t\t}\n\n\t\t\tif ((header.ImageDescriptor & 0x20) == 0)\n\t\t\t\timg.VerticalFlip ();\n\n\t\t\treturn img;\n\t\t}\n\t}\n\n\tstatic void WriteTo (BinaryWriter writer, TGAHeader header)\n\t{\n\t\twriter.Write (header.IdLength);\n\t\twriter.Write (header.ColorMapType);\n\t\twriter.Write ((byte)header.DataTypeCode);\n\t\twriter.Write (header.ColorMapOrigin);\n\t\twriter.Write (header.ColorMapLength);\n\t\twriter.Write (header.ColorMapDepth);\n\t\twriter.Write (header.OriginX);\n\t\twriter.Write (header.OriginY);\n\t\twriter.Write (header.Width);\n\t\twriter.Write (header.Height);\n\t\twriter.Write (header.BitsPerPixel);\n\t\twriter.Write (header.ImageDescriptor);\n\t}\n\n\tstatic TGAHeader ReadHeader (BinaryReader reader)\n\t{\n\t\tvar header = new TGAHeader {\n\t\t\tIdLength = reader.ReadByte (),\n\t\t\tColorMapType = reader.ReadByte (),\n\t\t\tDataTypeCode = (DataType)reader.ReadByte (),\n\t\t\tColorMapOrigin = reader.ReadInt16 (),\n\t\t\tColorMapLength = reader.ReadInt16 (),\n\t\t\tColorMapDepth = reader.ReadByte (),\n\t\t\tOriginX = reader.ReadInt16 (),\n\t\t\tOriginY = reader.ReadInt16 (),\n\t\t\tWidth = reader.ReadInt16 (),\n\t\t\tHeight = reader.ReadInt16 (),\n\t\t\tBitsPerPixel = reader.ReadByte (),\n\t\t\tImageDescriptor = reader.ReadByte ()\n\t\t};\n\t\treturn header;\n\t}\n\n\tbool UnloadRleData (BinaryWriter writer)\n\t{\n\t\tconst int max_chunk_length = 128;\n\t\tint npixels = Width * Height;\n\t\tint curpix = 0;\n\t\tvar bpp = (int)Format;\n\n\t\twhile (curpix < npixels) {\n\t\t\tint chunkstart = curpix * bpp;\n\t\t\tint curbyte = curpix * bpp;\n\t\t\tint run_length = 1;\n\t\t\tbool literal = true;\n\t\t\twhile (curpix + run_length < npixels && run_length < max_chunk_length && curpix + run_length < curpix + Width) {\n\t\t\t\tbool succ_eq = true;\n\t\t\t\tfor (int t = 0; succ_eq && t < bpp; t++)\n\t\t\t\t\tsucc_eq = (buffer [curbyte + t] == buffer [curbyte + t + bpp]);\n\t\t\t\tcurbyte += bpp;\n\t\t\t\tif (1 == run_length)\n\t\t\t\t\tliteral = !succ_eq;\n\t\t\t\tif (literal && succ_eq) {\n\t\t\t\t\trun_length--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!literal && !succ_eq)\n\t\t\t\t\tbreak;\n\t\t\t\trun_length++;\n\t\t\t}\n\t\t\tcurpix += run_length;\n\n\t\t\twriter.Write ((byte)(literal ? run_length - 1 : 128 + (run_length - 1)));\n\t\t\twriter.Write (buffer, chunkstart, literal ? run_length * bpp : bpp);\n\t\t}\n\t\treturn true;\n\t}\n\n\tvoid LoadRleData (BinaryReader reader)\n\t{\n\t\tvar pixelcount = Width * Height;\n\t\tvar currentpixel = 0;\n\t\tvar currentbyte = 0;\n\n\t\tvar bytespp = (int)Format;\n\t\tvar color = new byte [4];\n\n\t\tdo {\n\t\t\tvar chunkheader = reader.ReadByte ();\n\t\t\tif (chunkheader < 128) {\n\t\t\t\tchunkheader++;\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = reader.ReadByte ();\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchunkheader -= 127;\n\t\t\t\treader.Read (color, 0, bytespp);\n\t\t\t\tfor (int i = 0; i < chunkheader; i++) {\n\t\t\t\t\tfor (int t = 0; t < bytespp; t++)\n\t\t\t\t\t\tbuffer [currentbyte++] = color [t];\n\t\t\t\t\tcurrentpixel++;\n\t\t\t\t\tif (currentpixel > pixelcount)\n\t\t\t\t\t\tthrow new InvalidProgramException (\"Too many pixels read\");\n\t\t\t\t}\n\t\t\t}\n\t\t} while (currentpixel < pixelcount);\n\t}\n\n\tstatic DataType DataTypeFor (int bpp, bool rle)\n\t{\n\t\tvar format = (Format)bpp;\n\t\tif (format == Format.GRAYSCALE)\n\t\t\treturn rle ? DataType.RleBlackAndWhiteImage : DataType.UncompressedBlackAndWhiteImage;\n\t\treturn rle ? DataType.RleTrueColorImage : DataType.UncompressedTrueColorImage;\n\t}\n}\n\nstruct TGAHeader\n{\n\tpublic byte IdLength;\n\tpublic byte ColorMapType;\n\tpublic DataType DataTypeCode;\n\n\t// field #4. Color map specification\n\tpublic short ColorMapOrigin; // index of first color map entry that is included in the file\n\tpublic short ColorMapLength; // number of entries of the color map that are included in the file\n\tpublic byte ColorMapDepth;   // number of bits per pixel\n\n\t// field #5. Image specification\n\tpublic short OriginX; // absolute coordinate of lower-left corner for displays where origin is at the lower left\n\tpublic short OriginY; // as for X-origin\n\tpublic short Width;   // width in pixels\n\tpublic short Height;  // height in pixels\n\tpublic byte BitsPerPixel;     // pixel depth\n\tpublic byte ImageDescriptor;  // bits 3-0 give the alpha channel depth, bits 5-4 give direction\n}\n\npublic enum DataType : byte\n{\n\tNoImageData = 0, // no image data is present\n\tUncompressedColorMappedImage = 1,\n\tUncompressedTrueColorImage = 2,\n\tUncompressedBlackAndWhiteImage = 3,\n\tRleColorMappedImage = 9, // run-length encoded color-mapped image\n\tRleTrueColorImage = 10, // run-length encoded true-color image\n\tRleBlackAndWhiteImage = 11 // run-length encoded black-and-white (grayscale) image\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/ImageResultHandler.csx",
    "content": "using XIR = Xamarin.Interactive.Representations;\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n    XIR.ImageFormat format;\n\n    switch (img.Format) {\n    case Format.BGRA:\n        format = XIR.ImageFormat.Bgra32;\n        break;\n    case Format.BGR:\n        format = XIR.ImageFormat.Bgr24;\n        break;\n    default:\n        return null;\n    }\n\n    return new XIR.Image (format, img.buffer, img.Width, img.Height);\n});"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/LICENSE.txt",
    "content": "Tiny Renderer, https://github.com/ssloy/tinyrenderer\nCopyright Dmitry V. Sokolov\n\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it freely,\nsubject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.\n2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n3. This notice may not be removed or altered from any source distribution.\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/Matrix.csx",
    "content": "using System;\n\npublic struct Matrix4\n{\n\tpublic const int Len = 4;\n\n\tpublic float R0C0, R0C1, R0C2, R0C3;\n\tpublic float R1C0, R1C1, R1C2, R1C3;\n\tpublic float R2C0, R2C1, R2C2, R2C3;\n\tpublic float R3C0, R3C1, R3C2, R3C3;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\tcase 3: return R0C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\tcase 3: return R1C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\tcase 3: return R2C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R3C0;\n\t\t\t\tcase 1: return R3C1;\n\t\t\t\tcase 2: return R3C2;\n\t\t\t\tcase 3: return R3C3;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\tcase 3: R0C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\tcase 3: R1C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\tcase 3: R2C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R3C0 = value; return;\n\t\t\t\tcase 1: R3C1 = value; return;\n\t\t\t\tcase 2: R3C2 = value; return;\n\t\t\t\tcase 3: R3C3 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix4 Transpose ()\n\t{\n\t\treturn new Matrix4 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0, R0C3 = R3C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1, R1C3 = R3C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2, R2C3 = R3C2,\n\t\t\tR3C0 = R0C3, R3C1 = R1C3, R3C2 = R2C3, R3C3 = R3C3\n\t\t};\n\t}\n\n\n\tpublic static Matrix4 Identity ()\n\t{\n\t\treturn new Matrix4 { R0C0 = 1, R1C1 = 1, R2C2 = 1, R3C3 = 1 };\n\t}\n\n\tpublic static Matrix4 Zoom (float scale)\n\t{\n\t\treturn new Matrix4 { R0C0 = scale, R1C1 = scale, R2C2 = scale, R3C3 = scale };\n\t}\n\n\tpublic static Matrix4 RotationZ (float angle)\n\t{\n\t\tvar cosangle = (float)Math.Cos (angle);\n\t\tvar sinangle = (float)Math.Sin (angle);\n\n\t\tvar R = Identity ();\n\t\tR [0, 0] = R [1, 1] = cosangle;\n\t\tR [0, 1] = -sinangle;\n\t\tR [1, 0] = sinangle;\n\n\t\treturn R;\n\t}\n\n\n\tpublic static Matrix4 operator * (Matrix4 l, Matrix4 r)\n\t{\n\t\tvar result = new Matrix4 ();\n\t\tfor (int i = 0; i < Len; i++) {\n\t\t\tfor (int j = 0; j < Len; j++) {\n\t\t\t\tresult [i, j] = 0;\n\t\t\t\tfor (int k = 0; k < Len; k++) {\n\t\t\t\t\tresult [i, j] += l [i, k] * r [k, j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this[r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix3\n{\n\tpublic const int Len = 3;\n\n\tpublic float R0C0, R0C1, R0C2;\n\tpublic float R1C0, R1C1, R1C2;\n\tpublic float R2C0, R2C1, R2C2;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\tcase 2: return R0C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\tcase 2: return R1C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R2C0;\n\t\t\t\tcase 1: return R2C1;\n\t\t\t\tcase 2: return R2C2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\tcase 2: R0C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\tcase 2: R1C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R2C0 = value; return;\n\t\t\t\tcase 1: R2C1 = value; return;\n\t\t\t\tcase 2: R2C2 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n\n\tpublic Matrix3 Transpose ()\n\t{\n\t\treturn new Matrix3 {\n\t\t\tR0C0 = R0C0, R0C1 = R1C0, R0C2 = R2C0,\n\t\t\tR1C0 = R0C1, R1C1 = R1C1, R1C2 = R2C1,\n\t\t\tR2C0 = R0C2, R2C1 = R1C2, R2C2 = R2C2\n\t\t};\n\t}\n\n\tpublic void SetColumn (int col, Vec3f v)\n\t{\n\t\tthis [0, col] = v.x;\n\t\tthis [1, col] = v.y;\n\t\tthis [2, col] = v.z;\n\t}\n\n\tpublic void SetRow (int row, Vec3f v)\n\t{\n\t\tthis [row, 0] = v.x;\n\t\tthis [row, 1] = v.y;\n\t\tthis [row, 2] = v.z;\n\t}\n\n\tpublic override string ToString ()\n\t{\n\t\tvar sb = new System.Text.StringBuilder ();\n\t\tfor (int r = 0; r < Len; r++) {\n\t\t\tfor (int c = 0; c < Len; c++)\n\t\t\t\tsb.Append (this [r, c]).Append (\" \");\n\t\t\tsb.AppendLine ();\n\t\t}\n\t\treturn sb.ToString ();\n\t}\n}\n\npublic struct Matrix2\n{\n\tpublic const int Len = 2;\n\n\tpublic float R0C0, R0C1;\n\tpublic float R1C0, R1C1;\n\n\tpublic float this [int row, int column] {\n\t\tget {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R0C0;\n\t\t\t\tcase 1: return R0C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: return R1C0;\n\t\t\t\tcase 1: return R1C1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t\tset {\n\t\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R0C0 = value; return;\n\t\t\t\tcase 1: R0C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\tswitch (column) {\n\t\t\t\tcase 0: R1C0 = value; return;\n\t\t\t\tcase 1: R1C1 = value; return;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthrow new IndexOutOfRangeException ();\n\t\t}\n\t}\n}\n\n// we don't want to declare them in Matrix because we don't need them in lesson which introduces Matrix class\nstatic class MatrixHelpers\n{\n\t// For Matrix4\n\t// how to calc inverse Matrix https://en.wikipedia.org/w/index.php?title=Invertible_matrix&section=4#In_relation_to_its_adjugate\n\tpublic static Matrix4 TransposeInverse (Matrix4 m)\n\t{\n\t\t// returns Transpose(Inverse(m))\n\t\t// where Inverse(m) = Transpose(cofactor) / det(m)\n\t\t// Transpose(Inverse(m)) = Transpose(Transpose(cofactor) / det(m)) = cofactor / det(m)\n\n\t\tvar cofactor = Cofactor (m);\n\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < Matrix4.Len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tfor (int r = 0; r < Matrix4.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix4.Len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix4 Inverse (Matrix4 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix4.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tpublic static Matrix3 Inverse (Matrix3 m)\n\t{\n\t\t// where Inverse(m) = Transpose(Cofactor(m)) / det(m)\n\t\tvar cofactor = Cofactor (m);\n\n\t\tint len = Matrix3.Len;\n\t\tfloat det = 0;\n\t\tfor (int i = 0; i < len; i++)\n\t\t\tdet += m [0, i] * cofactor [0, i];\n\n\t\tcofactor = cofactor.Transpose ();\n\n\t\tfor (int r = 0; r < len; r++) {\n\t\t\tfor (int c = 0; c < len; c++)\n\t\t\t\tcofactor [r, c] /= det;\n\t\t}\n\n\t\treturn cofactor;\n\t}\n\n\tstatic Matrix4 Cofactor (Matrix4 m)\n\t{\n\t\tvar r = new Matrix4 ();\n\t\tfor (int row = 0; row < Matrix4.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix4.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic Matrix3 Cofactor (Matrix3 m)\n\t{\n\t\tvar r = new Matrix3 ();\n\t\tfor (int row = 0; row < Matrix3.Len; row++) {\n\t\t\tfor (int col = 0; col < Matrix3.Len; col++)\n\t\t\t\tr [row, col] = Cofactor (m, row, col);\n\t\t}\n\t\treturn r;\n\t}\n\n\tstatic float Cofactor (Matrix4 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic float Cofactor (Matrix3 m, int row, int col)\n\t{\n\t\tint sign = ((row + col) % 2 == 0) ? 1 : -1;\n\t\treturn Det (Minor (m, row, col)) * sign;\n\t}\n\n\tstatic Matrix3 Minor (Matrix4 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix3 ();\n\t\tfor (int r = 0; r < Matrix3.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix3.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic Matrix2 Minor (Matrix3 m, int row, int col)\n\t{\n\t\tvar minor = new Matrix2 ();\n\t\tfor (int r = 0; r < Matrix2.Len; r++) {\n\t\t\tfor (int c = 0; c < Matrix2.Len; c++) {\n\t\t\t\tint y = (r < row) ? r : r + 1;\n\t\t\t\tint x = (c < col) ? c : c + 1;\n\t\t\t\tminor [r, c] = m [y, x];\n\t\t\t}\n\t\t}\n\t\treturn minor;\n\t}\n\n\tstatic float Det (Matrix3 m)\n\t{\n\t\tfloat det = 0;\n\t\tdet += m [0, 0] * (m [1, 1] * m [2, 2] - m [1, 2] * m [2, 1]);\n\t\tdet -= m [0, 1] * (m [1, 0] * m [2, 2] - m [1, 2] * m [2, 0]);\n\t\tdet += m [0, 2] * (m [1, 0] * m [2, 1] - m [1, 1] * m [2, 0]);\n\t\treturn det;\n\t}\n\n\tstatic float Det (Matrix2 m)\n\t{\n\t\treturn m [0, 0] * m [1, 1] - m [0, 1] * m [1, 0];\n\t}\n\n\tpublic static Vec3f Mult (Matrix3 m, Vec3f v)\n\t{\n\t\treturn new Vec3f {\n\t\t\tx = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z,\n\t\t\ty = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z,\n\t\t\tz = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z\n\t\t};\n\t}\n\n\tpublic static Vec4f Mult (Matrix4 m, Vec4f v)\n\t{\n\t\treturn new Vec4f {\n\t\t\tx = m.R0C0*v.x + m.R0C1*v.y + m.R0C2*v.z + m.R0C3*v.h,\n\t\t\ty = m.R1C0*v.x + m.R1C1*v.y + m.R1C2*v.z + m.R1C3*v.h,\n\t\t\tz = m.R2C0*v.x + m.R2C1*v.y + m.R2C2*v.z + m.R2C3*v.h,\n\t\t\th = m.R3C0*v.x + m.R3C1*v.y + m.R3C2*v.z + m.R3C3*v.h\n\t\t};\n\t}\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/Model.csx",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nstruct Face\n{\n\tpublic int [] Vertices;\n\tpublic int [] Textures;\n\tpublic int [] Normals;\n}\n\nclass Model\n{\n\tpublic List<Vec3f> Vertices { get; } = new List<Vec3f> ();\n\tpublic List<Face> Faces { get; } = new List<Face> ();\n\tpublic List<Vec3f> Textures { get; } = new List<Vec3f> ();\n\tpublic List<Vec3f> Normals { get; } = new List<Vec3f> ();\n\n\tpublic static Model FromFile (string path)\n\t{\n\t\tvar model = new Model ();\n\n\t\tstring line;\n\t\tusing (var reader = new System.IO.StreamReader (path)) {\n\t\t\twhile ((line = reader.ReadLine ()) != null)\n\t\t\t\tmodel.ParseLine (line);\n\t\t}\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tpublic static Model FromText (string text)\n\t{\n\t\tvar model = new Model ();\n\n\t\tvar lines = text.Split (new char [] { '\\r', '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tforeach (var line in lines)\n\t\t\tmodel.ParseLine (line);\n\n\t\tConsole.WriteLine ($\"v#{model.Vertices.Count} f#{model.Faces.Count}\");\n\t\treturn model;\n\t}\n\n\tvoid ParseLine (string line)\n\t{\n\t\tFunc<string [], Vec3f> parseV3f = strItems => new Vec3f {\n\t\t\tx = float.Parse (strItems [1]),\n\t\t\ty = float.Parse (strItems [2]),\n\t\t\tz = float.Parse (strItems [3])\n\t\t};\n\n\t\tvar items = line.Split (new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);\n\t\tif (line.StartsWith (\"v \", StringComparison.InvariantCulture)) {\n\t\t\tVertices.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vt \", StringComparison.InvariantCulture)) {\n\t\t\tTextures.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"vn \", StringComparison.InvariantCulture)) {\n\t\t\tNormals.Add (parseV3f (items));\n\t\t} else if (line.StartsWith (\"f \", StringComparison.InvariantCulture)) {\n\t\t\tvar indexes = items.Skip (1)\n\t\t\t\t\t\t\t   .SelectMany (s => s.Split (new char [] { '/', ' ' }, StringSplitOptions.RemoveEmptyEntries))\n\t\t\t\t\t\t\t   .Select (s => int.Parse (s) - 1) // in wavefront obj all indices start at 1, not zero\n\t\t\t\t\t\t\t   .ToArray ();\n\t\t\tFaces.Add (new Face {\n\t\t\t\tVertices = indexes.Where ((v, index) => index % 3 == 0).ToArray (),\n\t\t\t\tTextures = indexes.Where ((v, index) => index % 3 == 1).ToArray (),\n\t\t\t\tNormals = indexes.Where ((v, index) => index % 3 == 2).ToArray ()\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic Vec3f Normal (Face face, int nthvert)\n\t{\n\t\tint idx = face.Normals [nthvert];\n\t\treturn Normals [idx];\n\t}\n\n\tpublic Vec3f Vertex (Face face, int nthvert)\n\t{\n\t\tint idx = face.Vertices [nthvert];\n\t\treturn Vertices [idx];\n\t}\n\n\tpublic Vec3f GetUV (Face face, int nthvert)\n\t{\n\t\tint idx = face.Textures [nthvert];\n\t\treturn Textures [idx];\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/WpfImageResultHandler.csx",
    "content": "using System;\nusing System.IO;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\n\nusing XIR = Xamarin.Interactive.Representations;\n\nstatic PixelFormat ConvertFormat (Format format)\n{\n\tswitch (format) {\n\n\t\tcase Format.BGRA:\n\t\t\treturn PixelFormats.Bgra32;\n\t\tcase Format.GRAYSCALE:\n\t\t\treturn PixelFormats.Gray8;\n\t\tcase Format.BGR:\n\t\tdefault:\n\t\t\treturn PixelFormats.Bgr24;\n\t}\n}\n\nInteractiveAgent.RepresentationManager.AddProvider<Image> (img => {\n\tvar source = BitmapSource.Create (img.Width, img.Height, 96, 96, ConvertFormat (img.Format), null, img.buffer, img.BytesPerRow);\n\tvar encoder = new PngBitmapEncoder ();\n\tvar outputFrame = BitmapFrame.Create (source);\n\tencoder.Frames.Add (outputFrame);\n\n\tusing (var memory = new MemoryStream ()) {\n\t\tencoder.Save (memory);\n\t\treturn XIR.Image.FromPng (memory.GetBuffer (), img.Width, img.Height);\n\t}\n});\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\n#load \"lesson6.csx\"\n#load \"lesson6bis.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n```\n\n# Lesson 8: Ambient occlusion\n\n> ℹ️ This workbook is a port of an [excellent C++ series](https://github.com/ssloy/tinyrenderer/wiki) written by Dmitry Sokolov. We appreciate that original work is available under a license that allowed us to turn it into a Workbook.\n\nIn previous lectures we used local illumination model. In other words, for computing illumination of a current pixel we did not take into account its neighbors. [Phong reflection model](https://en.wikipedia.org/wiki/Phong_reflection_model) is a famous example of such approach:\n\n![  ](./img/lesson6_phong.png)\n\nIn this model final illumination intensity for a point is a sum of three components: ambient intensity, constant for all points in the scene, diffuse and specular highlights depending on normal vectors. Wait a minute, why did he choose **constant** ambient component?\n\n# **Second attempt in the global illumination: ambient occlusion**\n\nWell, I was not 100% right: we did use a bit global illumination when we computed shadow mapping. Let us check another possibility to improve our renders (note that one does not exclude another!). Here is an example where I used only ambient component of the Phong reflection model:\n\n![  ](./img/lesson8_goal.png)\n\n**No diffuse component, no specular. Ambient only, however it is easy to see that I did not choose it to be constant.** Okay, the problem is stated as follows: let us ambient intensity for each point of our scene. When we previously supposed constant ambient illumination, it means that we supposed our scene so nice that all light was reflected everywhere equally. A bit strong hypothesis that is. Of course, it was made back in the old days where computing power was severely limited. Nowadays, we can spend a bit more to get more realistic images. Global illumination is more expensive than the local is. Recall that for shadow mapping we were forced to do two-passes rendering, thus roughly dividing our FPS by 2.\n\n# **Brute force attempt**\n\nLet us suppose that our object is surrounded by a hemisphere, emitting light uniformly (cloudy sky). Then let us choose randomly, say, a thousand points at the hemisphere, render the object thousand times and to compute what parts of the model were visible.\n\n**Question:** Do you know how to pick **uniformly** a thousand points on a (hemi-)sphere? Something like this:\n\n![  ](./img/lesson8_sphere.png)\n\nIf we simply pick randomly a longitude and a latitude, we will obtain an accumulation of points near the poles, thus breaking our assumption on uniform lighting of the sky. [Check the answer](http://mathworld.wolfram.com/SpherePointPicking.html).\n\n**Question:** where do we store the visibility information?\n\n```csharp\nVec3f RandPointOnUnitSphere ()\n{\n    var rnd = new Random ();\n    var u = rnd.NextDouble ();\n    var v = rnd.NextDouble ();\n    var theta = 2 * Math.PI * u;\n    var phi = Math.Acos(2 * v - 1);\n\n    return new Vec3f {\n        x = (float)(Math.Sin (phi) * Math.Cos (theta)),\n        y = (float)(Math.Sin (phi) * Math.Sin (theta)),\n        z = (float)Math.Cos (phi)\n    };\n}\n```\n\nSince we are in the brute force section, then the answer is obvious: in a texture!\n\nThus, we do a two-pass rendering for each point we picked on the sphere, here is the first shader and the resulting image:\n\n```csharp\nclass ZShader : IShader\n{\n    const float depth = 255f;\n\n    readonly Model model;\n    readonly Matrix4 transformation;\n\n    public ZShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView)\n    {\n        this.model = model;\n        transformation = viewport * projection * modelView;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        color = Color.White * (fragment.z / depth);\n        return false;\n    }\n}\nvar zshader = new ZShader (diabloModel, viewPort, projection, modelView);\nvar step1 = Render (diabloModel, zshader).Image;\nstep1.VerticalFlip();\nstep1\n```\n\nThis image is not very interesting for us, we are more interested in its z-buffer, exactly as in the previous lesson. Then we do another pass:\n\n```csharp\nclass OcclusionShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Matrix4 transformation;\n    readonly Image occlusion;\n    readonly float [] shadowbuffer;\n    readonly int width;\n\n    public OcclusionShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Image occlusion, float [] shadowbuffer, int width)\n    {\n        this.model = model;\n        this.occlusion = occlusion;\n        this.shadowbuffer = shadowbuffer;\n        this.width = width;\n\n        transformation = viewport * projection * modelView;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uvf = CalcUV (varyingU, varyingV, bar);\n        var uvi = CalcXY (occlusion, uvf);\n\n        var index = (int)(fragment.x + fragment.y * width);\n        if (Math.Abs(shadowbuffer [index] - (byte)fragment.z) <= 1e-2)\n            occlusion [uvi.x, uvi.y] = Color.White;\n\n        color = Color.White;\n        return false;\n    }\n}\n```\n\nThe resulting image is not interesting either, it will simply draw a white image. However, this line I like:\n\n`occlusion [uvi.x, uvi.y] = Color.White;`\n\nocclusion - is initially clear image; this line tells us that if the fragment is visible, then we put a white point in this image using fragment's texture coordinates. Here is the resulting occlusion image for one point we choose on the hemisphere:\n\n![](./img/occlusion.png)\n\n**Question:** Why are there holes in obviously visible triangles?\n\n**Question:** Why are there triangles more densely covered than others?\n\nWell, we repeat above procedure a thousand times, compute average of all occl images.\n\n```csharp\nvar rnd = new Random ();\nvar screen_coords = new Vec4f [3];\n\nvar frame = new Image (width, height, Format.BGR);\nvar shadowbuffer = InitZBuffer (frame);\nvar zbuffer = InitZBuffer (frame);\n\nvar total = new Image (1024, 1024, Format.BGR);\nvar occl = new Image (1024, 1024, Format.BGR);\n\nconst int nrenders = 1;\nfor (int iter = 1; iter <= nrenders; iter++) {\n    for (int i = 0; i < shadowbuffer.Length; i++) {\n        shadowbuffer [i] = 0;\n        zbuffer [i] = 0;\n    }\n\n    var vUp = new Vec3f {\n        x = (float)rnd.NextDouble (),\n        y = (float)rnd.NextDouble (),\n        z = (float)rnd.NextDouble ()\n    };\n    var spLocation = RandPointOnUnitSphere ();\n    spLocation.y = Math.Abs (spLocation.y);\n\n    frame.Clear ();\n    var mvM = LookAt (spLocation, center, vUp);\n    var pM = Projection (0);\n    var zshader = new ZShader (diabloModel, viewPort, pM, mvM);\n    foreach (var face in diabloModel.Faces) {\n        for (int i = 0; i < 3; i++)\n            screen_coords [i] = zshader.Vertex (face, i);\n        Triangle (frame, screen_coords, zshader, shadowbuffer);\n    }\n    //frame.VerticalFlip ();\n    //frame.WriteToFile (\"framebuffer.tga\");\n\n    occl.Clear ();\n    var shader = new OcclusionShader (diabloModel, viewPort, pM, mvM, occl, shadowbuffer, frame.Width);\n    foreach (var face in diabloModel.Faces) {\n        for (int i = 0; i < 3; i++)\n            screen_coords [i] = shader.Vertex (face, i);\n        Triangle (frame, screen_coords, shader, zbuffer);\n    }\n\n    for (int i = 0; i < total.Width; i++) {\n        for (int j = 0; j < total.Height; j++) {\n            float prev = total [i, j] [0];\n            float curr = occl [i, j] [0];\n            var val = (byte)((prev * (iter - 1) + curr) / iter + 0.5f);\n            total [i, j] = new Color (val, val, val);\n        }\n    }\n}\n\n// total.VerticalFlip ();\n// total.WriteToFile (\"total-occlusion.tga\");\n```\n\nHere is the average visible texture:\n\n![](./img/total-occlusion.png)\n\nCool, looks like something we could want. Let us draw our Diable without any lighting computation, simply by putting above texture:\n\n```csharp\nvar aoTexture = Image.Load (\"obj/diablo3-total-occlusion.tga\");\naoTexture.VerticalFlip ();\n\nclass AOShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Matrix4 transformation;\n    readonly Image aoImage;\n\n    public AOShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Image aoImage)\n    {\n        this.model = model;\n        this.aoImage = aoImage;\n\n        transformation = viewport * projection * modelView;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uvf = CalcUV (varyingU, varyingV, bar);\n        var uvi = CalcXY (aoImage, uvf);\n\n        var t = aoImage [uvi.x, uvi.y] [0];\n        color = new Color (t, t, t);\n\n        return false;\n    }\n}\n\nvar shader = new AOShader (diabloModel, viewPort, projection, modelView, aoTexture);\nvar image = Render (diabloModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n**Question:** Wow, he is in a bad mood... Why?\n\nThis question is linked to the previous one. Did you notice that in Diablo's texture there is one arm only? The artist (in this case [Samuel Sharit](https://www.linkedin.com/in/samuelsharit)) is practical and did not want to waste precious resources. He simply said that the arms are textured in the same way and both arms can have same texture coordinates. Roughly it means that our lighting computing will count arms twice, thus quadrupling the light energy in the final render.\n\n## **Let us sum up**\n\nThis method allows to precompute ambient occlusion for scenes with static geometry. Computation time depends on the number of samples you choose, but in practice it does not matter since we compute it once and use as a texture afterwards. Advantage of this method is its flexibility and ability to compute much more complex lighting than a simple uniform hemisphere. Disadvantage - for doubled texture coordinates the computation is not correct, we need to put some scotch tape to repair it (see the teaser image for this lesson).\n\n# **Screen space ambient occlusion**\n\nWell, we see that global illumination is still an expensive thing, it requires visibility computations for many points. Let us try to find a compromise between computing time and rendering quality. Here is an image I want to compute (recall that in this lesson I do not use other lighting besides the ambient one):\n\n![  ](./img/lesson8_goal2.png)\n\nHere is the shader to compute the image:\n\n```csharp\nclass ZShader : IShader\n{\n    readonly Model model;\n    readonly Matrix4 transformation;\n\n    public ZShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView)\n    {\n        this.model = model;\n        transformation = viewport * projection * modelView;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        color = Color.Black;\n        return false;\n    }\n};\n```\n\nWhat-what-what?! `color = Color.Black;` ?!\n\nYes, that is right. At the moment I am only interested in the z-buffer, the image will appear after a post-processing step. Here is the complete code with our \"empty\" shader call and the post-processing routine (takes a few mins to render):\n\n```csharp\nfloat MaxElevationAngle (float [] zbuffer, Vec2f p, Vec2f dir, int width, int height)\n{\n    float maxangle = 0;\n    for (float t = 0; t < 1000; t += 1) {\n        Vec2f cur = p + dir * t;\n        if (cur.x >= width || cur.y >= height || cur.x < 0 || cur.y < 0)\n            return maxangle;\n\n        var distance = (p - cur).Norm ();\n        if (distance < 1)\n            continue;\n\n        float elevation = zbuffer [(int)cur.x + (int)cur.y * width] - zbuffer [(int)p.x + (int)p.y * width];\n        maxangle = (float)Math.Max (maxangle, Math.Atan (elevation / distance));\n    }\n\n    return maxangle;\n}\n\nImage RenderAO(Model model)\n{\n    var shader = new ZShader (model, viewPort, projection, modelView);\n    var result = Render (model, shader);\n    var image = result.Image;\n    var zbuffer = result.ZBuffer;\n\n    for (int x = 0; x < image.Width; x++) {\n        for (int y = 0; y < image.Height; y++) {\n            if (zbuffer [x + y * image.Width] < -1e5)\n                continue;\n\n            double total = 0;\n            for (var a = 0.0; a < 2 * Math.PI - 0.001; a += Math.PI / 4) {\n                total += Math.PI / 2 - MaxElevationAngle (zbuffer,\n                                                            new Vec2f { x = x, y = y },\n                                                            new Vec2f { x = (float)Math.Cos (a), y = (float)Math.Sin (a) },\n                                                            image.Width, image.Height);\n            }\n            total /= (Math.PI / 2) * 8;\n            var v = (byte)(Math.Min (255, total * 255));\n            image [x, y] = new Color (v, v, v);\n        }\n    }\n    return image;\n}\n\nvar image = RenderAO(diabloModel); \nimage.VerticalFlip ();\nimage\n```\n\nThe empty shader call gives us the z-buffer. As for the post-processing: for each pixel of our image I emit a number of rays (eight here) in all directions around the pixel. The z-buffer is a height map, you can imagine it as a landscape. What i want to compute is the slope in each of our 8 directions. The function `MaxElevationAngle` gives the maximum slope we encounter for each ray we cast.\n\nIf all eight rays have zero elevation, then the current pixel is well visible, the terrain around is flat. If the angle is near 90°, then current pixel is well-hidden in a kind of a valley, and receives little ambient light.\n\nIn theory we need to compute the [solid angle](https://en.wikipedia.org/wiki/Solid_angle) for each point of the z-buffer, but we approximate it as a sum of (90°-max_elevation_angle) / 8. \n\nHere is an ambient-occlusion-only render of our friend:\n\n```csharp\nvar image = RenderAO(headModel); \nimage.VerticalFlip ();\nimage\n```\n\nEnjoy!\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson1.csx",
    "content": "int width = 800;\nint height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nstatic void Swap<T>(ref T x, ref T y)\n{\n\t T t = y;\n\t y = x;\n\t x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n\t T t = arr[y];\n\t arr[y] = arr[x];\n\t arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n\tbool steep = false;\n\t// if the line is steep, we transpose the image\n\tif (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n\t\tSwap (ref x0, ref y0);\n\t\tSwap (ref x1, ref y1);\n\t\tsteep = true;\n\t}\n\tif (x0 > x1) { // make it left to right\n\t\tSwap (ref x0, ref x1);\n\t\tSwap (ref y0, ref y1);\n\t}\n\t// (x0, y0) == (x1, y1)\n\tif(x0 == x1) {\n\t\timage [x0, y0] = color;\n\t} else {\n\t\tfor (int x = x0; x <= x1; x++) {\n\t\t\tdouble t = (x-x0) / (double)(x1-x0);\n\t\t\tint y = (int)Math.Round(y0*(1-t) + y1*t);\n\t\t\tif (steep)\n\t\t\t\timage [y, x] = color;\n\t\t\telse\n\t\t\t\timage [x, y] = color; \n\t\t}\n\t}\n\treturn image;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson1.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n```\n\n# **Lesson 1: Bresenham’s Line Drawing Algorithm**\n\n# First attempt\n\nThe goal of the first lesson is to render the wire mesh. To do this, we should learn how to draw line segments. We can simply read what Bresenham’s line algorithm is, but let’s write code ourselves. How does the simplest code that draws a line segment between `(x0, y0)` and `(x1, y1)` points look like? Apparently, something like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (double t = 0; t < 1; t += 0.01) {\n        int x = (int) (x0 * (1-t) + x1 * t);\n        int y = (int) (y0 * (1-t) + y1 * t); \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\n# Second attempt\n\nThe problem with this code (in addition to efficiency) is the choice of the constant, which I took equal to .01. If we take it equal to .1, our line segment will look like this:\n\n```csharp\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    for (int x = x0; x <= x1; x++) {\n        double t = (x-x0)/(double)(x1-x0);\n        int y = (int)(y0*(1-t) + y1*t);\n         \n        image [x, y] = color; \n    } \n    return image;\n}\n\nLine (new Image (100, 100, Format.BGR), x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\n```\n\nCaution! The first source of errors in such code of my students is the integer division, like: `(x-x0)/(x1-x0)`. Then, if we try to draw the following lines with this code:\n\n```csharp\nvar image = new Image (100, 100, Format.BGR);\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\nIt turns out that one line is good, the second one is with holes, and there’s no third line at all. Note that the first and the third lines (in the code) draw the same line in different colors, and in different directions (with the source and target points flipped). We have already seen the white one, it is drawn well. I was hoping to change the color of the white line to red, but could not do it. It’s a test for symmetry: the result of drawing a line segment should not depend on the order of points: the `(a,b)` line segment should be exactly the same as the `(b,a)` line segment.\n\n# Third attempt\n\nWe fix the missing red line by swapping the points so `x0` is always lower than `x1`.\n\nThere are holes in one of the line segments due to the fact that its height is greater than the width. My students often suggest the following fix:\n\n`if (dx > dy) { for (int x) } else { for (int y) }`\n\nHoly cow!\n\n```csharp\nstatic void Swap<T>(ref T x, ref T y)\n{\n     T t = y;\n     y = x;\n     x = t;\n}\n\nstatic void Swap<T>(T[] arr, int x, int y)\n{\n     T t = arr[y];\n     arr[y] = arr[x];\n     arr[x] = t;\n}\n\nImage Line (Image image, int x0, int y0, int x1, int y1, Color color)\n{\n    bool steep = false;\n    // if the line is steep, we transpose the image\n    if (Math.Abs (x0-x1) < Math.Abs (y0-y1)) {\n        Swap (ref x0, ref y0);\n        Swap (ref x1, ref y1);\n        steep = true;\n    }\n    if (x0 > x1) { // make it left to right\n        Swap (ref x0, ref x1);\n        Swap (ref y0, ref y1);\n    }\n    // (x0, y0) == (x1, y1)\n    if(x0 == x1) {\n        image [x0, y0] = color;\n    } else {\n        for (int x = x0; x <= x1; x++) {\n            double t = (x-x0) / (double)(x1-x0);\n            int y = (int)Math.Round(y0*(1-t) + y1*t);\n            if (steep)\n                image [y, x] = color;\n            else\n                image [x, y] = color; \n        }\n    }\n    return image;\n}\n\nLine(image, x0: 13, y0: 20, x1: 80, y1: 40, color: Color.White);\nLine(image, x0: 20, y0: 13, x1: 40, y1: 80, color: Color.Red);\nLine(image, x0: 80, y0: 40, x1: 13, y1: 20, color: Color.Red);\n```\n\n# Wireframe rendering\n\nSo now we are ready to create a wire render. You can find the snapshot of the code and the test model here. I used the [wavefront obj](http://en.wikipedia.org/wiki/Wavefront_.obj_file) format of the file to store model. All we need for the render is read from the file the array of vertices of the following type:\n\n`v 0.608654 -0.568839 -0.416318`\n\nare `x,y,z` coordinates, one vertex per file line and faces\n\n`f 1193/1240/1193 1180/1227/1180 1179/1226/1179`\n\n```csharp\nint width = 800, height = 800;\nvar headModel = Model.FromFile (\"obj/african_head.obj\");\n\nvar image = new Image(width, height, Format.BGR);\nforeach(var face in headModel.Faces) {\n    for(int j=0; j<3; j++) {\n        var v0 = headModel.Vertices[face.Vertices [j]];\n        var v1 = headModel.Vertices[face.Vertices [(j+1) % 3]];\n        // scale x from [-1..1] to [0..w] \n        // scale y from [-1..1] to [0..h]\n        int x0 = (int)((v0.x + 1) * width / 2); \n        int y0 = (int)((v0.y + 1) * height / 2); \n        int x1 = (int)((v1.x + 1) * width / 2); \n        int y1 = (int)((v1.y + 1) * height / 2);\n        Line(image, x0, y0, x1, y1, Color.White);\n    }\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson2.csx",
    "content": "using static Geometry;\n\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\n\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n\tLine(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n\tLine(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n\tLine(image, t[0], t[1], color);\n\tLine(image, t[1], t[2], color);\n\tLine(image, t[2], t[0], color);\n}\n\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson2.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\nusing static Geometry;\n```\n\n# Lesson 2: Triangle rasterization and back face culling\n\n# Old-school method: Line sweeping\n\nThus, the task is to draw two-dimensional triangles. For motivated students it normally takes a couple of hours, even if they are bad programmers. Last time we saw Bresenham’s line drawing algorithm. Today’s task is to draw a filled triangle. Funny enough, but this task is not trivial. I don’t know why, but I know that it’s true. Most of my students struggle with this simple task. So, the initial stub will look like this:\n\n```csharp\nvoid Line (Image image, Vec2i p1, Vec2i p2, Color color)\n{\n    Line(image, p1.x, p1.y, p2.x, p2.y, color);\n}\n\nvoid Line (Image image, Vec3f p1, Vec3f p2, Color color)\n{\n    Line(image, (int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y, color);\n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    Line(image, t[0], t[1], color);\n    Line(image, t[1], t[2], color);\n    Line(image, t[2], t[0], color);\n}\n\nVec2i[] t0 = {\n    new Vec2i { x = 10, y = 70 },\n    new Vec2i { x = 50, y = 160 },\n    new Vec2i { x = 70, y = 80 }\n};\nVec2i[] t1 = {\n    new Vec2i { x = 180, y = 50 },\n    new Vec2i { x = 150, y = 1 },\n    new Vec2i { x = 70, y = 180 }\n};\nVec2i[] t2 = {\n    new Vec2i { x = 180, y = 150 },\n    new Vec2i { x = 120, y = 160 },\n    new Vec2i { x = 130, y = 180 }\n};\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThe code is simple: I provide three triangles for the initial debugging of your code. If we invoke `Line` inside the triangle function, we’ll get the contour of the triangle. How to draw a filled triangle?\n\nA good method of drawing a triangle must have the following features:\n\n* It should be (surprise!) simple and fast.\n\n\n* It should be symmetrical: the picture should not depend on the order of vertices passed to the drawing function.\n\n\n* If two triangles have two common vertices, there should be no holes between them because of rasterization rounding.\n\nWe could add more requirements, but let’s do with these ones. Traditionally a line sweeping is used:\n\n1. Sort vertices of the triangle by their y-coordinates\n\n2. Rasterize simultaneously the left and the right sides of the triangle\n\n3. Draw a horizontal line segment between the left and the right boundary points\n\nAt this point my students start to lose the firm ground: which segment is the left one, which one is right? Besides, there are three segments in a triangle... Usually, after this introduction I leave my students for about an hour: once again, reading my code is much less valuable than comparing your own code with mine.\n\n`[One hour passes]`\n\nHow do I draw a triangle? Once again, if you have a better method, I’d be glad to adopt it. Let us assume that we have three points of the triangle: `t0`, `t1`, `t2`, they are sorted in ascending order by the y-coordinate. Then, the boundary A is between `t0` and `t2`, boundary B is between `t0` and `t1`, and then between `t1` and `t2`.\n\n```csharp\nvoid OrderByY (Vec2i[] t)\n{\n    if(t[0].y > t[1].y) Swap(t, 0, 1);\n    if(t[1].y > t[2].y) Swap(t, 1, 2);\n    if(t[0].y > t[1].y) Swap(t, 0, 1);   \n}\n\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    Line(image, t[0], t[1], Color.Green);\n    Line(image, t[1], t[2], Color.Green);\n    Line(image, t[2], t[0], Color.Red);    \n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\n// Here boundary A is red, and boundary B is green.\nimage.VerticalFlip ();\nimage\n```\n\nUnfortunately, boundary B is made of two parts. Let us draw the bottom half of the triangle by cutting it horizontally:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        image[A.x, y] = Color.Red; \n        image[B.x, y] = Color.Green; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNote that the segments are not continuous. Last time when we drew straight lines we struggled to get continuous segments and here I did not bother with rotating the image (remember the xy swapping?). Why? We fill the triangles aftewards, that’s why. If we connect the corresponding pairs of points by horizontal lines, the gaps disappear:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        Line(image, A, B, Color.White);\n        image[B.x, y] = Color.Green; \n        image[A.x, y] = Color.Red; \n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nNow, let us draw the second (upper) half of the triangle. We can do this by adding a second loop:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    OrderByY(t);\n    \n    float height_10 = t[1].y - t[0].y;\n    float height_20 = t[2].y - t[0].y;\n    for(int y=t[0].y; y<=t[1].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[0].y) / height_10; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[0].x + (int)((t[1].x-t[0].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n    \n    float height_21 = t[2].y - t[1].y;\n    for(int y=t[1].y; y<=t[2].y; y++) {\n        var alpha = (y-t[0].y) / height_20;\n        var beta = (y-t[1].y) / height_21; // be careful with divisions by zero\n        Vec2i A = new Vec2i { x = t[0].x + (int)((t[2].x-t[0].x)*alpha), y = y};\n        Vec2i B = new Vec2i { x = t[1].x + (int)((t[2].x-t[1].x)*beta), y = y};\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, y] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\nThis could be enough, but I dislike to see the same code twice. That is why we will make it a bit less readable, but more handy for modifications/maintaining:\n\n```csharp\nvoid Triangle (Image image, Vec2i[] t, Color color)\n{\n    // I dont care about degenerate triangles\n    if(t[0].y == t[1].y && t[1].y == t[2].y)\n        return;\n\n    OrderByY(t);\n\n    float height_10 = t[1].y - t[0].y;\n    float total_height = t[2].y - t[0].y;\n    for(int i=0; i<total_height; i++) {\n        bool second_half = i > t[1].y - t[0].y || t[1].y == t[0].y;\n        float segment_height = second_half ? t[2].y-t[1].y : t[1].y-t[0].y;\n        var alpha = i / total_height;\n        // be careful with divisions by zero\n        var beta = (i - (second_half ? t[1].y-t[0].y : 0)) / segment_height;\n        Vec2i A = new Vec2i {\n            x = t[0].x + (int)((t[2].x-t[0].x)*alpha),\n            y = t[0].y + i\n        };\n        Vec2i B = new Vec2i {\n            x = second_half ? t[1].x + (int)((t[2].x-t[1].x)*beta) : t[0].x + (int)((t[1].x-t[0].x)*beta),\n            y = t[0].y + i\n        };\n        if(A.x > B.x) Swap(ref A, ref B);\n        for (int j=A.x; j<=B.x; j++)\n            image[j, t[0].y + i] = color;\n    }\n}\n\nvar image = new Image (200, 200, Format.BGR);\nTriangle (image, t0, Color.Red);\nTriangle (image, t1, Color.White);\nTriangle (image, t2, Color.Green);\n\nimage.VerticalFlip ();\nimage\n```\n\n# The method I adopt for my code\n\nWhile not being really complicated, the source code for the line sweeping is a bit messy. Moreover, it is really an old-school approach designed for mono-thread CPU programming. Let us take a look at the following pseudo-code:\n\n```csharp\n// triangle(Vec2i[] points) { \n//     Vec2i bbox[2] = find_bounding_box(points); \n//     for (each pixel in the bounding box) { \n//         if (inside(points, pixel)) { \n//             put_pixel(pixel); \n//         } \n//     } \n// }\n```\n\nDo you like it? I do. It is really easy to find a bounding box. It is certainly no problem to check whether a point belongs a 2D triangle (or any convex polygon).\n\n*Off Topic: if I have to implement some code to check whether a point belongs to a polygon, and this program will run on a plane, I will never get on this plane. Turns out, it is a surprisingly difficult task to solve this problem reliably. But here we just painting pixels. I am okay with that.*\n\nThere is another thing I like about this pseudocode: a neophyte in programming accepts it with enthusiasm, more experienced programmers often chuckle: “*What an idiot wrote it?*”. And an expert in computer graphics programming will shrug his shoulders and say: “*Well, that’s how it works in real life*”. Massively parallel computations in thousands of threads (i’m talking about regular consumer computers here) change the way of thinking.\n\nOkay, let us start: first of all we need to know what the [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) are. Given a 2D triangle ABC and a point P, all in old good Cartesian coordinates `(xy)`. Our goal is to find barycentric coordinates of the point P with respect to the triangle ABC. It means that we look for three numbers `(1 − u − v,u,v)` such that we can find the point P as follows:\n\n![ ](./img/lesson2_f1.png)\n\nWhile being a bit frightening at the first glance, it is really simple: imagine that we put three weights `(1−u−v,u,v)` at the vertices A, B and C, respectively. Then the barycenter of the system is exactly in the point P. We can say the same thing with other words: the point P has coordinates `(u,v)` in the (oblique) basis (A,![](./img/lesson2_ab.png),![](./img/lesson2_ac.png)):\n\n![ ](./img/lesson2_f2.png)\n\nSo, we have vectors ![](./img/lesson2_ab.png)￼, ![](./img/lesson2_ac.png)￼ and ![￼](./img/lesson2_ap.png), we need to find two real numbers u and v respecting the following constraint:\n\n![ ](./img/lesson2_f3.png)\n\nIt is a simple vector equation, or a linear system of two equations with two variables:\n\n![ ](./img/lesson2_f4.png)\n\nI am lazy and do not want to solve linear systems in a scholar way. Let us write it in matrix form:\n\n![ ](./img/lesson2_f5.png)\n\nIt means that we are looking for a vector `(u,v,1)` that is orthogonal to `(￼ABx,AC￼x,￼PAx)` and `(￼ABy,AC￼y,PA￼y)` *at the same time*! I hope you see [where I am heading](https://en.wikipedia.org/wiki/Cross_product). That is a small hint: to find an intersection of two straight lines in a plane (that is exactly what we did here), it is sufficient to compute one cross product. By the way, test yourself: how do we find an equation of a line passing through two given points?\n\nSo, let us program our new rasterization routine: we iterate through all pixels of a bounding box for a given triangle. For each pixel we compute its barycentric coordinates. If it has at least one negative component, then the pixel is outside of the triangle. Probably it is more clear to see the program directly:\n\n```csharp\nVec3f Barycentric (Vec3f a, Vec3f b, Vec3f c, Vec2i p)\n{\n    var pixel = new Vec3f { x = p.x + 0.5f, y = p.y + 0.5f };\n\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - pixel;\n\n    var r = Cross (new Vec3f { x = ab.x, y = ac.x, z = pa.x },\n                   new Vec3f { x = ab.y, y = ac.y, z = pa.y });\n\n    // triangle is degenerate, in this case return smth with negative coordinates \n    if (Math.Abs (r.z) < 1)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n\n    return new Vec3f { x = 1 - r.x / r.z - r.y / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color)\n{\n    var t0 = coordinates [0];\n    var t1 = coordinates [1];\n    var t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    Vec2i p;\n    for (p.x = pMin.x; p.x <= pMax.x; p.x++) {\n        for (p.y = pMin.y; p.y <= pMax.y; p.y++) {\n            var bc = Barycentric (t0, t1, t2, p);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n            image [p.x, p.y] = color;\n        }\n    }\n}\n```\n\n# Flat shading render\n\nWe already know how to draw a model with empty triangles. Let us fill them with a random color. This will help us to see how well we have encoded filling of triangles. Here is the code:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\n// Map world coordinates [-1..-1] to screen coordinates [0..width]\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*image.Width/2),\n    y = (int)((v.y+1)*image.Height/2)\n};\n\nvar rnd = new Random();\nFunc<byte> rndByte = () => (byte)rnd.Next(255);\nFunc<Color> rndColor = () => new Color(rndByte(), rndByte(), rndByte()); \n\nvar coordinates = new Vec3f[3];\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        var v = headModel.Vertices[vIndex];\n        coordinates[i] = map(v);\n    }    \n    Triangle(image, coordinates, rndColor());\n}\n\nimage.VerticalFlip ();\nimage\n```\n\nLet us get rid of these clown-colors and put some lighting. Captain Obvious: ”*At the same light intensity, the polygon is illuminated most brightly when it is orthogonal to the light direction.*”\n\nLet us compare:\n\n![ ](./img/lesson2_light1.jpeg)\n\n![](./img/lesson2_light2.jpeg)\n\nWe get zero illumination if the polygon is parallel to the vector of light. To paraphrase: the intensity of illumination is equal to the scalar product of the light vector and the normal to the given triangle. The normal to the triangle can be calculated simply as the [cross product](https://en.wikipedia.org/wiki/Cross_product) of its two sides.\n\nAs a side note, at this course we will perform linear computations on the colors. However `(128,128,128)` color is not half as bright as `(255, 255, 255)`. We are going to ignore gamma correction and tolerate the incorrectness of the brightness of our colors.\n\n```csharp\nvar image = new Image (width, height, Format.BGR);\nvar light_dir = new Vec3f { x = 0, y = 0, z = -1 };\n\nvar world = new Vec3f [3];\nvar screen = new Vec3f [3];\nforeach (var face in headModel.Faces) {\n    for (int i = 0; i < 3; i++) {\n        var vIndex = face.Vertices [i];\n        world [i] = headModel.Vertices [vIndex];\n        screen [i] = map (world [i]);\n    }\n\n    var n = Cross (world [2] - world [0], world [1] - world [0]).Normalize ();\n\n    var intensivity = Dot (n, light_dir);\n    if (intensivity > 0)\n        Triangle (image, screen, Color.White * intensivity);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson3.csx",
    "content": "using static Geometry;\n\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nfloat [] InitZBuffer (Image image)\n{\n\tvar zbuffer = new float [image.Width * image.Height];\n\tfor (int idx = 0; idx < zbuffer.Length; idx++)\n\t\tzbuffer [idx] = float.NegativeInfinity;\n\treturn zbuffer;\n}\n\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n\tvar ab = b - a;\n\tvar ac = c - a;\n\tvar pa = a - p;\n\n\tvar r = Cross (new Vec3f {\n\t\tx = ab.x,\n\t\ty = ac.x,\n\t\tz = pa.x\n\t}, new Vec3f {\n\t\tx = ab.y,\n\t\ty = ac.y,\n\t\tz = pa.y\n\t});\n\n\t// triangle is degenerate, in this case return smth with negative coordinates\n\t// dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n\tif ((int)r.z == 0)\n\t\treturn new Vec3f { x = -1, y = 1, z = 1 };\n\treturn new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n\tVec3f t0 = coordinates [0];\n\tVec3f t1 = coordinates [1];\n\tVec3f t2 = coordinates [2];\n\n\tvar pMax = new Vec2i {\n\t\tx = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n\t\ty = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n\t};\n\tvar pMin = new Vec2i {\n\t\tx = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n\t\ty = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n\t};\n\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f {\n\t\t\t\tx = x + 0.5f,\n\t\t\t\ty = y + 0.5f\n\t\t\t};\n\t\t\tvar bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0)\n\t\t\t\tcontinue;\n\n\t\t\tvar z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n\t\t\tvar u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n\t\t\tvar v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (zbuffer [idx] < z) {\n\t\t\t\tzbuffer [idx] = z;\n\n\t\t\t\tvar color = texture [u, v];\n\t\t\t\timage [x, y] = color * intensivity;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson3.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\nusing static Geometry;\n```\n\n# **Lesson 3: Hidden faces removal (z buffer)**\n\n# Introduction\n\nHello, let me introduce you my friend z-buffer of a black guy. He will help us get rid of the visual artifacts of the hidden faces removal we had during the last lesson.\n\n![](./img/lesson3_face1.png)\n\nBy the way, i'd like to mention that this model i use heavily in the course is created by [Vidar Rapp](https://se.linkedin.com/in/vidarrapp). He kindely granted me a permission to use it for teaching rendering basics and i vandalized it, but i promise you to give back the eyes to the guy.\n\nWell, back to the topic, in theory we could just draw all the triangles without discarding any. If we do it properly starting rear-to-front, the front facets will erase the back ones. It is called the [painter's algorithm](http://en.wikipedia.org/wiki/Painter%27s_algorithm). Unfortunately, it comes along with a high computational cost: for each camera movement we need to re-sort all the scene. And then there are dynamic scenes... And this is not even the main problem. The main problem is it is not always possible to determine the correct order.\n\n# **Let us try to render a simple scene**\n\nImagine a simple scene made of three triangles: the camera looks up-to-down, we project the colored triangles onto the white screen:\n\n![ ](./img/lesson3_scene1.png)\n\nThe render should look like this:\n\n![ ](./img/lesson3_scene2.png)\n\nBlue facet - is it behind or in front of the red one? The painter's algorithm does not work here. It is possible to split blue facet in two (one in front of the red facet and one behind). And then the one in front of the red one is to be split in two - one in front of the green triangle and one behind... I think you get the problem: in scenes with millions of triangles it is really expensive to compute. It is possible to use [BSP trees](https://en.wikipedia.org/wiki/Binary_space_partitioning) to get it done. By the way, this data structure is constant for moving camera, but it is really messy. And the life is too short to get it messy.\n\n# **Even simpler: let us lose a dimension. Y-buffer!**\n\nLet us lose a dimension for a while and to cut the above scene along the yellow plane:\n\n![ ](./img/lesson3_scene3.png)\n\nI mean, now our scene is made of three line segments (intersection of the yellow plane and each of the triangles), and the final render has a normal width but 1 pixel height:\n\n![ ](./img/lesson3_scene4.png)\n\nOur scene is two-dimensional, so it is easy to draw it using the line() function we programmed in the very first lesson.\n\n```csharp\nvar scene = new Image (800, 500, Format.BGR);\n\n// scene \"2d mesh\"\nLine(scene, new Vec2i {x=20, y=34}, new Vec2i {x=744, y=400}, Color.Red);\nLine(scene, new Vec2i {x=120, y=434}, new Vec2i {x=444, y=400}, Color.Green);\nLine(scene, new Vec2i {x=330, y=463}, new Vec2i {x=594, y=200}, Color.Blue);\n\n// screen line\nLine(scene, new Vec2i {x=10, y=10}, new Vec2i{x=790, y=10}, Color.White);\n\nscene.VerticalFlip(); // I want to have the origin at the left bottom corner of the image\nscene // This is how our 2D scene looks like if we look at it sideways:\n```\n\nLet us render it. Recall that the render is 1 pixel height. In my source code I create images 16 pixels height for the ease of reading on high resolution screens. `Rasterize()` function writes only in the first line of the image `render`\n\n```csharp\nvoid Rasterize(Image image, Vec2i p0, Vec2i p1, int[] ybuffer, Color color)\n{\n    if (p0.x>p1.x)\n        Swap(ref p0, ref p1);\n    \n    for (int x=p0.x; x<=p1.x; x++) {\n        float t = (x-p0.x)/(float)(p1.x-p0.x);\n        var y = (int)(p0.y*(1-t) + p1.y*t);\n        if (ybuffer[x] < y) {\n            ybuffer[x] = y;\n            image[x, 0] = color;\n        }\n    }\n}\n\nvar ybuffer = new int [width];\nfor (int i = 0; i < width; i++)\n    ybuffer[i] = int.MinValue;\n\nvar render = new Image (width, 16, Format.BGR);\nRasterize(render, new Vec2i{x=20,y=34}, new Vec2i{x=744, y=400}, ybuffer, Color.Red);\nRasterize(render, new Vec2i{x=120, y=434}, new Vec2i{x=444,y=400}, ybuffer, Color.Green);\nRasterize(render, new Vec2i{x=330, y=463}, new Vec2i{x=594,y=200}, ybuffer, Color.Blue);\n\nrender\n```\n\nIt is really-really simple: I iterate through all x-coordinates between `p0.x` and `p1.x` and compute the corresponding y-coordinate of the segment. Then I check what we got in our array `ybuffer` with current `x` index. If the current `y`-value is closer to the camera than the value in the `ybuffer`, then I draw it on the screen and update the `ybuffer`.\n\nLet us see it step-by-step. After calling `Rasterize()` on the first (red) segment this is our memory:\n\nscreen:![](./img/lesson3_rasterize1.png)\n\nybuffer: ![ ](./img/lesson3_rasterize2.png)\n\nHere the magenta color indicates the minus infinity, those are places corresponding to the screen we did not touch. All the rest is shown in the shades of gray: clear colors are close to the camera, dark colors far from the camera.\n\nThen we draw the green segment.\n\nscreen:![ ](./img/lesson3_rasterize3.png)\n\nybuffer:![ ](./img/lesson3_rasterize4.png)\n\nAnd finally the blue one.\n\nscreen:![ ](./img/lesson3_rasterize5.png)\n\nybuffer:![ ](./img/lesson3_rasterize6.png)\n\nCongratulations, we just drew a 2D scene on a 1D screen! Let us admire once again the render: ![ ](./img/lesson3_rasterize7.png)\n\n# Back to 3D\n\nSo, for drawing on a 2D screen the z-buffer must be two-dimensional:\n\n`var zbuffer = new int[width * height];`\n\nPersonally I pack a two-dimensional buffer into a one-dimensional, the conversion is trivial:\n\n`var idx = x + y* width;`\n\nand the back one:\n\n`var x = idx % width;`\\\n`var y = idx % width;`\n\nThen in the code I simply iterate through all the triangles and call the rasterizer function with current triangle and a reference to the z-buffer.\n\nThe only difficulty is how to compute the z-value of a pixel we want to draw. Let us recall how we computed the y-value in the y-buffer example:\n\n`int y = p0.y*(1-t) + p1.y*t;`\n\nWhat is the nature of the `t` variable? It turns out that `(1-t, t)` are barycentric coordinates of the point `(x,y)` with respect to the segment `p0, p1: (x,y) = p0*(1-t) + p1*t`. So the idea is to take the barycentric coordinates version of triangle rasterization, and for every pixel we want to draw simply to multiply its barycentric coordinates by the z-values of the vertices of the triangle we rasterize:\n\n```csharp\nVec3f Barycentric (Vec2f a, Vec2f b, Vec2f c, Vec2f p)\n{\n    var ab = b - a;\n    var ac = c - a;\n    var pa = a - p;\n\n    var r = Cross (new Vec3f {\n        x = ab.x,\n        y = ac.x,\n        z = pa.x\n    }, new Vec3f {\n        x = ab.y,\n        y = ac.y,\n        z = pa.y\n    });\n\n    // triangle is degenerate, in this case return smth with negative coordinates\n    // dont forget that r.z is integer. If it is zero then triangle ABC is degenerate \n    if ((int)r.z == 0)\n        return new Vec3f { x = -1, y = 1, z = 1 };\n    return new Vec3f { x = 1 - (r.x + r.y) / r.z, y = r.x / r.z, z = r.y / r.z };\n}\n\nvoid Triangle (Image image, Vec3f [] coordinates, Color color, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D (t0), Project2D (t1), Project2D (t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n\nfloat [] InitZBuffer (Image image)\n{\n    var zbuffer = new float [image.Width * image.Height];\n    for (int idx = 0; idx < zbuffer.Length; idx++)\n        zbuffer [idx] = float.NegativeInfinity;\n    return zbuffer;\n}\n\nvar image = new Image(width, height, Format.BGR);\nFunc<Vec3f, Vec3f> map = v => new Vec3f {\n    x = (int)((v.x+1)*(image.Width-1)/2 + 0.5f),\n    y = (int)((v.y+1)*(image.Height-1)/2 + 0.5f),\n    z = v.z\n};\n\nvar zbuffer = InitZBuffer(image);\nforeach(var face in headModel.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = headModel.Vertices[vIndex];\n        screen[i] = map(world[i]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, Color.White * intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Okay, we just interpolated the z-values. What else can we do?\n\nTexture!\n\nIn the `.obj` file we have lines starting with `vt u v`, they give an array of texture coordinates. The number in the middle (between the slashes) in the facet lines\\\n`f x/x/x x/x/x x/x/x` are the texture coordinates of this vertex of this triangle. Interpolate it inside the triangle, multiply by the width-height of the texture image and you will get the color to put in your render.\n\n```csharp\nvoid Triangle (Image image, Vec3f [] coordinates, Image texture, Vec2f [] uv, float intensivity, float [] zbuffer)\n{\n    Vec3f t0 = coordinates [0];\n    Vec3f t1 = coordinates [1];\n    Vec3f t2 = coordinates [2];\n\n    var pMax = new Vec2i {\n        x = (int)Math.Max (0, Math.Max (t0.x, Math.Max (t1.x, t2.x))),\n        y = (int)Math.Max (0, Math.Max (t0.y, Math.Max (t1.y, t2.y)))\n    };\n    var pMin = new Vec2i {\n        x = (int)Math.Min (image.Width, Math.Min (t0.x, Math.Min (t1.x, t2.x))),\n        y = (int)Math.Min (image.Height, Math.Min (t0.y, Math.Min (t1.y, t2.y)))\n    };\n\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f {\n                x = x + 0.5f,\n                y = y + 0.5f\n            };\n            var bc = Barycentric (Project2D(t0), Project2D(t1), Project2D(t2), pixelCenter);\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0)\n                continue;\n\n            var z = t0.z * bc.x + t1.z * bc.y + t2.z * bc.z;\n            var u = (int)(uv [0].x * bc.x + uv [1].x * bc.y + uv [2].x * bc.z);\n            var v = (int)(uv [0].y * bc.x + uv [1].y * bc.y + uv [2].y * bc.z);\n            var idx = x + y * image.Width;\n            if (zbuffer [idx] < z) {\n                zbuffer [idx] = z;\n\n                var color = texture [u, v];\n                image [x, y] = color * intensivity;\n            }\n        }\n    }\n}\n\nvar image = new Image(width, height, Format.BGR);\nvar headTexture = Image.Load (\"obj/african_head_diffuse.tga\");\nheadTexture.VerticalFlip ();\n\nFunc<Vec3f, Vec2f> uvMap = v => new Vec2f {\n    x = v.x * (headTexture.Width - 1),\n    y = v.y * (headTexture.Height - 1)\n}; \n\nvar zbuffer = InitZBuffer(image);\nvar uv = new Vec2f[3];\nvar model = headModel;\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson4.csx",
    "content": "Vec2f[] uv = new Vec2f [3];\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n\tx = v.x * (texture.Width - 1),\n\ty = v.y * (texture.Height - 1)\n};\n\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n\tvar depth = 255f;\n\n\tvar m = Matrix4.Identity ();\n\tm [0, 3] = x + w / 2f;\n\tm [1, 3] = y + h / 2f;\n\tm [2, 3] = depth / 2f;\n\n\tm [0, 0] = w / 2f;\n\tm [1, 1] = h / 2f;\n\tm [2, 2] = depth / 2f;\n\treturn m;\n}\n\nMatrix4 Projection (float coeff)\n{\n\tvar projection = Matrix4.Identity ();\n\tprojection [3, 2] = coeff;\n\treturn projection;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson4.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 4: Perspective projection**\n\n# The goal\n\nIn previous lessons we rendered our model in orthographic projection by simply forgetting the z-coordinate. The goal for today is to learn how to draw in perspective:\n\n![  ](./img/lesson4_the_goal.png)\n\n# 2D geometry: Linear transformations\n\nA linear transformation on a plane can be represented by a corresponding matrix. If we take a point `(x,y)` then its transformation can be written as follows:\n\n![  ](./img/lesson4_formula1.svg)\n\nThe simplest (not degenerate) transformation is the identity, it does not move any point:\n\n![  ](./img/lesson4_formula_2d_identity.svg)\n\nDiagonal coefficients of the matrix give scaling along coordinate axes. Let us illustrate it, if we take the following transformation:\n\n![  ](./img/lesson4_formula_2d_scale.svg)\n\nThen the white object (the white square with one corner chopped) will be transformed into the yellow one. Red and green line segments give unit length vectors aligned with `x` and `y`, respectively. All the images for this article were generated using this code:\n\n```csharp\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n\nMatrix4 Projection (float coeff)\n{\n    var projection = Matrix4.Identity ();\n    projection [3, 2] = coeff;\n    return projection;\n}\n\nVec4f Embed4D (Vec3f v, float fill = 1)\n{\n    return new Vec4f { x = v.x, y = v.y, z = v.z, h = fill };\n}\n\nVec3f Project3D (Vec4f v)\n{\n    return new Vec3f { x = v.x, y = v.y, z = v.z };\n}\n\nFunc<Vec4f, Vec3f> map = v => Project3D(v/v.h);\nvoid RenderAxes (Image image)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n\n    // draw the axes\n    var x = new Vec3f { x = 1 };\n    var y = new Vec3f { y = 1 };\n    var o = new Vec3f ();\n    o = map(Mult(vp, Embed4D(o)));\n    x = map(Mult(vp, Embed4D(x)));\n    y = map(Mult(vp, Embed4D(y)));\n    Line(image, o, x, Color.Red);\n    Line(image, o, y, Color.Green);\n}\n\nvar cube = Model.FromFile(\"obj/cube.obj\");\nvoid RenderCube(Image image, Matrix4 deformation, Color color)\n{\n    var w = image.Width;\n    var h = image.Height;\n\n    var vp = Viewport(w/4, w/4, w/2, h/2);\n    var face = cube.Faces[0];\n    var faceLen = face.Vertices.Length;\n\n    for(int j=0; j<faceLen; j++) {\n        var wp0 = cube.Vertices[face.Vertices [j]];\n        var wp1 = cube.Vertices[face.Vertices [(j+1) % faceLen]];\n\n        var sp0 = map(Mult(vp*deformation, Embed4D(wp0)));\n        var sp1 = map(Mult(vp*deformation, Embed4D(wp1)));\n        Line(image, sp0, sp1, color);\n    }\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Zoom(1f), color: Color.White);\n// draw the deformed model\nRenderCube(image, deformation: Matrix4.Zoom(1.5f), color: Color.Yellow); \n\nimage.VerticalFlip ();\nimage\n```\n\nWhy do we bother with matrices? Because it is handy. First of all, in matrix form we can express a transformation of the entire object like this:\n\n![  ](img/lesson4_formula_2d_scale32.svg)\n\nIn this expression the transformation matrix is the same as in the previous one, but the 2x5 matrix is nothing else but the vertices of our squarish object. We simply took all the vertices in an array, multiplied it by the transformation matrix and obtained the transformed object. Cool, is not it?\n\nWell, the true reason hides here: very, very often we wish to transform our object with many transformations in a row. Imagine that in your source code you write transformation functions like:\n\n```csharp\n// vec2 foo(vec2 p) return vec2(ax+by, cx+dy);\n// vec2 bar(vec2 p) return vec2(ex+fy, gx+hy);\n// [..]\n// for (each p in object) {\n//     p = foo(bar(p));\n// }\n```\n\nThis code performs two linear transformations for each vertex of our object, and often we count those vertices in millions. And tens of transformations in a row is not a rare case, resulting in tens millions of operations, really expensive. In matrix form we can pre-multiply all the transformation matrices and to transform our object one time. For an expression with multiplications only we can put parentheses where we want, can we?\n\nOkay, let us continue. We know that diagonal coefficients of the matrix scale our world along the coordinate axes. What other coefficients are responsible for? Let us consider the following transformation:\n\n![  ](./img/lesson4_formula_2d_tr_example1.svg)\n\nHere is its action on our object:\n\n```csharp\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\n// draw the original model\nRenderCube(image, deformation: Matrix4.Identity(), color: Color.White);\n\nvar deformation = Matrix4.Identity ();\ndeformation[0, 1] = 1/3f;\nRenderCube(image, deformation, Color.Yellow); // draw the deformed model\n\nimage.VerticalFlip();\nimage\n```\n\nIt is a simple shearing along the x-axis. Another anti-diagonal element shears our space along the y-axis. Thus, there are two base linear transformations on a plane: scaling and shearing. Many readers react: wait, what about rotations?!\n\nIt turns out that any rotation (around the origin) can be represented as a composite action of three shears, here the white object is transformed to the red one, then to the green one and finally to the blue:\n\n![](./img/lesson4_formula_rotation.png)\n\nBut those are intricate details, to keep the things simple, a rotation matrix can be written directly (do you remember the pre-multiplication trick?):\n\n![  ](img/lesson4_formula_rotation.svg)\n\nWe can multiply the matrices in any order, but let us remember that the multiplication for matrices is not commutative:\n\n![  ](img/lesson4_formula_noncomutative.svg)\n\nIt makes sense: to shear an object and then to rotate it is not the same as to rotate it and then to shear it!\n\n```csharp\nfloat DegToRad (float degAngle)\n{\n    return degAngle * (float)Math.PI / 180;\n}\n\nvar image = new Image(300, 300, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nvar angle = DegToRad(30);\n\nvar rotation = Matrix4.RotationZ(angle);\nvar shear = Matrix4.Identity ();\nshear[0, 1] = 1/3f;\n\nRenderCube(image, deformation: rotation * shear, color: Color.Green);\nRenderCube(image, deformation: shear * rotation, color: Color.Red);\n\nimage.VerticalFlip();\nimage\n```\n\n# 2D affine transformations\n\nSo, any linear transformation on a plane is a composition of scale and shear transformations. And it means that we can do any linear transformation we want, the origin wont ever move! Those possibilities are great, but if we can not perform simple translations, our life will be miserable. Can we? Okay, translations are not linear, no problem, let us try to append translations after performing the linear part:\n\n![  ](./img/lesson4_formula_translation.svg)\n\nThis expression is really cool, we can rotate, we can scale, shear and translate. However. Let us recall that we are interested in composing multiple transformation, here is what a composition of two transformations look like (remember, we need to compose dozes of those?):\n\n![  ](./img/lesson4_formula_composition.svg)\n\nIt is starting to look ugly even for a single composition, add more and things get even worse.\n\n# Homogeneous coordinates\n\nOkay, now it is the time for the black magic. Imagine that i add one column and one row to our transformation matrix (thus making it 3x3) and append one coordinate always equal to 1 to our vector to be transformed:\n\n![  ](./img/lesson4_formula_3d.svg)\n\nIf we multiply this matrix and the vector augmented by 1 we get another vector with 1 in the last component, but the other two components have exactly the shape we would like! Magic.\n\nIn fact, the idea is really simple. Parallel translations are not linear in the 2D space. So we embed our 2D into 3D space (by simply adding 1 for the 3rd component). It means that our 2D space is the plane z=1 in the 3D space. Then we perform a linear 3D transformation and project the result onto our 2D physical plane. Parallel translations have not become linear, but the pipeline is simple.\n\nHow do we project 3D back onto the 2D plane? Simply by dividing by the 3d component:\n\n![  ](./img/lesson4_formula_project.svg)\n\n## Wait a second, it is forbidden to divide by zero!\n\nWho said this? \\[Shoots\\] Let us recall the pipeline:\n\n* We embed 2D into 3D by putting it inside the plane z=3\n\n* We do whatever we want in 3d\n\n* For every point we want to project from 3D into 2D we draw a straight line between the origin and the point to project and then we find its intersection with the plane z=1.\n\nIn this image our 2D plane is in magenta, the point `(x,y,z)` is projected onto `(x/z, y/z)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nLet us imagine a vertical rail through the point `(x,y,1)`. Where will be projected the point `(x,y,1)`? Doh, onto `(x,y)`:\n\n![  ](./img/lesson4_sketch1.png)\n\nNow let us descend on the rail, for example, the point `(x,y,1/2)` is projected onto `(2x, 2y)`:\n\n![](./img/lesson4_sketch3.png)\n\nLet us continue, point `(x,y,1/4)` becomes `(4x, 4y)`:\n\n![](./img/lesson4_sketch4.png)\n\nIf we continue the process, approaching to `z=0`, then the projection goes farther from the origin in the direction `(x,y)`. In other words, point `(x,y,0)` is projected onto an infinitely far point in the direction `(x,y)`. What is it? Right, it is simply a vector!\n\nHomogeneous coordinates allow to distinguish between a vector and a point. If a programmer writes `vec2(x,y)`, is it a vector or a point? Hard to say. In homogeneous coordinates all things with `z=0` are vectors, all the rest are points. Look: `vector + vector = vector`. `vector - vector = vector`. `point + vector = point`. Great, is not it?\n\n## A composite transformation\n\nAs i said before, we should be able to accumulate dozens of transformations. Why? Let us imagine we need to rotate an object (2D) around a point `(x0,y0)`. How to do it? Well, we could look up for formulas somewhere, or we can do it by hand, we have all the tools we need!\n\nWe know to rotate around the origin, we know how to translate. It is all we need: translate `(x0,y0)` into the origin, rotate, un-translate, done:\n\n![  ](img/lesson4_formula_rotate_xy.svg)\n\nIn 3D sequences of actions will be a bit longer, but the idea is the same: we need to know few basic transformations and with their aid we can represent any composed action.\n\n# Wait a minute, may I touch this magical bottom row of the 3x3 matrix?\n\nSure thing! Let us apply the following transformation to our standard squarish object:\n\n![  ](./img/lesson4_matrix_third_line.svg)\n\nRecall that the original object is in white, unit axis vectors are in red and green:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\nRenderCube(image, Matrix4.Identity(), color: Color.White);\n\nimage.VerticalFlip ();\nimage\n```\n\nHere is the transformed object:\n\n```csharp\nvar image = new Image(500, 500, Format.BGR);\nRenderAxes(image);\n\nvar deformation = Matrix4.Identity ();\ndeformation[3, 0] = -1/5f;\nRenderCube(image, deformation, color: Color.Red);\n\nimage.VerticalFlip ();\nimage\n```\n\nAnd here another kind of magic (white!) happens. Do you remember our y-buffer exercise? Here we will do the same: we project our 2D object onto the vertical line `x=0`. Let us harden the rules a bit: we have to use a central projection, our camera is in the point `(5,0)` and is pointed onto the origin. To find the projection we need to trace straight lines between the camera and the points to be projected (yellow) and to find the intersection with the screen line (white vertical).\n\n![  ](./img/lesson4_sketch5.png)\n\nNow i replace the original object with the transformed one, but i do not touch the yellow lines we drew before:\n\n![  ](./img/lesson4_sketch6.png)\n\nIf we project the red object onto the screen using **standard orthogonal projection**, then we find exactly the same points! Let us look closely how the transformation works: all vertical segments are transformed into vertical segments, but those close to the camera are stretched and those far from the camera are shrunk. If we choose the coefficient correctly (in our transformation matrix it is the -1/5 coefficient), we obtain an image in perspective (central) projection!\n\n# Time to work in full 3D\n\nLet us explain the magic. As for 2D affine transformations, for 3D affine transformations we will use homogeneous coordinates: a point `(x,y,z)` is augmented with 1`(x,y,z,1)`, then we transform it in 4D and project back to 3D. For example, if we take the following transformation:\n\n![  ](./img/lesson4_formula_4d_1.svg)\n\nThe retro-projection gives us the following 3D coordinages:\n\n![  ](./img/lesson4_formula_central_project.svg)\n\nLet us remember this result, but put it aside for a while. Let us return to the standard definition of the central projection, without any fancy stuff as 4D transformations. Given a point `P=(x,y,z)` we want to project it onto the plane z=0, the camera is on the z-axis in the point `(0,0,c)`:\n\n![](./img/lesson4_sketch7.png)\n\nTriangles ABC and ODC are similar. It means that we can write the following: |AB|/|AC|=|OD|/|OC| => x/(c-z) = x'/c. In other words:\n\n![ ](./img/lesson4_formula_x.svg)\n\nBy doing the same reasoning for triangles CPB and CP'D, it is easy to find the following expression:\n\n![](./img/lesson4_formula_y.svg)\n\nIt is really similar to the result we put aside few moments ago, but there we got the result by a single matrix multiplication. We got the law for the coefficient: `r = -1/c`\n\n# Let us sum up: the main formula for today\n\n*If you simply copy-paste this formula without understanding the above material, I hate you.*\n\nSo, if we want to compute a central projection with a camera **(important!) camera located on the z-axis with distance c from the origin**, then we embed the point into 4D by augmenting it with 1, then we multiply it with the following matrix, and retro-project it into 3D.\n\n![  ](./img/lesson4_formula_last.svg)\n\nWe deformed our object in a way, that simply forgetting its z-coordinate we will get a drawing in a perspective. If we want to use the z-buffer, then, naturally, do not forget the z:\n\n```csharp\nvar image = new Image(width, height, Format.BGR);\n\nvar camera = new Vec3f { z = 3 };\nvar projection = Projection(-1/camera.z);\nvar viewPort   = Viewport(width/8, height/8, width*3/4, height*3/4);\n\nFunc<Vec3f, Vec3f> map = v => {\n    var r4 = Mult (viewPort * projection, Embed4D (v));\n    var r = Project3D (r4 / r4.h);\n    r.x = (int)(r.x + 0.5f);\n    r.y = (int)(r.y + 0.5f);\n    return r;\n};\n\nFunc<Image, Vec3f, Vec2f> uvMap = (texture, v) => new Vec2f {\n    x = v.x * (texture.Width - 1),\n    y = v.y * (texture.Height - 1)\n};\n\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nVec2f[] uv = new Vec2f [3];\n\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);     \n}\n\nimage.VerticalFlip ();\nimage\n```"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson5.csx",
    "content": "using static Geometry;\n\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n\tvar z = (eye - center).Normalize ();\n\tvar x = Cross (up, z).Normalize ();\n\tvar y = Cross (z, x).Normalize ();\n\n\tvar Minv = Matrix4.Identity ();\n\tMinv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n\tMinv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n\tMinv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n\tvar Tr = Matrix4.Identity ();\n\tTr [0, 3] = -center.x;\n\tTr [1, 3] = -center.y;\n\tTr [2, 3] = -center.y;\n\n\treturn Minv * Tr;\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson5.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# Lesson 5: Moving the camera\n\n# Change of basis in 3D space\n\nIn Euclidean space coordinates can be given by a point (the origin) and a basis. What does it mean that point P has coordinates `(x,y,z)` in the frame `(O, i,j,k)`? It means that the vector OP can be expressed as follows:\n\n![  ](./img/lesson5_basis.svg)\n\nNow image that we have another frame `(O', i',j',k')`. How do we transform coordinates given in one frame to another? First of all let us note that since `(i,j,k)` and `(i',j',k')` are bases of 3D, there exists a (non degenerate) matrix M such that:\n\n![  ](./img/lesson5_new_basis.svg)\n\nLet us draw an illustration:\n\n![](./img/lesson5_sketch1.png)\n\nThen let us re-express the vector OP:\n\n![  ](./img/lesson5_change_basis1.svg)\n\nNow let us substitute `(i',j',k')` in the right part with the change of basis matrix:\n\n![  ](./img/lesson5_change_basis2.svg)\n\nAnd it gives us the formula to transform coordinates from one frame to another:\n\n![  ](./img/lesson5_change_basis3.svg)\n\n# Let us create our own gluLookAt\n\nOpenGL and, as a consequence, our tiny renderer are able to draw scenes **only with the camera located on the z-axis.** If we want to move the camera, no problem, we can move all the scene, leaving the camera immobile.\n\nLet us put the problem this way: we want to draw a scene with a camera situated in point **e**(eye), the camera should be pointed to the point **c** (center) in such way that a given vector **u**(up) is to be vertical in the final render.\n\nHere is an illustration:\n\n![  ](./img/lesson5_change_basis4.png)\n\n```csharp\nMatrix4 LookAt (Vec3f eye, Vec3f center, Vec3f up)\n{\n    var z = (eye - center).Normalize ();\n    var x = Cross (up, z).Normalize ();\n    var y = Cross (z, x).Normalize ();\n\n    var Minv = Matrix4.Identity ();\n    Minv [0, 0] = x.x; Minv [0, 1] = x.y; Minv [0, 2] = x.z;\n    Minv [1, 0] = y.x; Minv [1, 1] = y.y; Minv [1, 2] = y.z;\n    Minv [2, 0] = z.x; Minv [2, 1] = z.y; Minv [2, 2] = z.z;\n\n    var Tr = Matrix4.Identity ();\n    Tr [0, 3] = -center.x;\n    Tr [1, 3] = -center.y;\n    Tr [2, 3] = -center.y;\n\n    return Minv * Tr;\n}\n```\n\nNote that `z'` is given by the vector **`ce`** (do not forget to normalize it, it helps later). How do we compute `x'`? Simply by a cross product between **`u`** and **`z'`**. Then we compute `y'`, such that it is orthogonal to already calculated `x'` and `z'` (let me remind you that in our problem settings \\*\\*`ce` \\*\\*and **`u`** are not necessarily orthogonal). The very last step is a translation of the origin to the center **c** and our transformation matrix is ready. Now it suffices to get any point with coordinates `(x,y,z,1)` in the model frame, multiply it by the matrix ModelView and we get the coordinates in the camera frame! By the way, the name ModelView comes from OpenGL terminology.\n\n# Viewport\n\nIf you followed this course from the beginning, you should remember strange lines like this one:\n\n```csharp\n// x = (v.x+1)*(width-1)/2\n// y = (v.y+1)*(height-1)/2\n```\n\nWhat does it mean? It means that i have a point Vec2f v, it belongs to the square \\[-1,1\\]\\*\\[-1,1\\]. I want to draw it in the image of (width, height) dimensions. Value (v.x\\+1) is varying between 0 and 2, (v.x\\+1)/2 between 0 and 1, and (v.x\\+1)\\*width/2 sweeps all the image. Thus we effectively mapped the bi-unit square onto the image.\n\nBut now we are getting rid of these ugly constructs, and i want to rewrite all the computiations in the matrix form. Let us consider the following C# code:\n\n```csharp\n/*\nMatrix4 Viewport (int x, int y, int w, int h)\n{\n    var depth = 255f;\n\n    var m = Matrix4.Identity ();\n    m [0, 3] = x + w / 2f;\n    m [1, 3] = y + h / 2f;\n    m [2, 3] = depth / 2f;\n\n    m [0, 0] = w / 2f;\n    m [1, 1] = h / 2f;\n    m [2, 2] = depth / 2f;\n    return m;\n}\n*/\n```\n\nThis code creates this matrix:\n\n![  ](./img/lesson5_viewport.svg)\n\nIt means that the bi-unit cube \\[-1,1\\]*\\[-1,1\\]*\\[-1,1\\] is mapped onto the screen cube \\[0,w\\]*\\[0,h\\]*\\[0,d\\]. Right, cube, and not a rectangle, this is because of the depth computations with the z-buffer. Here d is the resolution of the z-buffer. I like to have it equal to 255 because of simplicity of dumping black-and-white images of the z-buffer for debugging.\n\nIn the OpenGL terminology this matrix is called viewport matrix.\n\n# Chain of coordinate transformations\n\nSo, let us sum up. Our models (characters, for example) are created in their own local frame (**object coordinates**). They are inserted into a scene expressed in **world coordinates**. The transformation from one to another is made with matrix **Model**. Then, we want to express it in the camera frame (**eye coordinates**), the transformation is called **View**. Then, we deform the scene to create a perspective deformation with **Projection** matrix (lesson 4), this matrix transforms the scene to so-called **clip coordinates**. Finally, we draw the scene, and the matrix transforming clip coordinates to the **screen coordinates** is called **Viewport**.\n\nAgain, if we read a point **v** from the .obj file, then to draw it on the screen it undergoes the following chain of transformations:\n\nViewport \\* Projection \\* View \\* Model \\* v\n\nAs i draw a single object only, the matrix Model is equal to identity, and i merged it with the matrix View:\n\n```csharp\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\n// draw the model\nvar modelView  = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1/(eye-center).Norm());\n\nFunc<Vec3f, Vec3f> map = v => {\n\tvar r4 = Mult (viewPort * projection * modelView, Embed4D (v));\n\tvar r = Project3D (r4 / r4.h);\n\tr.x = (int)(r.x + 0.5f);\n\tr.y = (int)(r.y + 0.5f);\n\treturn r;\n};\n\nvar image = new Image(width, height, Format.BGR);\nvar model = headModel;\nvar zbuffer = InitZBuffer(image);\nforeach(var face in model.Faces) {\n    for(int i=0; i<3; i++) {\n        var vIndex = face.Vertices[i];\n        world[i] = model.Vertices[vIndex];\n        screen[i] = map(world[i]);\n        \n        var tIndex = face.Textures[i];\n        uv[i] = uvMap(headTexture, model.Textures[tIndex]);\n    }    \n\n    Vec3f n = Cross(world[2] - world[0], world[1] - world[0]).Normalize ();\n\n    var intensivity = Dot(n, light_dir);\n    if(intensivity > 0)\n        Triangle(image, screen, headTexture, uv, intensivity, zbuffer);\n}\n\nimage.VerticalFlip ();\nimage\n```\n\n# Transformation of normal vectors\n\nThere is a widely-known fact:\n\n* If we have a model and its normal vectors are given by the artist AND this model is transformed with an affine mapping, then normal vectors are to be transformed with a mapping, equal to the transposition of the inverse matrix of the original mapping matrix\n\nWhat-what-what?! I met quite a few programmers who know this fact, but it remains a black magic for them. In fact, it is not so complicated. Take a pencil and draw a 2D triangle `(0,0)`, `(0,1)`, `(1,0)` and a vector **n**, normal to the hypothenuse. Naturally, **n** is equal to `(1,1)`. Then let us stretch all the y-coordinates by a factor of 2, leaving x-coordinates intact. Thus, our triangle becomes `(0,0)`, `(0,2)`, `(1,0)`. If we transform the vector **n** in the same way, it becomes `(1, 2)` and it is no longer orthogonal to the transformed edge of the triangle.\n\nThus, to remove all the black magic fog, we need to understand one simple thing: **we do not need to simply transform normal vectors (as they can become not normal anymore), we need to compute (new) normal vectors to the transformed model.**\n\nBack to 3D, we have a vector **n** = (A,B,C). We know that the plane passing through the origin and having **n** for its normal, has an equation `Ax+By+Cz=0`. Let us write it in the matrix form (i do it in homogeneous coordinates from the beginning):\n\n![  ](./img/lesson5_transform_normal1.png)\n\nRecall that `(A,B,C)` - is a vector, so we augment it with 0 when embedding into the 4D, and `(x,y,z)` is augmented with 1 since it is a point.\n\nLet us insert an identity matrix in between (inverse to M multiplied by M is equal to identity):\n\n![  ](./img/lesson5_transform_normal2.png)\n\nThe expression in right parentheses - are for the transformed points of the object. In the left - are for normal vectors to the transformed object! In standard convention we usually write coordinates as columns (please let us not raise all the stuff about contra- and co-variant vectors), so we can rewrite the previous expression as follows:\n\n![  ](./img/lesson5_transform_normal2.png)\n\nAnd the left parentheses tell us that a normal to the transformed object can be computed from the old normal by applying the inverse transpose matrix of the affine mapping.\n\nPlease note that if our transformation matrix M is a composition of uniform scalings, rotations and translations, then M is equal to its inverse transpose, since inverse and transpose are cancelling each other in this case. But since our matrices include perspective deformations, usually this trick does not help.\n\nIn the current code we do not use the transformation of normal vectors, but in the next lesson it will be very, very handy.\n\nHappy coding!\n\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson6.csx",
    "content": "using static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n\nvar diabloModel = Model.FromFile (\"obj/diablo3_pose.obj\");\nvar diabloTexture = Image.Load (\"obj/diablo3_pose_diffuse.tga\");\nvar diabloNormalMap = Image.Load (\"obj/diablo3_pose_nm.tga\");\nvar diabloTangentMap = Image.Load (\"obj/diablo3_pose_nm_tangent.tga\");\nvar diabloSpecularMap = Image.Load (\"obj/diablo3_pose_spec.tga\");\ndiabloTexture.VerticalFlip ();\ndiabloNormalMap.VerticalFlip ();\ndiabloTangentMap.VerticalFlip ();\ndiabloSpecularMap.VerticalFlip ();\n\nlight_dir = new Vec3f { x = 1, y = 1, z = 1 };\neye = new Vec3f { x = 1, y = 1, z = 3 };\ncenter = new Vec3f { x = 0, y = 0, z = 0 };\nup = new Vec3f { x = 0, y = 1, z = 0 };\n\nvar modelView = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1f/(eye-center).Norm());\n\ninterface IShader\n{\n\tVec4f Vertex (Face face, int nthvert);\n\tbool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n};\n\nclass RenderResult\n{\n\tpublic Image Image { get; set; }\n\tpublic float [] ZBuffer { get; set; }\n}\n\nRenderResult Render (Model model, IShader shader)\n{\n\tvar image = new Image (width, height, Format.BGR);\n\tvar zbuffer = InitZBuffer (image);\n\tvar screen_coords = new Vec4f [3];\n\n\tforeach (var face in model.Faces) {\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tscreen_coords [i] = shader.Vertex (face, i);\n\t\tTriangle (image, screen_coords, shader, zbuffer);\n\t}\n\n\treturn new RenderResult {\n\t\tImage = image,\n\t\tZBuffer = zbuffer\n\t};\n}\n\nvoid Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n{\n\tpMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n\tpMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n\tfor (int i = 0; i < 3; i++) {\n\t\tpMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n\t\tpMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n\t\tpMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n\t\tpMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n\t}\n}\n\nvoid Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n{\n\tVec2i pMin, pMax;\n\tBox (pts, out pMin, out pMax);\n\n\tColor color;\n\tfor (int x = pMin.x; x <= pMax.x; x++) {\n\t\tfor (int y = pMin.y; y <= pMax.y; y++) {\n\t\t\tvar pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n\t\t\tvar bc = Barycentric (Project2D (pts [0] / pts [0].h),\n\t\t\t\t\t\t\t\t  Project2D (pts [1] / pts [1].h),\n\t\t\t\t\t\t\t\t  Project2D (pts [2] / pts [2].h),\n\t\t\t\t\t\t\t\t  pixelCenter);\n\n\t\t\tvar z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n\t\t\tvar w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n\t\t\tvar frag_depth = z / w;\n\n\t\t\tvar idx = x + y * image.Width;\n\t\t\tif (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n\t\t\t\tcontinue;\n\n\n\t\t\tvar fragment = new Vec3f { x = x, y = y, z = frag_depth };\n\t\t\tvar discard = shader.Fragment (fragment, bc, out color);\n\t\t\tif (!discard) {\n\t\t\t\tzbuffer [idx] = frag_depth;\n\t\t\t\timage [x, y] = color;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic class ShaderUtils\n{\n    public static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n    {\n        var v = model.Vertex (face, nthvert); // read the vertex from model\n        var glVertex = Embed4D (v);\n        return Mult (t, glVertex); // transform it to screen coordinates\n    }\n\n    public static void UpdateVarayingUV (Model model, Face face, int nthvert,\n                                         ref Vec3f varyingU, ref Vec3f varyingV)\n    {\n        var vt = model.GetUV (face, nthvert);\n        varyingU [nthvert] = vt.x;\n        varyingV [nthvert] = vt.y;\n    }\n\n    public static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n    {\n        return new Vec2f {\n            x = Dot (varU, bar),\n            y = Dot (varV, bar)\n        };\n    }\n\n    public static Color GetColor (Image texture, Vec2f uvf)\n    {\n        var uvi = CalcXY(texture, uvf);\n        return texture [uvi.x, uvi.y];\n    }\n\n    public static Vec3f Transform (Matrix4 t, Vec3f v)\n    {\n        var v4d = Mult (t, Embed4D (v));\n        return Project3D (v4d);\n    }\n\n    public static Vec3f Normal (Image normalMap, Vec2f uvf)\n    {\n        // RGB values as xyz. But Color stores data as BGR (zyx)\n        var c = GetColor (normalMap, uvf);\n\n        return new Vec3f {\n            x = (c [2] / 255f) * 2 - 1,\n            y = (c [1] / 255f) * 2 - 1,\n            z = (c [0] / 255f) * 2 - 1\n        };\n    }\n\n    public static float Specular (Image specularMap, Vec2f uvf)\n    {\n        var uvi = CalcXY (specularMap, uvf);\n        var color = specularMap [uvi.x, uvi.y];\n        return color[0];\n    }\n\n    public static Vec2i CalcXY (Image texture, Vec2f uvf)\n    {\n        return new Vec2i {\n            x = (int)(uvf.x * texture.Width),\n            y = (int)(uvf.y * texture.Height)\n        };\n    }\n}\n\nclass TextureShader : IShader\n{\n\treadonly Model model;\n\treadonly Vec3f lightDir;\n\treadonly Matrix4 transformation;\n\treadonly Image texture;\n\n\t// written by vertex shader, read by fragment shader\n\tVec3f varyingIntensity = new Vec3f ();\n\tVec3f varyingU = new Vec3f ();\n\tVec3f varyingV = new Vec3f ();\n\n\tpublic TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n\t{\n\t\tthis.model = model;\n\t\ttransformation = viewPort * projection * modelView;\n\t\tthis.lightDir = lightDir.Normalize ();\n\t\tthis.texture = texture;\n\t}\n\n\tpublic Vec4f Vertex (Face face, int nthvert)\n\t{\n\t\tUpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n\t\tvar n = model.Normal (face, nthvert).Normalize ();\n\t\tvaryingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n\t\treturn TransformFace (model, face, nthvert, transformation);\n\t}\n\n\tpublic bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n\t{\n\t\t// interpolate intensity for the current pixel\n\t\tvar intensity = Dot (varyingIntensity, bar);\n\n\t\t// interpolate uv for the current pixel\n\t\tvar uvf = CalcUV (varyingU, varyingV, bar);\n\n\t\tcolor = GetColor (texture, uvf) * intensity;\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson6.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\n```\n\n# **Lesson 6: Shaders for the software renderer**\n\nRefactoring the source code. IShader.\n\n```csharp\ninterface IShader\n{\n    Vec4f Vertex (Face face, int nthvert);\n    bool Fragment (Vec3f fragment, Vec3f bar, out Color color);\n};\n\nclass RenderResult\n{\n    public Image Image { get; set; }\n    public float [] ZBuffer { get; set; }\n}\n\nRenderResult Render (Model model, IShader shader)\n{\n    var image = new Image (width, height, Format.BGR);\n    var zbuffer = InitZBuffer (image);\n    var screen_coords = new Vec4f [3];\n\n    foreach (var face in model.Faces) {\n        for (int i = 0; i < 3; i++)\n            screen_coords [i] = shader.Vertex (face, i);\n        Triangle (image, screen_coords, shader, zbuffer);\n    }\n\n    return new RenderResult {\n        Image = image,\n        ZBuffer = zbuffer\n    };\n}\n\nvoid Box (Vec4f [] pts, out Vec2i pMin, out Vec2i pMax)\n{\n    pMax = new Vec2i { x = int.MinValue, y = int.MinValue };\n    pMin = new Vec2i { x = int.MaxValue, y = int.MaxValue };\n\n    for (int i = 0; i < 3; i++) {\n        pMax.x = (int)Math.Max (pMax.x, pts [i].x / pts [i].h);\n        pMax.y = (int)Math.Max (pMax.y, pts [i].y / pts [i].h);\n        pMin.x = (int)Math.Min (pMin.x, pts [i].x / pts [i].h);\n        pMin.y = (int)Math.Min (pMin.y, pts [i].y / pts [i].h);\n    }\n}\n\nvoid Triangle (Image image, Vec4f [] pts, IShader shader, float [] zbuffer)\n{\n    Vec2i pMin, pMax;\n    Box (pts, out pMin, out pMax);\n\n    Color color;\n    for (int x = pMin.x; x <= pMax.x; x++) {\n        for (int y = pMin.y; y <= pMax.y; y++) {\n            var pixelCenter = new Vec2f { x = x + 0.5f, y = y + 0.5f };\n            var bc = Barycentric (Project2D (pts [0] / pts [0].h),\n                                    Project2D (pts [1] / pts [1].h),\n                                    Project2D (pts [2] / pts [2].h),\n                                    pixelCenter);\n\n            var z = pts [0].z * bc.x + pts [1].z * bc.y + pts [2].z * bc.z; // z [0..255]\n            var w = pts [0].h * bc.x + pts [1].h * bc.y + pts [2].h * bc.z;\n            var frag_depth = z / w;\n\n            var idx = x + y * image.Width;\n            if (bc.x < 0 || bc.y < 0 || bc.z < 0 || zbuffer[idx] > frag_depth)\n                continue;\n\n\n            var fragment = new Vec3f { x = x, y = y, z = frag_depth };\n            var discard = shader.Fragment (fragment, bc, out color);\n            if (!discard) {\n                zbuffer [idx] = frag_depth;\n                image [x, y] = color;\n            }\n        }\n    }\n}\n```\n\nLet us see how it works. The actual render code:\n\n* Parsing the .obj file\n\n* Iteration through all triangles of the model and rasterization of each triangle.\n\nThe last step is the most interesting. Outer loop iterates through all the triangles. Inner loop iterates through all the vertices of the current triangle and calls a vertex shader for each vertex.\n\n**The main goal of the vertex shader is to transform the coordinates of the vertices. The secondary goal is to prepare data for the fragment shader.**\n\nWhat happens after that? We call the rasterization routine. What happens inside the rasterizer we do not know (well, okay, we do know since we programmed it!) with one exception. We know that the rasterizer calls **our** routine for each pixel, namely, the fragment shader. Again, for each pixel inside the triangle the rasterizer calls our own callback, the fragment shader.\n\n**The main goal of the fragment shader - is to determine the color of the current pixel. Secondary goal - we can discard current pixel by returning true.**\n\nThe rendering pipeline for the OpenGL 2 can be represented as follows (in fact, it is more or less the same for newer versions too):\n\n![  ](./img/lesson6_opengl2_pipeline.png)\n\nBecause of the time limits I have for my course, I restrict myself to the OpenGL 2 pipeline and therefore to fragment and vertex shaders only. In newer versions of OpenGL there are other shaders, allowing, for example, to generate geometry on the fly.\n\nOkay, in the above image all the stages we can not touch are shown in blue, whereas our callbacks are shown in orange. In fact, our render code - is the \\*\\*primitive processing \\*\\*routine. It calls the vertex shader. We do not have primitive assembly here, since we are drawing dumb triangles only (in our code it is merged with the primitive processing). `Triangle` function - is the **rasterizer**, for each point inside the triangle it calls the **fragment shader**, then performs depth checks (z-buffer) and such.\n\nThat is all. You know what the shaders are and now you can create your own shaders.\n\n# **My implementation of shaders shown on Gouraud shading**\n\nAccording to its name, it is a Gouraud shader. Here is the code:\n\n```csharp\nusing static ShaderUtils;\n\nclass GouraudShader : IShader\n{\n    readonly Model model;\n    readonly Vec3f lightDir;\n\n    // written by vertex shader, read by fragment shader\n    protected Vec3f varyingIntensity = new Vec3f ();\n\n    readonly Matrix4 transformation;\n\n    public GouraudShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n    {\n        this.model = model;\n        transformation = viewPort * projection * modelView;\n        this.lightDir = lightDir.Normalize ();\n    }\n\n    public virtual Vec4f Vertex (Face face, int nthvert)\n    {\n        var n = model.Normal (face, nthvert).Normalize ();\n        // get diffuse lighting intensity\n        varyingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir));\n        var d = Dot(n, lightDir);\n\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public virtual bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // interpolate intensity for the current pixel\n        var intensity = Dot (varyingIntensity, bar);\n        color = Color.White * intensity; // well duh\n        return false;\n    }\n}\n\n// set of utils which will be used in our shaders\nstatic class ShaderUtils\n{\n    public static Vec4f TransformFace (Model model, Face face, int nthvert, Matrix4 t)\n    {\n        var v = model.Vertex (face, nthvert); // read the vertex from model\n        var glVertex = Embed4D (v);\n        return Mult (t, glVertex); // transform it to screen coordinates\n    }\n\n    public static void UpdateVarayingUV (Model model, Face face, int nthvert,\n                                         ref Vec3f varyingU, ref Vec3f varyingV)\n    {\n        var vt = model.GetUV (face, nthvert);\n        varyingU [nthvert] = vt.x;\n        varyingV [nthvert] = vt.y;\n    }\n\n    public static Vec2f CalcUV (Vec3f varU, Vec3f varV, Vec3f bar)\n    {\n        return new Vec2f {\n            x = Dot (varU, bar),\n            y = Dot (varV, bar)\n        };\n    }\n\n    public static Color GetColor (Image texture, Vec2f uvf)\n    {\n        var uvi = CalcXY(texture, uvf);\n        return texture [uvi.x, uvi.y];\n    }\n\n    public static Vec3f Transform (Matrix4 t, Vec3f v)\n    {\n        var v4d = Mult (t, Embed4D (v));\n        return Project3D (v4d);\n    }\n\n    public static Vec3f Normal (Image normalMap, Vec2f uvf)\n    {\n        // RGB values as xyz. But Color stores data as BGR (zyx)\n        var c = GetColor (normalMap, uvf);\n\n        return new Vec3f {\n            x = (c [2] / 255f) * 2 - 1,\n            y = (c [1] / 255f) * 2 - 1,\n            z = (c [0] / 255f) * 2 - 1\n        };\n    }\n\n    public static float Specular (Image specularMap, Vec2f uvf)\n    {\n        var uvi = CalcXY (specularMap, uvf);\n        var color = specularMap [uvi.x, uvi.y];\n        return color[0];\n    }\n\n    public static Vec2i CalcXY (Image texture, Vec2f uvf)\n    {\n        return new Vec2i {\n            x = (int)(uvf.x * texture.Width),\n            y = (int)(uvf.y * texture.Height)\n        };\n    }\n}\n\nvar light_dir = new Vec3f { x = 1, y = 1, z = 1 };\nvar eye = new Vec3f { x = 1, y = 1, z = 3 };\nvar center = new Vec3f { x = 0, y = 0, z = 0 };\nvar up = new Vec3f { x = 0, y = 1, z = 0 };\n\nvar modelView = LookAt(eye, center, up);\nvar viewPort = Viewport(width/8, height/8, width*3/4, height*3/4);\nvar projection = Projection(-1f/(eye-center).Norm());\n\nvar shader = new GouraudShader (headModel, viewPort, projection, modelView, light_dir);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n**vayring** is a reserved keyword in GLSL language, I have used VaryingIntensity as a name in order to show the correspondence. In varying variables we store data to be interpolated inside the triangle, and the fragment shaders get the interpolated value (for the current pixel).\n\nFragment routine is called for each pixel inside the triangle we draw; as an input it receives [barycentric coordinates](https://en.wikipedia.org/wiki/Barycentric_coordinate_system) for interpolation of VaryingXXX data. Thus, interpolated intensity can be computed as:\n\nVaryingIntensity\\[0\\]\\*bar\\[0\\] \\+ VaryingIntensity\\[1\\]\\*bar\\[1\\] \\+ VaryingIntensity\\[2\\]\\*bar\\[2\\]\n\nor simply as a dot product between two vectors: `Dot(VaryingIntensity,bar)`. In true GLSL, of course, fragment shaders receive ready interpolated values.\n\nNotice that the shader returns a bool value. It is easy to understand what it does if we look inside the updated rasterizer:\n\n```csharp\n/*\n...\nvar discard = shader.Fragment (fragment, bc, out color);\nif (!discard) {\n    zbuffer [idx] = frag_depth;\n    image [x, y] = color;\n}\n*/\n```\n\nFragment shader can discard drawing of the current pixel, then the rasterizer simply skips it. It is handy if we want to create binary masks or whatever you want.\n\nOf course, the rasterizer can not imagine all the weird stuff you could program, therefore it can not be pre-compiled with your shader. Here we use IShader interface as an intermediate between the two.\n\n# **First modification of the shaders**\n\nSimple modification of the Gourad shading, where the intensities are allowed to have 6 values only:\n\n```csharp\nclass GouraudShader6 : GouraudShader\n{\n    public GouraudShader6 (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir)\n        : base (model, viewPort, projection, modelView, lightDir)\n    {\n    }\n\n    public override bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var intensity = Dot (varyingIntensity, bar);\n        if (intensity > 0.85f) intensity = 1;\n        else if (intensity > 0.60f) intensity = 0.80f;\n        else if (intensity > 0.45f) intensity = 0.60f;\n        else if (intensity > 0.30f) intensity = 0.45f;\n        else if (intensity > 0.15f) intensity = 0.30f;\n        else intensity = 0;\n        color = new Color (255, 155, 0) * intensity;\n        return false;\n    }\n}\n\nvar shader = new GouraudShader6 (headModel, viewPort, projection, modelView, light_dir);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Textures**\n\nI'll skip the [Phong shading](https://en.wikipedia.org/wiki/Phong_shading), but take a look at the article. Remember the homework assignment I gave you for texturing? We had to interpolate uv-coordinates.\n\n```csharp\nusing static ShaderUtils;\n\nclass TextureShader : IShader\n{\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 transformation;\n    readonly Image texture;\n\n    // written by vertex shader, read by fragment shader\n    Vec3f varyingIntensity = new Vec3f ();\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    public TextureShader (Model model, Matrix4 viewPort, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n    {\n        this.model = model;\n        transformation = viewPort * projection * modelView;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var n = model.Normal (face, nthvert).Normalize ();\n        varyingIntensity [nthvert] = Math.Max (0, Dot (n, lightDir)); // get diffuse lighting intensity\n\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // interpolate intensity for the current pixel\n        var intensity = Dot (varyingIntensity, bar);\n\n        // interpolate uv for the current pixel\n        var uvf = CalcUV (varyingU, varyingV, bar);\n\n        color = GetColor (texture, uvf) * intensity;\n        return false;\n    }\n}\n\nvar shader = new TextureShader (headModel, viewPort, projection, modelView, light_dir, headTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Normalmapping**\n\nOkay, now we have texture coordinates. What can we store in texture images? In fact, almost anything. It can be color, directions, temperature and so on. Let us load this texture:\n\n![  ](./img/lesson6_african_head_nm.png)\n\nIf we interpret RGB values as xyz directions, this image gives us normal vectors **for each pixel** of our render and not only per vertex as before.\n\nBy the way, compare this image to another one, it gives exactly the same information, but in another frame:\n\n![  ](./img/lesson6_african_head_nm_tangent.png)\n\nOne of the images gives normal vectors in global (Cartesian) coordinate system, another one in [Darboux frame](https://en.wikipedia.org/wiki/Darboux_frame) (so-called tangent space). In Darboux frame the z-vector is normal to the object, x - principal curvature direction and y - their cross product.\n\n**Exercise 1:** Can you tell which image is represented in Darboux frame and which one is in the global coordinate frame?\n\n**Exercise 2:** Can you tell which representation is better and if yes, why is that?\n\n**Uniform** is a reserved keyword in GLSL, it allows to pass constants to the shaders. Here I pass the matrix Projection\\*ModelView and its inverse transpose to transform the normal vectors (refer to the end of the lesson5). So, computation of the lighting intensity is the same as before with one exception: instead of interpolating normal vectors we retrieve the information from the normal mapping texture (do not forget to transform light vector and normal vectors).\n\n```csharp\nclass NormalMapShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public NormalMapShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n\n        var intensity = Math.Max (0f, Dot (n, l));\n        color = GetColor (texture, uv) * intensity;\n        return false;\n    }\n}\n\nvar headNormalMap = Image.Load (\"obj/african_head_nm.tga\");\nheadNormalMap.VerticalFlip ();\n\nvar shader = new NormalMapShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Specular mapping**\n\nOkay, let us continue the fun. All the computer graphics science is the art to cheat. To (cheaply) trick the eye we use the [Phong's approximation](https://en.wikipedia.org/wiki/Phong_reflection_model) of the lighting model. Phong proposed to consider the final lighting as a (weighted) sum of three light intensities: ambient lighting (constant per scene), diffuse lighting (the one we computed up to this moment) and specular lighting.\n\nTake a look at the following image, it speaks for itself:\n\n![  ](./img/lesson6_phong.png)\n\nWe compute diffuse lighting as a cosine of the angle between the normal vector and the light direction vector. I mean, this supposes that the light is reflected in all directions uniformly. What happens to glossy surfaces? In the limit case (mirror) the pixel is illuminated if and only if we can see the light source reflected by this pixel:\n\n![  ](./img/lesson6_reflection.png)\n\nFor diffuse lighting we computed the (cosine of) angle between vectors **n** and **l**, and now we are interested in the (cosine of) angle between vectors **r** (reflected light direction) and **v**(view direction).\n\n**Exercise 3:** Given vectors **n** and **l**, find vector **r**.\n\n*Answer:* If **n** and **l** are normalized, then **r** = 2**n**<**n**,**l**> - **l**\n\nFor diffused lighting we computed the light intensity as the cosine. But a glossy surface reflects in one direction much more than in others! Okay then, what happens if we take tenth power of the cosine? Recall that all numbers inferior to 1 will decrease when we apply the power. It means that tenth power of the cosine will give smaller radius of the reflected beam. And hundredth power **much** smaller beam radius. This power is stored in a special texture (specular mapping texture) that tells for each point if it is glossy or not.\\\n\\\nI think that i do not need to comment anything in the below code at the exception of coefficients: `5 + color [i] * (diff + 1.3f * specular)`\n\nI took 5 for the ambient component, 1 for the diffuse component and 1.3 for the specular component. What coefficients to choose - is your choice. Different choices give different appearances for the object. Normally it is for the artist to decide.\n\n*Please note that normally the sum of the coefficents must be equal to 1, but you know. I like to create light.*\n\n```csharp\nclass SpecularShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n    readonly Image specularMap;\n\n    public SpecularShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap, Image specularMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n        this.specularMap = specularMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n        return TransformFace (model, face, nthvert, transformation);\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n\n        var r = (n * (2 * Dot (n, l)) - l).Normalize ();\n\n        var diff = Math.Max (0f, Dot (n, l));\n        var specular = Math.Pow (Math.Max (0f, r.z), Specular (specularMap, uv) + 15);\n\n        color = GetColor (texture, uv);\n\n        int v = 0;\n        for (int i = 0; i < 4; i++)\n            v = (v << 8) | (byte)Math.Min (255, (int)(5 + color [i] * (diff + 1.3f * specular)));\n        color = new Color (v, color.format);\n\n        return false;\n    }\n}\n\nvar headSpecularMap = Image.Load (\"./obj/african_head_spec.tga\");\nvar shader = new SpecularShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headNormalMap, headSpecularMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n```csharp\nvar diabloModel = Model.FromFile (\"obj/diablo3_pose.obj\");\nvar diabloTexture = Image.Load (\"obj/diablo3_pose_diffuse.tga\");\nvar diabloNormalMap = Image.Load (\"obj/diablo3_pose_nm.tga\");\nvar diabloTangentMap = Image.Load (\"obj/diablo3_pose_nm_tangent.tga\");\nvar diabloSpecularMap = Image.Load (\"obj/diablo3_pose_spec.tga\");\ndiabloTexture.VerticalFlip ();\ndiabloNormalMap.VerticalFlip ();\ndiabloTangentMap.VerticalFlip ();\ndiabloSpecularMap.VerticalFlip ();\n\nvar shader = new SpecularShader (diabloModel, viewPort, projection, modelView, light_dir, diabloTexture, diabloNormalMap, diabloSpecularMap);\n\nvar image = Render (diabloModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Conclusion**\n\nWe know how to render quite nice scenes, but our lighting is far from being real. In the next articles I will talk about shadows.\n\nEnjoy!"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson6bis.csx",
    "content": "using static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n\n    readonly Matrix4 transformation;\n    readonly Vec3f[] ndcTri = new Vec3f[3];     // triangle in normalized device coordinates\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        ndcTri[nthvert] = Project3D (glVertex / glVertex.h);\n\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        var A = new Matrix3 ();\n        A.SetRow (0, ndcTri [1] - ndcTri [0]);\n        A.SetRow (1, ndcTri [2] - ndcTri [0]);\n        A.SetRow (2, bn);\n\n        var AI = Inverse (A);\n        var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n        var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n\n        var B = new Matrix3 ();\n        B.SetColumn (0, i.Normalize ());\n        B.SetColumn (1, j.Normalize ());\n        B.SetColumn (2, bn);\n\n        var n = Mult (B, Normal (normalMap, uv)).Normalize ();\n\n        var l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (n, l));\n\n        color = GetColor (texture, uv) * diff;\n        return false;\n    }\n}"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson6bis.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\n#load \"lesson6.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n```\n\n# Lesson 6bis: tangent space normal mapping\n\nThe subject for today is [normal mapping](https://en.wikipedia.org/wiki/Normal_mapping). What is the main difference between normal mapping and Phong shading? The key is the density of information we have. For Phong shading we use normal vectors given per vertex of triangle mesh (and interpolate it inside triangles), whereas normal mapping textures provide dense information, dramatically improving rendering details.\n\nWell, we have already applied normal mapping in previous lesson, however we used the global system of coordinates to store the texture. Today we are talking about [tangent space](https://en.wikipedia.org/wiki/Darboux_frame) normal mapping.\n\nSo, we have two textures, the left one is given in the global frame (direct transformation from RGB to XYZ normal), whereas the right one in the Darboux frame:\n\n![](./img/lesson6bis_nm.jpg)\n\nTo use right texture, for each pixel we draw we compute tangent space (Darboux) frame. In this basis one vector (usually z) is orthogonal to our surface, and two others give a plane tangent to the current point. Then we read a (perturbed) normal vector from our texture, transform its coordinates from Darboux frame to the global system coordinates and we are done. Usually normal maps provide small perturbations of normal vectors, thus textures are in dominant blue color.\n\nWell, why such a mess? Why not to use global system as we did before? Imagine we want to animate our model. For example, I took the black guy model and opened his mouth. It is obvious that normal vectors are to be modified.\n\n![  ](./img/lesson6bis_mouth.jpg)\n\nLeft image gives the head with open mouth, but unchanged (global frame) normal texture. Inspect closely the interior of the lower lip. The light coming directly to his face; when the mouth was closed the backside of the lower lip naturally was not lit. Now the mouth is open, but the lip is not lit... The right image was computed with tangent space normal mapping.\n\nTherefore, if we have an animated model, then for correct normal mapping in global frame we need to have one texture per frame of the animation, whereas tangent space deforms accordingly to the model and we need one texture only!\n\nHere is another example:\n\n![  ](./img/global_vs_tangent_diablo.jpg)\n\nThese are textures for the Diablo model. Notice that only one hand is drawn in the texture, and only one side of the tail. The artist used the same texture for both arms and for both sides of the tail. It means that in the global coordinate system I can provide normal vectors either for the left side of the tail, either for the right one, but not for both! Same goes for the arms. And I need different information for the left and the right sides, for example, inspect left and right cheekbones in the left image, naturally normal vectors are pointing in the opposite directions!\n\nLet us finish with the motivation section and go straight ahead to the computations.\n\n# **Starting point, Phong shading**\n\nOkay, here is the starting point. The shader is really simple, it is Phong shading.\n\n```csharp\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        Vec3f bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        Vec3f l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (bn, l));\n\n        color = GetColor (texture, uv);\n        color *= diff;\n\n        return false;\n    }\n}\n\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, headTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\nFor the educational and debugging purposes I am removing the skin texture and apply a regular grid with horizontal red and vertical blue lines:\n\n```csharp\nvar gridTexture = Image.Load (\"obj/grid.tga\");\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, gridTexture);\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\nLet us remember how Phong shading works:\n\n![  ](./img/lesson6bis_triangle.png)\n\nFor each vertex of a triangle we have its coordinates p, texture coordinates uv and normal vectors. For shading current fragment our software rasterizer gives us barycentric coordinates of the fragment (alpha, beta, gamma). It means that the coordinates of the fragment can be obtained as p = alpha p0 \\+ beta p1 \\+ gamma p2. Then in the same way we interpolate texture coordinates and the normal vector:\n\n![ ](./img/lesson6bis_f00.png)\n\nNotice that blue and red lines are isolines of u and v, correspondingly. So, for each point of our surface we define a so-called Darboux frame, with x and y axes parallel to blue and red lines, and z axis orthogonal to the surface. This is the frame where tangent space normal map lives.\n\n# **How to reconstruct a (3D) linear function from three samples**\n\nOkay, so our goal is to compute three vectors (tangent basis) for each pixel we draw. Let us put that aside for a while and imagine a linear function f that for each point (x,y,z) gives a real number f(x,y,z) = Ax \\+ By \\+ Cz \\+ D. The only problem that we do not know A, B, C and D, however we do know three values of the function at three different points of the space (p0, p1, p2):\n\n![  ](./img/lesson6bis_f01.png)\n\n![  ](./img/lesson6bis_gradient_a.png)\n\nIt is convenient to imagine f as a height map of an inclined plane. We fix three different (non collinear) points on the plane and we know values of f in those points. Red lines inside the triangle show the iso-heights f0, f0 \\+ 1 meter, f0 \\+ 2 meters and so on. For a linear function we have the isolines are parallel (straight) lines.\n\nIn fact, I am more interested in the direction, orthogonal to the isolines. If we move along an iso, the height does not change (well duh, it is an iso!). If we deviate a little bit from an iso, the height starts to change a little bit. The steepest ascent we obtain when we move orthogonally to the isolines.\n\nLet us recall that the steepest ascent direction for a function is nothing else than its [gradient](https://en.wikipedia.org/wiki/Gradient). For a linear function f(x,y,z) = Ax \\+ By \\+ Cz \\+ D its gradient is a constant vector (A, B, C). Recall that we do not know the values of (A,B,C). We know only three samples of the function. Can we reconstruct A,B and C? Sure thing.\n\nSo, we have three points p0, p1, p2 and thre values f0, f1, f2. We need to find the vector of the steepest ascent (A,B,C). Let us consider another function defined as g(p) = f(p) - f(p0):\n\n![  ](./img/lesson6bis_gradient_b.png)\n\nObviously that we simply translated our inclined plane, without changing its inclination, therefore the steepest ascent direction for f and g is the same.\n\nLet us rewrite the definition of g:\n\n![  ](./img/lesson6bis_f02.png)\n\nPlease note that superscript x in p^x means x coordinate of the point p and not a power. So, the function g is simply a dot product between vector (p-p0) and (ABC). And we still do not know (A,B,C)!\n\nOkay, let us recall what we know. We know that if we go from point p0 to point p2, then the function g will go from zero to f2-f0. In other words, the dot product between vectors (p2-p0) and (ABC) is equal to f2-f0. Same thing for (p1-p0). Therefore, we are looking for the vector ABC, orthogonal to the normal n and respecting two constraints on dot products:\n\n![  ](./img/lesson6bis_f03.png)\n\nLet us rewrite this in a matrix form:\n\n![  ](./img/lesson6bis_f04.png)\n\nSo, we got an easy to solve linear matrix equation Ax = b:\n\n![  ](./img/lesson6bis_f05.png)\n\nPlease note that I used the letter A for two different things, the meaning should be clear from the context. So, our 3x3 matrix A, multiplied with the unknown vector x=(A,B,C), gives the vector b = (f1-f0, f2-f0, 0). Unknown vector x becomes known when we multiply inverse to A by b.\n\nAlso note that in the matrix A we have nothing related to the function f. It contains only some information about our triangle.\n\n# **Let us compute Darboux basis and apply the perturbation of normals**\n\nSo, Darboux basis is a triplet of vectors (i,j,n), where n - is the original normal vector, and i, j can be computed as follows:\n\n![  ](./img/lesson6bis_f06.png)\n\nUsing the normal maps in the tangent space.\n\n```csharp\nclass TangentShader : IShader\n{\n    // triangle uv coordinates, written by the vertex shader, read by the fragment shader\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n\n    // normal per vertex to be interpolated by FS\n    Matrix3 varyingNrm = new Matrix3 ();\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n\n    readonly Matrix4 transformation;\n    readonly Vec3f[] ndcTri = new Vec3f[3];     // triangle in normalized device coordinates\n\n    readonly Image texture;\n    readonly Image normalMap;\n\n    public TangentShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Vec3f lightDir, Image texture, Image normalMap)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var normal = Project3D (Mult (uniformMIT, Embed4D (model.Normal (face, nthvert))));\n        varyingNrm.SetColumn (nthvert, normal);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        ndcTri[nthvert] = Project3D (glVertex / glVertex.h);\n\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var bn = Mult(varyingNrm, bar).Normalize ();\n        var uv = CalcUV (varyingU, varyingV, bar);\n\n        var A = new Matrix3 ();\n        A.SetRow (0, ndcTri [1] - ndcTri [0]);\n        A.SetRow (1, ndcTri [2] - ndcTri [0]);\n        A.SetRow (2, bn);\n\n        var AI = Inverse (A);\n        var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n        var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n\n        var B = new Matrix3 ();\n        B.SetColumn (0, i.Normalize ());\n        B.SetColumn (1, j.Normalize ());\n        B.SetColumn (2, bn);\n\n        var n = Mult (B, Normal (normalMap, uv)).Normalize ();\n\n        var l = Transform (uniformM, lightDir).Normalize ();\n        var diff = Math.Max (0f, Dot (n, l));\n\n        color = GetColor (texture, uv) * diff;\n        return false;\n    }\n}\n```\n\nAll is quite straightforward, I compute the matrix A:\n\n```csharp\n// var A = new Matrix3 ();\n// A.SetRow (0, ndcTri [1] - ndcTri [0]);\n// A.SetRow (1, ndcTri [2] - ndcTri [0]);\n// A.SetRow (2, bn);\n```\n\nThen compute two unknown vectors (i,j) of Darboux basis:\n\n```csharp\n// var AI = Inverse (A);\n// var i = Mult (AI, new Vec3f { x = varyingU.y - varyingU.x, y = varyingU.z - varyingU.x });\n// var j = Mult (AI, new Vec3f { x = varyingV.y - varyingV.x, y = varyingV.z - varyingV.x });\n```\n\nOnce we have all the tangent basis, I read the perturbed normal from the texture and apply the basis change from the tangent basis to the global coordinates. Recall that I have already described how to perform change of basis.\n\nHere is the final rendered image, compare the details with Phong shading:\n\n```csharp\nvar headTangentMap = Image.Load (\"obj/african_head_nm_tangent.tga\");\nheadTangentMap.VerticalFlip ();\n\nvar shader = new TangentShader (headModel, viewPort, projection, modelView, light_dir, headTexture, headTangentMap);\n\nvar image = Render (headModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\n# **Were you paying attention?**\n\nHave you noticed that generally a (flat) triangle has a constant normal vector, whereas I used the interpolated normal in the last row of the matrix A? Why did I do it?\n\nHappy coding!"
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/lesson7.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacNet45\n- WPF\n---\n\n```csharp\n#load \"Geometry.csx\"\n#load \"Matrix.csx\"\n#load \"Image.csx\"\n#load \"Model.csx\"\n#load \"ImageResultHandler.csx\"\n#load \"lesson1.csx\"\n#load \"lesson2.csx\"\n#load \"lesson3.csx\"\n#load \"lesson4.csx\"\n#load \"lesson5.csx\"\n#load \"lesson6.csx\"\n#load \"lesson6bis.csx\"\nusing static Geometry;\nusing static MatrixHelpers;\nusing static ShaderUtils;\n```\n\n# Lesson 7: Shadow mapping\n\n# **The goal**\n\nWell, we are approaching the end of your short course of CG lectures. The goal for today is to compute shadows. **Attention, we are talking about hard shadows here, soft shadows computation is another story.**\n\n# **Problem statement**\n\nUp to this moment convex objects were shaded correctly by our simple local shading. Local means computation with light direction and the normal vector. Unfortunately, it does not produce correct results for non-convex objects. Here is the image we can got during previous lesson:\n\n```csharp\nvar shader = new TangentShader (diabloModel, viewPort, projection, modelView, light_dir, diabloTexture, diabloTangentMap);\n\nvar image = Render (diabloModel, shader).Image;\nimage.VerticalFlip();\nimage\n```\n\nWhy do not we see a shadow from his horns? Not good.\n\nThe idea is really simple: we will do a two-pass rendering. First time we will render the image placing the camera at the light source position. It will allow to determine what parts are lit and what parts are hidden from the light. Then in the second pass we do a render taking in account the visibility information. Almost no difficulties here. Let us use this shader:\n\n```csharp\nclass DepthShader : IShader\n{\n    const float depth = 255f;\n\n    Matrix3 varyingTri;\n\n    readonly Model model;\n    readonly Matrix4 transformation;\n\n    public DepthShader (Model model, Matrix4 transformation)\n    {\n        this.model = model;\n        this.transformation = transformation;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        varyingTri.SetColumn (nthvert, Project3D (glVertex / glVertex.h));\n        return glVertex;\n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        var p = Mult (varyingTri, bar);\n        color = Color.White * (p.z / depth);\n        return false;\n    }\n}\n```\n\nThis shader simply copies the z-buffer into the framebuffer. Here is how it I call it:\n\n```csharp\nvar model = diabloModel;\n\nvar modelView = LookAt (eye, center, up);\nvar viewPort = Viewport (width / 8, height / 8, width * 3 / 4, height * 3 / 4);\nvar projection = Projection (-1f / (eye - center).Norm ());\n\nvar M = viewPort * Projection (0) * LookAt (light_dir, center, up);\nvar depthShader = new DepthShader (model, M);\nvar step1 = Render (model, depthShader);\nstep1.Image.VerticalFlip ();\nstep1.Image\n```\n\nI put the camera at the light source position LookAt (light_dir, center, up) and then perform the render. Note that I keep the z-buffer, it is pointed by the **step1.ZBuffer** reference. Also it is useful to note line where I keep the object-to-screen transformation matrix.\n\nThe second pass is naturally made with another shader:\n\n```csharp\nclass ShadowShader : IShader\n{\n    Vec3f varyingU = new Vec3f ();\n    Vec3f varyingV = new Vec3f ();\n    Matrix3 varyingTri;\n\n    readonly Model model;\n    readonly Vec3f lightDir;\n    readonly Matrix4 uniformM;\n    readonly Matrix4 uniformMIT;\n    // transform framebuffer screen coordinates to shadowbuffer screen coordinates\n    readonly Matrix4 uniformShadow;\n    readonly Matrix4 transformation;\n\n    readonly Image texture;\n    readonly Image normalMap;\n    readonly Image specularMap;\n\n    readonly float[] shadowbuffer;\n    readonly int width;\n\n    public ShadowShader (Model model, Matrix4 viewport, Matrix4 projection, Matrix4 modelView, Matrix4 uniformShadow, Vec3f lightDir, Image texture, Image normalMap, Image specularMap, float[] shadowbuffer, int width)\n    {\n        this.model = model;\n        this.lightDir = lightDir.Normalize ();\n        this.texture = texture;\n        this.normalMap = normalMap;\n        this.specularMap = specularMap;\n        this.shadowbuffer = shadowbuffer;\n        this.width = width;\n\n        uniformM = projection * modelView;\n        uniformMIT = TransposeInverse (uniformM);\n        transformation = viewport * uniformM;\n        this.uniformShadow = uniformShadow;\n    }\n\n    public Vec4f Vertex (Face face, int nthvert)\n    {\n        UpdateVarayingUV (model, face, nthvert, ref varyingU, ref varyingV);\n\n        var glVertex = TransformFace (model, face, nthvert, transformation);\n        varyingTri.SetColumn (nthvert, Project3D (glVertex / glVertex.h));\n\n        return glVertex; \n    }\n\n    public bool Fragment (Vec3f fragment, Vec3f bar, out Color color)\n    {\n        // corresponding point in the shadow buffer\n        var sb_p = Mult (uniformShadow, Embed4D (Mult (varyingTri, bar)));\n        sb_p = sb_p / sb_p.h;\n        int idx = (int)sb_p.x + (int)sb_p.y * width; // index in the shadowbuffer array\n        float shadow = 0.3f + 0.7f * (shadowbuffer [idx] < sb_p.z + 3.5f ? 1f : 0f);\n\n        var uv = CalcUV (varyingU, varyingV, bar);\n        var n = Transform (uniformMIT, Normal (normalMap, uv)).Normalize ();\n        var l = Transform (uniformM, lightDir).Normalize ();\n        var r = (n * (2 * Dot (n, l)) - l).Normalize ();\n        var diff = Math.Max (0f, Dot (n, l));\n\n        var specular = Math.Pow (Math.Max (0f, r.z), Specular (specularMap, uv) + 15);\n        color = GetColor (texture, uv);\n\n        int v = 0;\n        for (int i = 0; i < 4; i++)\n            v = (v <<= 8) | (byte)Math.Min (255, (int)(5 + color [i] * shadow * (diff + 1.3f * specular)));\n        color = new Color (v, color.format);\n\n        return false;\n    }\n}\n```\n\nIt is a copy of the final shader from the previous lesson with one exception: I declared a constant matrix `Matrix4 uniformShadow`, it allows me to transform screen coordinates of current fragment into screen coordinates inside the shadowbuffer! I'll explain how it is computed a bit later, let us see how I use it:\n\n```csharp\n/*\nvar sb_p = Mult (uniformShadow, Embed4D (Mult (varyingTri, bar)));\nsb_p = sb_p / sb_p.h;\nint idx = (int)sb_p.x + (int)sb_p.y * width; // index in the shadowbuffer array\nvar depth = 255 * shadowbuffer [idx];\nfloat shadow = 0.3f + 0.7f * ((depth < sb_p.z ? 1f : 0f));\n*/\n```\n\n`Mult (varyingTri, bar)` provides me screen coordinates of the pixel we currently draw; we augment it with 1 (recall the homogeneous coordinates stuff), then transform it with the magic matrix `uniformShadow` and ta-da! We know xyz coordinates in the shadow buffer space. Now to determine whether the current pixel is lit or no it suffices to compare its z-coordinate with the value we stored in the shadow buffer.\n\nLet me show you how I call the shader:\n\n```csharp\nvar shadowM = M * Inverse (viewPort * projection * modelView);\nvar shader = new ShadowShader (model, viewPort, projection, modelView, shadowM, light_dir,\n                                diabloTexture, diabloNormalMap, diabloSpecularMap,\n                                step1.ZBuffer, width);\nvar step2 = Render (model, shader);\nstep2.Image.VerticalFlip ();\nstep2.Image\n```\n\nNotice the `sb_p.z + 3.5`  in fragment shader? This magic coefficient needed to get rig of artifact is known as the [z-fighting](http://en.wikipedia.org/wiki/Z-fighting). Resolution of our buffers is insufficient to obtain precise results. Try to delete `+ 3.5f`  and you will notice ugly shadow rendering.\n\nI simply move a bit one z-buffer with respect to another, it is sufficient to remove the artifact. Yes, it creates other problems (can you tell which ones?), but those are generally less visible. The final render is visible in the teaser image."
  },
  {
    "path": "graphics/tiny-renderer/lesson8.workbook/obj/diablo3_pose.obj",
    "content": "v 0.11526 0.700717 0.0677257\nv 0.114223 0.654606 0.0821706\nv 0.119952 0.67202 0.101202\nv 0.12069 0.712368 0.0932415\nv 0.120409 0.670105 0.118388\nv 0.103434 0.63749 0.102854\nv 0.0998313 0.642305 0.121165\nv 0.113204 0.661161 0.119513\nv 0.110674 0.71474 0.118248\nv 0.114329 0.673286 0.128141\nv 0.0938038 0.672987 0.125628\nv 0.0910976 0.702896 0.120497\nv 0.107546 0.664288 0.12793\nv 0.116526 0.652831 0.0186975\nv 0.122606 0.631867 0.0339156\nv 0.123238 0.584561 0.0390644\nv 0.113679 0.582153 0.0698344\nv 0.107247 0.593611 0.124012\nv 0.099392 0.618107 0.132025\nv 0.0519629 0.664482 0.148508\nv 0.056813 0.67065 0.139722\nv 0.0671458 0.660001 0.134186\nv 0.0799037 0.658226 0.13039\nv 0.0872667 0.645679 0.131726\nv 0.0690261 0.645978 0.151671\nv 0.0731557 0.627719 0.151074\nv 0.0524549 0.654325 0.16232\nv 0.0402945 0.655625 0.166186\nv 0.0399431 0.667873 0.157259\nv 0.0514006 0.648069 0.163058\nv 0.0395565 0.644343 0.164429\nv 0.0403297 0.634327 0.163322\nv 0.048132 0.610076 0.154571\nv 0.021597 0.677468 0.15559\nv 0.0424033 0.672267 0.161494\nv 0.0551611 0.669385 0.152479\nv 0.0324219 0.694391 0.157312\nv 0.0500123 0.692264 0.158015\nv 0.0621024 0.681106 0.149088\nv 0.042087 0.725178 0.149141\nv 0.0617158 0.711489 0.15088\nv 0.0706604 0.695445 0.133782\nv 0.0129512 0.710365 0.135873\nv 0.0267634 0.736074 0.134696\nv 0.0996029 0.759463 0.122043\nv 0.127526 0.758813 0.113749\nv 0.0634907 0.787228 0.117404\nv 0.0781113 0.602994 0.15624\nv 0.0661442 0.626208 0.15269\nv 0.0892525 0.572418 0.146698\nv 0.0501705 0.601641 0.155028\nv 0.0637543 0.593944 0.162443\nv 0.0649668 0.641321 0.158156\nv 0.0678663 0.629969 0.156521\nv 0.0497663 0.643588 0.152233\nv 0.0475697 0.626384 0.148209\nv 0.0605209 0.610199 0.15566\nv 0.0599761 0.626419 0.15429\nv 0.0643869 0.628457 0.153182\nv 0.0578146 0.640741 0.152849\nv 0.0813095 0.813025 0.103117\nv 0.135047 0.790409 0.0950163\nv 0.116789 0.817945 0.0520332\nv 0.0892876 0.821565 0.0596598\nv 0.0257091 0.775507 0.125488\nv 0.0636313 0.679507 0.139194\nv 0.0781289 0.671792 0.13872\nv 0.0878993 0.595034 0.00293464\nv 0.116772 0.566636 0.0537026\nv 0.114417 0.562155 0.0744385\nv 0.128176 0.558166 0.0246547\nv 0.107194 0.567445 0.09651\nv 0.0944716 0.545496 0.110902\nv 0.0712403 0.535304 0.117264\nv 0.112431 0.54474 0.087214\nv 0.0971602 0.533775 0.0882684\nv 0.0731382 0.524128 0.0962816\nv 0.106368 0.520964 0.0665483\nv 0.099392 0.514164 0.0756159\nv 0.0780586 0.512283 0.0791129\nv 0.1141 0.533037 0.0671107\nv 0.115436 0.533582 0.0411731\nv 0.115752 0.527449 0.0417179\nv 0.114469 0.546304 0.0516993\nv 0.102151 0.525076 0.0562506\nv 0.0970021 0.503198 0.0402242\nv 0.100605 0.498208 0.054177\nv 0.0863529 0.491407 0.0541595\nv 0.0949988 0.486943 0.0309282\nv 0.0732963 0.583559 0.000140556\nv 0.0795522 0.555653 0.0176783\nv 0.0874073 0.557569 0.0307173\nv 0.0843848 0.502601 0.03439\nv 0.0989175 0.529927 0.0420342\nv 0.0913612 0.482164 0.025094\nv 0.0906759 0.48197 0.0349172\nv 0.00242505 0.842706 0.085773\nv -0.0105613 0.872456 0.0789021\nv -0.0279935 0.869416 0.0666186\nv -0.0107546 0.825273 0.0714863\nv -0.00999895 0.80039 0.118951\nv -0.0275542 0.855217 0.105806\nv 0.00233719 0.823744 0.11222\nv -0.0122131 0.863705 0.0988999\nv -0.039451 0.902576 0.0606087\nv -0.00137068 0.808351 0.0664078\nv 0.0207008 0.806207 0.0844902\nv 0.0138474 0.77795 0.120374\nv -0.00152884 0.759691 0.126718\nv -0.0331072 0.875532 0.0913612\nv 0.0211577 0.79605 0.104594\nv -0.226707 -0.278811 0.0844199\nv -0.164271 -0.310688 0.0763188\nv -0.190121 -0.154536 0.0547394\nv -0.115682 -0.174358 0.0460584\nv -0.102748 -0.13025 0.0384494\nv -0.268074 -0.269339 0.0650371\nv -0.243946 -0.149703 0.0212455\nv -0.189084 -0.00231963 -0.0608723\nv -0.259147 -0.376006 0.0909394\nv -0.140495 -0.0527185 0.0225987\nv -0.164921 -0.01086 -0.00980567\nv -0.129125 -0.0841915 0.0319474\nv -0.116754 -0.0240045 0.0389238\nv -0.120655 -0.0525252 0.0430183\nv -0.0982849 -0.162391 0.0430007\nv -0.203775 -0.406776 0.0984782\nv -0.145872 -0.436597 0.059484\nv -0.112062 -0.35411 0.0492742\nv -0.237813 -0.446297 0.116033\nv -0.20511 -0.499332 0.0841563\nv -0.272291 -0.426932 0.106158\nv -0.270692 -0.459635 0.163568\nv -0.233912 -0.504639 0.102661\nv -0.283362 -0.512406 0.0865638\nv -0.252293 -0.489931 0.130584\nv -0.29858 -0.454451 0.1128\nv -0.291674 -0.453854 0.139897\nv -0.284153 -0.488068 0.128897\nv -0.294415 -0.476822 0.0981619\nv -0.302639 -0.443292 0.0965276\nv -0.311004 -0.454768 0.12489\nv -0.320423 -0.453836 0.0878993\nv -0.311865 -0.403683 0.0613995\nv -0.328718 -0.434137 0.0385899\nv -0.328278 -0.278442 -0.00706431\nv -0.321495 -0.34311 0.0478333\nv -0.297754 -0.253506 -0.137736\nv -0.214301 -0.520314 0.0970899\nv -0.231346 -0.516958 0.105876\nv -0.24356 -0.52411 0.101887\nv -0.222419 -0.53743 0.100727\nv -0.238007 -0.537219 0.100323\nv -0.233315 -0.527818 0.121288\nv -0.226268 -0.536639 0.0605033\nv -0.180209 -0.502091 0.0646329\nv -0.2563 -0.52404 0.0890767\nv -0.278617 -0.532422 0.106368\nv -0.24739 -0.547007 0.0609426\nv -0.272256 -0.556567 0.0515938\nv -0.237128 -0.554546 -0.0027238\nv -0.329438 -0.473131 0.0214564\nv -0.328981 -0.486733 0.0608371\nv -0.307384 -0.510948 0.0583242\nv -0.214266 -0.520806 0.0641936\nv -0.209187 -0.532686 0.0775489\nv -0.210118 -0.541472 0.0516817\nv -0.18448 -0.526307 0.0144449\nv -0.202369 -0.52469 0.046691\nv -0.13995 -0.494078 -0.0121604\nv -0.076477 -0.16464 -0.246828\nv -0.215215 -0.18578 -0.218676\nv -0.177468 -0.0685341 -0.2912\nv -0.300513 -0.164886 -0.0611535\nv -0.328489 -0.511264 -0.0174498\nv -0.32754 -0.511071 0.0356377\nv -0.294732 -0.547429 -0.00166944\nv -0.313974 -0.486012 0.0562506\nv -0.113872 -0.083102 0.0324922\nv -0.0877061 -0.1322 0.0504868\nv -0.0748427 -0.168576 0.02896\nv -0.0878115 -0.13336 0.0293466\nv -0.106439 -0.0435104 0.0336695\nv -0.100411 -0.0729097 0.019664\nv -0.0763716 -0.204442 0.0280814\nv -0.155678 -0.252803 -0.213914\nv -0.270464 -0.298615 -0.174779\nv -0.227252 -0.0342143 -0.120321\nv -0.229097 -0.0836292 -0.207834\nv -0.0959301 -0.172671 -0.22314\nv -0.18571 -0.119987 -0.24421\nv -0.0694303 -0.201104 0.043317\nv -0.0647911 -0.227656 0.0175025\nv -0.0861948 -0.217271 0.0386778\nv -0.0703792 -0.219379 0.0386251\nv -0.099515 -0.241258 0.0468492\nv -0.0809229 -0.241837 0.0346185\nv -0.361825 -0.347046 -0.0517169\nv -0.356465 -0.383352 0.0123713\nv -0.365041 -0.413717 -0.0374302\nv -0.198011 -0.343672 -0.195164\nv -0.222542 -0.382104 -0.170984\nv -0.0891119 -0.308386 -0.115946\nv -0.0247777 -0.200436 -0.16942\nv -0.122096 -0.400907 -0.110357\nv -0.0774611 -0.32262 -0.0285383\nv -0.0899027 -0.36237 -0.0259375\nv -0.0697642 -0.274013 0.00676553\nv -0.126085 -0.453625 -0.0196289\nv -0.150986 -0.459249 -0.0810108\nv -0.343496 -0.37142 -0.228429\nv -0.232489 -0.383334 -0.251801\nv -0.17195 -0.413577 -0.222964\nv -0.319439 -0.410818 -0.323955\nv -0.242874 -0.411029 -0.323674\nv -0.300373 -0.419147 -0.372492\nv -0.241398 -0.423136 -0.377693\nv -0.280023 -0.359242 -0.238586\nv -0.336608 -0.363635 -0.116596\nv -0.341528 -0.467894 -0.310635\nv -0.376516 -0.419341 -0.17\nv -0.34021 -0.470987 -0.359734\nv -0.356922 -0.494693 -0.23154\nv -0.3678 -0.432415 -0.235687\nv -0.3691 -0.469423 -0.118248\nv -0.337117 -0.518838 -0.136945\nv -0.268197 -0.578551 -0.134977\nv -0.192633 -0.538994 -0.0549854\nv -0.157927 -0.511422 -0.0755105\nv -0.170052 -0.525604 -0.152884\nv -0.146153 -0.481074 -0.182283\nv -0.185956 -0.440973 -0.312691\nv -0.281376 -0.36418 -0.154307\nv -0.159315 -0.374846 -0.160071\nv -0.177029 -0.419499 -0.142814\nv -0.207623 -0.455523 -0.380628\nv -0.20019 -0.524444 -0.379503\nv -0.332267 -0.533529 -0.224792\nv -0.27563 -0.574175 -0.229923\nv -0.175816 -0.507697 -0.257214\nv -0.293695 -0.535023 0.0562506\nv -0.0170808 -0.191808 -0.0932415\nv -0.0249886 -0.115858 -0.00550031\nv -0.0118968 -0.173286 -0.0372369\nv -0.216093 -0.549345 -0.141426\nv -0.23291 -0.571153 -0.356694\nv -0.211893 -0.551805 -0.242365\nv -0.213334 -0.49464 -0.477524\nv -0.24196 -0.540681 -0.524602\nv -0.222824 -0.433786 -0.46568\nv -0.322303 -0.541771 -0.514656\nv -0.347767 -0.520121 -0.487664\nv -0.280392 -0.547306 -0.527994\nv -0.286262 -0.580027 -0.331002\nv -0.335676 -0.543387 -0.345904\nv -0.371261 -0.533406 -0.419358\nv -0.324289 -0.469845 -0.50427\nv -0.359347 -0.47343 -0.451956\nv -0.242259 -0.468843 -0.513584\nv -0.328155 -0.438284 -0.464064\nv -0.274066 -0.472727 -0.520121\nv -0.268636 -0.418778 -0.47336\nv -0.26405 -0.676959 -0.365744\nv -0.223509 -0.587302 -0.461551\nv -0.229431 -0.689242 -0.390381\nv -0.217798 -0.629336 -0.456683\nv -0.244421 -0.666872 -0.48132\nv -0.27078 -0.728043 -0.425509\nv -0.283204 -0.679841 -0.483376\nv -0.276843 -0.784821 -0.410097\nv -0.244755 -0.72734 -0.414403\nv -0.238868 -0.781991 -0.378519\nv -0.24739 -0.767353 -0.363354\nv -0.241451 -0.720768 -0.382596\nv -0.268583 -0.7146 -0.363898\nv -0.251221 -0.79851 -0.377096\nv -0.273469 -0.798422 -0.39191\nv -0.263188 -0.827716 -0.377482\nv -0.25326 -0.811514 -0.363354\nv -0.282466 -0.829192 -0.392033\nv -0.274997 -0.828366 -0.372615\nv -0.275489 -0.81487 -0.357748\nv -0.239852 -0.749868 -0.402822\nv -0.257881 -0.783801 -0.405107\nv -0.234703 -0.689839 -0.458511\nv -0.328454 -0.660264 -0.488051\nv -0.367167 -0.637666 -0.455101\nv -0.388641 -0.741943 -0.435631\nv -0.376199 -0.631515 -0.395108\nv -0.400098 -0.749288 -0.367958\nv -0.383721 -0.823042 -0.261308\nv -0.341229 -0.632657 -0.35462\nv -0.362352 -0.751995 -0.321882\nv -0.42405 -0.853284 -0.300847\nv -0.350174 -0.740432 -0.472639\nv -0.374196 -0.81292 -0.477929\nv -0.319228 -0.757776 -0.318754\nv -0.282642 -0.767582 -0.344621\nv -0.337117 -0.824061 -0.251221\nv -0.378642 -0.839771 -0.211243\nv -0.346519 -0.841335 -0.204056\nv -0.384265 -0.849313 -0.179577\nv -0.353566 -0.852177 -0.173321\nv -0.398341 -0.84731 -0.154711\nv -0.351914 -0.850033 -0.14466\nv -0.403841 -0.868169 -0.125505\nv -0.359206 -0.872685 -0.119829\nv -0.407268 -0.896601 -0.109988\nv -0.428268 -0.941078 -0.0731733\nv -0.385618 -0.936808 -0.0554072\nv -0.427512 -0.988226 -0.0347064\nv -0.40834 -0.985977 -0.0265877\nv -0.418638 -1 -0.0334763\nv -0.409447 -0.922574 -0.0527537\nv -0.368555 -0.903806 -0.104699\nv -0.420114 -0.954082 -0.0233543\nv -0.420711 -0.984887 -0.0225108\nv -0.380716 -0.952641 -0.0529294\nv -0.34615 -0.890767 -0.143553\nv -0.322708 -0.865621 -0.209732\nv -0.305029 -0.838523 -0.25282\nv -0.394229 -0.880435 -0.21279\nv -0.40298 -0.884916 -0.172548\nv -0.339911 -0.878431 -0.173321\nv -0.340333 -0.942467 -0.116332\nv -0.372263 -0.974871 -0.0709767\nv -0.418111 -0.930781 -0.135627\nv -0.368063 -0.961059 -0.140565\nv -0.395266 -0.987225 -0.105613\nv -0.412768 -0.970864 -0.0551963\nv -0.405546 -0.98306 -0.078041\nv -0.434401 -0.949988 -0.0829438\nv -0.430183 -0.963326 -0.099269\nv -0.400661 -0.968861 -0.0308228\nv -0.415563 -0.977208 -0.0443539\nv -0.43173 -0.974168 -0.0451095\nv -0.224142 -0.382578 -0.183021\nv -0.280744 -0.362475 -0.179102\nv -0.344762 -0.376305 -0.133308\nv -0.175869 -0.418251 -0.162514\nv -0.151408 -0.46742 -0.0904298\nv -0.409061 -0.832689 -0.359452\nv -0.436527 -0.875479 -0.277827\nv -0.409078 -0.870471 -0.240203\nv -0.391171 -0.957931 -0.0474467\nv -0.428619 -0.95236 -0.0712403\nv -0.392612 -0.924736 -0.175588\nv -0.355446 -0.943785 -0.177661\nv -0.330826 -0.922803 -0.173795\nv -0.319826 -0.938302 -0.223263\nv -0.383246 -0.93419 -0.226075\nv -0.347784 -0.955277 -0.227568\nv -0.480494 -0.870594 -0.26296\nv -0.466014 -0.867518 -0.233859\nv -0.496784 -0.864953 -0.258479\nv -0.484782 -0.858591 -0.230099\nv -0.519383 -0.873036 -0.246775\nv -0.51021 -0.867501 -0.220557\nv -0.533916 -0.892402 -0.2382\nv -0.52476 -0.883633 -0.21532\nv -0.587987 -0.92753 -0.202176\nv -0.573015 -0.93013 -0.187977\nv -0.603399 -0.965013 -0.185112\nv -0.587759 -0.96807 -0.171968\nv -0.586863 -0.943134 -0.216779\nv -0.594753 -0.980635 -0.201314\nv -0.598478 -0.987506 -0.180719\nv -0.494025 -0.905792 -0.259076\nv -0.524075 -0.915598 -0.247777\nv -0.576249 -0.955312 -0.233332\nv -0.549134 -0.94679 -0.181686\nv -0.488437 -0.883668 -0.221137\nv -0.471251 -0.883334 -0.227797\nv -0.500105 -0.92268 -0.200366\nv -0.542315 -0.9693 -0.213774\nv -0.510175 -0.93665 -0.225196\nv -0.579254 -0.973834 -0.194496\nv -0.562577 -0.97654 -0.205005\nv -0.574913 -0.952009 -0.179278\nv -0.587583 -0.966858 -0.20931\nv -0.586318 -0.976945 -0.189242\nv -0.474519 -0.931536 -0.233244\nv -0.471128 -0.917724 -0.215742\nv -0.419358 -0.91319 -0.226532\nv -0.434822 -0.917548 -0.305978\nv -0.403086 -0.886515 -0.359224\nv -0.386269 -0.851984 -0.4263\nv -0.313341 -0.810829 -0.460127\nv -0.316188 -0.843602 -0.441131\nv -0.336397 -0.967947 -0.279725\nv -0.260763 -0.938847 -0.308069\nv -0.331336 -0.942554 -0.324307\nv -0.331266 -0.886444 -0.370506\nv -0.42948 -0.944575 -0.319878\nv -0.402225 -0.95707 -0.275103\nv -0.289021 -0.878203 -0.359347\nv -0.281288 -0.843813 -0.282975\nv -0.270323 -0.859347 -0.334481\nv -0.24479 -0.877289 -0.243893\nv -0.248199 -0.887095 -0.304731\nv -0.253963 -0.845781 -0.223509\nv -0.303676 -0.75029 -0.466717\nv -0.289108 -0.850455 -0.208502\nv -0.260588 -0.844603 -0.187889\nv -0.228816 -0.848575 -0.203423\nv -0.206727 -0.855376 -0.172688\nv -0.241908 -0.847099 -0.155889\nv -0.203898 -0.870436 -0.156785\nv -0.234949 -0.862159 -0.140811\nv -0.19541 -0.921221 -0.103943\nv -0.216146 -0.921098 -0.103697\nv -0.198591 -0.962798 -0.0907462\nv -0.213334 -0.965487 -0.0940499\nv -0.205005 -0.982515 -0.0964222\nv -0.188469 -0.935121 -0.118687\nv -0.196746 -0.973518 -0.107019\nv -0.22669 -0.884125 -0.210769\nv -0.20989 -0.902594 -0.18202\nv -0.244526 -0.94744 -0.12315\nv -0.259902 -0.893702 -0.160827\nv -0.264629 -0.859558 -0.181721\nv -0.263751 -0.886901 -0.173022\nv -0.23342 -0.952659 -0.161125\nv -0.195779 -0.953432 -0.152198\nv -0.238007 -0.917232 -0.176185\nv -0.212333 -0.960742 -0.113608\nv -0.223579 -0.965434 -0.138123\nv -0.22379 -0.944452 -0.106509\nv -0.197817 -0.949302 -0.126999\nv -0.21047 -0.968914 -0.104084\nv -0.240818 -0.908744 -0.186219\nv -0.307929 -0.903314 -0.210066\nv -0.240484 -0.924402 -0.250308\nv -0.278231 -0.957896 -0.25159\nv -0.268987 -0.933399 -0.223456\nv -0.0218079 -0.117158 0.00576388\nv -0.00451622 -0.172354 -0.017485\nv 0.0111588 -0.124943 0.00857553\nv 0.0238112 -0.188258 -0.0190665\nv -0.0554599 -0.00961236 0.0186623\nv -0.0614171 -0.0116157 0.0119144\nv -0.110744 -0.0432116 0.0195761\nv -0.0848944 0.0545812 0.00748601\nv 0.00130039 -0.0290304 0.0240924\nv 0.0115981 0.0488525 -0.00326856\nv -0.12735 -0.033775 0.0174498\nv -0.137437 0.00885669 0.00472708\nv -0.171651 0.0863529 -0.0459706\nv -0.154799 0.0739816 -0.0121253\nv -0.236794 0.11208 -0.127719\nv -0.00829438 -0.198556 -0.0915369\nv 0.00970021 -0.244807 -0.25275\nv -0.00630865 -0.252961 -0.285629\nv -0.126911 -0.230521 -0.328032\nv -0.0404702 -0.290022 -0.341757\nv -0.15805 -0.313658 -0.37764\nv -0.083225 -0.350771 -0.392753\nv -0.256054 -0.452518 -0.493463\nv -0.20815 -0.500773 -0.534478\nv -0.38785 -0.571943 -0.536727\nv -0.35831 -0.604172 -0.591642\nv -0.540699 -0.660106 -0.534829\nv -0.543475 -0.680473 -0.592679\nv -0.683214 -0.726338 -0.418321\nv -0.724001 -0.750641 -0.408744\nv -0.724388 -0.787808 -0.271782\nv -0.748234 -0.790022 -0.2689\nv -0.211313 -0.245001 -0.433381\nv -0.302499 -0.393263 -0.526043\nv -0.427301 -0.509964 -0.533318\nv -0.554036 -0.612449 -0.514199\nv -0.680245 -0.695516 -0.410888\nv -0.737585 -0.772502 -0.255017\nv -0.178171 -0.180192 -0.381313\nv -0.188715 -0.170773 -0.417759\nv -0.202053 -0.145064 -0.39212\nv -0.206551 -0.151056 -0.425157\nv -0.221031 -0.117808 -0.435455\nv -0.164482 -0.136752 -0.357045\nv -0.188293 -0.11888 -0.377025\nv -0.176484 -0.109971 -0.401733\nv -0.181826 -0.108793 -0.358328\nv -0.109865 -0.184638 -0.285313\nv -0.154623 -0.103557 -0.339982\nv -0.202105 -0.071293 -0.404562\nv -0.154992 -0.0832074 -0.364443\nv -0.237673 -0.218747 -0.499807\nv -0.233719 -0.194953 -0.539715\nv -0.245194 -0.22676 -0.551506\nv -0.263188 -0.209345 -0.57783\nv -0.23089 -0.256071 -0.488666\nv -0.233016 -0.250308 -0.535919\nv -0.207043 -0.223298 -0.566162\nv -0.206217 -0.240853 -0.557498\nv -0.18462 -0.187748 -0.548993\nv -0.212754 -0.192264 -0.556426\nv -0.241556 -0.20678 -0.578357\nv -0.20685 -0.173057 -0.491934\nv -0.20866 -0.138597 -0.47705\nv -0.218413 -0.113661 -0.525147\nv -0.215232 -0.118546 -0.496538\nv -0.224581 -0.051998 -0.457843\nv -0.201227 -0.0994096 -0.483007\nv -0.237444 -0.0798334 -0.476435\nv -0.190437 -0.1364 -0.440147\nv -0.238042 -0.0523847 -0.479932\nv -0.225038 -0.0361825 -0.473184\nv -0.204144 -0.026781 -0.448248\nv -0.221506 -0.00962994 -0.477858\nv -0.204899 -0.0453907 -0.494746\nv -0.219309 -0.0796226 -0.49884\nv -0.252188 -0.0474643 -0.521035\nv -0.151654 -0.104471 -0.517538\nv -0.186817 -0.100341 -0.495466\nv -0.169595 -0.0330721 -0.360524\nv -0.213686 0.0203142 -0.414912\nv -0.201771 -0.0223878 -0.43129\nv -0.22727 0.0430359 -0.42572\nv -0.168734 -0.0770218 -0.383475\nv -0.183689 -0.0212104 -0.453045\nv -0.137332 -0.0663023 -0.501599\nv -0.112677 -0.028714 -0.463185\nv -0.295294 -0.356096 -0.576424\nv -0.431079 -0.483569 -0.569009\nv -0.567901 -0.587179 -0.534109\nv -0.692089 -0.676326 -0.409816\nv -0.255263 -0.307103 -0.551752\nv -0.257512 -0.329192 -0.491811\nv -0.271079 -0.273082 -0.567005\nv -0.224423 -0.265631 -0.564756\nv -0.246758 -0.275191 -0.500949\nv -0.250712 -0.3106 -0.564299\nv -0.247461 -0.264401 -0.533986\nv -0.239676 -0.282202 -0.568868\nv -0.745598 -0.785278 -0.25282\nv -0.17058 -0.14835 -0.537219\nv -0.179348 -0.114329 -0.518979\nv -0.191597 -0.00715217 -0.30814\nv -0.223983 0.0790953 -0.344287\nv -0.260517 0.131884 -0.356869\nv -0.214125 0.0328788 -0.389818\nv -0.18383 0.0240396 -0.427231\nv -0.253137 0.104137 -0.375637\nv -0.27867 0.149861 -0.385531\nv -0.218202 0.115418 -0.406548\nv -0.113731 0.0165009 -0.454627\nv -0.106632 0.064545 -0.41971\nv -0.0471831 0.182318 0.00604504\nv -0.0370084 0.130549 -0.00416479\nv 0.0283977 0.118494 -0.0347767\nv -0.0450743 0.109514 0.0105788\nv -0.0674973 0.0732787 0.00590445\nv -0.0687977 0.109936 0.020279\nv -0.0988824 0.0630865 0.00678309\nv -0.05669 0.128475 -0.0250062\nv -0.0825396 0.0679893 -0.0156926\nv -0.0641233 0.105279 -0.0112818\nv -0.0997083 0.0442132 -0.00295226\nv -0.0515236 0.26368 -0.0284329\nv -0.0974063 0.409869 0.0412259\nv 0.0925034 0.404755 -0.0309634\nv 0.0899027 0.504077 -0.0140231\nv -0.210681 0.101466 -0.0606263\nv -0.165009 0.0900959 -0.0308931\nv -0.230907 0.108987 -0.0835589\nv -0.250554 0.145661 -0.116578\nv -0.200893 0.125663 -0.036534\nv -0.23762 0.0883387 -0.157453\nv -0.243384 0.101887 -0.219081\nv -0.228078 0.108495 -0.156838\nv -0.242119 0.0460057 -0.217148\nv -0.268724 0.124398 -0.177169\nv -0.267652 0.106948 -0.200401\nv -0.25869 0.0981092 -0.257196\nv -0.259709 0.086968 -0.311461\nv -0.245299 0.0941025 -0.28468\nv -0.25695 0.14162 -0.257354\nv -0.196306 0.118845 -0.202369\nv -0.273732 0.14603 -0.312094\nv -0.215056 0.115348 -0.267634\nv -0.170527 0.115172 -0.243489\nv -0.228342 0.113608 -0.289723\nv -0.273556 0.141321 -0.210171\nv -0.227094 0.121639 -0.194883\nv -0.245387 0.132816 -0.1839\nv -0.22669 0.12192 -0.242997\nv -0.203037 0.127825 -0.0755457\nv -0.162478 0.071293 -0.0233016\nv -0.199311 0.0553193 -0.0644221\nv -0.152181 0.114505 -0.0470777\nv -0.147137 0.0883738 -0.0385548\nv -0.02353 0.169859 -0.00704673\nv -0.0356201 0.185991 -0.0167645\nv -0.0239518 0.218184 -0.0281517\nv 0.0821706 0.347187 -0.041015\nv -0.0566197 0.318332 0.0103152\nv -0.0683056 0.370277 0.0193301\nv -0.0364461 0.218097 -0.0120901\nv -0.043317 0.219098 -0.0370436\nv -0.05307 0.172354 -0.0321056\nv -0.0248304 0.275858 -0.0146382\nv 0.0609602 0.245018 -0.0526834\nv -0.0702914 0.389133 0.0130566\nv -0.14104 0.178927 -0.0426493\nv -0.111201 0.22256 -0.0572172\nv -0.142305 0.331863 -0.0111939\nv -0.191509 0.13213 -0.126981\nv -0.171599 0.222419 -0.119566\nv -0.176273 0.291973 -0.0724353\nv -0.199294 0.174323 -0.243278\nv -0.218009 0.268003 -0.221312\nv -0.197079 0.350789 -0.0400134\nv -0.255931 0.328243 -0.16898\nv -0.265297 0.32204 -0.262398\nv -0.295716 0.36794 -0.250501\nv -0.238815 0.310301 -0.361508\nv -0.164552 0.174815 -0.262345\nv -0.192721 0.227779 -0.324852\nv -0.225512 0.270411 -0.334271\nv -0.206534 0.262538 -0.357906\nv -0.28642 0.334306 -0.245914\nv -0.287175 0.361561 -0.288827\nv -0.101905 0.20634 -0.336221\nv -0.211928 0.115524 -0.296419\nv -0.0737884 0.120304 -0.331195\nv -0.224686 0.145942 -0.351773\nv -0.153921 0.104348 -0.353601\nv -0.154729 0.134432 -0.300109\nv -0.0861421 0.470161 0.0632095\nv -0.0696236 0.420026 0.0354971\nv -0.116174 0.456788 0.065986\nv -0.099269 0.427459 0.0370084\nv -0.129213 0.440973 0.0426493\nv -0.0952799 0.419798 0.0239693\nv -0.104365 0.403015 0.0261659\nv -0.0480969 0.358345 0.0105964\nv -0.0635434 0.366148 0.00333882\nv -0.0767054 0.349594 -0.00279411\nv -0.216937 0.325537 -0.317963\nv -0.262064 0.35339 -0.277862\nv -0.251415 0.353232 -0.298896\nv -0.214248 0.287474 -0.268988\nv -0.135996 0.272449 -0.331441\nv -0.185991 0.352002 -0.366183\nv -0.177802 0.298334 -0.299353\nv -0.113152 0.272098 -0.350912\nv -0.134292 0.34789 -0.371683\nv -0.158419 0.209749 -0.320775\nv -0.144818 0.381788 -0.391628\nv -0.21887 0.291006 -0.323709\nv -0.271307 0.36982 -0.273662\nv -0.261308 0.383703 -0.295646\nv -0.297684 0.401206 -0.397586\nv -0.303553 0.405441 -0.369926\nv -0.300302 0.425087 -0.348329\nv -0.40841 0.456244 -0.431378\nv -0.39697 0.473869 -0.44389\nv -0.407022 0.47292 -0.407338\nv -0.474027 0.488859 -0.474607\nv -0.452114 0.485819 -0.465645\nv -0.470091 0.486293 -0.452764\nv -0.444593 0.465276 -0.442396\nv -0.434576 0.480617 -0.454891\nv -0.44758 0.479703 -0.426159\nv -0.460567 0.471971 -0.460742\nv -0.294855 0.443574 -0.346009\nv -0.3969 0.493867 -0.432872\nv -0.403051 0.493762 -0.411802\nv -0.461586 0.496538 -0.458528\nv -0.439356 0.495923 -0.443749\nv -0.444435 0.494289 -0.432222\nv -0.270253 0.463361 -0.397058\nv -0.258426 0.427653 -0.419183\nv -0.285242 0.464714 -0.364232\nv -0.250185 0.415 -0.287913\nv -0.163884 0.398587 -0.370242\nv -0.219731 0.462746 -0.353495\nv -0.188961 0.445067 -0.35411\nv -0.361104 0.568288 -0.308245\nv -0.354374 0.574403 -0.367589\nv -0.300671 0.599989 -0.392384\nv -0.312603 0.471637 -0.212051\nv -0.386058 0.625136 -0.27078\nv -0.440551 0.614206 -0.365181\nv -0.428162 0.646558 -0.388518\nv -0.435631 0.65566 -0.290444\nv -0.412997 0.68636 -0.368063\nv -0.319984 0.679524 -0.371999\nv -0.342003 0.658823 -0.283327\nv -0.419024 0.697079 -0.32218\nv -0.347538 0.705813 -0.334007\nv -0.150898 0.625716 -0.381893\nv -0.217552 0.679577 -0.296735\nv -0.172671 0.673479 -0.332232\nv -0.117756 0.687766 -0.318455\nv -0.274593 0.646874 -0.386726\nv -0.281798 0.677837 -0.329421\nv -0.351615 0.679278 -0.32863\nv -0.320616 0.659386 -0.380259\nv -0.148614 0.556022 -0.396496\nv -0.315696 0.684708 -0.327171\nv -0.223491 0.65812 -0.237216\nv -0.345218 0.671054 -0.308368\nv -0.278635 0.65436 -0.281763\nv -0.268724 0.631164 -0.229431\nv -0.307103 0.626401 -0.26108\nv -0.190244 0.68701 -0.250308\nv -0.138263 0.694531 -0.272678\nv -0.22191 0.704495 -0.291621\nv -0.450023 0.628686 -0.313236\nv -0.43013 0.694039 -0.294784\nv -0.524321 0.683882 -0.367483\nv -0.508716 0.697167 -0.386058\nv -0.526465 0.725723 -0.31835\nv -0.496134 0.739325 -0.369979\nv -0.524426 0.689189 -0.338225\nv -0.511616 0.739975 -0.314009\nv -0.56878 0.72973 -0.383703\nv -0.572558 0.782993 -0.358873\nv -0.575177 0.73994 -0.349489\nv -0.573753 0.771307 -0.338277\nv -0.503356 0.754279 -0.335097\nv -0.573753 0.768566 -0.379872\nv -0.6435 0.751379 -0.372492\nv -0.642481 0.760517 -0.362932\nv -0.631621 0.77621 -0.375321\nv -0.63633 0.76296 -0.380997\nv -0.659632 0.761062 -0.377588\nv -0.185622 0.524198 -0.384898\nv -0.195972 0.482902 -0.368678\nv -0.180772 0.441324 -0.45837\nv -0.208748 0.450216 -0.438776\nv -0.174727 0.536727 -0.443257\nv -0.207518 0.508523 -0.428971\nv -0.219696 0.522564 -0.519102\nv -0.21358 0.496345 -0.511967\nv -0.22379 0.498998 -0.504956\nv -0.212262 0.529558 -0.506203\nv -0.224054 0.519822 -0.500984\nv 0.0923629 0.459284 -0.0198397\nv -0.0165888 0.480195 0.0423329\nv -0.0253752 0.461832 0.0294521\nv 0.0173268 0.396935 0.00817136\nv 0.022792 0.347169 -0.0113345\nv 0.0708713 0.278617 -0.0503638\nv -0.0942256 0.492742 0.0723122\nv -0.144501 0.538379 0.0842617\nv -0.121007 0.498225 0.0578322\nv -0.17738 0.700137 -0.291727\nv -0.197835 0.689418 -0.27085\nv -0.094454 0.718676 -0.274576\nv -0.18643 0.712456 -0.219748\nv -0.132482 0.742681 -0.20374\nv -0.0662145 0.766668 -0.220293\nv -0.122079 0.76593 -0.171388\nv -0.022792 0.82566 -0.153393\nv -0.202527 0.718676 -0.194039\nv -0.172425 0.7327 -0.191245\nv -0.190349 0.696253 -0.212913\nv -0.191298 0.731575 -0.162039\nv -0.199786 0.700418 -0.184655\nv -0.187889 0.720293 -0.151794\nv -0.168893 0.765912 -0.128194\nv -0.118582 0.757196 -0.141215\nv -0.256001 0.688855 -0.215285\nv -0.252697 0.664183 -0.237655\nv -0.299336 0.51694 -0.317787\nv -0.33109 0.484132 -0.307191\nv -0.353232 0.496169 -0.348223\nv -0.305767 0.472376 -0.350227\nv -0.291217 0.558395 -0.371753\nv -0.192616 0.558518 -0.389836\nv -0.173813 0.725266 -0.155959\nv -0.1519 0.741662 -0.109338\nv -0.171072 0.73827 -0.132587\nv -0.101958 0.792395 -0.147788\nv -0.0465856 0.798352 -0.190982\nv -0.114364 0.756071 -0.102959\nv -0.118177 0.801937 -0.175553\nv -0.07479 0.79909 -0.172794\nv -0.109004 0.810284 -0.162285\nv -0.0652304 0.809756 -0.153991\nv -0.0105789 0.847556 -0.114452\nv -0.0680596 0.827646 -0.11881\nv -0.0867747 0.811689 -0.137051\nv -0.0922398 0.784522 -0.0962289\nv -0.119864 0.774751 -0.162531\nv -0.111921 0.777985 -0.16826\nv -0.214582 0.714283 -0.13814\nv -0.219661 0.734 -0.107862\nv -0.202914 0.686272 -0.107229\nv -0.233279 0.688785 -0.156662\nv -0.194514 0.694391 -0.0893579\nv -0.230028 0.679384 -0.12967\nv -0.233016 0.704812 -0.150951\nv -0.241205 0.703089 -0.115735\nv -0.219327 0.697378 -0.120075\nv -0.191702 0.721646 -0.109075\nv -0.160897 0.730977 -0.12113\nv -0.196763 0.675412 -0.0858961\nv -0.233033 0.661213 -0.112413\nv -0.0795698 0.802552 -0.103223\nv -0.0903596 0.821706 -0.135961\nv -0.0982849 0.783924 -0.165132\nv -0.103012 0.778863 -0.108723\nv -0.0882508 0.757337 -0.119337\nv -0.0494324 0.624433 -0.0333006\nv -0.158525 0.619741 -0.0540541\nv -0.0821179 0.708836 -0.110832\nv -0.153165 0.686202 -0.0551963\nv -0.0980037 0.604699 -0.0436334\nv -0.0140407 0.523776 0.0235476\nv -0.112923 0.520789 0.0663375\nv -0.188521 0.609057 -0.033652\nv -0.150652 0.559062 0.0299968\nv -0.222982 0.630021 0.0142516\nv -0.202703 0.545865 0.0467613\nv -0.174129 0.52165 0.0595192\nv -0.186993 0.649211 -0.0749482\nv -0.211805 0.605964 -0.0708713\nv -0.226531 0.680051 -0.0760728\nv -0.236443 0.616016 -0.0921168\nv -0.332777 0.47401 -0.181334\nv -0.361596 0.500176 -0.114786\nv -0.383158 0.42108 -0.117474\nv -0.276632 0.657435 -0.172073\nv -0.331793 0.511493 -0.219977\nv -0.39683 0.498295 -0.216146\nv -0.256599 0.664658 -0.123766\nv -0.271869 0.626226 -0.129916\nv -0.317717 0.629442 -0.1574\nv -0.315134 0.531192 -0.134397\nv -0.332689 0.496116 -0.155783\nv -0.355938 0.566777 -0.148174\nv -0.329842 0.531139 -0.115998\nv -0.348276 0.502003 -0.126577\nv -0.32081 0.521228 -0.148912\nv -0.39495 0.413225 0.045953\nv -0.403332 0.363143 -0.0164833\nv -0.399817 0.398991 -0.0650371\nv -0.392489 0.450181 -0.00407692\nv -0.346308 0.43491 0.123959\nv -0.367518 0.474801 0.0462341\nv -0.332373 0.535427 -0.0382912\nv -0.28171 0.441078 0.132236\nv -0.227849 0.465768 0.117439\nv -0.427459 0.387095 0.09108\nv -0.435789 0.338453 0.0306997\nv -0.381436 0.404456 0.137543\nv -0.445981 0.345218 0.129793\nv -0.40103 0.37815 0.163304\nv -0.343022 0.395828 0.198415\nv -0.247057 0.387112 0.149193\nv -0.301111 0.351193 0.208554\nv -0.502935 0.347099 0.210927\nv -0.414561 0.369135 0.26528\nv -0.472393 0.369047 0.222507\nv -0.525076 0.289671 0.226672\nv -0.448547 0.317436 0.0624011\nv -0.445647 0.289442 0.112765\nv -0.417601 0.287597 0.0317717\nv -0.29619 0.500808 0.109813\nv -0.37685 0.487435 -0.0773381\nv -0.271483 0.550118 0.0389062\nv -0.258215 0.567093 0.00386601\nv -0.136998 0.472797 0.0573753\nv -0.180543 0.516308 0.092644\nv -0.501213 0.341177 0.366253\nv -0.390398 0.318877 0.236513\nv -0.372615 0.303729 0.239026\nv -0.359189 0.311127 0.233859\nv -0.39017 0.326925 0.273469\nv -0.403455 0.34926 0.222015\nv -0.507029 0.287281 0.188065\nv -0.476048 0.350719 0.460285\nv -0.506801 0.306312 0.424876\nv -0.502144 0.329262 0.430622\nv -0.513303 0.304643 0.4609\nv -0.509595 0.322251 0.46554\nv -0.506063 0.31719 0.482867\nv -0.510579 0.288757 0.368063\nv -0.525006 0.295276 0.294152\nv -0.514884 0.339683 0.306224\nv -0.464573 0.372861 0.314378\nv -0.525375 0.258321 0.270218\nv -0.509138 0.244122 0.192212\nv -0.5223 0.242857 0.214107\nv -0.42043 0.246863 0.106316\nv -0.508576 0.232155 0.282606\nv -0.497733 0.22024 0.196499\nv -0.510807 0.219362 0.221734\nv -0.505869 0.288423 0.468931\nv -0.497188 0.29141 0.425948\nv -0.495291 0.25876 0.376164\nv -0.477788 0.219239 0.165835\nv -0.49327 0.246723 0.15921\nv -0.267037 0.352072 -0.149562\nv -0.309581 0.383808 -0.237778\nv -0.241785 0.297719 0.0423857\nv -0.302042 0.39683 -0.224282\nv -0.285277 0.271711 -0.000948948\nv -0.30698 0.390785 -0.281306\nv -0.316698 0.406249 -0.27512\nv -0.2731 0.385249 -0.293677\nv -0.263452 0.412821 -0.286367\nv -0.286156 0.401961 -0.303887\nv -0.314079 0.416002 -0.307226\nv -0.318156 0.421854 -0.302042\nv -0.280621 0.424296 -0.28403\nv -0.311935 0.428074 -0.302042\nv -0.304098 0.422187 -0.306839\nv -0.307331 0.457052 -0.262398\nv -0.370822 0.327382 -0.0895688\nv -0.343953 0.366218 -0.148139\nv -0.300671 0.491583 -0.277616\nv -0.335659 0.290637 -0.0737357\nv -0.320476 0.46496 -0.312111\nv -0.338066 0.474344 -0.340579\nv -0.297455 0.435719 -0.267617\nv -0.256634 0.516343 -0.333726\nv -0.263557 0.467613 -0.353636\nv -0.267793 0.493428 -0.353425\nv -0.301357 0.455242 -0.326503\nv -0.334429 0.500176 -0.33768\nv -0.309809 0.493182 -0.353495\nv -0.421098 0.275489 0.0633149\nv -0.386567 0.326714 -0.0402945\nv -0.335378 0.285875 -0.0232489\nv -0.203247 0.386761 0.0166415\nv -0.149896 0.414297 0.0263241\nv -0.167258 0.475011 0.0974941\nv -0.148438 0.479405 0.0743682\nv -0.35274 0.258619 0.207799\nv -0.291727 0.300443 0.118898\nv -0.249025 0.347099 0.0987418\nv -0.178312 0.408604 -0.0285207\nv -0.208185 0.421116 0.0755808\nv -0.363195 0.231136 0.119407\nv -0.381454 0.243911 0.0394686\nv -0.444241 0.202755 0.242646\nv -0.429023 0.199294 0.184251\nv -0.465821 0.260869 0.409061\nv -0.465557 0.22973 0.327733\nv -0.415211 0.276596 0.412751\nv -0.393597 0.231311 0.322954\nv -0.456859 0.366745 0.377236\nv -0.379275 0.297403 0.336239\nv -0.404 0.318508 0.418778\nv -0.410941 0.343268 0.465909\nv -0.372035 0.293062 0.278196\nv -0.364689 0.249991 0.295505\nv -0.381225 0.262714 0.347626\nv -0.322198 0.264489 0.169402\nv -0.3203 0.246318 0.0940498\nv -0.378115 0.221892 0.213018\nv -0.356131 0.254033 0.246986\nv -0.470144 0.325098 0.522862\nv -0.395406 0.31784 0.498172\nv -0.395582 0.311356 0.464889\nv -0.529013 0.265543 0.56031\nv -0.496521 0.275208 0.59101\nv -0.453555 0.274734 0.607458\nv -0.422012 0.276386 0.605578\nv -0.545127 0.249148 0.535286\nv -0.449671 0.259937 0.639388\nv -0.425755 0.262978 0.637648\nv -0.453432 0.243595 0.685306\nv -0.43918 0.246811 0.686764\nv -0.458844 0.243296 0.700418\nv -0.441359 0.248445 0.704003\nv -0.461111 0.233473 0.724071\nv -0.446245 0.234597 0.726356\nv -0.46684 0.212385 0.754261\nv -0.467807 0.186237 0.773363\nv -0.442291 0.188012 0.777001\nv -0.454803 0.197378 0.773047\nv -0.446543 0.214723 0.759059\nv -0.37337 0.244649 0.570081\nv -0.382438 0.288862 0.488543\nv -0.416617 0.235072 0.660212\nv -0.429603 0.229765 0.707535\nv -0.437212 0.17499 0.772731\nv -0.433434 0.201701 0.754701\nv -0.465382 0.163761 0.788089\nv -0.444066 0.169226 0.791094\nv -0.457614 0.177345 0.796067\nv -0.455699 0.149299 0.809458\nv -0.385355 0.257214 0.483657\nv -0.438987 0.241152 0.490282\nv -0.41428 0.220363 0.525305\nv -0.393983 0.231838 0.499772\nv -0.421625 0.273398 0.459706\nv -0.195111 0.17195 -0.13148\nv -0.221857 0.217675 -0.229484\nv -0.224985 0.237954 -0.304274\nv -0.218975 0.267494 -0.169472\nv -0.216445 0.599743 -0.0423681\nv -0.249605 0.611078 -0.0264823\nv -0.246072 0.579904 -0.0156047\nv -0.222595 0.611429 -0.0137947\nv -0.304256 0.549028 -0.0794644\nv -0.334798 0.551559 -0.0657927\nv -0.307472 0.551383 -0.0465153\nv -0.289021 0.567603 -0.102098\nv -0.29243 0.56096 -0.0901838\nv -0.269251 0.558887 -0.0647735\nv -0.25876 0.58015 -0.0920817\nv -0.279391 0.611588 -0.0779356\nv -0.273152 0.576776 -0.102801\nv -0.297561 0.552402 -0.12496\nv -0.320775 0.592855 -0.0986539\nv -0.326837 0.535023 -0.101132\nv -0.276948 0.558553 -0.0438091\nv -0.299564 0.5724 -0.066109\nv -0.230362 0.584156 -0.0659333\nv -0.242593 0.581556 -0.0777423\nv -0.228728 0.610463 -0.0642639\nv -0.233438 0.59825 -0.0768109\nv -0.257635 0.570063 -0.044758\nv -0.272713 0.570133 -0.0577444\nv -0.255369 0.562401 -0.0579904\nv -0.247812 0.568552 -0.0716796\nv -0.261466 0.562594 -0.0362001\nv -0.32877 0.535163 -0.0792535\nv -0.470899 0.192792 0.742171\nv -0.471145 0.174586 0.765895\nv -0.463132 0.2243 0.646997\nv -0.468 0.226215 0.696974\nv -0.4415 0.16334 0.76419\nv -0.438056 0.191192 0.738885\nv -0.46264 0.184726 0.733262\nv -0.46257 0.162039 0.760974\nv -0.444698 0.163533 0.787703\nv -0.463554 0.161196 0.785207\nv -0.450884 0.150898 0.803694\nv -0.459003 0.147823 0.801163\nv -0.432099 0.208607 0.696271\nv -0.425474 0.212561 0.647243\nv -0.459284 0.201719 0.689804\nv -0.454363 0.142041 0.808228\nv -0.3413 0.250958 0.508997\nv -0.347608 0.255158 0.535497\nv -0.344744 0.220873 0.540681\nv -0.340702 0.215179 0.51557\nv -0.339788 0.207184 0.543915\nv -0.334727 0.203265 0.518118\nv -0.333937 0.192387 0.547271\nv -0.329825 0.18694 0.519928\nv -0.314202 0.176537 0.534865\nv -0.309756 0.176343 0.553826\nv -0.30872 0.165888 0.522405\nv -0.367571 0.23762 0.495044\nv -0.347204 0.191737 0.506976\nv -0.314027 0.149158 0.516975\nv -0.281728 0.160493 0.547042\nv -0.29004 0.156785 0.559484\nv -0.287685 0.154465 0.530981\nv -0.266106 0.136717 0.553966\nv -0.272467 0.130513 0.559941\nv -0.271588 0.128633 0.545162\nv -0.352986 0.197027 0.551928\nv -0.321671 0.166995 0.561698\nv -0.328946 0.144378 0.533599\nv -0.329913 0.151601 0.555882\nv -0.311479 0.14002 0.537167\nv -0.312902 0.145872 0.557287\nv -0.291252 0.150125 0.53193\nv -0.297596 0.152585 0.560995\nv -0.364988 0.1839 0.546357\nv -0.364443 0.178645 0.521316\nv -0.389098 0.217007 0.557797\nv -0.265596 0.126419 0.553035\nv -0.401311 0.24305 0.616209\nv -0.456472 0.223034 0.53186\nv -0.407005 0.219362 0.605578\nv -0.428812 0.21105 0.570239\nv -0.484782 0.249886 0.629547\nv -0.501388 0.247215 0.62185\nv -0.512002 0.199048 0.670843\nv -0.497101 0.202404 0.678136\nv -0.518223 0.179682 0.684655\nv -0.498524 0.184954 0.695305\nv -0.513742 0.153727 0.686747\nv -0.492655 0.152339 0.696675\nv -0.505114 0.106562 0.691034\nv -0.489702 0.109022 0.701262\nv -0.49146 0.0842793 0.696974\nv -0.498594 0.0740871 0.680754\nv -0.472745 0.0792535 0.694707\nv -0.468896 0.221295 0.643184\nv -0.478913 0.169789 0.684462\nv -0.476857 0.112396 0.694057\nv -0.461305 0.0847362 0.683074\nv -0.481742 0.0503462 0.689716\nv -0.483482 0.0493621 0.669525\nv -0.465733 0.0555653 0.684198\nv -0.466594 0.0331951 0.668629\nv -0.469564 0.0414192 0.660458\nv -0.462535 0.0429129 0.668032\nv -0.517169 0.166186 0.667979\nv -0.507152 0.109848 0.668524\nv -0.495783 0.0758795 0.664991\nv -0.50854 0.214195 0.619091\nv -0.461516 0.0807823 0.667944\nv -0.469177 0.118986 0.676133\nv -0.491846 0.114803 0.656978\nv -0.481812 0.0766703 0.653534\nv -0.465136 0.0619618 0.679278\nv -0.480354 0.0565318 0.664781\nv -0.501898 0.157101 0.654061\nv -0.47575 0.165062 0.668734\nv -0.457544 0.197536 0.633764\nv -0.461832 0.0351808 0.660669\nv -0.521843 0.23878 0.604822\nv -0.535708 0.235441 0.591115\nv -0.545373 0.173848 0.626894\nv -0.531561 0.178681 0.634169\nv -0.547605 0.158981 0.631129\nv -0.533265 0.164534 0.643078\nv -0.535866 0.131515 0.627245\nv -0.523723 0.136154 0.637472\nv -0.51267 0.0994974 0.608776\nv -0.499649 0.103276 0.616789\nv -0.497206 0.0910976 0.602836\nv -0.498454 0.0871964 0.588919\nv -0.479756 0.0949636 0.598496\nv -0.511633 0.210452 0.617193\nv -0.512863 0.154641 0.633044\nv -0.48791 0.115102 0.608583\nv -0.471268 0.10194 0.590026\nv -0.479176 0.076108 0.584842\nv -0.482445 0.0781815 0.570573\nv -0.466278 0.0845956 0.584209\nv -0.455014 0.072857 0.550979\nv -0.543493 0.145732 0.618125\nv -0.514884 0.105911 0.59036\nv -0.499016 0.0927846 0.576758\nv -0.536183 0.195322 0.585281\nv -0.472586 0.109725 0.578217\nv -0.493428 0.127139 0.601413\nv -0.509208 0.125716 0.590184\nv -0.4903 0.102081 0.568288\nv -0.465997 0.090342 0.577391\nv -0.482199 0.0845605 0.567866\nv -0.529663 0.153305 0.603926\nv -0.509366 0.155397 0.621253\nv -0.523407 0.185727 0.575036\nv -0.493358 0.190015 0.606825\nv -0.512319 0.245721 0.489158\nv -0.525762 0.224757 0.51926\nv -0.482339 0.268232 0.453801\nv -0.519998 0.277704 0.493621\nv -0.542175 0.230907 0.578305\nv -0.553667 0.225161 0.564053\nv -0.567128 0.187326 0.577795\nv -0.558342 0.186676 0.585703\nv -0.573103 0.16232 0.583172\nv -0.562788 0.163849 0.592574\nv -0.56516 0.146803 0.574122\nv -0.557551 0.144501 0.584209\nv -0.550856 0.125857 0.56205\nv -0.542702 0.126068 0.573121\nv -0.535761 0.121639 0.561558\nv -0.530788 0.128457 0.544055\nv -0.52295 0.125171 0.562963\nv -0.537184 0.193618 0.581854\nv -0.549432 0.168805 0.587073\nv -0.536885 0.134713 0.576126\nv -0.51998 0.132113 0.564457\nv -0.505641 0.12055 0.539398\nv -0.508962 0.127491 0.535163\nv -0.503567 0.128826 0.54887\nv -0.484958 0.135153 0.529733\nv -0.566425 0.169841 0.563157\nv -0.548782 0.139054 0.549397\nv -0.530471 0.137121 0.540224\nv -0.549889 0.211208 0.548132\nv -0.520754 0.139212 0.561575\nv -0.537096 0.140688 0.572137\nv -0.543686 0.146188 0.552701\nv -0.523723 0.147612 0.543159\nv -0.503005 0.133975 0.548729\nv -0.509085 0.131181 0.534882\nv -0.553316 0.166555 0.558412\nv -0.54228 0.167276 0.58073\nv -0.53685 0.196183 0.541577\nv -0.388834 0.216286 0.528855\nv -0.0103153 0.638052 -0.0238288\nv -0.0345658 0.629775 -0.019049\nv 0.00405933 0.557569 -0.00878644\nv 0.0426317 0.577356 -0.0394862\nv 0.0241099 0.566988 -0.0196816\nv 0.0076969 0.631867 0.00458649\nv 0.0390469 0.596791 -0.0216498\nv 0.00486768 0.58514 -0.0238639\nv -0.0266404 0.585053 -0.0152181\nv -0.0916424 0.719766 -0.0684989\nv -0.0402945 0.674287 -0.0183461\nv -0.103855 0.744473 -0.0815204\nv -0.0429129 0.848452 -0.0981092\nv -0.092398 0.884441 -0.0697291\nv -0.125101 0.830369 -0.0901663\nv -0.108389 0.790391 -0.0504165\nv -0.0952272 0.788318 -0.00485012\nv -0.115524 0.871068 -0.115471\nv -0.0911679 0.938144 -0.114979\nv -0.0952272 0.926387 -0.137261\nv -0.107458 0.964485 -0.149984\nv -0.109584 0.95359 -0.159368\nv -0.0954029 0.825888 -0.120778\nv -0.0910625 0.856799 -0.136928\nv -0.078779 0.917917 -0.151337\nv -0.0947528 0.955014 -0.166274\nv -0.052947 0.868327 -0.112958\nv -0.0526658 0.925157 -0.137191\nv -0.0896039 0.964643 -0.158894\nv -0.0641057 0.949953 -0.146927\nv -0.097582 0.969968 -0.151285\nv -0.0716796 0.957878 -0.132165\nv -0.0365691 0.84977 -0.047148\nv -0.0555302 0.884968 -0.0781816\nv -0.0588339 0.934506 -0.1141\nv -0.0658454 0.862739 -0.127298\nv -0.0327733 0.832935 0.00599231\nv -0.0683056 0.893034 -0.0646856\nv -0.0804485 0.947018 -0.113644\nv -0.104031 0.965065 -0.165343\nv -0.0224757 0.610234 0.00912029\nv -0.0561277 0.648034 0.0549327\nv -0.0191193 0.588321 0.0233367\nv -0.0485186 0.620251 0.0886198\nv -0.0482726 0.623309 0.115998\nv -0.0187678 0.599937 0.0937335\nv -0.0111939 0.615418 0.124381\nv -0.0447756 0.661125 0.110357\nv -0.0671107 0.660106 0.104963\nv -0.0315257 0.609813 0.071293\nv 0.00829438 0.549204 0.0310863\nv 0.00829438 0.640758 0.159017\nv -0.00133554 0.652778 0.135381\nv -0.00307525 0.638421 0.128949\nv 0.000843496 0.625013 0.146575\nv -0.00405933 0.586089 0.126507\nv 0.0165712 0.584402 0.148438\nv 0.012301 0.563139 0.116912\nv 0.0242681 0.552736 0.138878\nv -0.0181703 0.606052 0.112361\nv -0.0501529 0.617685 0.105665\nv -0.0705549 0.653587 0.0789723\nv -0.0394159 0.614259 0.108108\nv -0.0376762 0.619654 0.117105\nv -0.0309809 0.634626 0.116315\nv -0.0120198 0.629986 0.123519\nv 0.00490282 0.650019 0.144993\nv 0.0281341 0.654096 0.164095\nv 0.0247953 0.667065 0.155414\nv 0.00774962 0.607616 0.146188\nv 0.0350051 0.632148 0.162514\nv 0.0241275 0.639616 0.163269\nv 0.0169754 0.648455 0.164447\nv 0.0116332 0.659175 0.155151\nv 0.0440727 0.604523 0.154764\nv 0.0376059 0.606843 0.15378\nv 0.0292588 0.630918 0.162496\nv 0.0313675 0.643763 0.16334\nv -0.000984079 0.652128 0.148297\nv 0.00660739 0.661266 0.158823\nv -0.0127755 0.658103 0.1435\nv 0.00296981 0.685341 0.155115\nv -0.0103328 0.673725 0.153516\nv -0.0257091 0.665835 0.126595\nv -0.0210171 0.705778 0.144431\nv -0.029663 0.683408 0.144045\nv -0.0126173 0.723966 0.131761\nv -0.106333 0.734756 -0.0590096\nv -0.1128 0.754437 -0.00653711\nv -0.0787966 0.707061 0.114751\nv 0.0330545 0.585211 0.153288\nv 0.0272555 0.599972 0.153182\nv 0.059115 0.557112 0.14835\nv 0.050434 0.58384 0.154606\nv 0.012547 0.636137 0.160159\nv 0.00590447 0.623168 0.153745\nv 0.0100868 0.612203 0.152216\nv 0.014111 0.610234 0.148807\nv 0.0298211 0.620919 0.146874\nv 0.014234 0.613046 0.149439\nv 0.0127755 0.626911 0.149492\nv 0.0188205 0.613767 0.151214\nv 0.0178716 0.633782 0.149844\nv 0.0405933 0.598707 0.154307\nv -0.120761 0.744948 0.0342846\nv -0.181984 0.660475 0.0333181\nv -0.162689 0.638931 -0.042825\nv -0.215812 0.575581 0.0540716\nv -0.178856 0.511844 0.0236355\nv -0.200981 0.54156 0.0800619\nv -0.135715 0.517749 0.0859312\nv -0.165958 0.54047 0.115787\nv -0.0240396 0.530735 0.175166\nv -0.0771272 0.523372 0.148016\nv -0.0928022 0.541525 0.164482\nv -0.12062 0.656592 0.0797455\nv -0.104875 0.687379 0.0964046\nv -0.143974 0.593382 0.0891119\nv -0.126155 0.710136 0.0755105\nv -0.0166591 0.53671 0.170421\nv -0.0740695 0.562841 0.150582\nv -0.142252 0.814308 -0.0267283\nv -0.170562 0.813236 0.0110709\nv -0.130865 0.792307 0.0589217\nv -0.174639 0.808491 -0.0442309\nv -0.196113 0.814607 -0.0249886\nv -0.21293 0.783485 -0.0637719\nv -0.103416 0.844709 0.0578498\nv -0.158683 0.850912 0.00551786\nv -0.188328 0.840544 -0.0316136\nv -0.206832 0.803852 -0.0627878\nv -0.129688 0.845078 -0.0156047\nv -0.0665483 0.818912 0.00741572\nv -0.121762 0.832021 -0.0222297\nv -0.162215 0.841142 -0.0418234\nv -0.194162 0.795276 -0.0576214\nv -0.208045 0.800706 -0.0498366\nv -0.0959126 0.758567 0.0898851\nv -0.0675851 0.843075 0.0246195\nv -0.0274488 0.815063 0.0534566\nv -0.077918 0.82942 0.0770042\nv -0.0649316 0.749359 0.111447\nv -0.101325 0.762995 0.0454258\nv -0.0159561 0.854989 -0.072119\nv -0.0170808 0.841458 -0.00147615\nv -0.0364461 0.783292 0.0993393\nv -0.0281693 0.75825 0.120725\nv -0.0181527 0.767669 0.117545\nv -0.0282747 0.799986 0.0745264\nv -0.026904 0.792166 0.0829438\nv -0.0282923 0.781218 0.102256\nv -0.0383615 0.830422 0.0836116\nv -0.0465856 0.861508 0.0766527\nv -0.0328788 0.813078 0.110129\nv -0.0438091 0.854075 0.0968263\nv -0.0117914 0.656328 0.133571\nv -0.0192598 0.641848 0.131462\nv -0.0913612 0.64473 -0.0213159\nv -0.0823288 0.621657 0.0387657\nv -0.176607 0.536112 0.00196813\nv -0.116262 0.556813 0.037026\nv -0.139581 0.586511 -0.015306\nv -0.103961 0.538326 0.0664078\nv -0.0602221 0.534583 0.120022\nv -0.0206305 0.520033 0.164868\nv -0.0187854 0.525902 0.156082\nv -0.131814 0.576618 0.104576\nv -0.0118617 0.526236 0.169139\nv 0.0568481 0.578094 -0.0518223\nv 0.0632095 0.595544 -0.0297157\nv 0.0492391 0.583787 0.00488523\nv 0.019418 0.53671 0.0464274\nv 0.0210347 0.533459 0.0674621\nv 0.0300496 0.528503 0.0214916\nv 0.0110885 0.550627 0.0621727\nv 0.020982 0.540945 0.0900784\nv 0.0417179 0.529276 0.106948\nv 0.0491337 0.519014 0.0846835\nv 0.0306646 0.519611 0.0811162\nv 0.0514884 0.507029 0.0627877\nv 0.0406811 0.510614 0.035585\nv 0.0437739 0.505325 0.0363406\nv 0.0385548 0.509823 0.0614698\nv 0.0329315 0.521246 0.0456015\nv 0.0592908 0.505729 0.0730679\nv 0.0708186 0.489052 0.0519629\nv 0.0542649 0.51035 0.0526658\nv 0.0745088 0.496292 0.0385372\nv 0.0665308 0.547886 0.0225459\nv 0.0700453 0.518135 0.0338804\nv 0.0848592 0.483815 0.0301726\nv -0.419446 0.356096 0.403086\nv -0.413717 0.363371 0.323393\nv 0.0299793 -0.116772 -0.00943663\nv 0.0278881 -0.117035 0.0023196\nv 0.0328261 -0.174323 -0.0231435\nv 0.0351457 -0.176607 -0.0447756\nv 0.0457597 -0.00630867 0.0128809\nv 0.0517872 -0.00905004 0.00576388\nv 0.107651 0.0463044 -0.031596\nv 0.102169 0.0571117 -0.0239869\nv 0.0152181 -0.208045 -0.0943662\nv 0.0278354 -0.19954 -0.0988824\nv 0.0328788 -0.19309 -0.102608\nv 0.00843496 -0.221101 -0.18752\nv 0.0369733 -0.196236 -0.178874\nv 0.114382 0.167241 -0.0716093\nv 0.106527 0.129301 -0.0596071\nv 0.144027 0.178364 -0.0871964\nv 0.10925 0.109321 -0.0409272\nv 0.0984782 0.0749657 -0.0309282\nv 0.13438 0.109619 -0.0477981\nv 0.12055 0.0655643 -0.0350227\nv 0.108161 0.105015 -0.0648438\nv 0.105648 0.127157 -0.085527\nv 0.0997259 0.0685692 -0.0509964\nv 0.113644 0.169332 -0.10918\nv 0.119443 0.18267 -0.0928022\nv 0.172214 0.545127 -0.0801146\nv 0.192862 0.504358 -0.0835765\nv 0.225249 0.599919 -0.183267\nv 0.113907 0.214002 -0.10324\nv 0.140038 0.264436 -0.121182\nv 0.131867 0.338962 -0.0827681\nv 0.159649 0.400169 -0.0818543\nv 0.179911 0.300531 -0.144572\nv 0.201139 0.358539 -0.155203\nv 0.181123 0.34137 -0.139441\nv 0.134274 0.213106 -0.104857\nv 0.116666 0.214406 -0.123273\nv 0.13742 0.254982 -0.142656\nv 0.180139 0.331547 -0.170703\nv 0.182424 0.350648 -0.157066\nv 0.218149 0.459003 -0.139441\nv 0.231645 0.475029 -0.169349\nv 0.250431 0.527572 -0.192897\nv 0.231645 0.542122 -0.17608\nv 0.237427 0.455224 -0.162303\nv 0.229062 0.448178 -0.176519\nv 0.219942 0.462746 -0.168155\nv 0.240748 0.503075 -0.204109\nv 0.203827 0.402963 -0.158753\nv 0.1852 0.490353 -0.0985485\nv 0.234931 0.568183 -0.174129\nv 0.229677 0.574263 -0.196394\nv 0.240625 0.539574 -0.218307\nv 0.0274663 0.802411 0.102309\nv 0.0202263 0.814185 0.0757741\nv -0.183496 0.644396 -0.0129336\nv -0.209134 0.549766 0.0197167\nv -0.198714 0.522599 0.0515587\nv -0.0914491 0.62844 0.0662671\nv -0.115383 0.576547 0.0599058\nv -0.108161 0.563139 0.0778653\nv -0.109637 0.603838 0.0616631\nv -0.105718 0.58797 0.0298562\nv 0.0795522 0.555671 0.0176783\nv 0.0844024 0.502601 0.03439\nv 0.0913788 0.482164 0.025094\nv 0.319615 -0.279391 -0.0492391\nv 0.26542 -0.323744 -0.0486416\nv 0.245229 -0.168875 -0.011809\nv 0.175711 -0.204601 -0.00776722\nv 0.131093 -0.152427 0.0120725\nv 0.349541 -0.256388 -0.0736126\nv 0.28417 -0.142199 -0.0529821\nv 0.173532 0.00755631 -0.0877412\nv 0.368221 -0.35534 -0.0836819\nv 0.133079 -0.0532984 0.0125997\nv 0.156627 -0.00543002 -0.0297684\nv 0.132323 -0.0923804 0.0181527\nv 0.101993 -0.0188733 0.0320001\nv 0.106439 -0.0508207 0.037887\nv 0.149053 -0.193354 0.00110707\nv 0.32682 -0.398939 -0.0634907\nv 0.267968 -0.440604 -0.0848241\nv 0.217007 -0.373809 -0.0685517\nv 0.372439 -0.428092 -0.0628405\nv 0.343936 -0.485028 -0.0888659\nv 0.396496 -0.40038 -0.0800267\nv 0.420834 -0.434436 -0.0314378\nv 0.377394 -0.483394 -0.0817137\nv 0.41906 -0.476822 -0.112906\nv 0.400011 -0.46619 -0.0599234\nv 0.428777 -0.419745 -0.08565\nv 0.431097 -0.422328 -0.0587284\nv 0.428197 -0.456015 -0.0710997\nv 0.425157 -0.441149 -0.100745\nv 0.424771 -0.407391 -0.100271\nv 0.444118 -0.417408 -0.0785155\nv 0.440586 -0.412171 -0.115014\nv 0.413085 -0.36613 -0.130144\nv 0.427881 -0.38908 -0.159966\nv 0.382473 -0.23393 -0.155871\nv 0.404685 -0.306558 -0.135838\nv 0.307718 -0.187889 -0.250958\nv 0.361104 -0.502987 -0.0829087\nv 0.3788 -0.495835 -0.0797456\nv 0.390205 -0.499139 -0.0882157\nv 0.373405 -0.517169 -0.0846835\nv 0.387481 -0.512863 -0.0898851\nv 0.387956 -0.506414 -0.0679366\nv 0.363705 -0.513162 -0.122377\nv 0.315468 -0.493182 -0.0992866\nv 0.397673 -0.495009 -0.103873\nv 0.425491 -0.498014 -0.0964046\nv 0.385355 -0.517292 -0.130162\nv 0.40704 -0.519067 -0.148034\nv 0.35824 -0.524989 -0.182213\nv 0.431589 -0.424507 -0.180807\nv 0.446825 -0.439321 -0.146874\nv 0.431536 -0.467525 -0.145907\nv 0.350508 -0.501722 -0.112941\nv 0.352775 -0.514902 -0.100921\nv 0.347134 -0.521456 -0.126103\nv 0.308755 -0.512424 -0.148631\nv 0.334815 -0.507556 -0.125751\nv 0.253084 -0.494429 -0.153446\nv 0.0683584 -0.169156 -0.319492\nv 0.199188 -0.144045 -0.250554\nv 0.104963 -0.0734018 -0.409623\nv 0.31473 -0.122852 -0.14357\nv 0.427881 -0.461305 -0.218132\nv 0.442607 -0.461006 -0.172794\nv 0.4095 -0.503005 -0.198696\nv 0.431466 -0.442361 -0.146294\nv 0.112923 -0.0907462 0.0221242\nv 0.110428 -0.153253 0.0297859\nv 0.118845 -0.198538 -0.00574633\nv 0.111658 -0.154536 0.00688854\nv 0.0916072 -0.0419112 0.0288546\nv 0.093716 -0.0783397 0.0125821\nv 0.140495 -0.2395 -0.0249359\nv 0.151355 -0.217938 -0.267283\nv 0.279162 -0.253611 -0.309071\nv 0.201789 -0.0121956 -0.147208\nv 0.1991 -0.0523144 -0.231715\nv 0.108495 -0.165255 -0.268197\nv 0.166714 -0.0962113 -0.275876\nv 0.136945 -0.241152 -0.00766177\nv 0.133431 -0.26289 -0.0405757\nv 0.159298 -0.253418 -0.024233\nv 0.144185 -0.25927 -0.0205427\nv 0.181545 -0.274769 -0.0289425\nv 0.159895 -0.277458 -0.0354972\nv 0.409851 -0.294099 -0.240801\nv 0.433592 -0.333058 -0.185938\nv 0.432766 -0.361807 -0.239694\nv 0.216374 -0.339244 -0.32863\nv 0.255597 -0.383088 -0.322216\nv 0.131937 -0.302657 -0.197273\nv 0.184989 -0.41254 -0.23096\nv 0.152884 -0.338664 -0.117387\nv 0.173057 -0.376498 -0.130847\nv 0.147524 -0.303659 -0.0683232\nv 0.228675 -0.459829 -0.152444\nv 0.235546 -0.466489 -0.216058\nv 0.347556 -0.362703 -0.420694\nv 0.242066 -0.403894 -0.407233\nv 0.203019 -0.443662 -0.359294\nv 0.307999 -0.418532 -0.501898\nv 0.237796 -0.437089 -0.47763\nv 0.277756 -0.436791 -0.542772\nv 0.223052 -0.455576 -0.529329\nv 0.283046 -0.366323 -0.410273\nv 0.370928 -0.32761 -0.303061\nv 0.34752 -0.466032 -0.493006\nv 0.40776 -0.393122 -0.373265\nv 0.33239 -0.475029 -0.5391\nv 0.393544 -0.478456 -0.420922\nv 0.38423 -0.416459 -0.432099\nv 0.429445 -0.435947 -0.319299\nv 0.410168 -0.494271 -0.323903\nv 0.373388 -0.568727 -0.293045\nv 0.301515 -0.529944 -0.2062\nv 0.257723 -0.516975 -0.212473\nv 0.251907 -0.542807 -0.286613\nv 0.209398 -0.50963 -0.309247\nv 0.197009 -0.478368 -0.447563\nv 0.309721 -0.345271 -0.321917\nv 0.198573 -0.380628 -0.287878\nv 0.231698 -0.430605 -0.282483\nv 0.200067 -0.495185 -0.519418\nv 0.212684 -0.562805 -0.510667\nv 0.387218 -0.520841 -0.402506\nv 0.349928 -0.57291 -0.382297\nv 0.22205 -0.53794 -0.388219\nv 0.423541 -0.493551 -0.14712\nv 0.305469 -0.553035 -0.288177\nv 0.26238 -0.594788 -0.493481\nv 0.273785 -0.569026 -0.380786\nv 0.189541 -0.547218 -0.610674\nv 0.216093 -0.59217 -0.660229\nv 0.181141 -0.483692 -0.607599\nv 0.293185 -0.57226 -0.675201\nv 0.31791 -0.54091 -0.659122\nv 0.252434 -0.589815 -0.674656\nv 0.322163 -0.585228 -0.48248\nv 0.352441 -0.541894 -0.517186\nv 0.362018 -0.536358 -0.599427\nv 0.277493 -0.500914 -0.672126\nv 0.325098 -0.487295 -0.63271\nv 0.197607 -0.521105 -0.656117\nv 0.283116 -0.463062 -0.637701\nv 0.227516 -0.518416 -0.671652\nv 0.21822 -0.460039 -0.630514\nv 0.322479 -0.683461 -0.487488\nv 0.229958 -0.631181 -0.589534\nv 0.287316 -0.705884 -0.494658\nv 0.238551 -0.671054 -0.575757\nv 0.266808 -0.701807 -0.595913\nv 0.322426 -0.739377 -0.53866\nv 0.304309 -0.703687 -0.60607\nv 0.345341 -0.788089 -0.520262\nv 0.302745 -0.741433 -0.516888\nv 0.324272 -0.788089 -0.473817\nv 0.334815 -0.771202 -0.465171\nv 0.309932 -0.73089 -0.485854\nv 0.338769 -0.717253 -0.480934\nv 0.338927 -0.801708 -0.477718\nv 0.35223 -0.799441 -0.501494\nv 0.354058 -0.82761 -0.483218\nv 0.34926 -0.812621 -0.465997\nv 0.364795 -0.827013 -0.505114\nv 0.366974 -0.826047 -0.484466\nv 0.371701 -0.811672 -0.471427\nv 0.308034 -0.760746 -0.499807\nv 0.330123 -0.789583 -0.507047\nv 0.269989 -0.718237 -0.563069\nv 0.339033 -0.676185 -0.628633\nv 0.377535 -0.639757 -0.613204\nv 0.423505 -0.727762 -0.592029\nv 0.401856 -0.620515 -0.559607\nv 0.461797 -0.72553 -0.536569\nv 0.513303 -0.800513 -0.446912\nv 0.383035 -0.622852 -0.510069\nv 0.448107 -0.729765 -0.477735\nv 0.530296 -0.825572 -0.503884\nv 0.376041 -0.738815 -0.609795\nv 0.396707 -0.799494 -0.624504\nv 0.412663 -0.743243 -0.456507\nv 0.372597 -0.76289 -0.464257\nv 0.478649 -0.807454 -0.416828\nv 0.534478 -0.816434 -0.403859\nv 0.507152 -0.819439 -0.384634\nv 0.549678 -0.820353 -0.371841\nv 0.522915 -0.823674 -0.355709\nv 0.570379 -0.816487 -0.34991\nv 0.528187 -0.818807 -0.326205\nv 0.583489 -0.839648 -0.320616\nv 0.54221 -0.842618 -0.302868\nv 0.588374 -0.870646 -0.307191\nv 0.613521 -0.919376 -0.279619\nv 0.577531 -0.914543 -0.250712\nv 0.619443 -0.969705 -0.245914\nv 0.603328 -0.967209 -0.23277\nv 0.610375 -0.981074 -0.243191\nv 0.602151 -0.901856 -0.253559\nv 0.552525 -0.876568 -0.291902\nv 0.617861 -0.936386 -0.230503\nv 0.616403 -0.967121 -0.23212\nv 0.572277 -0.930271 -0.248164\nv 0.525147 -0.860349 -0.323006\nv 0.486487 -0.846765 -0.378853\nv 0.45417 -0.827013 -0.401873\nv 0.552402 -0.855745 -0.409781\nv 0.572365 -0.854919 -0.370594\nv 0.511827 -0.850947 -0.350244\nv 0.53504 -0.916933 -0.301093\nv 0.557938 -0.950339 -0.264893\nv 0.596405 -0.902963 -0.342337\nv 0.567585 -0.936632 -0.340228\nv 0.576038 -0.961024 -0.307525\nv 0.601132 -0.949812 -0.260324\nv 0.587302 -0.959512 -0.281218\nv 0.616244 -0.927635 -0.291358\nv 0.607669 -0.93918 -0.307331\nv 0.596088 -0.949425 -0.233508\nv 0.606228 -0.957245 -0.251134\nv 0.621797 -0.954996 -0.256001\nv 0.253805 -0.386954 -0.335255\nv 0.301655 -0.350701 -0.347767\nv 0.37706 -0.347028 -0.326345\nv 0.224862 -0.434313 -0.30148\nv 0.235705 -0.476927 -0.224897\nv 0.486803 -0.80705 -0.539311\nv 0.564088 -0.845289 -0.496591\nv 0.552771 -0.845025 -0.446104\nv 0.583383 -0.936545 -0.24609\nv 0.613503 -0.930781 -0.27867\nv 0.572962 -0.897884 -0.379767\nv 0.549714 -0.924085 -0.370365\nv 0.524426 -0.904984 -0.351246\nv 0.495115 -0.924683 -0.389959\nv 0.546199 -0.911451 -0.424367\nv 0.519049 -0.937581 -0.409834\nv 0.620497 -0.845658 -0.491126\nv 0.612501 -0.842372 -0.459723\nv 0.638 -0.842741 -0.488314\nv 0.631744 -0.836028 -0.458423\nv 0.660686 -0.852388 -0.479422\nv 0.656187 -0.84629 -0.452378\nv 0.676379 -0.870646 -0.472622\nv 0.671036 -0.861456 -0.449021\nv 0.736899 -0.902436 -0.443082\nv 0.724528 -0.905142 -0.426616\nv 0.756634 -0.938548 -0.42753\nv 0.743419 -0.941781 -0.411978\nv 0.734264 -0.918603 -0.456824\nv 0.746301 -0.955137 -0.441658\nv 0.753576 -0.961041 -0.421731\nv 0.632253 -0.881348 -0.491794\nv 0.666151 -0.893474 -0.481724\nv 0.721787 -0.931853 -0.471128\nv 0.702861 -0.922504 -0.41623\nv 0.635328 -0.862053 -0.449619\nv 0.617861 -0.859558 -0.4541\nv 0.653464 -0.898763 -0.432889\nv 0.692229 -0.94642 -0.446315\nv 0.658419 -0.913665 -0.457614\nv 0.731768 -0.948758 -0.432679\nv 0.713791 -0.952571 -0.440305\nv 0.728816 -0.926581 -0.417636\nv 0.737304 -0.941992 -0.448828\nv 0.739711 -0.951341 -0.428514\nv 0.619952 -0.902717 -0.468773\nv 0.622184 -0.891013 -0.448389\nv 0.570924 -0.885864 -0.441992\nv 0.553175 -0.886849 -0.523407\nv 0.486733 -0.862704 -0.544407\nv 0.436175 -0.832935 -0.588163\nv 0.356834 -0.808614 -0.579535\nv 0.370066 -0.837258 -0.56502\nv 0.483482 -0.952536 -0.448898\nv 0.401293 -0.935525 -0.430816\nv 0.452167 -0.928848 -0.482146\nv 0.422223 -0.873687 -0.514832\nv 0.537448 -0.915563 -0.531227\nv 0.538256 -0.931167 -0.479844\nv 0.391171 -0.871859 -0.483183\nv 0.420536 -0.835378 -0.412048\nv 0.38532 -0.855323 -0.451112\nv 0.418304 -0.875303 -0.361104\nv 0.385689 -0.885583 -0.417513\nv 0.43737 -0.84608 -0.344305\nv 0.340087 -0.757196 -0.585158\nv 0.469634 -0.844937 -0.353952\nv 0.463501 -0.850525 -0.319984\nv 0.42948 -0.855042 -0.316698\nv 0.426792 -0.862317 -0.284293\nv 0.46554 -0.856043 -0.287562\nv 0.431185 -0.874688 -0.270481\nv 0.46633 -0.868836 -0.272713\nv 0.445647 -0.914016 -0.213949\nv 0.463782 -0.91725 -0.223544\nv 0.451376 -0.953414 -0.196095\nv 0.462306 -0.958897 -0.205374\nv 0.452501 -0.974467 -0.200243\nv 0.431255 -0.928303 -0.22075\nv 0.440885 -0.965645 -0.207219\nv 0.421801 -0.889766 -0.325695\nv 0.42159 -0.909043 -0.292342\nv 0.476786 -0.950111 -0.248902\nv 0.476031 -0.902383 -0.300724\nv 0.470407 -0.867255 -0.319176\nv 0.473237 -0.895284 -0.313763\nv 0.449812 -0.958036 -0.277932\nv 0.420008 -0.952061 -0.250079\nv 0.448441 -0.924841 -0.300267\nv 0.452255 -0.956595 -0.222701\nv 0.449724 -0.96619 -0.248445\nv 0.467051 -0.941676 -0.225091\nv 0.434084 -0.944734 -0.229624\nv 0.454609 -0.963044 -0.212034\nv 0.446174 -0.916406 -0.31306\nv 0.484923 -0.891418 -0.370365\nv 0.412944 -0.9234 -0.3704\nv 0.448547 -0.950989 -0.393632\nv 0.452237 -0.928373 -0.363494\nv 0.0993217 -0.0437212 0.013039\nv 0.117 -0.0326855 0.00843494\nv 0.132956 0.0132675 -0.0162198\nv 0.174393 0.0882332 -0.136154\nv 0.172284 0.0767757 -0.0868099\nv 0.171159 0.108829 -0.285049\nv 0.00316311 -0.239694 -0.424384\nv -0.0470776 -0.322356 -0.4651\nv -0.206288 -0.446754 -0.598162\nv -0.387411 -0.551928 -0.631445\nv -0.577268 -0.63445 -0.594559\nv -0.729255 -0.698028 -0.432784\nv -0.756634 -0.767687 -0.272432\nv -0.0792359 -0.255087 -0.536024\nv -0.261572 -0.388817 -0.610832\nv -0.427213 -0.493516 -0.610639\nv -0.583787 -0.592222 -0.559713\nv -0.7104 -0.676994 -0.421221\nv -0.0270973 -0.190806 -0.492918\nv -0.0579904 -0.180034 -0.514849\nv -0.023407 -0.156609 -0.518012\nv -0.0553017 -0.161248 -0.534214\nv -0.0514006 -0.128001 -0.550258\nv -0.00166942 -0.146557 -0.467385\nv -0.00917302 -0.129371 -0.496679\nv -0.035708 -0.118283 -0.496187\nv 0.007117 -0.119214 -0.480547\nv 0.0405405 -0.19309 -0.383492\nv 0.0145679 -0.112326 -0.445964\nv -0.0222824 -0.0805364 -0.516835\nv -0.00671283 -0.090834 -0.457034\nv -0.131445 -0.226655 -0.581046\nv -0.161038 -0.199944 -0.592732\nv -0.186729 -0.231417 -0.598092\nv -0.191685 -0.214336 -0.630531\nv -0.136365 -0.263962 -0.566109\nv -0.184778 -0.254472 -0.576389\nv -0.182881 -0.19432 -0.578199\nv -0.199258 -0.209767 -0.609725\nv -0.121833 -0.178909 -0.554037\nv -0.100534 -0.145644 -0.553632\nv -0.130584 -0.118546 -0.582259\nv -0.109795 -0.124855 -0.567726\nv -0.0574456 -0.0602397 -0.560046\nv -0.0993393 -0.105314 -0.550575\nv -0.0711524 -0.0882332 -0.579341\nv -0.0723474 -0.144238 -0.524584\nv -0.0709416 -0.0606088 -0.58203\nv -0.069729 -0.0438443 -0.568077\nv -0.0576565 -0.0340386 -0.537799\nv -0.0776895 -0.0167997 -0.565898\nv -0.0986539 -0.0506449 -0.559677\nv -0.099761 -0.0857555 -0.573349\nv -0.100692 -0.0549151 -0.613608\nv -0.116982 -0.104435 -0.542157\nv 0.00662496 -0.0410502 -0.463958\nv -0.0404878 0.0115278 -0.520332\nv -0.0445472 -0.0301902 -0.527414\nv -0.0606439 0.0340737 -0.528099\nv -0.0182758 -0.0848768 -0.478104\nv -0.0715566 -0.026781 -0.521632\nv -0.237427 -0.307929 -0.574316\nv -0.176308 -0.333954 -0.587425\nv -0.239694 -0.275841 -0.599304\nv -0.156925 -0.283221 -0.579623\nv -0.18947 -0.269655 -0.585211\nv -0.144132 -0.116473 -0.542983\nv 0.0806769 -0.0121428 -0.424314\nv -0.00416476 0.0702035 -0.465505\nv -0.0435982 0.121868 -0.484852\nv -0.0251292 0.0236179 -0.502829\nv -0.0629459 0.0179594 -0.50065\nv -0.0487998 0.0939092 -0.497382\nv -0.0861245 0.139528 -0.506537\nv -0.0925386 0.109092 -0.482779\nv 0.199487 0.100938 -0.197782\nv 0.17738 0.0913612 -0.124627\nv 0.19831 0.106421 -0.242382\nv 0.175887 0.137174 -0.313728\nv 0.206639 0.121463 -0.19787\nv 0.162514 0.0891997 -0.289969\nv 0.111763 0.0971251 -0.364724\nv 0.147348 0.106263 -0.297948\nv 0.154588 0.0526482 -0.320616\nv 0.144045 0.11635 -0.363319\nv 0.133835 0.100376 -0.371753\nv 0.0854743 0.0908691 -0.411521\nv 0.0331424 0.0769514 -0.462359\nv 0.0567427 0.0864408 -0.42709\nv 0.0578674 0.132394 -0.418814\nv 0.0914666 0.115664 -0.319017\nv 0.0016167 0.135241 -0.468404\nv 0.0493445 0.109145 -0.391611\nv 0.0489404 0.111588 -0.338225\nv 0.0333533 0.106052 -0.420044\nv 0.108635 0.131322 -0.399483\nv 0.111939 0.116701 -0.338611\nv 0.12431 0.125769 -0.350754\nv 0.0719081 0.115612 -0.379767\nv 0.181773 0.124222 -0.225758\nv 0.173251 0.074421 -0.0969318\nv 0.187168 0.0622078 -0.136506\nv 0.161776 0.113239 -0.152321\nv 0.156644 0.0894457 -0.11577\nv 0.163533 0.173005 -0.186237\nv 0.138052 0.21655 -0.187854\nv 0.189839 0.314607 -0.241785\nv 0.139194 0.129389 -0.254472\nv 0.103065 0.216954 -0.298123\nv 0.140635 0.300373 -0.309159\nv 0.0359189 0.167785 -0.365445\nv 0.0516114 0.260623 -0.381559\nv 0.184603 0.382684 -0.320423\nv 0.12243 0.350279 -0.409394\nv 0.048132 0.337785 -0.456929\nv 0.0643166 0.384441 -0.477665\nv -0.0773381 0.303975 -0.46568\nv 0.00256563 0.170052 -0.349875\nv -0.0538783 0.223702 -0.407795\nv -0.0493797 0.267019 -0.444101\nv -0.0796753 0.25999 -0.437142\nv 0.0692721 0.35274 -0.468861\nv 0.0275191 0.374653 -0.486399\nv 0.0205427 0.1086 -0.41363\nv -0.0501353 0.13879 -0.453133\nv -0.0464977 0.100271 -0.41247\nv -0.0154465 0.130267 -0.371507\nv -0.0440024 0.319562 -0.428795\nv 0.0268162 0.364338 -0.458932\nv -0.00581661 0.351791 -0.455365\nv 0.0063438 0.282782 -0.404316\nv -0.0853337 0.271272 -0.362405\nv -0.10846 0.346167 -0.416951\nv -0.0374653 0.295681 -0.386321\nv -0.0625417 0.206727 -0.376322\nv -0.0438442 0.287351 -0.433715\nv 0.0339859 0.382596 -0.465118\nv 0.00667768 0.391382 -0.464749\nv -0.070801 0.407426 -0.540962\nv -0.0435104 0.41254 -0.534267\nv -0.0234422 0.43969 -0.521738\nv -0.0482902 0.500281 -0.651337\nv -0.0672513 0.516044 -0.644853\nv -0.0307876 0.517503 -0.637455\nv -0.0628756 0.544547 -0.724528\nv -0.0640882 0.538362 -0.701508\nv -0.0449865 0.543862 -0.711173\nv -0.0430886 0.519154 -0.686553\nv -0.0613995 0.531069 -0.681756\nv -0.0303483 0.535427 -0.679946\nv -0.0533863 0.527115 -0.708256\nv -0.0242681 0.461129 -0.514744\nv -0.0612941 0.537131 -0.637367\nv -0.0400309 0.539012 -0.633325\nv -0.0557762 0.551488 -0.705216\nv -0.0525076 0.548237 -0.678892\nv -0.0398552 0.548835 -0.678206\nv -0.081907 0.478157 -0.513935\nv -0.106122 0.434717 -0.514796\nv -0.0461814 0.483745 -0.512512\nv 0.00878642 0.425755 -0.450708\nv -0.115998 0.394985 -0.40161\nv -0.0658279 0.470935 -0.449812\nv -0.0820652 0.444083 -0.422504\nv 0.0177661 0.620304 -0.538432\nv -0.03859 0.617158 -0.559537\nv -0.0890064 0.628668 -0.521052\nv 0.0423505 0.613222 -0.466664\nv 0.0536323 0.686571 -0.536639\nv -0.00625593 0.673022 -0.629178\nv -0.0384669 0.699329 -0.6254\nv 0.0489579 0.721295 -0.585\nv -0.0350051 0.73755 -0.597828\nv -0.0781464 0.71228 -0.518996\nv 0.0140231 0.706112 -0.49993\nv 0.00576389 0.754613 -0.580378\nv -0.0378695 0.747759 -0.522247\nv -0.053193 0.699698 -0.395407\nv -0.10556 0.682195 -0.37279\nv -0.104717 0.669894 -0.489984\nv -0.0573753 0.708238 -0.465838\nv -0.0261484 0.723351 -0.526465\nv -0.0811865 0.691825 -0.525797\nv -0.0417882 0.721804 -0.493656\nv 0.00660739 0.685288 -0.375514\nv -0.00962992 0.716515 -0.512354\nv -0.00961234 0.688381 -0.444909\nv 0.0383615 0.66833 -0.415703\nv 0.026658 0.667786 -0.464433\nv -0.0246723 0.706305 -0.348962\nv -0.0683584 0.702334 -0.313992\nv -0.0517344 0.7256 -0.393684\nv 0.0405933 0.695129 -0.611465\nv 0.0352335 0.757073 -0.577654\nv 0.0150951 0.756932 -0.695357\nv -0.0106491 0.764612 -0.688803\nv 0.0508909 0.803922 -0.669314\nv -0.0103504 0.805117 -0.665255\nv 0.0397146 0.765596 -0.681141\nv 0.0453731 0.815397 -0.652567\nv 0.0115454 0.808333 -0.736443\nv 0.0245493 0.863863 -0.72184\nv 0.042333 0.823586 -0.724862\nv 0.0454082 0.855165 -0.714635\nv 0.0204724 0.825221 -0.653516\nv 0.00950691 0.847573 -0.734404\nv 0.0500826 0.845324 -0.794099\nv 0.0562331 0.855147 -0.78765\nv 0.037518 0.866833 -0.782062\nv 0.0372193 0.854198 -0.790409\nv 0.0508558 0.857291 -0.809458\nv -0.115981 0.531051 -0.427653\nv -0.0912382 0.489737 -0.433873\nv -0.149598 0.450497 -0.476435\nv -0.14299 0.513847 -0.468949\nv -0.202931 0.499982 -0.518047\nv -0.201086 0.521492 -0.515271\nv 0.24551 0.627122 -0.204091\nv -0.0693424 0.71286 -0.356043\nv -0.0400134 0.70808 -0.365023\nv -0.00474467 0.733877 -0.327874\nv -0.0193301 0.755263 -0.270218\nv 0.0036903 0.780181 -0.243208\nv 0.0229326 0.74602 -0.328753\nv 0.0102098 0.754086 -0.299599\nv 0.00609778 0.719309 -0.329983\nv 0.0434576 0.75992 -0.30206\nv 0.0336344 0.728377 -0.324201\nv 0.0531227 0.749165 -0.295522\nv 0.0597301 0.793361 -0.261589\nv 0.0312621 0.774259 -0.225389\nv 0.0324395 0.725214 -0.389414\nv 0.0169051 0.697308 -0.400467\nv -0.00803079 0.556391 -0.494851\nv 0.0222648 0.52302 -0.523969\nv -0.00615049 0.534162 -0.561224\nv -0.0252697 0.499192 -0.523231\nv -0.0669877 0.58876 -0.508066\nv -0.125417 0.567093 -0.430728\nv 0.042825 0.750641 -0.284592\nv 0.061628 0.772854 -0.233508\nv 0.0597828 0.765438 -0.269286\nv 0.0325976 0.812586 -0.209451\nv 0.065986 0.777791 -0.199803\nv 0.0765473 0.852494 -0.202088\nv 0.0429129 0.830651 -0.188346\nv 0.073349 0.858293 -0.18158\nv 0.0397498 0.837978 -0.164499\nv 0.0480969 0.863108 -0.110902\nv 0.0721189 0.858996 -0.130742\nv 0.0882508 0.835413 -0.0971251\nv 0.0114399 0.790057 -0.23588\nv 0.0655643 0.817155 -0.217868\nv 0.076969 0.750589 -0.313306\nv 0.0968439 0.77686 -0.299687\nv 0.105226 0.724177 -0.29243\nv 0.0745088 0.727182 -0.342143\nv 0.103662 0.737919 -0.272274\nv 0.0993393 0.720768 -0.328208\nv 0.0754929 0.7437 -0.336907\nv 0.109865 0.748111 -0.327944\nv 0.0984255 0.737075 -0.311426\nv 0.0810811 0.760693 -0.274699\nv 0.0665483 0.757688 -0.255263\nv 0.121094 0.716146 -0.278178\nv 0.117931 0.712403 -0.323235\nv 0.0691316 0.846431 -0.0978456\nv 0.0713985 0.870945 -0.125593\nv 0.068868 0.826275 -0.191509\nv 0.0580782 0.800214 -0.187871\nv 0.086845 0.798914 -0.148578\nv 0.114751 0.643904 -0.123924\nv 0.148297 0.657769 -0.237269\nv 0.101149 0.750343 -0.149756\nv 0.10867 0.729361 -0.215478\nv 0.125769 0.632622 -0.179788\nv 0.183127 0.658788 -0.255931\nv 0.213598 0.618933 -0.212913\nv 0.2353 0.68701 -0.26043\nv 0.246108 0.624381 -0.262942\nv 0.246231 0.594612 -0.24428\nv 0.134907 0.692247 -0.26716\nv 0.15682 0.673374 -0.290022\nv 0.14176 0.728904 -0.299564\nv 0.14241 0.691157 -0.318385\nv 0.0764946 0.682582 -0.44642\nv 0.16898 0.688715 -0.44447\nv 0.144554 0.645696 -0.50297\nv 0.0820827 0.709943 -0.390381\nv 0.0476224 0.665009 -0.471971\nv 0.0828384 0.701191 -0.526412\nv 0.115787 0.719748 -0.348944\nv 0.120567 0.709556 -0.362791\nv 0.105349 0.729378 -0.41196\nv 0.143834 0.710558 -0.388746\nv 0.114346 0.702105 -0.422346\nv 0.136154 0.738569 -0.429164\nv 0.16464 0.704442 -0.400221\nv 0.15081 0.694602 -0.431659\nv 0.127842 0.713352 -0.399431\nv 0.20207 0.501476 -0.500211\nv 0.160106 0.53193 -0.529821\nv 0.158015 0.590377 -0.519488\nv 0.223896 0.560995 -0.485028\nv 0.256563 0.454416 -0.452413\nv 0.265016 0.527994 -0.443749\nv 0.244895 0.63814 -0.399466\nv 0.256599 0.444646 -0.385179\nv 0.261027 0.474555 -0.31429\nv 0.207096 0.454434 -0.539117\nv 0.134731 0.469335 -0.554212\nv 0.246319 0.427196 -0.491178\nv 0.203335 0.399448 -0.562718\nv 0.258989 0.384687 -0.510315\nv 0.276473 0.37272 -0.454065\nv 0.228974 0.39625 -0.360278\nv 0.253207 0.32812 -0.415615\nv 0.237128 0.345201 -0.636998\nv 0.313095 0.320775 -0.570081\nv 0.278846 0.350262 -0.607915\nv 0.193477 0.292799 -0.652023\nv 0.138333 0.431976 -0.568886\nv 0.150529 0.375584 -0.569465\nv 0.0929076 0.432819 -0.542017\nv 0.278477 0.478895 -0.362194\nv 0.20316 0.651619 -0.462851\nv 0.274787 0.562858 -0.330475\nv 0.265578 0.603855 -0.31603\nv 0.261045 0.516518 -0.253102\nv 0.328911 0.233965 -0.682055\nv 0.267494 0.304783 -0.533037\nv 0.266896 0.292605 -0.516255\nv 0.264665 0.29851 -0.495835\nv 0.298281 0.285225 -0.544828\nv 0.274013 0.333814 -0.537799\nv 0.173778 0.317612 -0.624205\nv 0.408217 0.176133 -0.686571\nv 0.341563 0.162848 -0.698169\nv 0.36258 0.179032 -0.699821\nv 0.365058 0.133571 -0.711577\nv 0.380136 0.147313 -0.71358\nv 0.390925 0.132851 -0.712298\nv 0.293062 0.194742 -0.677925\nv 0.242277 0.250431 -0.672249\nv 0.282694 0.274294 -0.677486\nv 0.329842 0.292008 -0.639335\nv 0.202474 0.24008 -0.656521\nv 0.147296 0.283292 -0.616033\nv 0.15617 0.267423 -0.634046\nv 0.112185 0.350402 -0.549872\nv 0.200401 0.21242 -0.637771\nv 0.139212 0.26289 -0.600622\nv 0.150617 0.245036 -0.619566\nv 0.364531 0.115418 -0.701121\nv 0.336063 0.14849 -0.686905\nv 0.285084 0.167258 -0.658419\nv 0.125576 0.283098 -0.573331\nv 0.134274 0.307261 -0.593628\nv 0.138597 0.37706 -0.411363\nv 0.0770921 0.39987 -0.484308\nv 0.0934172 0.420325 -0.4011\nv 0.0719608 0.423136 -0.473324\nv 0.0955084 0.416072 -0.450866\nv 0.0423681 0.409148 -0.500088\nv 0.0506801 0.425087 -0.505377\nv 0.015675 0.397744 -0.475047\nv 0.0168524 0.426598 -0.462113\nv 0.0130742 0.419675 -0.490862\nv 0.0217727 0.438354 -0.516536\nv 0.0273433 0.444013 -0.517538\nv 0.0263241 0.441992 -0.475925\nv 0.0241451 0.450005 -0.511581\nv 0.0173795 0.444259 -0.507029\nv 0.0509437 0.486276 -0.487154\nv 0.0784276 0.575598 -0.52353\nv 0.064176 0.613837 -0.497276\nv 0.0314027 0.540769 -0.479809\nv 0.0544231 0.526728 -0.505465\nv 0.0159737 0.495642 -0.519945\nv -0.00274136 0.50717 -0.547218\nv 0.0469195 0.453713 -0.483359\nv -0.0390293 0.540347 -0.467104\nv -0.0466559 0.483991 -0.488384\nv -0.0477103 0.51506 -0.489017\nv -0.00442836 0.478684 -0.510755\nv -0.00618564 0.540382 -0.538151\nv -0.0295927 0.52585 -0.525006\nv 0.105103 0.401504 -0.546972\nv 0.104207 0.515816 -0.532932\nv 0.0946122 0.458774 -0.492145\nv 0.190279 0.441061 -0.330967\nv 0.24117 0.472446 -0.223931\nv 0.241345 0.485274 -0.25927\nv 0.250237 0.511282 -0.227305\nv 0.219573 0.280656 -0.478192\nv 0.180069 0.338207 -0.41066\nv 0.175535 0.389432 -0.375514\nv 0.206165 0.45772 -0.26665\nv 0.197782 0.47111 -0.320529\nv 0.107388 0.326697 -0.496327\nv 0.0789372 0.389432 -0.516852\nv 0.179155 0.218009 -0.559572\nv 0.14589 0.253084 -0.530506\nv 0.317014 0.141936 -0.644554\nv 0.245334 0.179243 -0.609971\nv 0.346747 0.156943 -0.603592\nv 0.270323 0.183056 -0.542403\nv 0.369364 0.244579 -0.650564\nv 0.32689 0.221769 -0.549643\nv 0.38604 0.180666 -0.601237\nv 0.425649 0.174639 -0.626156\nv 0.287474 0.258268 -0.525024\nv 0.274804 0.215232 -0.512705\nv 0.311602 0.188767 -0.545812\nv 0.184181 0.305539 -0.441377\nv 0.130197 0.35998 -0.470566\nv 0.195814 0.251643 -0.495115\nv 0.247812 0.251415 -0.492145\nv 0.434506 0.136682 -0.691509\nv 0.435929 0.145978 -0.608934\nv 0.408498 0.156117 -0.605332\nv 0.438319 0.0318771 -0.703652\nv 0.476294 0.0384669 -0.672354\nv 0.495976 0.0486416 -0.630812\nv 0.498823 0.0632798 -0.604172\nv 0.402611 0.0256212 -0.716831\nv 0.518399 0.0263768 -0.614206\nv 0.52049 0.039943 -0.594243\nv 0.552209 -0.00880402 -0.600868\nv 0.555829 -0.000369045 -0.588655\nv 0.56523 -0.0182758 -0.601606\nv 0.571574 -0.0077145 -0.587196\nv 0.581064 -0.0372896 -0.593593\nv 0.584068 -0.030401 -0.58022\nv 0.596633 -0.0694479 -0.582803\nv 0.600341 -0.0983025 -0.568517\nv 0.605156 -0.0864935 -0.546041\nv 0.605964 -0.0835413 -0.561874\nv 0.602573 -0.0602046 -0.564914\nv 0.461217 0.0783397 -0.548659\nv 0.41261 0.136242 -0.587513\nv 0.528029 0.0128106 -0.569202\nv 0.565881 -0.017854 -0.567462\nv 0.595175 -0.0921344 -0.536921\nv 0.592767 -0.0619619 -0.548747\nv 0.602169 -0.120813 -0.553703\nv 0.608108 -0.107915 -0.536639\nv 0.616016 -0.11034 -0.550996\nv 0.614013 -0.136734 -0.534583\nv 0.394229 0.109215 -0.580695\nv 0.376797 0.0783046 -0.624732\nv 0.402014 0.0526834 -0.590641\nv 0.391523 0.0777422 -0.580132\nv 0.374794 0.125646 -0.617668\nv 0.128036 0.164921 -0.286455\nv 0.0497311 0.209609 -0.381893\nv -0.020982 0.232278 -0.427002\nv 0.102063 0.264014 -0.357713\nv 0.18882 0.668875 -0.281447\nv 0.216779 0.690577 -0.297807\nv 0.236794 0.652673 -0.299213\nv 0.217271 0.672934 -0.273504\nv 0.197413 0.685763 -0.367044\nv 0.218466 0.689558 -0.39089\nv 0.226883 0.66594 -0.366218\nv 0.165167 0.703265 -0.356817\nv 0.182951 0.697255 -0.355094\nv 0.202404 0.672249 -0.331389\nv 0.159069 0.690542 -0.332654\nv 0.173409 0.718518 -0.338752\nv 0.155484 0.696394 -0.348065\nv 0.147647 0.708326 -0.370348\nv 0.176554 0.726742 -0.379538\nv 0.179366 0.696781 -0.394897\nv 0.22437 0.658402 -0.336625\nv 0.212631 0.695357 -0.351105\nv 0.172003 0.674217 -0.301568\nv 0.165237 0.682476 -0.314554\nv 0.166397 0.689154 -0.297596\nv 0.158226 0.68513 -0.30749\nv 0.21648 0.666011 -0.314905\nv 0.213405 0.678259 -0.327575\nv 0.200313 0.667206 -0.318982\nv 0.17789 0.675869 -0.31712\nv 0.228377 0.650371 -0.320915\nv 0.200225 0.682301 -0.395336\nv 0.576389 -0.080923 -0.580572\nv 0.588022 -0.105455 -0.568042\nv 0.507715 -0.0106667 -0.609479\nv 0.553615 -0.0340386 -0.602766\nv 0.581889 -0.0992339 -0.537518\nv 0.573736 -0.0651425 -0.551664\nv 0.564932 -0.0792008 -0.57175\nv 0.57783 -0.108758 -0.55618\nv 0.602344 -0.111025 -0.53548\nv 0.598461 -0.12062 -0.551611\nv 0.609918 -0.130689 -0.532211\nv 0.605964 -0.135733 -0.538572\nv 0.545689 -0.0302077 -0.563122\nv 0.505377 -0.0027238 -0.569747\nv 0.535761 -0.0454961 -0.586107\nv 0.609426 -0.141075 -0.530559\nv 0.413067 0.126893 -0.532193\nv 0.438056 0.116877 -0.536059\nv 0.432784 0.101799 -0.505571\nv 0.408252 0.109461 -0.50188\nv 0.43187 0.0954732 -0.489439\nv 0.407268 0.104857 -0.486328\nv 0.429498 0.0848065 -0.475011\nv 0.402594 0.092644 -0.472235\nv 0.409693 0.0749657 -0.45243\nv 0.425421 0.0643869 -0.447686\nv 0.392542 0.0690437 -0.44816\nv 0.392981 0.10129 -0.551137\nv 0.391171 0.092644 -0.493305\nv 0.379644 0.0546867 -0.453168\nv 0.410537 0.0548624 -0.420413\nv 0.420096 0.044881 -0.427284\nv 0.393684 0.0560749 -0.427038\nv 0.405335 0.0327558 -0.401979\nv 0.407954 0.0237409 -0.407145\nv 0.393948 0.0289249 -0.407303\nv 0.433575 0.0765121 -0.495009\nv 0.428057 0.0499947 -0.45786\nv 0.392577 0.0409798 -0.465469\nv 0.415598 0.037026 -0.465522\nv 0.393122 0.0375004 -0.448652\nv 0.413717 0.0333357 -0.449021\nv 0.392612 0.0513654 -0.430043\nv 0.419692 0.0395389 -0.434225\nv 0.421678 0.0610305 -0.500685\nv 0.397058 0.0669876 -0.500879\nv 0.436931 0.0567075 -0.547324\nv 0.399765 0.0241451 -0.400485\nv 0.494289 0.0443187 -0.56755\nv 0.401188 0.0382385 -0.628335\nv 0.473412 0.0279935 -0.564106\nv 0.435824 0.025709 -0.587372\nv 0.501283 0.00789019 -0.642639\nv 0.491723 0.00207358 -0.657488\nv 0.510737 -0.0610481 -0.639722\nv 0.520174 -0.0554072 -0.626876\nv 0.514164 -0.0838225 -0.6364\nv 0.527765 -0.0760728 -0.61953\nv 0.507785 -0.104348 -0.623168\nv 0.518996 -0.101378 -0.603047\nv 0.501529 -0.143728 -0.601536\nv 0.513478 -0.139493 -0.587847\nv 0.505342 -0.16218 -0.583243\nv 0.487717 -0.170878 -0.587038\nv 0.504903 -0.162109 -0.564264\nv 0.50188 -0.0136717 -0.614311\nv 0.513355 -0.0773381 -0.596071\nv 0.508224 -0.131339 -0.576143\nv 0.495361 -0.152532 -0.553703\nv 0.495484 -0.191245 -0.56581\nv 0.475257 -0.189646 -0.56581\nv 0.492373 -0.181809 -0.551155\nv 0.474115 -0.201262 -0.545549\nv 0.466787 -0.192827 -0.549784\nv 0.47517 -0.190911 -0.543879\nv 0.493481 -0.0884968 -0.631146\nv 0.479809 -0.136348 -0.603434\nv 0.47278 -0.166169 -0.583664\nv 0.473483 -0.0254279 -0.650072\nv 0.479949 -0.154184 -0.551875\nv 0.492549 -0.119197 -0.569835\nv 0.470759 -0.125066 -0.589569\nv 0.463097 -0.160616 -0.569518\nv 0.488384 -0.174779 -0.551735\nv 0.471796 -0.181334 -0.564141\nv 0.478262 -0.0850526 -0.614311\nv 0.497171 -0.0737357 -0.592451\nv 0.483763 -0.0229677 -0.595385\nv 0.467016 -0.197132 -0.540822\nv 0.470776 -0.00569362 -0.674639\nv 0.455576 -0.00808352 -0.687573\nv 0.457562 -0.0733666 -0.665027\nv 0.467402 -0.0675676 -0.653464\nv 0.455769 -0.0879169 -0.661635\nv 0.470038 -0.0832074 -0.649334\nv 0.445876 -0.107827 -0.643447\nv 0.457509 -0.103662 -0.63257\nv 0.426387 -0.129846 -0.616297\nv 0.435771 -0.1254 -0.604471\nv 0.420694 -0.134749 -0.599445\nv 0.406196 -0.136594 -0.599111\nv 0.418181 -0.127561 -0.582469\nv 0.469757 -0.0288019 -0.651443\nv 0.457685 -0.0812744 -0.626296\nv 0.429955 -0.110849 -0.594085\nv 0.411292 -0.118142 -0.574614\nv 0.402084 -0.143799 -0.577971\nv 0.387991 -0.140214 -0.580677\nv 0.403631 -0.133483 -0.566566\nv 0.370189 -0.138509 -0.551611\nv 0.438882 -0.0935754 -0.653481\nv 0.408832 -0.121182 -0.618406\nv 0.394791 -0.129406 -0.599779\nv 0.432222 -0.0367624 -0.671107\nv 0.400467 -0.108987 -0.576389\nv 0.4234 -0.0987067 -0.600446\nv 0.411257 -0.100921 -0.615489\nv 0.38829 -0.117703 -0.592099\nv 0.397691 -0.126823 -0.566812\nv 0.386198 -0.133536 -0.581274\nv 0.428074 -0.0769866 -0.642656\nv 0.446772 -0.0745264 -0.62366\nv 0.420026 -0.0341792 -0.657347\nv 0.453063 -0.0321583 -0.62793\nv 0.358662 0.0625769 -0.692915\nv 0.377957 0.0218782 -0.692651\nv 0.349471 0.110709 -0.671283\nv 0.375655 0.085404 -0.71235\nv 0.441219 -0.00864585 -0.693635\nv 0.424613 -0.0115629 -0.703652\nv 0.418954 -0.0527713 -0.696113\nv 0.426528 -0.0531227 -0.687028\nv 0.410853 -0.0766528 -0.68933\nv 0.42101 -0.0754051 -0.679753\nv 0.395758 -0.0803079 -0.675939\nv 0.404439 -0.0834359 -0.666995\nv 0.376322 -0.0832777 -0.655028\nv 0.387007 -0.0848417 -0.646505\nv 0.375022 -0.0797983 -0.639458\nv 0.362422 -0.064053 -0.639335\nv 0.378642 -0.0719959 -0.628844\nv 0.428391 -0.0369909 -0.67181\nv 0.419815 -0.0633677 -0.67072\nv 0.394247 -0.0771096 -0.644677\nv 0.383088 -0.0658806 -0.628563\nv 0.35636 -0.0587812 -0.613714\nv 0.355235 -0.0525955 -0.619847\nv 0.36852 -0.0550733 -0.613819\nv 0.354901 -0.0347767 -0.601184\nv 0.397287 -0.0588515 -0.689084\nv 0.371015 -0.0659685 -0.659878\nv 0.362633 -0.0551084 -0.642709\nv 0.404 -0.0135311 -0.696763\nv 0.383439 -0.0591853 -0.632306\nv 0.393509 -0.0707659 -0.647946\nv 0.377711 -0.0597828 -0.657962\nv 0.370049 -0.0449338 -0.640056\nv 0.370576 -0.0505219 -0.615225\nv 0.356518 -0.0494676 -0.621358\nv 0.393069 -0.0537729 -0.676853\nv 0.414438 -0.0587636 -0.664763\nv 0.391488 -0.0168172 -0.680877\nv 0.410484 0.0641409 -0.552121\nv 0.102871 0.658261 -0.0631041\nv 0.121024 0.65146 -0.094208\nv 0.127596 0.573472 -0.0729976\nv 0.0750185 0.581661 -0.0556708\nv 0.104998 0.578059 -0.0594314\nv 0.102871 0.655291 -0.00917304\nv 0.0840509 0.604927 -0.0374478\nv 0.106509 0.598566 -0.0755281\nv 0.129529 0.604207 -0.100341\nv 0.123695 0.779303 -0.0699751\nv 0.101606 0.7146 -0.016044\nv 0.118125 0.805346 -0.0877764\nv 0.0132675 0.865726 -0.0939093\nv 0.0375356 0.9221 -0.06755\nv 0.0895336 0.896338 -0.0741398\nv 0.0928022 0.85223 -0.0353917\nv 0.0770218 0.841265 0.0080132\nv 0.0623836 0.925737 -0.102204\nv 0.00576389 0.967736 -0.108618\nv 0.0187502 0.960936 -0.130514\nv 0.00847011 1 -0.14176\nv 0.0176431 0.992479 -0.15067\nv 0.0718026 0.877131 -0.108793\nv 0.0532633 0.90117 -0.126155\nv 0.0110357 0.945524 -0.144625\nv 0.00553544 0.985608 -0.159561\nv 0.0123889 0.888413 -0.108073\nv -0.0163076 0.936334 -0.134467\nv -0.00506098 0.990493 -0.153077\nv -0.0194707 0.963659 -0.143588\nv -0.00254806 0.999104 -0.144537\nv -0.0197167 0.973852 -0.128282\nv 0.000421748 0.861139 -0.044389\nv 0.000474467 0.90219 -0.0739993\nv -0.0196113 0.946561 -0.111166\nv 0.0279935 0.891593 -0.120286\nv 0.0138123 0.848592 0.00926086\nv 0.00954205 0.91674 -0.0609251\nv -0.00832953 0.969054 -0.108829\nv 0.00736302 0.999157 -0.157558\nv 0.123379 0.805363 -0.0418761\nv 0.110551 0.823077 0.0101395\nv 0.214248 0.782255 0.0628932\nv 0.220838 0.756809 -0.0141989\nv 0.28656 0.729993 0.091572\nv 0.298563 0.657189 0.0578498\nv 0.289899 0.69244 0.116719\nv 0.259674 0.63155 0.114821\nv 0.257003 0.670474 0.147348\nv 0.138281 0.580607 0.187291\nv 0.189506 0.605332 0.167926\nv 0.189962 0.628422 0.185587\nv 0.159913 0.742822 0.100675\nv 0.213088 0.703125 0.11577\nv 0.129547 0.581643 0.181334\nv 0.164605 0.63619 0.1684\nv 0.103943 0.889977 -0.00834712\nv 0.122571 0.903332 0.0329491\nv 0.0952799 0.861807 0.0758092\nv 0.136067 0.903982 -0.0210347\nv 0.147594 0.920255 0.000667753\nv 0.184005 0.905493 -0.034144\nv 0.0506976 0.891224 0.0661969\nv 0.0925562 0.928127 0.0242681\nv 0.127632 0.937652 -0.00801324\nv 0.167504 0.918901 -0.034847\nv 0.0749482 0.907971 -0.000333902\nv 0.0480969 0.851843 0.00903242\nv 0.0766527 0.893017 -0.00741575\nv 0.107317 0.92398 -0.0217025\nv 0.161231 0.904509 -0.031104\nv 0.168506 0.916441 -0.02172\nv 0.0276421 0.872825 0.0308052\nv 0.00883914 0.827734 0.0575335\nv 0.0361825 0.863828 0.0831547\nv 0.156451 0.720609 -0.00374304\nv 0.153674 0.694197 0.0563736\nv 0.290532 0.680332 0.0269743\nv 0.220188 0.660299 0.0603451\nv 0.231505 0.700858 0.00569359\nv 0.217956 0.637384 0.0884441\nv 0.173215 0.606333 0.137455\nv 0.142867 0.570274 0.177082\nv 0.139282 0.574474 0.167873\nv 0.2104 0.681809 0.130127\nv 0.131656 0.570344 0.179858\nv 0.0881278 0.595016 0.00268863\nv 0.128264 0.558201 0.0246547\nv 0.115524 0.533617 0.0411731\nv 0.11584 0.527484 0.0417179\nv 0.0849823 0.499508 0.039328\nv 0.0874952 0.557604 0.0307173\nv 0.0989878 0.529944 0.0420518\nv 0.0950866 0.486961 0.0309282\nv 0.388992 0.221172 -0.621499\nv 0.347503 0.278723 -0.594384\nv 0.230767 0.771711 0.0179946\nv 0.300162 0.706305 0.0577268\nv 0.302516 0.67666 0.0889713\nv 0.153604 0.703757 0.0845605\nv 0.203054 0.674428 0.0836819\nv 0.202193 0.658525 0.101026\nv 0.182863 0.693741 0.0835061\nv 0.192844 0.679717 0.0521562\n# 2519 vertices\n\nvt  0.644 0.154 0.599\nvt  0.632 0.188 0.600\nvt  0.640 0.183 0.600\nvt  0.656 0.168 0.599\nvt  0.643 0.221 0.601\nvt  0.656 0.202 0.601\nvt  0.639 0.194 0.600\nvt  0.621 0.228 0.601\nvt  0.586 0.119 0.597\nvt  0.562 0.130 0.598\nvt  0.578 0.188 0.600\nvt  0.615 0.158 0.599\nvt  0.614 0.081 0.598\nvt  0.644 0.095 0.597\nvt  0.695 0.188 0.602\nvt  0.671 0.180 0.600\nvt  0.673 0.195 0.601\nvt  0.684 0.201 0.602\nvt  0.647 0.189 0.600\nvt  0.595 0.214 0.600\nvt  0.703 0.208 0.602\nvt  0.713 0.199 0.602\nvt  0.719 0.214 0.603\nvt  0.724 0.204 0.603\nvt  0.715 0.196 0.602\nvt  0.728 0.196 0.602\nvt  0.735 0.206 0.602\nvt  0.734 0.198 0.602\nvt  0.734 0.218 0.603\nvt  0.730 0.165 0.600\nvt  0.731 0.189 0.602\nvt  0.734 0.188 0.602\nvt  0.733 0.162 0.600\nvt  0.734 0.227 0.602\nvt  0.716 0.218 0.603\nvt  0.703 0.212 0.603\nvt  0.717 0.236 0.602\nvt  0.702 0.230 0.602\nvt  0.694 0.221 0.602\nvt  0.697 0.257 0.602\nvt  0.682 0.239 0.602\nvt  0.673 0.225 0.602\nvt  0.734 0.260 0.602\nvt  0.710 0.276 0.602\nvt  0.637 0.273 0.601\nvt  0.598 0.264 0.601\nvt  0.659 0.309 0.601\nvt  0.704 0.152 0.599\nvt  0.706 0.125 0.597\nvt  0.682 0.130 0.598\nvt  0.677 0.154 0.599\nvt  0.719 0.150 0.599\nvt  0.733 0.122 0.597\nvt  0.703 0.187 0.602\nvt  0.703 0.177 0.601\nvt  0.699 0.172 0.601\nvt  0.707 0.175 0.602\nvt  0.711 0.186 0.606\nvt  0.717 0.188 0.606\nvt  0.706 0.173 0.601\nvt  0.717 0.161 0.601\nvt  0.730 0.159 0.599\nvt  0.624 0.324 0.601\nvt  0.578 0.291 0.600\nvt  0.734 0.303 0.601\nvt  0.700 0.310 0.601\nvt  0.715 0.317 0.601\nvt  0.673 0.210 0.602\nvt  0.692 0.216 0.602\nvt  0.691 0.211 0.602\nvt  0.641 0.070 0.597\nvt  0.662 0.081 0.596\nvt  0.676 0.098 0.596\nvt  0.705 0.093 0.595\nvt  0.733 0.096 0.595\nvt  0.686 0.077 0.596\nvt  0.704 0.073 0.595\nvt  0.733 0.077 0.595\nvt  0.711 0.057 0.595\nvt  0.697 0.054 0.595\nvt  0.661 0.057 0.597\nvt  0.682 0.060 0.596\nvt  0.674 0.039 0.597\nvt  0.670 0.043 0.597\nvt  0.694 0.044 0.596\nvt  0.719 0.033 0.595\nvt  0.711 0.023 0.596\nvt  0.733 0.053 0.594\nvt  0.734 0.032 0.594\nvt  0.275 0.976 0.506\nvt  0.271 0.991 0.510\nvt  0.241 0.990 0.536\nvt  0.236 0.970 0.540\nvt  0.325 0.976 0.455\nvt  0.322 0.987 0.457\nvt  0.299 0.955 0.477\nvt  0.305 0.955 0.472\nvt  0.302 0.969 0.479\nvt  0.339 0.984 0.440\nvt  0.336 0.990 0.443\nvt  0.733 0.014 0.595\nvt  0.727 0.011 0.596\nvt  0.298 0.668 0.427\nvt  0.321 0.707 0.450\nvt  0.332 0.693 0.450\nvt  0.323 0.665 0.434\nvt  0.339 0.678 0.447\nvt  0.337 0.640 0.426\nvt  0.307 0.634 0.413\nvt  0.288 0.655 0.417\nvt  0.352 0.621 0.416\nvt  0.352 0.584 0.395\nvt  0.333 0.597 0.401\nvt  0.320 0.616 0.409\nvt  0.597 0.747 -0.465\nvt  0.621 0.733 -0.465\nvt  0.638 0.776 -0.437\nvt  0.611 0.783 -0.437\nvt  0.648 0.761 -0.440\nvt  0.645 0.778 -0.437\nvt  0.644 0.754 -0.446\nvt  0.579 0.752 -0.465\nvt  0.590 0.787 -0.440\nvt  0.542 0.754 -0.462\nvt  0.556 0.791 -0.451\nvt  0.606 0.693 -0.456\nvt  0.634 0.678 -0.468\nvt  0.643 0.715 -0.465\nvt  0.572 0.710 -0.457\nvt  0.571 0.695 -0.460\nvt  0.593 0.685 -0.461\nvt  0.563 0.668 -0.455\nvt  0.566 0.684 -0.426\nvt  0.561 0.686 -0.437\nvt  0.553 0.670 -0.459\nvt  0.547 0.707 -0.450\nvt  0.554 0.695 -0.446\nvt  0.541 0.682 -0.446\nvt  0.525 0.688 -0.442\nvt  0.556 0.654 -0.501\nvt  0.569 0.652 -0.505\nvt  0.576 0.668 -0.453\nvt  0.603 0.655 -0.496\nvt  0.586 0.664 -0.492\nvt  0.585 0.658 -0.494\nvt  0.595 0.649 -0.493\nvt  0.577 0.651 -0.498\nvt  0.586 0.642 -0.488\nvt  0.577 0.645 -0.494\nvt  0.570 0.634 -0.513\nvt  0.582 0.634 -0.511\nvt  0.563 0.651 -0.516\nvt  0.557 0.631 -0.502\nvt  0.521 0.674 -0.487\nvt  0.533 0.670 -0.497\nvt  0.588 0.624 -0.500\nvt  0.564 0.611 -0.444\nvt  0.609 0.620 -0.451\nvt  0.597 0.626 -0.482\nvt  0.454 0.857 -0.466\nvt  0.462 0.834 -0.465\nvt  0.497 0.846 -0.461\nvt  0.485 0.886 -0.467\nvt  0.525 0.846 -0.458\nvt  0.518 0.777 -0.462\nvt  0.563 0.844 -0.459\nvt  0.645 0.790 -0.437\nvt  0.643 0.805 -0.440\nvt  0.636 0.805 -0.444\nvt  0.640 0.813 -0.425\nvt  0.650 0.809 -0.442\nvt  0.644 0.817 -0.430\nvt  0.653 0.790 -0.438\nvt  0.657 0.776 -0.440\nvt  0.654 0.769 -0.436\nvt  0.467 0.802 -0.465\nvt  0.470 0.774 -0.467\nvt  0.499 0.775 -0.465\nvt  0.498 0.818 -0.462\nvt  0.661 0.741 -0.451\nvt  0.651 0.753 -0.447\nvt  0.517 0.713 -0.454\nvt  0.544 0.728 -0.465\nvt  0.512 0.735 -0.456\nvt  0.499 0.707 -0.479\nvt  0.386 0.562 -0.685\nvt  0.424 0.552 -0.685\nvt  0.411 0.596 -0.685\nvt  0.388 0.597 -0.685\nvt  0.423 0.813 -0.467\nvt  0.431 0.768 -0.467\nvt  0.441 0.742 -0.469\nvt  0.449 0.721 -0.469\nvt  0.460 0.745 -0.469\nvt  0.456 0.760 -0.468\nvt  0.408 0.746 -0.469\nvt  0.413 0.734 -0.469\nvt  0.667 0.706 -0.465\nvt  0.670 0.722 -0.461\nvt  0.430 0.709 -0.454\nvt  0.397 0.522 -0.685\nvt  0.389 0.523 -0.685\nvt  0.387 0.496 -0.685\nvt  0.395 0.491 -0.685\nvt  0.389 0.442 -0.685\nvt  0.409 0.461 -0.685\nvt  0.384 0.469 -0.685\nvt  0.367 0.448 -0.685\nvt  0.457 0.478 -0.685\nvt  0.437 0.450 -0.685\nvt  0.453 0.440 -0.697\nvt  0.468 0.464 -0.696\nvt  0.445 0.513 -0.685\nvt  0.425 0.499 -0.685\nvt  0.477 0.499 -0.685\nvt  0.495 0.484 -0.696\nvt  0.497 0.445 -0.646\nvt  0.510 0.452 -0.642\nvt  0.423 0.527 -0.685\nvt  0.462 0.528 -0.685\nvt  0.474 0.542 -0.685\nvt  0.445 0.562 -0.685\nvt  0.367 0.420 -0.685\nvt  0.334 0.432 -0.685\nvt  0.351 0.404 -0.685\nvt  0.323 0.418 -0.685\nvt  0.422 0.427 -0.685\nvt  0.395 0.403 -0.685\nvt  0.474 0.760 -0.468\nvt  0.493 0.756 -0.468\nvt  0.379 0.470 -0.685\nvt  0.447 0.388 -0.709\nvt  0.448 0.419 -0.705\nvt  0.485 0.401 -0.627\nvt  0.480 0.420 -0.637\nvt  0.478 0.587 -0.685\nvt  0.496 0.568 -0.685\nvt  0.486 0.600 -0.685\nvt  0.515 0.584 -0.685\nvt  0.395 0.801 -0.468\nvt  0.678 0.800 -0.452\nvt  0.660 0.758 -0.446\nvt  0.688 0.779 -0.457\nvt  0.706 0.767 -0.457\nvt  0.467 0.627 -0.685\nvt  0.501 0.611 -0.685\nvt  0.487 0.631 -0.685\nvt  0.538 0.562 -0.685\nvt  0.550 0.583 -0.685\nvt  0.528 0.603 -0.685\nvt  0.513 0.398 -0.667\nvt  0.523 0.406 -0.679\nvt  0.502 0.418 -0.600\nvt  0.496 0.414 -0.604\nvt  0.521 0.549 -0.685\nvt  0.508 0.511 -0.685\nvt  0.486 0.431 -0.620\nvt  0.506 0.432 -0.616\nvt  0.527 0.421 -0.676\nvt  0.545 0.559 -0.712\nvt  0.584 0.532 -0.709\nvt  0.583 0.550 -0.708\nvt  0.551 0.566 -0.701\nvt  0.612 0.550 -0.709\nvt  0.598 0.562 -0.709\nvt  0.589 0.564 -0.710\nvt  0.594 0.551 -0.709\nvt  0.598 0.537 -0.709\nvt  0.611 0.577 -0.710\nvt  0.610 0.570 -0.709\nvt  0.619 0.561 -0.709\nvt  0.617 0.570 -0.710\nvt  0.589 0.577 -0.701\nvt  0.629 0.566 -0.710\nvt  0.625 0.558 -0.709\nvt  0.632 0.555 -0.709\nvt  0.632 0.565 -0.709\nvt  0.620 0.536 -0.709\nvt  0.576 0.387 -0.709\nvt  0.605 0.396 -0.709\nvt  0.603 0.416 -0.709\nvt  0.574 0.413 -0.709\nvt  0.609 0.439 -0.709\nvt  0.570 0.439 -0.708\nvt  0.620 0.466 -0.709\nvt  0.572 0.467 -0.708\nvt  0.572 0.490 -0.708\nvt  0.623 0.493 -0.709\nvt  0.538 0.492 -0.708\nvt  0.531 0.463 -0.706\nvt  0.555 0.509 -0.709\nvt  0.623 0.515 -0.709\nvt  0.627 0.419 -0.709\nvt  0.647 0.429 -0.709\nvt  0.524 0.437 -0.666\nvt  0.521 0.356 -0.709\nvt  0.554 0.364 -0.708\nvt  0.662 0.494 -0.709\nvt  0.661 0.511 -0.709\nvt  0.681 0.501 -0.709\nvt  0.680 0.507 -0.709\nvt  0.752 0.685 -0.953\nvt  0.738 0.692 -0.953\nvt  0.731 0.679 -0.953\nvt  0.746 0.673 -0.953\nvt  0.726 0.671 -0.953\nvt  0.742 0.665 -0.954\nvt  0.721 0.659 -0.954\nvt  0.737 0.654 -0.954\nvt  0.716 0.649 -0.955\nvt  0.733 0.642 -0.955\nvt  0.720 0.620 -0.957\nvt  0.711 0.625 -0.957\nvt  0.705 0.612 -0.959\nvt  0.710 0.605 -0.958\nvt  0.700 0.603 -0.961\nvt  0.703 0.601 -0.958\nvt  0.699 0.629 -0.957\nvt  0.694 0.612 -0.958\nvt  0.695 0.604 -0.958\nvt  0.713 0.676 -0.954\nvt  0.698 0.655 -0.954\nvt  0.749 0.652 -0.954\nvt  0.756 0.664 -0.953\nvt  0.681 0.514 -0.709\nvt  0.665 0.524 -0.709\nvt  0.766 0.677 -0.953\nvt  0.684 0.487 -0.709\nvt  0.694 0.494 -0.709\nvt  0.717 0.692 -0.953\nvt  0.748 0.630 -0.954\nvt  0.766 0.647 -0.954\nvt  0.722 0.614 -0.956\nvt  0.733 0.611 -0.955\nvt  0.778 0.662 -0.953\nvt  0.695 0.631 -0.956\nvt  0.690 0.637 -0.955\nvt  0.678 0.661 -0.954\nvt  0.674 0.640 -0.954\nvt  0.747 0.602 -0.954\nvt  0.762 0.619 -0.954\nvt  0.720 0.599 -0.956\nvt  0.733 0.598 -0.955\nvt  0.677 0.627 -0.955\nvt  0.686 0.617 -0.956\nvt  0.718 0.610 -0.957\nvt  0.711 0.598 -0.957\nvt  0.695 0.626 -0.957\nvt  0.688 0.610 -0.957\nvt  0.696 0.597 -0.957\nvt  0.414 0.480 -0.685\nvt  0.360 0.450 -0.685\nvt  0.331 0.436 -0.685\nvt  0.652 0.454 -0.709\nvt  0.698 0.676 -0.954\nvt  0.682 0.679 -0.954\nvt  0.773 0.634 -0.954\nvt  0.695 0.697 -0.953\nvt  0.679 0.699 -0.953\nvt  0.793 0.639 -0.953\nvt  0.788 0.651 -0.953\nvt  0.861 0.723 -0.888\nvt  0.883 0.735 -0.890\nvt  0.863 0.747 -0.890\nvt  0.848 0.731 -0.892\nvt  0.845 0.726 -0.890\nvt  0.855 0.720 -0.882\nvt  0.840 0.719 -0.901\nvt  0.848 0.713 -0.894\nvt  0.833 0.714 -0.922\nvt  0.844 0.708 -0.911\nvt  0.826 0.685 -0.961\nvt  0.820 0.689 -0.959\nvt  0.810 0.676 -0.999\nvt  0.816 0.672 -1.002\nvt  0.813 0.691 -0.977\nvt  0.801 0.679 -1.017\nvt  0.831 0.733 -0.932\nvt  0.823 0.719 -0.947\nvt  0.835 0.680 -0.979\nvt  0.855 0.694 -0.951\nvt  0.859 0.711 -0.910\nvt  0.864 0.716 -0.907\nvt  0.869 0.703 -0.942\nvt  0.808 0.696 -0.991\nvt  0.809 0.722 -0.968\nvt  0.794 0.706 -1.006\nvt  0.848 0.669 -1.006\nvt  0.862 0.685 -0.968\nvt  0.825 0.666 -1.010\nvt  0.824 0.676 -0.985\nvt  0.816 0.666 -1.013\nvt  0.803 0.685 -1.003\nvt  0.795 0.684 -1.010\nvt  0.796 0.678 -1.013\nvt  0.817 0.738 -0.955\nvt  0.876 0.697 -0.955\nvt  0.668 0.471 -0.709\nvt  0.672 0.442 -0.708\nvt  0.691 0.461 -0.709\nvt  0.848 0.762 -0.935\nvt  0.629 0.397 -0.709\nvt  0.644 0.401 -0.709\nvt  0.741 0.427 -0.750\nvt  0.741 0.443 -0.728\nvt  0.718 0.446 -0.708\nvt  0.721 0.422 -0.704\nvt  0.746 0.415 -0.734\nvt  0.733 0.401 -0.694\nvt  0.699 0.454 -0.709\nvt  0.702 0.418 -0.714\nvt  0.711 0.392 -0.725\nvt  0.675 0.413 -0.707\nvt  0.679 0.396 -0.703\nvt  0.840 0.774 -0.966\nvt  0.817 0.772 -0.983\nvt  0.659 0.538 -0.709\nvt  0.651 0.559 -0.709\nvt  0.648 0.573 -0.709\nvt  0.693 0.558 -0.709\nvt  0.679 0.577 -0.709\nvt  0.668 0.560 -0.709\nvt  0.684 0.544 -0.709\nvt  0.685 0.525 -0.709\nvt  0.686 0.533 -0.709\nvt  0.913 0.704 -0.983\nvt  0.887 0.717 -0.934\nvt  0.628 0.574 -0.709\nvt  0.623 0.597 -0.709\nvt  0.610 0.598 -0.709\nvt  0.591 0.597 -0.711\nvt  0.711 0.753 -0.884\nvt  0.725 0.749 -0.889\nvt  0.736 0.760 -0.893\nvt  0.723 0.763 -0.883\nvt  0.737 0.743 -0.895\nvt  0.747 0.754 -0.900\nvt  0.742 0.740 -0.909\nvt  0.752 0.751 -0.914\nvt  0.788 0.725 -1.001\nvt  0.774 0.734 -0.957\nvt  0.769 0.729 -0.962\nvt  0.786 0.720 -1.007\nvt  0.780 0.738 -0.972\nvt  0.794 0.729 -1.014\nvt  0.747 0.772 -0.931\nvt  0.762 0.763 -0.952\nvt  0.734 0.726 -0.947\nvt  0.762 0.715 -0.999\nvt  0.724 0.741 -0.908\nvt  0.726 0.729 -0.939\nvt  0.785 0.751 -0.999\nvt  0.790 0.765 -1.007\nvt  0.771 0.773 -0.970\nvt  0.734 0.713 -0.970\nvt  0.751 0.704 -1.007\nvt  0.779 0.713 -1.005\nvt  0.787 0.716 -1.012\nvt  0.773 0.720 -0.989\nvt  0.799 0.731 -1.012\nvt  0.798 0.739 -1.005\nvt  0.787 0.741 -0.991\nvt  0.762 0.775 -0.961\nvt  0.726 0.715 -0.961\nvt  0.757 0.794 -0.975\nvt  0.740 0.793 -0.968\nvt  0.703 0.714 -0.975\nvt  0.700 0.733 -0.937\nvt  0.022 0.649 0.173\nvt  0.019 0.619 0.173\nvt  0.014 0.626 0.173\nvt  0.017 0.652 0.173\nvt  0.006 0.626 0.173\nvt  0.006 0.652 0.173\nvt  0.006 0.694 0.173\nvt  0.029 0.699 0.173\nvt  0.033 0.697 0.173\nvt  0.659 0.833 -0.454\nvt  0.646 0.821 -0.443\nvt  0.049 0.730 0.173\nvt  0.057 0.726 0.173\nvt  0.006 0.734 0.173\nvt  0.638 0.852 -0.457\nvt  0.628 0.839 -0.451\nvt  0.636 0.824 -0.446\nvt  0.615 0.835 -0.450\nvt  0.630 0.817 -0.442\nvt  0.013 0.588 0.173\nvt  0.006 0.588 0.173\nvt  0.017 0.588 0.172\nvt  0.022 0.546 0.111\nvt  0.006 0.532 0.117\nvt  0.203 0.940 -0.291\nvt  0.213 0.950 -0.291\nvt  0.264 0.917 -0.291\nvt  0.225 0.894 -0.291\nvt  0.281 0.893 -0.291\nvt  0.238 0.881 -0.291\nvt  0.291 0.865 -0.291\nvt  0.255 0.859 -0.291\nvt  0.289 0.825 -0.291\nvt  0.261 0.832 -0.291\nvt  0.268 0.756 -0.291\nvt  0.236 0.767 -0.291\nvt  0.226 0.700 -0.291\nvt  0.203 0.715 -0.291\nvt  0.183 0.647 -0.292\nvt  0.165 0.659 -0.292\nvt  0.146 0.581 -0.292\nvt  0.126 0.574 -0.292\nvt  0.121 0.528 -0.292\nvt  0.116 0.525 -0.292\nvt  0.328 0.815 -0.291\nvt  0.314 0.767 -0.291\nvt  0.295 0.734 -0.291\nvt  0.249 0.684 -0.291\nvt  0.201 0.637 -0.292\nvt  0.158 0.579 -0.292\nvt  0.123 0.522 -0.292\nvt  0.322 0.855 -0.291\nvt  0.338 0.844 -0.290\nvt  0.363 0.821 -0.291\nvt  0.330 0.862 -0.290\nvt  0.340 0.851 -0.290\nvt  0.319 0.881 -0.290\nvt  0.330 0.878 -0.290\nvt  0.325 0.888 -0.290\nvt  0.320 0.900 -0.291\nvt  0.333 0.900 -0.290\nvt  0.342 0.894 -0.290\nvt  0.353 0.802 -0.291\nvt  0.368 0.799 -0.290\nvt  0.368 0.783 -0.285\nvt  0.364 0.783 -0.291\nvt  0.355 0.777 -0.291\nvt  0.340 0.792 -0.291\nvt  0.377 0.783 -0.291\nvt  0.369 0.773 -0.291\nvt  0.381 0.805 -0.291\nvt  0.374 0.796 -0.291\nvt  0.368 0.782 -0.284\nvt  0.314 0.932 -0.291\nvt  0.364 0.837 -0.290\nvt  0.349 0.852 -0.290\nvt  0.374 0.850 -0.290\nvt  0.376 0.877 -0.290\nvt  0.370 0.877 -0.290\nvt  0.374 0.890 -0.290\nvt  0.380 0.880 -0.290\nvt  0.343 0.876 -0.290\nvt  0.385 0.850 -0.290\nvt  0.389 0.841 -0.290\nvt  0.373 0.840 -0.290\nvt  0.379 0.858 -0.290\nvt  0.385 0.871 -0.290\nvt  0.345 0.913 -0.290\nvt  0.398 0.846 -0.291\nvt  0.404 0.867 -0.291\nvt  0.385 0.891 -0.290\nvt  0.386 0.908 -0.290\nvt  0.411 0.901 -0.291\nvt  0.409 0.889 -0.291\nvt  0.315 0.721 -0.291\nvt  0.262 0.675 -0.291\nvt  0.211 0.632 -0.292\nvt  0.163 0.577 -0.292\nvt  0.335 0.781 -0.291\nvt  0.347 0.772 -0.291\nvt  0.372 0.918 -0.290\nvt  0.335 0.938 -0.291\nvt  0.372 0.939 -0.290\nvt  0.385 0.932 -0.287\nvt  0.381 0.927 -0.292\nvt  0.392 0.922 -0.290\nvt  0.419 0.914 -0.291\nvt  0.006 0.768 0.173\nvt  0.043 0.760 0.173\nvt  0.046 0.742 0.173\nvt  0.042 0.774 0.173\nvt  0.056 0.776 0.173\nvt  0.056 0.763 0.173\nvt  0.049 0.797 0.173\nvt  0.060 0.798 0.173\nvt  0.564 0.899 -0.417\nvt  0.556 0.895 -0.436\nvt  0.545 0.910 -0.381\nvt  0.540 0.908 -0.399\nvt  0.534 0.892 -0.435\nvt  0.535 0.915 -0.422\nvt  0.553 0.926 -0.441\nvt  0.533 0.931 -0.422\nvt  0.524 0.931 -0.385\nvt  0.601 0.873 -0.460\nvt  0.605 0.872 -0.459\nvt  0.612 0.875 -0.459\nvt  0.606 0.880 -0.452\nvt  0.006 0.921 0.173\nvt  0.042 0.914 0.173\nvt  0.035 0.886 0.173\nvt  0.006 0.890 0.173\nvt  0.048 0.804 0.173\nvt  0.046 0.816 0.173\nvt  0.055 0.821 0.173\nvt  0.064 0.840 0.173\nvt  0.044 0.821 0.173\nvt  0.052 0.847 0.173\nvt  0.040 0.795 0.173\nvt  0.379 0.374 0.257\nvt  0.397 0.365 0.257\nvt  0.417 0.331 0.257\nvt  0.395 0.331 0.257\nvt  0.369 0.339 0.257\nvt  0.357 0.348 0.257\nvt  0.416 0.362 0.257\nvt  0.432 0.356 0.257\nvt  0.118 0.199 0.365\nvt  0.138 0.210 0.372\nvt  0.133 0.232 0.365\nvt  0.098 0.201 0.360\nvt  0.390 0.287 0.257\nvt  0.399 0.237 0.257\nvt  0.379 0.242 0.257\nvt  0.374 0.298 0.257\nvt  0.392 0.203 0.257\nvt  0.375 0.199 0.257\nvt  0.364 0.236 0.257\nvt  0.393 0.185 0.257\nvt  0.379 0.181 0.257\nvt  0.519 0.123 0.194\nvt  0.504 0.133 0.211\nvt  0.498 0.157 0.248\nvt  0.531 0.162 0.263\nvt  0.413 0.942 -0.291\nvt  0.438 0.941 -0.291\nvt  0.384 0.962 -0.291\nvt  0.412 0.962 -0.291\nvt  0.395 0.939 -0.294\nvt  0.395 0.986 -0.291\nvt  0.376 0.973 -0.291\nvt  0.498 0.055 0.095\nvt  0.491 0.083 0.156\nvt  0.506 0.088 0.158\nvt  0.521 0.069 0.118\nvt  0.355 0.382 0.257\nvt  0.370 0.379 0.257\nvt  0.083 0.929 0.173\nvt  0.109 0.962 0.173\nvt  0.117 0.953 0.173\nvt  0.098 0.934 0.173\nvt  0.092 0.923 0.173\nvt  0.094 0.928 0.173\nvt  0.097 0.920 0.173\nvt  0.118 0.942 0.173\nvt  0.078 0.901 0.173\nvt  0.085 0.881 0.173\nvt  0.078 0.890 0.168\nvt  0.069 0.885 0.173\nvt  0.470 0.350 0.257\nvt  0.466 0.318 0.257\nvt  0.548 0.208 0.346\nvt  0.562 0.190 0.346\nvt  0.544 0.158 0.263\nvt  0.569 0.217 0.399\nvt  0.573 0.203 0.382\nvt  0.803 0.618 0.349\nvt  0.802 0.627 0.353\nvt  0.809 0.631 0.373\nvt  0.817 0.623 0.386\nvt  0.786 0.610 0.318\nvt  0.838 0.598 0.408\nvt  0.835 0.588 0.402\nvt  0.846 0.608 0.435\nvt  0.890 0.638 0.432\nvt  0.911 0.637 0.402\nvt  0.920 0.588 0.479\nvt  0.911 0.586 0.497\nvt  0.887 0.576 0.499\nvt  0.882 0.567 0.479\nvt  0.925 0.574 0.493\nvt  0.916 0.572 0.508\nvt  0.900 0.564 0.511\nvt  0.896 0.558 0.493\nvt  0.925 0.564 0.500\nvt  0.918 0.564 0.514\nvt  0.911 0.558 0.517\nvt  0.907 0.552 0.500\nvt  0.902 0.583 0.521\nvt  0.877 0.626 0.476\nvt  0.853 0.614 0.458\nvt  0.895 0.580 0.522\nvt  0.914 0.561 0.527\nvt  0.909 0.569 0.526\nvt  0.905 0.567 0.526\nvt  0.865 0.619 0.481\nvt  0.828 0.632 0.426\nvt  0.858 0.642 0.476\nvt  0.858 0.656 0.452\nvt  0.870 0.675 0.399\nvt  0.936 0.481 0.530\nvt  0.900 0.508 0.615\nvt  0.913 0.530 0.614\nvt  0.936 0.499 0.553\nvt  0.902 0.477 0.613\nvt  0.867 0.503 0.683\nvt  0.797 0.433 0.635\nvt  0.770 0.443 0.614\nvt  0.760 0.479 0.665\nvt  0.778 0.485 0.697\nvt  0.799 0.492 0.741\nvt  0.813 0.454 0.703\nvt  0.847 0.519 0.718\nvt  0.855 0.482 0.715\nvt  0.830 0.513 0.759\nvt  0.819 0.504 0.759\nvt  0.829 0.478 0.733\nvt  0.872 0.434 0.726\nvt  0.868 0.411 0.712\nvt  0.821 0.436 0.685\nvt  0.846 0.450 0.726\nvt  0.821 0.456 0.726\nvt  0.840 0.463 0.736\nvt  0.831 0.472 0.761\nvt  0.843 0.479 0.726\nvt  0.867 0.459 0.704\nvt  0.878 0.473 0.678\nvt  0.319 0.117 0.426\nvt  0.330 0.095 0.408\nvt  0.337 0.110 0.409\nvt  0.328 0.119 0.417\nvt  0.858 0.530 0.687\nvt  0.753 0.522 0.747\nvt  0.765 0.522 0.759\nvt  0.808 0.551 0.799\nvt  0.824 0.558 0.757\nvt  0.783 0.530 0.806\nvt  0.796 0.539 0.826\nvt  0.805 0.543 0.814\nvt  0.875 0.545 0.665\nvt  0.831 0.568 0.747\nvt  0.795 0.572 0.815\nvt  0.805 0.583 0.799\nvt  0.755 0.549 0.799\nvt  0.766 0.559 0.843\nvt  0.784 0.565 0.850\nvt  0.775 0.562 0.861\nvt  0.750 0.584 0.830\nvt  0.756 0.582 0.841\nvt  0.767 0.589 0.841\nvt  0.769 0.593 0.830\nvt  0.762 0.582 0.856\nvt  0.810 0.388 0.581\nvt  0.798 0.378 0.543\nvt  0.782 0.420 0.591\nvt  0.961 0.985 0.382\nvt  0.947 0.980 0.399\nvt  0.959 0.938 0.454\nvt  0.972 0.944 0.444\nvt  0.918 0.921 0.543\nvt  0.908 0.902 0.575\nvt  0.933 0.899 0.550\nvt  0.941 0.918 0.522\nvt  0.928 0.961 0.452\nvt  0.923 0.942 0.497\nvt  0.973 0.905 0.505\nvt  0.977 0.906 0.501\nvt  0.965 0.892 0.538\nvt  0.967 0.898 0.528\nvt  0.006 0.949 0.173\nvt  0.063 0.948 0.173\nvt  0.070 0.868 0.173\nvt  0.006 0.853 0.173\nvt  0.293 0.111 0.446\nvt  0.304 0.108 0.435\nvt  0.303 0.115 0.440\nvt  0.290 0.118 0.449\nvt  0.282 0.106 0.451\nvt  0.277 0.108 0.452\nvt  0.947 0.645 0.476\nvt  0.960 0.631 0.484\nvt  0.953 0.621 0.516\nvt  0.932 0.645 0.497\nvt  0.845 0.391 0.653\nvt  0.267 0.092 0.439\nvt  0.292 0.099 0.441\nvt  0.278 0.102 0.449\nvt  0.267 0.100 0.447\nvt  0.299 0.045 0.396\nvt  0.307 0.058 0.404\nvt  0.279 0.070 0.423\nvt  0.269 0.058 0.420\nvt  0.288 0.029 0.389\nvt  0.266 0.039 0.406\nvt  0.257 0.025 0.395\nvt  0.277 0.011 0.381\nvt  0.251 0.125 0.456\nvt  0.263 0.135 0.458\nvt  0.256 0.138 0.459\nvt  0.243 0.124 0.453\nvt  0.230 0.042 0.396\nvt  0.255 0.047 0.442\nvt  0.256 0.045 0.457\nvt  0.234 0.058 0.410\nvt  0.257 0.085 0.433\nvt  0.257 0.098 0.443\nvt  0.231 0.101 0.436\nvt  0.223 0.076 0.415\nvt  0.190 0.114 0.418\nvt  0.181 0.094 0.409\nvt  0.209 0.129 0.436\nvt  0.229 0.128 0.449\nvt  0.210 0.144 0.444\nvt  0.228 0.141 0.458\nvt  0.266 0.150 0.460\nvt  0.244 0.144 0.463\nvt  0.265 0.144 0.457\nvt  0.284 0.252 0.376\nvt  0.251 0.260 0.377\nvt  0.258 0.236 0.390\nvt  0.289 0.230 0.388\nvt  0.280 0.276 0.366\nvt  0.250 0.284 0.365\nvt  0.212 0.270 0.374\nvt  0.223 0.288 0.364\nvt  0.279 0.290 0.360\nvt  0.255 0.308 0.356\nvt  0.223 0.310 0.356\nvt  0.199 0.303 0.359\nvt  0.185 0.262 0.371\nvt  0.177 0.311 0.356\nvt  0.165 0.278 0.364\nvt  0.209 0.343 0.348\nvt  0.186 0.346 0.348\nvt  0.267 0.205 0.416\nvt  0.295 0.211 0.405\nvt  0.234 0.239 0.387\nvt  0.240 0.197 0.422\nvt  0.199 0.238 0.383\nvt  0.205 0.202 0.409\nvt  0.235 0.351 0.345\nvt  0.248 0.349 0.345\nvt  0.251 0.386 0.336\nvt  0.229 0.388 0.336\nvt  0.216 0.364 0.343\nvt  0.209 0.388 0.336\nvt  0.197 0.355 0.345\nvt  0.188 0.357 0.345\nvt  0.269 0.410 0.332\nvt  0.266 0.431 0.327\nvt  0.255 0.433 0.326\nvt  0.248 0.409 0.331\nvt  0.268 0.445 0.325\nvt  0.260 0.447 0.324\nvt  0.275 0.448 0.325\nvt  0.261 0.453 0.323\nvt  0.267 0.381 0.336\nvt  0.228 0.413 0.331\nvt  0.286 0.352 0.343\nvt  0.285 0.344 0.345\nvt  0.295 0.345 0.345\nvt  0.293 0.354 0.342\nvt  0.280 0.372 0.338\nvt  0.290 0.376 0.338\nvt  0.286 0.331 0.348\nvt  0.282 0.312 0.354\nvt  0.304 0.315 0.354\nvt  0.298 0.334 0.348\nvt  0.274 0.431 0.329\nvt  0.282 0.412 0.332\nvt  0.241 0.445 0.325\nvt  0.298 0.284 0.364\nvt  0.310 0.258 0.374\nvt  0.329 0.212 0.396\nvt  0.320 0.234 0.385\nvt  0.475 0.201 0.257\nvt  0.465 0.241 0.257\nvt  0.481 0.242 0.257\nvt  0.481 0.203 0.257\nvt  0.493 0.218 0.257\nvt  0.488 0.201 0.257\nvt  0.367 0.022 0.372\nvt  0.384 0.023 0.393\nvt  0.387 0.049 0.417\nvt  0.375 0.047 0.398\nvt  0.410 0.055 0.452\nvt  0.392 0.072 0.442\nvt  0.389 0.068 0.435\nvt  0.384 0.069 0.427\nvt  0.816 0.627 0.389\nvt  0.824 0.635 0.423\nvt  0.425 0.079 0.423\nvt  0.424 0.101 0.389\nvt  0.410 0.092 0.409\nvt  0.415 0.072 0.437\nvt  0.383 0.075 0.434\nvt  0.396 0.078 0.434\nvt  0.351 0.217 0.382\nvt  0.337 0.243 0.377\nvt  0.353 0.236 0.372\nvt  0.360 0.258 0.369\nvt  0.306 0.191 0.446\nvt  0.315 0.180 0.422\nvt  0.333 0.190 0.402\nvt  0.968 0.585 0.515\nvt  0.983 0.599 0.526\nvt  0.985 0.588 0.499\nvt  0.975 0.577 0.490\nvt  0.958 0.563 0.479\nvt  0.965 0.554 0.452\nvt  0.984 0.660 0.426\nvt  0.982 0.628 0.475\nvt  0.974 0.542 0.423\nvt  0.971 0.550 0.437\nvt  0.983 0.570 0.475\nvt  0.979 0.539 0.426\nvt  0.948 0.581 0.530\nvt  0.952 0.599 0.553\nvt  0.972 0.599 0.532\nvt  0.143 0.197 0.377\nvt  0.153 0.202 0.383\nvt  0.152 0.219 0.378\nvt  0.146 0.310 0.354\nvt  0.147 0.283 0.360\nvt  0.164 0.349 0.347\nvt  0.151 0.329 0.350\nvt  0.151 0.247 0.367\nvt  0.172 0.239 0.376\nvt  0.117 0.341 0.348\nvt  0.114 0.323 0.351\nvt  0.320 0.341 0.346\nvt  0.327 0.317 0.352\nvt  0.318 0.294 0.360\nvt  0.342 0.306 0.356\nvt  0.334 0.262 0.369\nvt  0.355 0.272 0.363\nvt  0.318 0.362 0.342\nvt  0.291 0.425 0.332\nvt  0.286 0.439 0.329\nvt  0.160 0.455 0.334\nvt  0.162 0.440 0.336\nvt  0.181 0.432 0.334\nvt  0.184 0.450 0.331\nvt  0.142 0.416 0.339\nvt  0.163 0.399 0.339\nvt  0.200 0.432 0.331\nvt  0.203 0.450 0.328\nvt  0.176 0.404 0.337\nvt  0.185 0.398 0.336\nvt  0.189 0.377 0.341\nvt  0.201 0.371 0.342\nvt  0.171 0.383 0.340\nvt  0.149 0.359 0.345\nvt  0.168 0.365 0.344\nvt  0.129 0.383 0.342\nvt  0.125 0.364 0.345\nvt  0.090 0.293 0.352\nvt  0.112 0.282 0.355\nvt  0.216 0.448 0.327\nvt  0.247 0.465 0.321\nvt  0.216 0.464 0.323\nvt  0.203 0.465 0.325\nvt  0.268 0.497 0.314\nvt  0.283 0.485 0.316\nvt  0.236 0.501 0.318\nvt  0.249 0.504 0.315\nvt  0.280 0.457 0.323\nvt  0.292 0.474 0.319\nvt  0.261 0.517 0.312\nvt  0.272 0.513 0.311\nvt  0.292 0.498 0.312\nvt  0.284 0.506 0.311\nvt  0.245 0.518 0.313\nvt  0.236 0.514 0.315\nvt  0.301 0.485 0.315\nvt  0.297 0.491 0.313\nvt  0.233 0.538 0.310\nvt  0.228 0.535 0.311\nvt  0.231 0.544 0.309\nvt  0.225 0.541 0.310\nvt  0.225 0.553 0.308\nvt  0.220 0.550 0.308\nvt  0.219 0.565 0.306\nvt  0.212 0.562 0.307\nvt  0.205 0.493 0.322\nvt  0.198 0.487 0.324\nvt  0.216 0.542 0.313\nvt  0.222 0.525 0.318\nvt  0.205 0.560 0.312\nvt  0.203 0.571 0.306\nvt  0.198 0.570 0.309\nvt  0.204 0.580 0.303\nvt  0.210 0.570 0.304\nvt  0.213 0.576 0.305\nvt  0.208 0.585 0.309\nvt  0.199 0.579 0.307\nvt  0.198 0.590 0.309\nvt  0.202 0.591 0.311\nvt  0.196 0.588 0.310\nvt  0.189 0.479 0.327\nvt  0.192 0.466 0.328\nvt  0.413 0.279 0.257\nvt  0.421 0.232 0.257\nvt  0.420 0.203 0.257\nvt  0.211 0.163 0.451\nvt  0.209 0.165 0.460\nvt  0.218 0.150 0.456\nvt  0.260 0.159 0.467\nvt  0.251 0.154 0.471\nvt  0.273 0.164 0.459\nvt  0.265 0.164 0.464\nvt  0.234 0.187 0.439\nvt  0.208 0.187 0.428\nvt  0.225 0.178 0.447\nvt  0.236 0.150 0.466\nvt  0.243 0.152 0.467\nvt  0.232 0.155 0.465\nvt  0.229 0.149 0.464\nvt  0.211 0.175 0.448\nvt  0.222 0.170 0.456\nvt  0.219 0.176 0.447\nvt  0.270 0.189 0.433\nvt  0.255 0.180 0.445\nvt  0.261 0.177 0.452\nvt  0.274 0.184 0.440\nvt  0.235 0.549 0.311\nvt  0.225 0.570 0.310\nvt  0.217 0.580 0.310\nvt  0.250 0.533 0.312\nvt  0.192 0.569 0.313\nvt  0.200 0.555 0.317\nvt  0.230 0.573 0.316\nvt  0.220 0.585 0.315\nvt  0.990 0.300 -0.059\nvt  0.991 0.318 -0.059\nvt  0.982 0.319 -0.059\nvt  0.979 0.302 -0.059\nvt  0.992 0.329 -0.059\nvt  0.984 0.330 -0.059\nvt  0.991 0.339 -0.060\nvt  0.988 0.340 -0.060\nvt  0.976 0.280 -0.059\nvt  0.988 0.278 -0.059\nvt  0.971 0.257 -0.059\nvt  0.986 0.256 -0.059\nvt  0.242 0.556 0.316\nvt  0.253 0.541 0.315\nvt  0.213 0.520 0.322\nvt  0.208 0.538 0.318\nvt  0.196 0.503 0.322\nvt  0.189 0.497 0.323\nvt  0.191 0.508 0.322\nvt  0.185 0.501 0.323\nvt  0.186 0.513 0.322\nvt  0.179 0.505 0.323\nvt  0.179 0.497 0.325\nvt  0.166 0.512 0.324\nvt  0.160 0.508 0.327\nvt  0.163 0.525 0.324\nvt  0.173 0.514 0.322\nvt  0.175 0.521 0.323\nvt  0.167 0.529 0.325\nvt  0.159 0.519 0.325\nvt  0.155 0.532 0.325\nvt  0.156 0.535 0.327\nvt  0.151 0.529 0.327\nvt  0.195 0.515 0.323\nvt  0.179 0.526 0.325\nvt  0.211 0.505 0.322\nvt  0.155 0.501 0.329\nvt  0.170 0.493 0.328\nvt  0.197 0.522 0.326\nvt  0.183 0.533 0.328\nvt  0.940 0.076 -0.059\nvt  0.959 0.078 -0.059\nvt  0.958 0.089 -0.059\nvt  0.939 0.088 -0.059\nvt  0.966 0.079 -0.060\nvt  0.965 0.089 -0.060\nvt  0.976 0.079 -0.060\nvt  0.972 0.092 -0.060\nvt  0.987 0.086 -0.063\nvt  0.986 0.093 -0.064\nvt  0.925 0.090 -0.059\nvt  0.922 0.076 -0.059\nvt  0.210 0.519 0.325\nvt  0.172 0.480 0.330\nvt  0.225 0.507 0.320\nvt  0.977 0.223 -0.059\nvt  0.960 0.205 -0.059\nvt  0.977 0.199 -0.059\nvt  0.989 0.207 -0.059\nvt  0.221 0.509 0.324\nvt  0.990 0.237 -0.059\nvt  0.277 0.540 0.307\nvt  0.270 0.543 0.307\nvt  0.280 0.549 0.305\nvt  0.273 0.551 0.305\nvt  0.283 0.557 0.304\nvt  0.275 0.562 0.304\nvt  0.287 0.574 0.301\nvt  0.280 0.576 0.302\nvt  0.266 0.557 0.308\nvt  0.256 0.532 0.312\nvt  0.275 0.578 0.305\nvt  0.281 0.589 0.297\nvt  0.276 0.591 0.304\nvt  0.289 0.595 0.286\nvt  0.285 0.583 0.295\nvt  0.292 0.585 0.297\nvt  0.296 0.596 0.297\nvt  0.284 0.599 0.297\nvt  0.293 0.605 0.292\nvt  0.297 0.604 0.300\nvt  0.288 0.606 0.299\nvt  0.287 0.549 0.307\nvt  0.295 0.570 0.306\nvt  0.298 0.585 0.303\nvt  0.285 0.520 0.310\nvt  0.272 0.596 0.309\nvt  0.268 0.579 0.312\nvt  0.302 0.568 0.312\nvt  0.304 0.586 0.309\nvt  0.955 0.307 -0.059\nvt  0.948 0.325 -0.059\nvt  0.938 0.322 -0.059\nvt  0.943 0.302 -0.059\nvt  0.945 0.335 -0.059\nvt  0.937 0.332 -0.059\nvt  0.939 0.343 -0.059\nvt  0.935 0.341 -0.059\nvt  0.949 0.279 -0.059\nvt  0.962 0.282 -0.059\nvt  0.953 0.248 -0.059\nvt  0.296 0.548 0.313\nvt  0.294 0.526 0.313\nvt  0.259 0.559 0.313\nvt  0.311 0.515 0.307\nvt  0.306 0.520 0.307\nvt  0.315 0.517 0.306\nvt  0.311 0.523 0.306\nvt  0.323 0.524 0.304\nvt  0.319 0.529 0.304\nvt  0.333 0.531 0.303\nvt  0.330 0.535 0.302\nvt  0.310 0.532 0.308\nvt  0.290 0.518 0.310\nvt  0.327 0.542 0.306\nvt  0.337 0.543 0.300\nvt  0.337 0.548 0.306\nvt  0.346 0.541 0.297\nvt  0.337 0.536 0.299\nvt  0.342 0.534 0.301\nvt  0.351 0.539 0.299\nvt  0.344 0.547 0.302\nvt  0.322 0.517 0.308\nvt  0.339 0.526 0.307\nvt  0.346 0.531 0.305\nvt  0.308 0.498 0.313\nvt  0.335 0.553 0.312\nvt  0.322 0.546 0.312\nvt  0.340 0.517 0.313\nvt  0.351 0.529 0.309\nvt  0.932 0.243 -0.059\nvt  0.927 0.260 -0.059\nvt  0.917 0.257 -0.059\nvt  0.923 0.240 -0.059\nvt  0.924 0.270 -0.059\nvt  0.914 0.267 -0.059\nvt  0.927 0.219 -0.059\nvt  0.939 0.224 -0.059\nvt  0.930 0.194 -0.059\nvt  0.950 0.203 -0.059\nvt  0.326 0.509 0.314\nvt  0.313 0.498 0.315\nvt  0.306 0.537 0.313\nvt  0.917 0.159 -0.059\nvt  0.918 0.137 -0.059\nvt  0.954 0.131 -0.059\nvt  0.953 0.158 -0.059\nvt  0.293 0.453 0.326\nvt  0.301 0.463 0.324\nvt  0.490 0.357 0.257\nvt  0.515 0.310 0.257\nvt  0.316 0.486 0.313\nvt  0.316 0.491 0.312\nvt  0.325 0.486 0.311\nvt  0.325 0.491 0.311\nvt  0.331 0.484 0.310\nvt  0.332 0.489 0.310\nvt  0.339 0.484 0.310\nvt  0.340 0.489 0.310\nvt  0.323 0.496 0.313\nvt  0.310 0.496 0.313\nvt  0.340 0.494 0.313\nvt  0.348 0.489 0.310\nvt  0.350 0.493 0.314\nvt  0.356 0.484 0.310\nvt  0.344 0.486 0.309\nvt  0.348 0.480 0.311\nvt  0.356 0.481 0.310\nvt  0.355 0.489 0.313\nvt  0.323 0.478 0.316\nvt  0.339 0.476 0.315\nvt  0.348 0.477 0.314\nvt  0.306 0.478 0.318\nvt  0.351 0.497 0.318\nvt  0.339 0.498 0.317\nvt  0.339 0.471 0.319\nvt  0.350 0.472 0.319\nvt  0.907 0.217 -0.059\nvt  0.897 0.228 -0.059\nvt  0.891 0.223 -0.059\nvt  0.898 0.211 -0.059\nvt  0.892 0.236 -0.059\nvt  0.885 0.233 -0.059\nvt  0.909 0.197 -0.059\nvt  0.920 0.203 -0.059\nvt  0.918 0.178 -0.059\nvt  0.324 0.472 0.320\nvt  0.310 0.470 0.322\nvt  0.323 0.500 0.316\nvt  0.176 0.085 0.401\nvt  0.215 0.062 0.397\nvt  0.153 0.089 0.396\nvt  0.162 0.098 0.403\nvt  0.145 0.098 0.397\nvt  0.142 0.089 0.391\nvt  0.137 0.117 0.393\nvt  0.108 0.087 0.373\nvt  0.147 0.068 0.378\nvt  0.166 0.059 0.379\nvt  0.171 0.074 0.392\nvt  0.141 0.078 0.384\nvt  0.953 0.836 0.434\nvt  0.972 0.813 0.434\nvt  0.986 0.844 0.428\nvt  0.934 0.863 0.427\nvt  0.075 0.646 0.962\nvt  0.074 0.608 0.962\nvt  0.090 0.585 0.962\nvt  0.101 0.665 0.963\nvt  0.100 0.713 0.964\nvt  0.089 0.720 0.963\nvt  0.079 0.677 0.963\nvt  0.101 0.745 0.969\nvt  0.096 0.746 0.962\nvt  0.063 0.684 0.962\nvt  0.058 0.658 0.962\nvt  0.079 0.725 0.963\nvt  0.091 0.752 0.963\nvt  0.053 0.625 0.962\nvt  0.164 0.685 0.962\nvt  0.150 0.699 0.962\nvt  0.142 0.688 0.962\nvt  0.147 0.671 0.962\nvt  0.104 0.747 0.962\nvt  0.110 0.728 0.964\nvt  0.117 0.733 0.963\nvt  0.108 0.750 0.963\nvt  0.116 0.710 0.963\nvt  0.125 0.721 0.963\nvt  0.125 0.672 0.963\nvt  0.133 0.639 0.962\nvt  0.160 0.712 0.962\nvt  0.134 0.738 0.962\nvt  0.114 0.667 0.963\nvt  0.105 0.715 0.963\nvt  0.161 0.043 0.599\nvt  0.176 0.031 0.599\nvt  0.186 0.055 0.382\nvt  0.821 0.154 0.598\nvt  0.830 0.180 0.599\nvt  0.837 0.187 0.599\nvt  0.846 0.183 0.599\nvt  0.824 0.224 0.601\nvt  0.847 0.227 0.600\nvt  0.830 0.192 0.600\nvt  0.813 0.199 0.600\nvt  0.879 0.119 0.598\nvt  0.850 0.158 0.598\nvt  0.888 0.188 0.599\nvt  0.903 0.130 0.599\nvt  0.851 0.081 0.598\nvt  0.822 0.095 0.597\nvt  0.771 0.186 0.601\nvt  0.785 0.197 0.601\nvt  0.795 0.191 0.600\nvt  0.797 0.177 0.600\nvt  0.822 0.187 0.600\nvt  0.873 0.214 0.600\nvt  0.812 0.166 0.599\nvt  0.766 0.207 0.602\nvt  0.755 0.198 0.602\nvt  0.750 0.214 0.602\nvt  0.745 0.203 0.602\nvt  0.753 0.195 0.602\nvt  0.740 0.196 0.602\nvt  0.737 0.165 0.600\nvt  0.737 0.188 0.602\nvt  0.753 0.218 0.602\nvt  0.766 0.212 0.602\nvt  0.751 0.237 0.602\nvt  0.767 0.231 0.602\nvt  0.777 0.219 0.602\nvt  0.769 0.259 0.602\nvt  0.784 0.243 0.602\nvt  0.798 0.225 0.601\nvt  0.758 0.276 0.602\nvt  0.884 0.834 0.418\nvt  0.846 0.815 0.389\nvt  0.881 0.797 0.403\nvt  0.905 0.808 0.417\nvt  0.832 0.274 0.601\nvt  0.870 0.264 0.600\nvt  0.807 0.309 0.601\nvt  0.763 0.151 0.599\nvt  0.790 0.152 0.598\nvt  0.785 0.129 0.597\nvt  0.760 0.125 0.597\nvt  0.748 0.150 0.599\nvt  0.765 0.185 0.601\nvt  0.764 0.175 0.601\nvt  0.769 0.171 0.600\nvt  0.760 0.174 0.601\nvt  0.757 0.185 0.606\nvt  0.751 0.187 0.606\nvt  0.750 0.160 0.600\nvt  0.761 0.172 0.600\nvt  0.737 0.158 0.599\nvt  0.844 0.324 0.601\nvt  0.891 0.292 0.600\nvt  0.888 0.768 0.401\nvt  0.910 0.771 0.408\nvt  0.752 0.937 0.721\nvt  0.801 0.920 0.721\nvt  0.816 0.938 0.722\nvt  0.759 0.960 0.721\nvt  0.736 0.957 0.721\nvt  0.731 0.939 0.720\nvt  0.700 0.960 0.721\nvt  0.644 0.938 0.720\nvt  0.655 0.926 0.719\nvt  0.709 0.931 0.720\nvt  0.612 0.920 0.701\nvt  0.606 0.925 0.711\nvt  0.730 0.896 0.720\nvt  0.777 0.879 0.721\nvt  0.704 0.902 0.720\nvt  0.611 0.917 0.708\nvt  0.653 0.913 0.717\nvt  0.188 0.806 0.906\nvt  0.220 0.794 0.906\nvt  0.241 0.834 0.906\nvt  0.191 0.856 0.906\nvt  0.185 0.773 0.907\nvt  0.205 0.767 0.906\nvt  0.151 0.854 0.906\nvt  0.160 0.807 0.906\nvt  0.167 0.777 0.909\nvt  0.119 0.850 0.906\nvt  0.135 0.806 0.906\nvt  0.148 0.779 0.908\nvt  0.099 0.841 0.906\nvt  0.124 0.803 0.906\nvt  0.195 0.746 0.906\nvt  0.183 0.749 0.906\nvt  0.174 0.743 0.905\nvt  0.195 0.900 0.906\nvt  0.148 0.876 0.906\nvt  0.971 0.755 0.431\nvt  0.954 0.793 0.436\nvt  0.943 0.747 0.431\nvt  0.976 0.691 0.417\nvt  0.952 0.704 0.423\nvt  0.778 0.337 0.601\nvt  0.769 0.309 0.601\nvt  0.756 0.316 0.601\nvt  0.770 0.334 0.601\nvt  0.111 0.890 0.906\nvt  0.771 0.353 0.601\nvt  0.774 0.363 0.601\nvt  0.405 0.669 0.427\nvt  0.381 0.665 0.434\nvt  0.371 0.694 0.450\nvt  0.381 0.708 0.450\nvt  0.367 0.640 0.426\nvt  0.364 0.678 0.447\nvt  0.416 0.655 0.417\nvt  0.397 0.634 0.413\nvt  0.372 0.598 0.401\nvt  0.385 0.617 0.409\nvt  0.796 0.204 0.601\nvt  0.777 0.208 0.602\nvt  0.785 0.214 0.602\nvt  0.755 0.850 0.721\nvt  0.756 0.817 0.721\nvt  0.790 0.811 0.722\nvt  0.779 0.847 0.721\nvt  0.894 0.935 0.722\nvt  0.864 0.975 0.722\nvt  0.828 0.951 0.722\nvt  0.893 0.927 0.722\nvt  0.685 0.872 0.720\nvt  0.669 0.827 0.721\nvt  0.685 0.818 0.721\nvt  0.706 0.858 0.720\nvt  0.785 0.851 0.722\nvt  0.764 0.862 0.721\nvt  0.743 0.867 0.721\nvt  0.716 0.874 0.720\nvt  0.733 0.854 0.721\nvt  0.625 0.885 0.720\nvt  0.662 0.857 0.721\nvt  0.643 0.895 0.718\nvt  0.610 0.909 0.717\nvt  0.604 0.909 0.717\nvt  0.692 0.883 0.720\nvt  0.136 0.074 0.377\nvt  0.138 0.067 0.371\nvt  0.134 0.056 0.365\nvt  0.143 0.055 0.370\nvt  0.825 0.070 0.597\nvt  0.804 0.081 0.597\nvt  0.789 0.097 0.596\nvt  0.761 0.093 0.595\nvt  0.780 0.077 0.596\nvt  0.762 0.073 0.595\nvt  0.770 0.054 0.595\nvt  0.754 0.051 0.595\nvt  0.805 0.057 0.597\nvt  0.796 0.043 0.597\nvt  0.792 0.039 0.597\nvt  0.784 0.060 0.596\nvt  0.746 0.033 0.595\nvt  0.772 0.044 0.596\nvt  0.755 0.024 0.596\nvt  0.944 0.389 0.506\nvt  0.988 0.393 0.540\nvt  0.982 0.369 0.536\nvt  0.948 0.371 0.510\nvt  0.887 0.372 0.457\nvt  0.893 0.379 0.455\nvt  0.909 0.408 0.477\nvt  0.912 0.391 0.479\nvt  0.904 0.406 0.472\nvt  0.877 0.372 0.443\nvt  0.879 0.381 0.440\nvt  0.741 0.011 0.596\nvt  0.214 0.421 0.330\nvt  0.029 0.141 0.173\nvt  0.024 0.143 0.173\nvt  0.022 0.118 0.173\nvt  0.027 0.110 0.173\nvt  0.014 0.144 0.173\nvt  0.014 0.118 0.173\nvt  0.036 0.190 0.173\nvt  0.014 0.186 0.173\nvt  0.040 0.189 0.173\nvt  0.064 0.218 0.173\nvt  0.056 0.222 0.173\nvt  0.014 0.225 0.173\nvt  0.014 0.080 0.173\nvt  0.021 0.080 0.173\nvt  0.025 0.080 0.172\nvt  0.014 0.024 0.117\nvt  0.029 0.038 0.111\nvt  0.014 0.260 0.173\nvt  0.053 0.233 0.173\nvt  0.050 0.252 0.173\nvt  0.063 0.255 0.173\nvt  0.064 0.268 0.173\nvt  0.050 0.266 0.173\nvt  0.057 0.289 0.173\nvt  0.067 0.290 0.173\nvt  0.014 0.412 0.173\nvt  0.014 0.382 0.173\nvt  0.042 0.377 0.173\nvt  0.050 0.406 0.173\nvt  0.062 0.313 0.173\nvt  0.054 0.307 0.173\nvt  0.056 0.296 0.173\nvt  0.072 0.332 0.173\nvt  0.059 0.339 0.173\nvt  0.051 0.313 0.173\nvt  0.047 0.286 0.173\nvt  0.090 0.421 0.173\nvt  0.105 0.426 0.173\nvt  0.124 0.445 0.173\nvt  0.116 0.454 0.173\nvt  0.100 0.415 0.173\nvt  0.105 0.412 0.173\nvt  0.102 0.419 0.173\nvt  0.126 0.433 0.173\nvt  0.085 0.393 0.173\nvt  0.077 0.377 0.173\nvt  0.086 0.382 0.168\nvt  0.093 0.372 0.173\nvt  0.071 0.440 0.173\nvt  0.014 0.441 0.173\nvt  0.014 0.345 0.173\nvt  0.077 0.359 0.173\nvt  0.691 0.337 0.601\nvt  0.700 0.334 0.601\nvt  0.696 0.362 0.601\nvt  0.698 0.353 0.601\nvt  0.765 0.978 0.721\nvt  0.740 0.975 0.721\nvt  0.799 0.868 0.721\nvt  0.597 0.747 -0.465\nvt  0.611 0.783 -0.437\nvt  0.638 0.776 -0.437\nvt  0.621 0.733 -0.465\nvt  0.648 0.761 -0.440\nvt  0.644 0.754 -0.446\nvt  0.645 0.778 -0.437\nvt  0.579 0.752 -0.465\nvt  0.590 0.787 -0.440\nvt  0.542 0.754 -0.462\nvt  0.556 0.791 -0.451\nvt  0.643 0.715 -0.465\nvt  0.634 0.678 -0.468\nvt  0.606 0.693 -0.456\nvt  0.593 0.685 -0.461\nvt  0.571 0.695 -0.460\nvt  0.572 0.710 -0.457\nvt  0.563 0.668 -0.455\nvt  0.553 0.670 -0.459\nvt  0.561 0.686 -0.437\nvt  0.566 0.684 -0.426\nvt  0.554 0.695 -0.446\nvt  0.547 0.707 -0.450\nvt  0.541 0.682 -0.446\nvt  0.525 0.688 -0.442\nvt  0.576 0.668 -0.453\nvt  0.569 0.652 -0.505\nvt  0.556 0.654 -0.501\nvt  0.603 0.655 -0.496\nvt  0.595 0.649 -0.493\nvt  0.585 0.658 -0.494\nvt  0.586 0.664 -0.492\nvt  0.577 0.651 -0.498\nvt  0.586 0.642 -0.488\nvt  0.582 0.634 -0.511\nvt  0.570 0.634 -0.513\nvt  0.577 0.645 -0.494\nvt  0.557 0.631 -0.502\nvt  0.563 0.651 -0.516\nvt  0.533 0.670 -0.497\nvt  0.521 0.674 -0.487\nvt  0.588 0.624 -0.500\nvt  0.597 0.626 -0.482\nvt  0.609 0.620 -0.451\nvt  0.564 0.611 -0.444\nvt  0.454 0.857 -0.466\nvt  0.485 0.886 -0.467\nvt  0.497 0.846 -0.461\nvt  0.462 0.834 -0.465\nvt  0.525 0.846 -0.458\nvt  0.563 0.844 -0.459\nvt  0.518 0.777 -0.462\nvt  0.645 0.790 -0.437\nvt  0.636 0.805 -0.444\nvt  0.643 0.805 -0.440\nvt  0.640 0.813 -0.425\nvt  0.644 0.817 -0.430\nvt  0.650 0.809 -0.442\nvt  0.653 0.790 -0.438\nvt  0.657 0.776 -0.440\nvt  0.654 0.769 -0.436\nvt  0.467 0.802 -0.465\nvt  0.498 0.818 -0.462\nvt  0.499 0.775 -0.465\nvt  0.470 0.774 -0.467\nvt  0.651 0.753 -0.447\nvt  0.661 0.741 -0.451\nvt  0.517 0.713 -0.454\nvt  0.512 0.735 -0.456\nvt  0.544 0.728 -0.465\nvt  0.499 0.707 -0.479\nvt  0.386 0.562 -0.685\nvt  0.388 0.597 -0.685\nvt  0.411 0.596 -0.685\nvt  0.424 0.552 -0.685\nvt  0.431 0.768 -0.467\nvt  0.423 0.813 -0.467\nvt  0.441 0.742 -0.469\nvt  0.456 0.760 -0.468\nvt  0.460 0.745 -0.469\nvt  0.449 0.721 -0.469\nvt  0.408 0.746 -0.469\nvt  0.413 0.734 -0.469\nvt  0.667 0.706 -0.465\nvt  0.670 0.722 -0.461\nvt  0.430 0.709 -0.454\nvt  0.397 0.522 -0.685\nvt  0.395 0.491 -0.685\nvt  0.387 0.496 -0.685\nvt  0.389 0.523 -0.685\nvt  0.389 0.442 -0.685\nvt  0.367 0.448 -0.685\nvt  0.384 0.469 -0.685\nvt  0.409 0.461 -0.685\nvt  0.457 0.478 -0.685\nvt  0.468 0.464 -0.696\nvt  0.453 0.440 -0.697\nvt  0.437 0.450 -0.685\nvt  0.445 0.513 -0.685\nvt  0.477 0.499 -0.685\nvt  0.425 0.499 -0.685\nvt  0.495 0.484 -0.696\nvt  0.510 0.452 -0.642\nvt  0.497 0.445 -0.646\nvt  0.462 0.528 -0.685\nvt  0.423 0.527 -0.685\nvt  0.474 0.542 -0.685\nvt  0.445 0.562 -0.685\nvt  0.367 0.420 -0.685\nvt  0.334 0.432 -0.685\nvt  0.351 0.404 -0.685\nvt  0.323 0.418 -0.685\nvt  0.422 0.427 -0.685\nvt  0.395 0.403 -0.685\nvt  0.474 0.760 -0.468\nvt  0.493 0.756 -0.468\nvt  0.379 0.470 -0.685\nvt  0.448 0.419 -0.705\nvt  0.447 0.388 -0.709\nvt  0.480 0.420 -0.637\nvt  0.485 0.401 -0.627\nvt  0.478 0.587 -0.685\nvt  0.496 0.568 -0.685\nvt  0.486 0.600 -0.685\nvt  0.515 0.584 -0.685\nvt  0.395 0.801 -0.468\nvt  0.678 0.800 -0.452\nvt  0.688 0.779 -0.457\nvt  0.660 0.758 -0.446\nvt  0.706 0.767 -0.457\nvt  0.467 0.627 -0.685\nvt  0.487 0.631 -0.685\nvt  0.501 0.611 -0.685\nvt  0.538 0.562 -0.685\nvt  0.528 0.603 -0.685\nvt  0.550 0.583 -0.685\nvt  0.513 0.398 -0.667\nvt  0.496 0.414 -0.604\nvt  0.502 0.418 -0.600\nvt  0.523 0.406 -0.679\nvt  0.521 0.549 -0.685\nvt  0.508 0.511 -0.685\nvt  0.486 0.431 -0.620\nvt  0.506 0.432 -0.616\nvt  0.527 0.421 -0.676\nvt  0.545 0.559 -0.712\nvt  0.551 0.566 -0.701\nvt  0.583 0.550 -0.708\nvt  0.584 0.532 -0.709\nvt  0.612 0.550 -0.709\nvt  0.594 0.551 -0.709\nvt  0.589 0.564 -0.710\nvt  0.598 0.562 -0.709\nvt  0.598 0.537 -0.709\nvt  0.611 0.577 -0.710\nvt  0.617 0.570 -0.710\nvt  0.619 0.561 -0.709\nvt  0.610 0.570 -0.709\nvt  0.589 0.577 -0.701\nvt  0.629 0.566 -0.710\nvt  0.632 0.565 -0.709\nvt  0.632 0.555 -0.709\nvt  0.625 0.558 -0.709\nvt  0.620 0.536 -0.709\nvt  0.576 0.387 -0.709\nvt  0.574 0.413 -0.709\nvt  0.603 0.416 -0.709\nvt  0.605 0.396 -0.709\nvt  0.570 0.439 -0.708\nvt  0.609 0.439 -0.709\nvt  0.572 0.467 -0.708\nvt  0.620 0.466 -0.709\nvt  0.572 0.490 -0.708\nvt  0.623 0.493 -0.709\nvt  0.538 0.492 -0.708\nvt  0.531 0.463 -0.706\nvt  0.623 0.515 -0.709\nvt  0.555 0.509 -0.709\nvt  0.627 0.419 -0.709\nvt  0.647 0.429 -0.709\nvt  0.524 0.437 -0.666\nvt  0.521 0.356 -0.709\nvt  0.554 0.364 -0.708\nvt  0.661 0.511 -0.709\nvt  0.662 0.494 -0.709\nvt  0.680 0.507 -0.709\nvt  0.681 0.501 -0.709\nvt  0.752 0.685 -0.953\nvt  0.746 0.673 -0.953\nvt  0.731 0.679 -0.953\nvt  0.738 0.692 -0.953\nvt  0.742 0.665 -0.954\nvt  0.726 0.671 -0.953\nvt  0.737 0.654 -0.954\nvt  0.721 0.659 -0.954\nvt  0.733 0.642 -0.955\nvt  0.716 0.649 -0.955\nvt  0.720 0.620 -0.957\nvt  0.710 0.605 -0.958\nvt  0.705 0.612 -0.959\nvt  0.711 0.625 -0.957\nvt  0.703 0.601 -0.958\nvt  0.700 0.603 -0.961\nvt  0.699 0.629 -0.957\nvt  0.694 0.612 -0.958\nvt  0.695 0.604 -0.958\nvt  0.713 0.676 -0.954\nvt  0.698 0.655 -0.954\nvt  0.756 0.664 -0.953\nvt  0.749 0.652 -0.954\nvt  0.665 0.524 -0.709\nvt  0.681 0.514 -0.709\nvt  0.766 0.677 -0.953\nvt  0.694 0.494 -0.709\nvt  0.684 0.487 -0.709\nvt  0.717 0.692 -0.953\nvt  0.766 0.647 -0.954\nvt  0.748 0.630 -0.954\nvt  0.733 0.611 -0.955\nvt  0.722 0.614 -0.956\nvt  0.778 0.662 -0.953\nvt  0.695 0.631 -0.956\nvt  0.690 0.637 -0.955\nvt  0.674 0.640 -0.954\nvt  0.678 0.661 -0.954\nvt  0.762 0.619 -0.954\nvt  0.747 0.602 -0.954\nvt  0.733 0.598 -0.955\nvt  0.720 0.599 -0.956\nvt  0.677 0.627 -0.955\nvt  0.686 0.617 -0.956\nvt  0.711 0.598 -0.957\nvt  0.718 0.610 -0.957\nvt  0.688 0.610 -0.957\nvt  0.695 0.626 -0.957\nvt  0.696 0.597 -0.957\nvt  0.414 0.480 -0.685\nvt  0.360 0.450 -0.685\nvt  0.331 0.436 -0.685\nvt  0.652 0.454 -0.709\nvt  0.682 0.679 -0.954\nvt  0.698 0.676 -0.954\nvt  0.773 0.634 -0.954\nvt  0.679 0.699 -0.953\nvt  0.695 0.697 -0.953\nvt  0.788 0.651 -0.953\nvt  0.793 0.639 -0.953\nvt  0.861 0.723 -0.888\nvt  0.848 0.731 -0.892\nvt  0.863 0.747 -0.890\nvt  0.883 0.735 -0.890\nvt  0.855 0.720 -0.882\nvt  0.845 0.726 -0.890\nvt  0.848 0.713 -0.894\nvt  0.840 0.719 -0.901\nvt  0.844 0.708 -0.911\nvt  0.833 0.714 -0.922\nvt  0.826 0.685 -0.961\nvt  0.816 0.672 -1.002\nvt  0.810 0.676 -0.999\nvt  0.820 0.689 -0.959\nvt  0.813 0.691 -0.977\nvt  0.801 0.679 -1.017\nvt  0.831 0.733 -0.932\nvt  0.823 0.719 -0.947\nvt  0.855 0.694 -0.951\nvt  0.835 0.680 -0.979\nvt  0.864 0.716 -0.907\nvt  0.859 0.711 -0.910\nvt  0.869 0.703 -0.942\nvt  0.808 0.696 -0.991\nvt  0.794 0.706 -1.006\nvt  0.809 0.722 -0.968\nvt  0.862 0.685 -0.968\nvt  0.848 0.669 -1.006\nvt  0.825 0.666 -1.010\nvt  0.816 0.666 -1.013\nvt  0.824 0.676 -0.985\nvt  0.796 0.678 -1.013\nvt  0.795 0.684 -1.010\nvt  0.803 0.685 -1.003\nvt  0.817 0.738 -0.955\nvt  0.876 0.697 -0.955\nvt  0.668 0.471 -0.709\nvt  0.691 0.461 -0.709\nvt  0.672 0.442 -0.708\nvt  0.848 0.762 -0.935\nvt  0.629 0.397 -0.709\nvt  0.644 0.401 -0.709\nvt  0.741 0.427 -0.750\nvt  0.721 0.422 -0.704\nvt  0.718 0.446 -0.708\nvt  0.741 0.443 -0.728\nvt  0.746 0.415 -0.734\nvt  0.733 0.401 -0.694\nvt  0.702 0.418 -0.714\nvt  0.699 0.454 -0.709\nvt  0.711 0.392 -0.725\nvt  0.675 0.413 -0.707\nvt  0.679 0.396 -0.703\nvt  0.840 0.774 -0.966\nvt  0.817 0.772 -0.983\nvt  0.659 0.538 -0.709\nvt  0.648 0.573 -0.709\nvt  0.651 0.559 -0.709\nvt  0.693 0.558 -0.709\nvt  0.684 0.544 -0.709\nvt  0.668 0.560 -0.709\nvt  0.679 0.577 -0.709\nvt  0.686 0.533 -0.709\nvt  0.685 0.525 -0.709\nvt  0.913 0.704 -0.983\nvt  0.887 0.717 -0.934\nvt  0.628 0.574 -0.709\nvt  0.623 0.597 -0.709\nvt  0.610 0.598 -0.709\nvt  0.591 0.597 -0.711\nvt  0.711 0.753 -0.884\nvt  0.723 0.763 -0.883\nvt  0.736 0.760 -0.893\nvt  0.725 0.749 -0.889\nvt  0.747 0.754 -0.900\nvt  0.737 0.743 -0.895\nvt  0.752 0.751 -0.914\nvt  0.742 0.740 -0.909\nvt  0.788 0.725 -1.001\nvt  0.786 0.720 -1.007\nvt  0.769 0.729 -0.962\nvt  0.774 0.734 -0.957\nvt  0.780 0.738 -0.972\nvt  0.794 0.729 -1.014\nvt  0.747 0.772 -0.931\nvt  0.762 0.763 -0.952\nvt  0.762 0.715 -0.999\nvt  0.734 0.726 -0.947\nvt  0.724 0.741 -0.908\nvt  0.726 0.729 -0.939\nvt  0.785 0.751 -0.999\nvt  0.771 0.773 -0.970\nvt  0.790 0.765 -1.007\nvt  0.751 0.704 -1.007\nvt  0.734 0.713 -0.970\nvt  0.779 0.713 -1.005\nvt  0.773 0.720 -0.989\nvt  0.787 0.716 -1.012\nvt  0.787 0.741 -0.991\nvt  0.798 0.739 -1.005\nvt  0.799 0.731 -1.012\nvt  0.762 0.775 -0.961\nvt  0.726 0.715 -0.961\nvt  0.740 0.793 -0.968\nvt  0.757 0.794 -0.975\nvt  0.703 0.714 -0.975\nvt  0.700 0.733 -0.937\nvt  0.646 0.821 -0.443\nvt  0.659 0.833 -0.454\nvt  0.636 0.824 -0.446\nvt  0.628 0.839 -0.451\nvt  0.638 0.852 -0.457\nvt  0.630 0.817 -0.442\nvt  0.615 0.835 -0.450\nvt  0.203 0.940 -0.291\nvt  0.225 0.894 -0.291\nvt  0.264 0.917 -0.291\nvt  0.213 0.950 -0.291\nvt  0.238 0.881 -0.291\nvt  0.281 0.893 -0.291\nvt  0.255 0.859 -0.291\nvt  0.291 0.865 -0.291\nvt  0.261 0.832 -0.291\nvt  0.289 0.825 -0.291\nvt  0.236 0.767 -0.291\nvt  0.268 0.756 -0.291\nvt  0.203 0.715 -0.291\nvt  0.226 0.700 -0.291\nvt  0.165 0.659 -0.292\nvt  0.183 0.647 -0.292\nvt  0.126 0.574 -0.292\nvt  0.146 0.581 -0.292\nvt  0.116 0.525 -0.292\nvt  0.121 0.528 -0.292\nvt  0.314 0.767 -0.291\nvt  0.328 0.815 -0.291\nvt  0.249 0.684 -0.291\nvt  0.295 0.734 -0.291\nvt  0.201 0.637 -0.292\nvt  0.158 0.579 -0.292\nvt  0.123 0.522 -0.292\nvt  0.322 0.855 -0.291\nvt  0.363 0.821 -0.291\nvt  0.338 0.844 -0.290\nvt  0.340 0.851 -0.290\nvt  0.330 0.862 -0.290\nvt  0.330 0.878 -0.290\nvt  0.319 0.881 -0.290\nvt  0.325 0.888 -0.290\nvt  0.320 0.900 -0.291\nvt  0.342 0.894 -0.290\nvt  0.333 0.900 -0.290\nvt  0.353 0.802 -0.291\nvt  0.364 0.783 -0.291\nvt  0.368 0.783 -0.285\nvt  0.368 0.799 -0.290\nvt  0.340 0.792 -0.291\nvt  0.355 0.777 -0.291\nvt  0.369 0.773 -0.291\nvt  0.377 0.783 -0.291\nvt  0.374 0.796 -0.291\nvt  0.381 0.805 -0.291\nvt  0.368 0.782 -0.284\nvt  0.314 0.932 -0.291\nvt  0.364 0.837 -0.290\nvt  0.374 0.850 -0.290\nvt  0.349 0.852 -0.290\nvt  0.376 0.877 -0.290\nvt  0.380 0.880 -0.290\nvt  0.374 0.890 -0.290\nvt  0.370 0.877 -0.290\nvt  0.343 0.876 -0.290\nvt  0.373 0.840 -0.290\nvt  0.389 0.841 -0.290\nvt  0.385 0.850 -0.290\nvt  0.379 0.858 -0.290\nvt  0.385 0.871 -0.290\nvt  0.345 0.913 -0.290\nvt  0.398 0.846 -0.291\nvt  0.404 0.867 -0.291\nvt  0.385 0.891 -0.290\nvt  0.409 0.889 -0.291\nvt  0.411 0.901 -0.291\nvt  0.386 0.908 -0.290\nvt  0.262 0.675 -0.291\nvt  0.315 0.721 -0.291\nvt  0.211 0.632 -0.292\nvt  0.163 0.577 -0.292\nvt  0.335 0.781 -0.291\nvt  0.347 0.772 -0.291\nvt  0.372 0.918 -0.290\nvt  0.372 0.939 -0.290\nvt  0.335 0.938 -0.291\nvt  0.381 0.927 -0.292\nvt  0.385 0.932 -0.287\nvt  0.419 0.914 -0.291\nvt  0.392 0.922 -0.290\nvt  0.564 0.899 -0.417\nvt  0.556 0.895 -0.436\nvt  0.534 0.892 -0.435\nvt  0.540 0.908 -0.399\nvt  0.545 0.910 -0.381\nvt  0.535 0.915 -0.422\nvt  0.524 0.931 -0.385\nvt  0.533 0.931 -0.422\nvt  0.553 0.926 -0.441\nvt  0.601 0.873 -0.460\nvt  0.606 0.880 -0.452\nvt  0.612 0.875 -0.459\nvt  0.605 0.872 -0.459\nvt  0.379 0.374 0.257\nvt  0.395 0.331 0.257\nvt  0.417 0.331 0.257\nvt  0.397 0.365 0.257\nvt  0.357 0.348 0.257\nvt  0.369 0.339 0.257\nvt  0.432 0.356 0.257\nvt  0.416 0.362 0.257\nvt  0.118 0.199 0.365\nvt  0.098 0.201 0.360\nvt  0.133 0.232 0.365\nvt  0.138 0.210 0.372\nvt  0.390 0.287 0.257\nvt  0.374 0.298 0.257\nvt  0.379 0.242 0.257\nvt  0.399 0.237 0.257\nvt  0.364 0.236 0.257\nvt  0.375 0.199 0.257\nvt  0.392 0.203 0.257\nvt  0.393 0.185 0.257\nvt  0.379 0.181 0.257\nvt  0.519 0.123 0.194\nvt  0.531 0.162 0.263\nvt  0.498 0.157 0.248\nvt  0.504 0.133 0.211\nvt  0.438 0.941 -0.291\nvt  0.413 0.942 -0.291\nvt  0.384 0.962 -0.291\nvt  0.395 0.939 -0.294\nvt  0.412 0.962 -0.291\nvt  0.395 0.986 -0.291\nvt  0.376 0.973 -0.291\nvt  0.498 0.055 0.095\nvt  0.521 0.069 0.118\nvt  0.506 0.088 0.158\nvt  0.491 0.083 0.156\nvt  0.370 0.379 0.257\nvt  0.355 0.382 0.257\nvt  0.466 0.318 0.257\nvt  0.470 0.350 0.257\nvt  0.544 0.158 0.263\nvt  0.562 0.190 0.346\nvt  0.548 0.208 0.346\nvt  0.573 0.203 0.382\nvt  0.569 0.217 0.399\nvt  0.803 0.618 0.349\nvt  0.817 0.623 0.386\nvt  0.809 0.631 0.373\nvt  0.802 0.627 0.353\nvt  0.786 0.610 0.318\nvt  0.835 0.588 0.402\nvt  0.838 0.598 0.408\nvt  0.846 0.608 0.435\nvt  0.890 0.638 0.432\nvt  0.911 0.586 0.497\nvt  0.920 0.588 0.479\nvt  0.911 0.637 0.402\nvt  0.882 0.567 0.479\nvt  0.887 0.576 0.499\nvt  0.916 0.572 0.508\nvt  0.925 0.574 0.493\nvt  0.896 0.558 0.493\nvt  0.900 0.564 0.511\nvt  0.918 0.564 0.514\nvt  0.925 0.564 0.500\nvt  0.911 0.558 0.517\nvt  0.907 0.552 0.500\nvt  0.877 0.626 0.476\nvt  0.902 0.583 0.521\nvt  0.895 0.580 0.522\nvt  0.853 0.614 0.458\nvt  0.909 0.569 0.526\nvt  0.914 0.561 0.527\nvt  0.905 0.567 0.526\nvt  0.865 0.619 0.481\nvt  0.858 0.642 0.476\nvt  0.828 0.632 0.426\nvt  0.870 0.675 0.399\nvt  0.858 0.656 0.452\nvt  0.936 0.481 0.530\nvt  0.936 0.499 0.553\nvt  0.913 0.530 0.614\nvt  0.900 0.508 0.615\nvt  0.867 0.503 0.683\nvt  0.902 0.477 0.613\nvt  0.797 0.433 0.635\nvt  0.778 0.485 0.697\nvt  0.760 0.479 0.665\nvt  0.770 0.443 0.614\nvt  0.813 0.454 0.703\nvt  0.799 0.492 0.741\nvt  0.847 0.519 0.718\nvt  0.830 0.513 0.759\nvt  0.855 0.482 0.715\nvt  0.829 0.478 0.733\nvt  0.819 0.504 0.759\nvt  0.872 0.434 0.726\nvt  0.846 0.450 0.726\nvt  0.821 0.436 0.685\nvt  0.868 0.411 0.712\nvt  0.821 0.456 0.726\nvt  0.840 0.463 0.736\nvt  0.831 0.472 0.761\nvt  0.867 0.459 0.704\nvt  0.843 0.479 0.726\nvt  0.878 0.473 0.678\nvt  0.319 0.117 0.426\nvt  0.328 0.119 0.417\nvt  0.337 0.110 0.409\nvt  0.330 0.095 0.408\nvt  0.858 0.530 0.687\nvt  0.765 0.522 0.759\nvt  0.753 0.522 0.747\nvt  0.824 0.558 0.757\nvt  0.808 0.551 0.799\nvt  0.783 0.530 0.806\nvt  0.805 0.543 0.814\nvt  0.796 0.539 0.826\nvt  0.875 0.545 0.665\nvt  0.831 0.568 0.747\nvt  0.805 0.583 0.799\nvt  0.795 0.572 0.815\nvt  0.766 0.559 0.843\nvt  0.755 0.549 0.799\nvt  0.784 0.565 0.850\nvt  0.775 0.562 0.861\nvt  0.756 0.582 0.841\nvt  0.750 0.584 0.830\nvt  0.769 0.593 0.830\nvt  0.767 0.589 0.841\nvt  0.762 0.582 0.856\nvt  0.810 0.388 0.581\nvt  0.782 0.420 0.591\nvt  0.798 0.378 0.543\nvt  0.961 0.985 0.382\nvt  0.972 0.944 0.444\nvt  0.959 0.938 0.454\nvt  0.947 0.980 0.399\nvt  0.918 0.921 0.543\nvt  0.941 0.918 0.522\nvt  0.933 0.899 0.550\nvt  0.908 0.902 0.575\nvt  0.928 0.961 0.452\nvt  0.923 0.942 0.497\nvt  0.977 0.906 0.501\nvt  0.973 0.905 0.505\nvt  0.967 0.898 0.528\nvt  0.965 0.892 0.538\nvt  0.293 0.111 0.446\nvt  0.290 0.118 0.449\nvt  0.303 0.115 0.440\nvt  0.304 0.108 0.435\nvt  0.282 0.106 0.451\nvt  0.277 0.108 0.452\nvt  0.947 0.645 0.476\nvt  0.932 0.645 0.497\nvt  0.953 0.621 0.516\nvt  0.960 0.631 0.484\nvt  0.845 0.391 0.653\nvt  0.267 0.092 0.439\nvt  0.267 0.100 0.447\nvt  0.278 0.102 0.449\nvt  0.292 0.099 0.441\nvt  0.299 0.045 0.396\nvt  0.269 0.058 0.420\nvt  0.279 0.070 0.423\nvt  0.307 0.058 0.404\nvt  0.288 0.029 0.389\nvt  0.277 0.011 0.381\nvt  0.257 0.025 0.395\nvt  0.266 0.039 0.406\nvt  0.251 0.125 0.456\nvt  0.243 0.124 0.453\nvt  0.256 0.138 0.459\nvt  0.263 0.135 0.458\nvt  0.230 0.042 0.396\nvt  0.234 0.058 0.410\nvt  0.256 0.045 0.457\nvt  0.255 0.047 0.442\nvt  0.257 0.085 0.433\nvt  0.223 0.076 0.415\nvt  0.231 0.101 0.436\nvt  0.257 0.098 0.443\nvt  0.190 0.114 0.418\nvt  0.181 0.094 0.409\nvt  0.209 0.129 0.436\nvt  0.229 0.128 0.449\nvt  0.210 0.144 0.444\nvt  0.228 0.141 0.458\nvt  0.266 0.150 0.460\nvt  0.265 0.144 0.457\nvt  0.244 0.144 0.463\nvt  0.284 0.252 0.376\nvt  0.289 0.230 0.388\nvt  0.258 0.236 0.390\nvt  0.251 0.260 0.377\nvt  0.250 0.284 0.365\nvt  0.280 0.276 0.366\nvt  0.212 0.270 0.374\nvt  0.223 0.288 0.364\nvt  0.255 0.308 0.356\nvt  0.279 0.290 0.360\nvt  0.223 0.310 0.356\nvt  0.199 0.303 0.359\nvt  0.185 0.262 0.371\nvt  0.165 0.278 0.364\nvt  0.177 0.311 0.356\nvt  0.186 0.346 0.348\nvt  0.209 0.343 0.348\nvt  0.267 0.205 0.416\nvt  0.295 0.211 0.405\nvt  0.240 0.197 0.422\nvt  0.234 0.239 0.387\nvt  0.205 0.202 0.409\nvt  0.199 0.238 0.383\nvt  0.235 0.351 0.345\nvt  0.229 0.388 0.336\nvt  0.251 0.386 0.336\nvt  0.248 0.349 0.345\nvt  0.216 0.364 0.343\nvt  0.209 0.388 0.336\nvt  0.197 0.355 0.345\nvt  0.188 0.357 0.345\nvt  0.269 0.410 0.332\nvt  0.248 0.409 0.331\nvt  0.255 0.433 0.326\nvt  0.266 0.431 0.327\nvt  0.260 0.447 0.324\nvt  0.268 0.445 0.325\nvt  0.261 0.453 0.323\nvt  0.275 0.448 0.325\nvt  0.267 0.381 0.336\nvt  0.228 0.413 0.331\nvt  0.286 0.352 0.343\nvt  0.293 0.354 0.342\nvt  0.295 0.345 0.345\nvt  0.285 0.344 0.345\nvt  0.280 0.372 0.338\nvt  0.290 0.376 0.338\nvt  0.286 0.331 0.348\nvt  0.298 0.334 0.348\nvt  0.304 0.315 0.354\nvt  0.282 0.312 0.354\nvt  0.274 0.431 0.329\nvt  0.282 0.412 0.332\nvt  0.241 0.445 0.325\nvt  0.298 0.284 0.364\nvt  0.310 0.258 0.374\nvt  0.320 0.234 0.385\nvt  0.329 0.212 0.396\nvt  0.475 0.201 0.257\nvt  0.481 0.203 0.257\nvt  0.481 0.242 0.257\nvt  0.465 0.241 0.257\nvt  0.493 0.218 0.257\nvt  0.488 0.201 0.257\nvt  0.367 0.022 0.372\nvt  0.375 0.047 0.398\nvt  0.387 0.049 0.417\nvt  0.384 0.023 0.393\nvt  0.389 0.068 0.435\nvt  0.392 0.072 0.442\nvt  0.410 0.055 0.452\nvt  0.384 0.069 0.427\nvt  0.824 0.635 0.423\nvt  0.816 0.627 0.389\nvt  0.425 0.079 0.423\nvt  0.415 0.072 0.437\nvt  0.410 0.092 0.409\nvt  0.424 0.101 0.389\nvt  0.383 0.075 0.434\nvt  0.396 0.078 0.434\nvt  0.337 0.243 0.377\nvt  0.351 0.217 0.382\nvt  0.353 0.236 0.372\nvt  0.360 0.258 0.369\nvt  0.333 0.190 0.402\nvt  0.315 0.180 0.422\nvt  0.306 0.191 0.446\nvt  0.968 0.585 0.515\nvt  0.975 0.577 0.490\nvt  0.985 0.588 0.499\nvt  0.983 0.599 0.526\nvt  0.958 0.563 0.479\nvt  0.965 0.554 0.452\nvt  0.982 0.628 0.475\nvt  0.984 0.660 0.426\nvt  0.971 0.550 0.437\nvt  0.983 0.570 0.475\nvt  0.974 0.542 0.423\nvt  0.979 0.539 0.426\nvt  0.972 0.599 0.532\nvt  0.952 0.599 0.553\nvt  0.948 0.581 0.530\nvt  0.152 0.219 0.378\nvt  0.153 0.202 0.383\nvt  0.143 0.197 0.377\nvt  0.147 0.283 0.360\nvt  0.146 0.310 0.354\nvt  0.151 0.329 0.350\nvt  0.164 0.349 0.347\nvt  0.151 0.247 0.367\nvt  0.172 0.239 0.376\nvt  0.114 0.323 0.351\nvt  0.117 0.341 0.348\nvt  0.320 0.341 0.346\nvt  0.327 0.317 0.352\nvt  0.318 0.294 0.360\nvt  0.342 0.306 0.356\nvt  0.334 0.262 0.369\nvt  0.355 0.272 0.363\nvt  0.318 0.362 0.342\nvt  0.286 0.439 0.329\nvt  0.291 0.425 0.332\nvt  0.160 0.455 0.334\nvt  0.184 0.450 0.331\nvt  0.181 0.432 0.334\nvt  0.162 0.440 0.336\nvt  0.163 0.399 0.339\nvt  0.142 0.416 0.339\nvt  0.203 0.450 0.328\nvt  0.200 0.432 0.331\nvt  0.185 0.398 0.336\nvt  0.176 0.404 0.337\nvt  0.201 0.371 0.342\nvt  0.189 0.377 0.341\nvt  0.171 0.383 0.340\nvt  0.168 0.365 0.344\nvt  0.149 0.359 0.345\nvt  0.129 0.383 0.342\nvt  0.125 0.364 0.345\nvt  0.112 0.282 0.355\nvt  0.090 0.293 0.352\nvt  0.216 0.448 0.327\nvt  0.216 0.464 0.323\nvt  0.247 0.465 0.321\nvt  0.203 0.465 0.325\nvt  0.268 0.497 0.314\nvt  0.283 0.485 0.316\nvt  0.236 0.501 0.318\nvt  0.249 0.504 0.315\nvt  0.280 0.457 0.323\nvt  0.292 0.474 0.319\nvt  0.261 0.517 0.312\nvt  0.272 0.513 0.311\nvt  0.284 0.506 0.311\nvt  0.292 0.498 0.312\nvt  0.236 0.514 0.315\nvt  0.245 0.518 0.313\nvt  0.297 0.491 0.313\nvt  0.301 0.485 0.315\nvt  0.228 0.535 0.311\nvt  0.233 0.538 0.310\nvt  0.225 0.541 0.310\nvt  0.231 0.544 0.309\nvt  0.220 0.550 0.308\nvt  0.225 0.553 0.308\nvt  0.212 0.562 0.307\nvt  0.219 0.565 0.306\nvt  0.198 0.487 0.324\nvt  0.205 0.493 0.322\nvt  0.222 0.525 0.318\nvt  0.216 0.542 0.313\nvt  0.205 0.560 0.312\nvt  0.198 0.570 0.309\nvt  0.203 0.571 0.306\nvt  0.204 0.580 0.303\nvt  0.208 0.585 0.309\nvt  0.213 0.576 0.305\nvt  0.210 0.570 0.304\nvt  0.199 0.579 0.307\nvt  0.198 0.590 0.309\nvt  0.202 0.591 0.311\nvt  0.196 0.588 0.310\nvt  0.192 0.466 0.328\nvt  0.189 0.479 0.327\nvt  0.413 0.279 0.257\nvt  0.421 0.232 0.257\nvt  0.420 0.203 0.257\nvt  0.211 0.163 0.451\nvt  0.218 0.150 0.456\nvt  0.209 0.165 0.460\nvt  0.251 0.154 0.471\nvt  0.260 0.159 0.467\nvt  0.273 0.164 0.459\nvt  0.265 0.164 0.464\nvt  0.234 0.187 0.439\nvt  0.225 0.178 0.447\nvt  0.208 0.187 0.428\nvt  0.236 0.150 0.466\nvt  0.229 0.149 0.464\nvt  0.232 0.155 0.465\nvt  0.243 0.152 0.467\nvt  0.219 0.176 0.447\nvt  0.222 0.170 0.456\nvt  0.211 0.175 0.448\nvt  0.270 0.189 0.433\nvt  0.274 0.184 0.440\nvt  0.261 0.177 0.452\nvt  0.255 0.180 0.445\nvt  0.235 0.549 0.311\nvt  0.225 0.570 0.310\nvt  0.217 0.580 0.310\nvt  0.250 0.533 0.312\nvt  0.192 0.569 0.313\nvt  0.200 0.555 0.317\nvt  0.230 0.573 0.316\nvt  0.220 0.585 0.315\nvt  0.990 0.300 -0.059\nvt  0.979 0.302 -0.059\nvt  0.982 0.319 -0.059\nvt  0.991 0.318 -0.059\nvt  0.992 0.329 -0.059\nvt  0.984 0.330 -0.059\nvt  0.991 0.339 -0.060\nvt  0.988 0.340 -0.060\nvt  0.976 0.280 -0.059\nvt  0.988 0.278 -0.059\nvt  0.971 0.257 -0.059\nvt  0.986 0.256 -0.059\nvt  0.242 0.556 0.316\nvt  0.253 0.541 0.315\nvt  0.213 0.520 0.322\nvt  0.208 0.538 0.318\nvt  0.189 0.497 0.323\nvt  0.196 0.503 0.322\nvt  0.185 0.501 0.323\nvt  0.191 0.508 0.322\nvt  0.179 0.505 0.323\nvt  0.186 0.513 0.322\nvt  0.179 0.497 0.325\nvt  0.160 0.508 0.327\nvt  0.166 0.512 0.324\nvt  0.163 0.525 0.324\nvt  0.167 0.529 0.325\nvt  0.175 0.521 0.323\nvt  0.173 0.514 0.322\nvt  0.159 0.519 0.325\nvt  0.155 0.532 0.325\nvt  0.156 0.535 0.327\nvt  0.151 0.529 0.327\nvt  0.195 0.515 0.323\nvt  0.179 0.526 0.325\nvt  0.211 0.505 0.322\nvt  0.155 0.501 0.329\nvt  0.170 0.493 0.328\nvt  0.197 0.522 0.326\nvt  0.183 0.533 0.328\nvt  0.940 0.076 -0.059\nvt  0.939 0.088 -0.059\nvt  0.958 0.089 -0.059\nvt  0.959 0.078 -0.059\nvt  0.966 0.079 -0.060\nvt  0.965 0.089 -0.060\nvt  0.976 0.079 -0.060\nvt  0.972 0.092 -0.060\nvt  0.987 0.086 -0.063\nvt  0.986 0.093 -0.064\nvt  0.925 0.090 -0.059\nvt  0.922 0.076 -0.059\nvt  0.210 0.519 0.325\nvt  0.172 0.480 0.330\nvt  0.225 0.507 0.320\nvt  0.977 0.223 -0.059\nvt  0.989 0.207 -0.059\nvt  0.977 0.199 -0.059\nvt  0.960 0.205 -0.059\nvt  0.221 0.509 0.324\nvt  0.990 0.237 -0.059\nvt  0.270 0.543 0.307\nvt  0.277 0.540 0.307\nvt  0.273 0.551 0.305\nvt  0.280 0.549 0.305\nvt  0.275 0.562 0.304\nvt  0.283 0.557 0.304\nvt  0.280 0.576 0.302\nvt  0.287 0.574 0.301\nvt  0.256 0.532 0.312\nvt  0.266 0.557 0.308\nvt  0.275 0.578 0.305\nvt  0.276 0.591 0.304\nvt  0.281 0.589 0.297\nvt  0.289 0.595 0.286\nvt  0.296 0.596 0.297\nvt  0.292 0.585 0.297\nvt  0.285 0.583 0.295\nvt  0.284 0.599 0.297\nvt  0.293 0.605 0.292\nvt  0.297 0.604 0.300\nvt  0.288 0.606 0.299\nvt  0.287 0.549 0.307\nvt  0.295 0.570 0.306\nvt  0.298 0.585 0.303\nvt  0.285 0.520 0.310\nvt  0.268 0.579 0.312\nvt  0.272 0.596 0.309\nvt  0.302 0.568 0.312\nvt  0.304 0.586 0.309\nvt  0.955 0.307 -0.059\nvt  0.943 0.302 -0.059\nvt  0.938 0.322 -0.059\nvt  0.948 0.325 -0.059\nvt  0.945 0.335 -0.059\nvt  0.937 0.332 -0.059\nvt  0.939 0.343 -0.059\nvt  0.935 0.341 -0.059\nvt  0.949 0.279 -0.059\nvt  0.962 0.282 -0.059\nvt  0.953 0.248 -0.059\nvt  0.296 0.548 0.313\nvt  0.294 0.526 0.313\nvt  0.259 0.559 0.313\nvt  0.306 0.520 0.307\nvt  0.311 0.515 0.307\nvt  0.311 0.523 0.306\nvt  0.315 0.517 0.306\nvt  0.319 0.529 0.304\nvt  0.323 0.524 0.304\nvt  0.330 0.535 0.302\nvt  0.333 0.531 0.303\nvt  0.290 0.518 0.310\nvt  0.310 0.532 0.308\nvt  0.327 0.542 0.306\nvt  0.337 0.548 0.306\nvt  0.337 0.543 0.300\nvt  0.346 0.541 0.297\nvt  0.351 0.539 0.299\nvt  0.342 0.534 0.301\nvt  0.337 0.536 0.299\nvt  0.344 0.547 0.302\nvt  0.322 0.517 0.308\nvt  0.339 0.526 0.307\nvt  0.346 0.531 0.305\nvt  0.308 0.498 0.313\nvt  0.335 0.553 0.312\nvt  0.322 0.546 0.312\nvt  0.340 0.517 0.313\nvt  0.351 0.529 0.309\nvt  0.932 0.243 -0.059\nvt  0.923 0.240 -0.059\nvt  0.917 0.257 -0.059\nvt  0.927 0.260 -0.059\nvt  0.924 0.270 -0.059\nvt  0.914 0.267 -0.059\nvt  0.927 0.219 -0.059\nvt  0.939 0.224 -0.059\nvt  0.930 0.194 -0.059\nvt  0.950 0.203 -0.059\nvt  0.326 0.509 0.314\nvt  0.313 0.498 0.315\nvt  0.306 0.537 0.313\nvt  0.917 0.159 -0.059\nvt  0.953 0.158 -0.059\nvt  0.954 0.131 -0.059\nvt  0.918 0.137 -0.059\nvt  0.293 0.453 0.326\nvt  0.301 0.463 0.324\nvt  0.515 0.310 0.257\nvt  0.490 0.357 0.257\nvt  0.316 0.491 0.312\nvt  0.316 0.486 0.313\nvt  0.325 0.491 0.311\nvt  0.325 0.486 0.311\nvt  0.332 0.489 0.310\nvt  0.331 0.484 0.310\nvt  0.340 0.489 0.310\nvt  0.339 0.484 0.310\nvt  0.310 0.496 0.313\nvt  0.323 0.496 0.313\nvt  0.340 0.494 0.313\nvt  0.350 0.493 0.314\nvt  0.348 0.489 0.310\nvt  0.356 0.484 0.310\nvt  0.356 0.481 0.310\nvt  0.348 0.480 0.311\nvt  0.344 0.486 0.309\nvt  0.355 0.489 0.313\nvt  0.323 0.478 0.316\nvt  0.339 0.476 0.315\nvt  0.348 0.477 0.314\nvt  0.306 0.478 0.318\nvt  0.351 0.497 0.318\nvt  0.339 0.498 0.317\nvt  0.339 0.471 0.319\nvt  0.350 0.472 0.319\nvt  0.907 0.217 -0.059\nvt  0.898 0.211 -0.059\nvt  0.891 0.223 -0.059\nvt  0.897 0.228 -0.059\nvt  0.892 0.236 -0.059\nvt  0.885 0.233 -0.059\nvt  0.909 0.197 -0.059\nvt  0.920 0.203 -0.059\nvt  0.918 0.178 -0.059\nvt  0.324 0.472 0.320\nvt  0.310 0.470 0.322\nvt  0.323 0.500 0.316\nvt  0.215 0.062 0.397\nvt  0.176 0.085 0.401\nvt  0.153 0.089 0.396\nvt  0.142 0.089 0.391\nvt  0.145 0.098 0.397\nvt  0.162 0.098 0.403\nvt  0.137 0.117 0.393\nvt  0.108 0.087 0.373\nvt  0.147 0.068 0.378\nvt  0.141 0.078 0.384\nvt  0.171 0.074 0.392\nvt  0.166 0.059 0.379\nvt  0.953 0.836 0.434\nvt  0.934 0.863 0.427\nvt  0.986 0.844 0.428\nvt  0.972 0.813 0.434\nvt  0.075 0.646 0.962\nvt  0.101 0.665 0.963\nvt  0.090 0.585 0.962\nvt  0.074 0.608 0.962\nvt  0.100 0.713 0.964\nvt  0.079 0.677 0.963\nvt  0.089 0.720 0.963\nvt  0.096 0.746 0.962\nvt  0.101 0.745 0.969\nvt  0.063 0.684 0.962\nvt  0.058 0.658 0.962\nvt  0.079 0.725 0.963\nvt  0.091 0.752 0.963\nvt  0.053 0.625 0.962\nvt  0.164 0.685 0.962\nvt  0.147 0.671 0.962\nvt  0.142 0.688 0.962\nvt  0.150 0.699 0.962\nvt  0.104 0.747 0.962\nvt  0.108 0.750 0.963\nvt  0.117 0.733 0.963\nvt  0.110 0.728 0.964\nvt  0.125 0.721 0.963\nvt  0.116 0.710 0.963\nvt  0.125 0.672 0.963\nvt  0.133 0.639 0.962\nvt  0.134 0.738 0.962\nvt  0.160 0.712 0.962\nvt  0.105 0.715 0.963\nvt  0.114 0.667 0.963\nvt  0.161 0.043 0.599\nvt  0.186 0.055 0.382\nvt  0.176 0.031 0.599\nvt  0.884 0.834 0.418\nvt  0.905 0.808 0.417\nvt  0.881 0.797 0.403\nvt  0.846 0.815 0.389\nvt  0.888 0.768 0.401\nvt  0.910 0.771 0.408\nvt  0.752 0.937 0.721\nvt  0.759 0.960 0.721\nvt  0.816 0.938 0.722\nvt  0.801 0.920 0.721\nvt  0.736 0.957 0.721\nvt  0.731 0.939 0.720\nvt  0.700 0.960 0.721\nvt  0.709 0.931 0.720\nvt  0.655 0.926 0.719\nvt  0.644 0.938 0.720\nvt  0.612 0.920 0.701\nvt  0.606 0.925 0.711\nvt  0.777 0.879 0.721\nvt  0.730 0.896 0.720\nvt  0.704 0.902 0.720\nvt  0.653 0.913 0.717\nvt  0.611 0.917 0.708\nvt  0.188 0.806 0.906\nvt  0.191 0.856 0.906\nvt  0.241 0.834 0.906\nvt  0.220 0.794 0.906\nvt  0.185 0.773 0.907\nvt  0.205 0.767 0.906\nvt  0.151 0.854 0.906\nvt  0.160 0.807 0.906\nvt  0.167 0.777 0.909\nvt  0.119 0.850 0.906\nvt  0.135 0.806 0.906\nvt  0.148 0.779 0.908\nvt  0.124 0.803 0.906\nvt  0.099 0.841 0.906\nvt  0.195 0.746 0.906\nvt  0.183 0.749 0.906\nvt  0.174 0.743 0.905\nvt  0.195 0.900 0.906\nvt  0.148 0.876 0.906\nvt  0.971 0.755 0.431\nvt  0.943 0.747 0.431\nvt  0.954 0.793 0.436\nvt  0.976 0.691 0.417\nvt  0.952 0.704 0.423\nvt  0.111 0.890 0.906\nvt  0.755 0.850 0.721\nvt  0.779 0.847 0.721\nvt  0.790 0.811 0.722\nvt  0.756 0.817 0.721\nvt  0.894 0.935 0.722\nvt  0.828 0.951 0.722\nvt  0.864 0.975 0.722\nvt  0.904 0.978 0.721\nvt  0.685 0.872 0.720\nvt  0.685 0.818 0.721\nvt  0.669 0.827 0.721\nvt  0.662 0.857 0.721\nvt  0.764 0.862 0.721\nvt  0.785 0.851 0.722\nvt  0.743 0.867 0.721\nvt  0.733 0.854 0.721\nvt  0.706 0.858 0.720\nvt  0.716 0.874 0.720\nvt  0.625 0.885 0.720\nvt  0.643 0.895 0.718\nvt  0.610 0.909 0.717\nvt  0.604 0.909 0.717\nvt  0.692 0.883 0.720\nvt  0.136 0.074 0.377\nvt  0.138 0.067 0.371\nvt  0.134 0.056 0.365\nvt  0.143 0.055 0.370\nvt  0.944 0.389 0.506\nvt  0.948 0.371 0.510\nvt  0.982 0.369 0.536\nvt  0.988 0.393 0.540\nvt  0.893 0.379 0.455\nvt  0.887 0.372 0.457\nvt  0.909 0.408 0.477\nvt  0.904 0.406 0.472\nvt  0.912 0.391 0.479\nvt  0.877 0.372 0.443\nvt  0.879 0.381 0.440\nvt  0.214 0.421 0.330\nvt  0.765 0.978 0.721\nvt  0.740 0.975 0.721\nvt  0.799 0.868 0.721\nvt  0.619 0.182 0.599\nvt  0.733 0.144 0.598\nvt  0.723 0.176 0.596\nvt  0.712 0.174 0.600\nvt  0.563 0.337 0.616\nvt  0.589 0.348 0.604\nvt  0.562 0.075 0.607\nvt  0.613 0.056 0.591\nvt  0.637 0.035 0.604\nvt  0.687 0.032 0.597\nvt  0.734 0.006 0.596\nvt  0.281 0.943 0.494\nvt  0.351 0.673 0.445\nvt  0.350 0.730 0.468\nvt  0.351 0.694 0.455\nvt  0.593 0.846 -0.455\nvt  0.640 0.820 -0.420\nvt  0.573 0.682 -0.408\nvt  0.553 0.683 -0.421\nvt  0.583 0.651 -0.475\nvt  0.601 0.639 -0.491\nvt  0.531 0.626 -0.447\nvt  0.538 0.653 -0.511\nvt  0.529 0.660 -0.506\nvt  0.545 0.641 -0.514\nvt  0.616 0.646 -0.504\nvt  0.592 0.630 -0.504\nvt  0.648 0.640 -0.468\nvt  0.437 0.628 -0.685\nvt  0.420 0.613 -0.685\nvt  0.527 0.653 -0.492\nvt  0.510 0.640 -0.443\nvt  0.649 0.787 -0.420\nvt  0.654 0.764 -0.418\nvt  0.653 0.759 -0.433\nvt  0.501 0.744 -0.468\nvt  0.658 0.665 -0.468\nvt  0.438 0.697 -0.491\nvt  0.450 0.649 -0.685\nvt  0.474 0.655 -0.685\nvt  0.547 0.524 -0.709\nvt  0.528 0.525 -0.708\nvt  0.499 0.369 -0.697\nvt  0.568 0.575 -0.720\nvt  0.554 0.586 -0.723\nvt  0.564 0.596 -0.696\nvt  0.613 0.558 -0.709\nvt  0.698 0.510 -0.709\nvt  0.300 0.430 -0.685\nvt  0.683 0.473 -0.709\nvt  0.701 0.483 -0.709\nvt  0.714 0.492 -0.709\nvt  0.805 0.670 -1.024\nvt  0.836 0.665 -1.013\nvt  0.792 0.694 -1.013\nvt  0.741 0.458 -0.752\nvt  0.703 0.574 -0.710\nvt  0.795 0.722 -1.024\nvt  0.767 0.704 -1.015\nvt  0.798 0.753 -1.015\nvt  0.730 0.778 -0.915\nvt  0.729 0.554 -0.937\nvt  0.726 0.573 -0.831\nvt  0.710 0.560 -0.852\nvt  0.609 0.865 -0.458\nvt  0.617 0.861 -0.457\nvt  0.343 0.860 -0.290\nvt  0.342 0.888 -0.290\nvt  0.378 0.838 -0.290\nvt  0.371 0.864 -0.290\nvt  0.374 0.872 -0.291\nvt  0.379 0.866 -0.246\nvt  0.375 0.908 -0.290\nvt  0.371 0.896 -0.290\nvt  0.379 0.905 -0.290\nvt  0.492 0.904 -0.459\nvt  0.336 0.740 -0.291\nvt  0.333 0.746 -0.291\nvt  0.346 0.750 -0.291\nvt  0.342 0.756 -0.291\nvt  0.356 0.761 -0.291\nvt  0.118 0.520 -0.292\nvt  0.389 0.825 -0.291\nvt  0.387 0.925 -0.262\nvt  0.048 0.758 0.173\nvt  0.054 0.734 0.173\nvt  0.061 0.742 0.173\nvt  0.640 0.862 -0.460\nvt  0.059 0.979 0.173\nvt  0.117 0.988 0.173\nvt  0.061 0.959 0.173\nvt  0.576 0.888 -0.406\nvt  0.589 0.865 -0.461\nvt  0.584 0.882 -0.410\nvt  0.589 0.886 -0.402\nvt  0.585 0.893 -0.415\nvt  0.573 0.899 -0.388\nvt  0.560 0.906 -0.441\nvt  0.547 0.916 -0.399\nvt  0.540 0.913 -0.377\nvt  0.360 0.961 -0.290\nvt  0.373 0.951 -0.256\nvt  0.362 0.949 -0.295\nvt  0.519 0.920 -0.431\nvt  0.511 0.928 -0.430\nvt  0.374 0.966 -0.291\nvt  0.547 0.942 -0.405\nvt  0.526 0.940 -0.403\nvt  0.550 0.921 -0.418\nvt  0.580 0.910 -0.445\nvt  0.006 0.834 0.173\nvt  0.077 0.888 0.183\nvt  0.449 0.282 0.257\nvt  0.479 0.051 0.100\nvt  0.444 0.043 0.119\nvt  0.432 0.255 0.257\nvt  0.461 0.209 0.257\nvt  0.449 0.205 0.257\nvt  0.402 0.182 0.257\nvt  0.390 0.164 0.257\nvt  0.466 0.191 0.257\nvt  0.483 0.175 0.298\nvt  0.515 0.190 0.292\nvt  0.420 0.181 0.257\nvt  0.481 0.285 0.257\nvt  0.457 0.189 0.257\nvt  0.469 0.185 0.257\nvt  0.434 0.178 0.257\nvt  0.451 0.183 0.257\nvt  0.520 0.211 0.318\nvt  0.542 0.123 0.193\nvt  0.551 0.080 0.107\nvt  0.889 0.682 0.346\nvt  0.916 0.688 0.318\nvt  0.919 0.555 0.518\nvt  0.993 0.520 0.543\nvt  0.992 0.501 0.497\nvt  0.942 0.525 0.591\nvt  0.316 0.159 0.424\nvt  0.318 0.136 0.427\nvt  0.338 0.152 0.409\nvt  0.335 0.167 0.406\nvt  0.383 0.100 0.375\nvt  0.356 0.108 0.394\nvt  0.348 0.088 0.393\nvt  0.339 0.128 0.404\nvt  0.338 0.125 0.414\nvt  0.757 0.592 0.841\nvt  0.943 0.660 0.452\nvt  0.973 0.893 0.530\nvt  0.111 0.974 0.173\nvt  0.006 0.974 0.173\nvt  0.168 0.154 0.405\nvt  0.178 0.161 0.411\nvt  0.159 0.169 0.397\nvt  0.121 0.975 0.173\nvt  0.329 0.077 0.404\nvt  0.298 0.083 0.425\nvt  0.283 0.074 0.424\nvt  0.260 0.064 0.448\nvt  0.268 0.076 0.426\nvt  0.300 0.140 0.439\nvt  0.311 0.144 0.433\nvt  0.956 0.501 0.544\nvt  0.819 0.374 0.575\nvt  0.266 0.050 0.414\nvt  0.250 0.073 0.424\nvt  0.253 0.060 0.417\nvt  0.254 0.051 0.427\nvt  0.255 0.035 0.419\nvt  0.254 0.037 0.416\nvt  0.241 0.028 0.395\nvt  0.275 0.127 0.461\nvt  0.270 0.119 0.459\nvt  0.263 0.114 0.480\nvt  0.261 0.106 0.451\nvt  0.277 0.133 0.454\nvt  0.249 0.114 0.452\nvt  0.264 0.127 0.479\nvt  0.260 0.125 0.465\nvt  0.287 0.152 0.447\nvt  0.184 0.152 0.421\nvt  0.193 0.173 0.429\nvt  0.182 0.174 0.411\nvt  0.245 0.132 0.459\nvt  0.300 0.171 0.432\nvt  0.284 0.171 0.452\nvt  0.281 0.163 0.460\nvt  0.274 0.175 0.482\nvt  0.250 0.185 0.436\nvt  0.164 0.208 0.388\nvt  0.270 0.356 0.342\nvt  0.270 0.341 0.347\nvt  0.297 0.296 0.359\nvt  0.157 0.188 0.388\nvt  0.144 0.175 0.386\nvt  0.129 0.958 0.173\nvt  0.494 0.243 0.257\nvt  0.400 0.029 0.419\nvt  0.350 0.036 0.373\nvt  0.364 0.064 0.409\nvt  0.352 0.052 0.389\nvt  0.427 0.055 0.479\nvt  0.973 0.619 0.494\nvt  0.985 0.611 0.499\nvt  0.940 0.614 0.544\nvt  0.968 0.611 0.520\nvt  0.507 0.282 0.257\nvt  0.121 0.192 0.368\nvt  0.134 0.253 0.361\nvt  0.301 0.395 0.336\nvt  0.186 0.473 0.330\nvt  0.983 0.184 -0.059\nvt  0.964 0.180 -0.059\nvt  0.176 0.469 0.332\nvt  0.217 0.164 0.460\nvt  0.245 0.188 0.433\nvt  0.251 0.161 0.472\nvt  0.255 0.171 0.463\nvt  0.244 0.168 0.464\nvt  0.243 0.177 0.453\nvt  0.244 0.162 0.481\nvt  0.230 0.169 0.459\nvt  0.227 0.172 0.460\nvt  0.237 0.178 0.464\nvt  0.228 0.165 0.461\nvt  0.232 0.146 0.470\nvt  0.236 0.146 0.465\nvt  0.210 0.587 0.312\nvt  0.196 0.578 0.310\nvt  0.197 0.592 0.312\nvt  0.990 0.344 -0.060\nvt  0.176 0.535 0.328\nvt  0.170 0.531 0.327\nvt  0.157 0.518 0.327\nvt  0.152 0.509 0.329\nvt  0.152 0.534 0.327\nvt  0.989 0.090 -0.058\nvt  0.299 0.595 0.303\nvt  0.281 0.600 0.302\nvt  0.294 0.608 0.301\nvt  0.935 0.346 -0.059\nvt  0.358 0.551 0.309\nvt  0.914 0.284 -0.059\nvt  0.353 0.537 0.303\nvt  0.344 0.550 0.307\nvt  0.927 0.112 -0.059\nvt  0.365 0.486 0.317\nvt  0.883 0.245 -0.060\nvt  0.357 0.480 0.312\nvt  0.356 0.491 0.316\nvt  0.991 0.220 -0.059\nvt  0.220 0.056 0.399\nvt  0.841 0.831 0.393\nvt  0.829 0.813 0.379\nvt  0.858 0.858 0.410\nvt  0.468 0.690 0.962\nvt  0.483 0.681 0.962\nvt  0.478 0.704 0.962\nvt  0.174 0.698 0.962\nvt  0.112 0.757 0.963\nvt  0.109 0.595 0.962\nvt  0.123 0.601 0.962\nvt  0.101 0.755 0.963\nvt  0.745 0.176 0.596\nvt  0.756 0.173 0.600\nvt  0.905 0.338 0.601\nvt  0.878 0.898 0.722\nvt  0.855 0.884 0.722\nvt  0.820 0.876 0.722\nvt  0.218 0.872 0.906\nvt  0.183 0.732 0.906\nvt  0.086 0.812 0.906\nvt  0.122 0.781 0.906\nvt  0.146 0.755 0.906\nvt  0.164 0.738 0.906\nvt  0.146 0.923 0.906\nvt  0.125 0.908 0.906\nvt  0.917 0.743 0.428\nvt  0.180 0.930 0.906\nvt  0.879 0.349 0.601\nvt  0.953 0.683 0.417\nvt  0.955 0.673 0.413\nvt  0.716 0.822 0.721\nvt  0.811 0.978 0.722\nvt  0.904 0.978 0.721\nvt  0.604 0.916 0.715\nvt  0.904 0.074 0.599\nvt  0.853 0.056 0.598\nvt  0.829 0.035 0.598\nvt  0.779 0.031 0.597\nvt  0.493 0.680 0.946\nvt  0.940 0.431 0.494\nvt  0.055 0.249 0.173\nvt  0.062 0.225 0.173\nvt  0.068 0.234 0.173\nvt  0.067 0.471 0.173\nvt  0.068 0.450 0.173\nvt  0.124 0.480 0.173\nvt  0.014 0.325 0.173\nvt  0.085 0.380 0.183\nvt  0.119 0.465 0.173\nvt  0.014 0.465 0.173\nvt  0.129 0.467 0.173\nvt  0.136 0.449 0.173\nvt  0.593 0.846 -0.455\nvt  0.640 0.820 -0.420\nvt  0.573 0.682 -0.408\nvt  0.553 0.683 -0.421\nvt  0.583 0.651 -0.475\nvt  0.601 0.639 -0.491\nvt  0.531 0.626 -0.447\nvt  0.538 0.653 -0.511\nvt  0.529 0.660 -0.506\nvt  0.545 0.641 -0.514\nvt  0.616 0.646 -0.504\nvt  0.592 0.630 -0.504\nvt  0.648 0.640 -0.468\nvt  0.437 0.628 -0.685\nvt  0.420 0.613 -0.685\nvt  0.527 0.653 -0.492\nvt  0.510 0.640 -0.443\nvt  0.649 0.787 -0.420\nvt  0.654 0.764 -0.418\nvt  0.653 0.759 -0.433\nvt  0.501 0.744 -0.468\nvt  0.658 0.665 -0.468\nvt  0.438 0.697 -0.491\nvt  0.450 0.649 -0.685\nvt  0.474 0.655 -0.685\nvt  0.547 0.524 -0.709\nvt  0.528 0.525 -0.708\nvt  0.499 0.369 -0.697\nvt  0.568 0.575 -0.720\nvt  0.554 0.586 -0.723\nvt  0.564 0.596 -0.696\nvt  0.613 0.558 -0.709\nvt  0.698 0.510 -0.709\nvt  0.300 0.430 -0.685\nvt  0.683 0.473 -0.709\nvt  0.714 0.492 -0.709\nvt  0.701 0.483 -0.709\nvt  0.805 0.670 -1.024\nvt  0.836 0.665 -1.013\nvt  0.792 0.694 -1.013\nvt  0.741 0.458 -0.752\nvt  0.703 0.574 -0.710\nvt  0.795 0.722 -1.024\nvt  0.767 0.704 -1.015\nvt  0.798 0.753 -1.015\nvt  0.730 0.778 -0.915\nvt  0.729 0.554 -0.937\nvt  0.710 0.560 -0.852\nvt  0.726 0.573 -0.831\nvt  0.609 0.865 -0.458\nvt  0.617 0.861 -0.457\nvt  0.343 0.860 -0.290\nvt  0.342 0.888 -0.290\nvt  0.378 0.838 -0.290\nvt  0.371 0.864 -0.290\nvt  0.379 0.866 -0.246\nvt  0.374 0.872 -0.291\nvt  0.375 0.908 -0.290\nvt  0.371 0.896 -0.290\nvt  0.379 0.905 -0.290\nvt  0.492 0.904 -0.459\nvt  0.336 0.740 -0.291\nvt  0.333 0.746 -0.291\nvt  0.346 0.750 -0.291\nvt  0.342 0.756 -0.291\nvt  0.356 0.761 -0.291\nvt  0.118 0.520 -0.292\nvt  0.389 0.825 -0.291\nvt  0.387 0.925 -0.262\nvt  0.640 0.862 -0.460\nvt  0.576 0.888 -0.406\nvt  0.589 0.865 -0.461\nvt  0.584 0.882 -0.410\nvt  0.585 0.893 -0.415\nvt  0.589 0.886 -0.402\nvt  0.573 0.899 -0.388\nvt  0.560 0.906 -0.441\nvt  0.547 0.916 -0.399\nvt  0.540 0.913 -0.377\nvt  0.360 0.961 -0.290\nvt  0.362 0.949 -0.295\nvt  0.373 0.951 -0.256\nvt  0.519 0.920 -0.431\nvt  0.511 0.928 -0.430\nvt  0.374 0.966 -0.291\nvt  0.526 0.940 -0.403\nvt  0.547 0.942 -0.405\nvt  0.550 0.921 -0.418\nvt  0.580 0.910 -0.445\nvt  0.449 0.282 0.257\nvt  0.479 0.051 0.100\nvt  0.444 0.043 0.119\nvt  0.432 0.255 0.257\nvt  0.461 0.209 0.257\nvt  0.449 0.205 0.257\nvt  0.402 0.182 0.257\nvt  0.390 0.164 0.257\nvt  0.466 0.191 0.257\nvt  0.483 0.175 0.298\nvt  0.515 0.190 0.292\nvt  0.420 0.181 0.257\nvt  0.481 0.285 0.257\nvt  0.457 0.189 0.257\nvt  0.469 0.185 0.257\nvt  0.434 0.178 0.257\nvt  0.451 0.183 0.257\nvt  0.520 0.211 0.318\nvt  0.542 0.123 0.193\nvt  0.551 0.080 0.107\nvt  0.889 0.682 0.346\nvt  0.916 0.688 0.318\nvt  0.919 0.555 0.518\nvt  0.993 0.520 0.543\nvt  0.942 0.525 0.591\nvt  0.992 0.501 0.497\nvt  0.316 0.159 0.424\nvt  0.338 0.152 0.409\nvt  0.318 0.136 0.427\nvt  0.335 0.167 0.406\nvt  0.383 0.100 0.375\nvt  0.348 0.088 0.393\nvt  0.356 0.108 0.394\nvt  0.338 0.125 0.414\nvt  0.339 0.128 0.404\nvt  0.757 0.592 0.841\nvt  0.943 0.660 0.452\nvt  0.973 0.893 0.530\nvt  0.168 0.154 0.405\nvt  0.159 0.169 0.397\nvt  0.178 0.161 0.411\nvt  0.329 0.077 0.404\nvt  0.298 0.083 0.425\nvt  0.283 0.074 0.424\nvt  0.260 0.064 0.448\nvt  0.268 0.076 0.426\nvt  0.300 0.140 0.439\nvt  0.311 0.144 0.433\nvt  0.956 0.501 0.544\nvt  0.819 0.374 0.575\nvt  0.266 0.050 0.414\nvt  0.250 0.073 0.424\nvt  0.253 0.060 0.417\nvt  0.254 0.051 0.427\nvt  0.255 0.035 0.419\nvt  0.254 0.037 0.416\nvt  0.241 0.028 0.395\nvt  0.270 0.119 0.459\nvt  0.275 0.127 0.461\nvt  0.263 0.114 0.480\nvt  0.261 0.106 0.451\nvt  0.277 0.133 0.454\nvt  0.249 0.114 0.452\nvt  0.264 0.127 0.479\nvt  0.260 0.125 0.465\nvt  0.287 0.152 0.447\nvt  0.184 0.152 0.421\nvt  0.193 0.173 0.429\nvt  0.182 0.174 0.411\nvt  0.245 0.132 0.459\nvt  0.300 0.171 0.432\nvt  0.284 0.171 0.452\nvt  0.281 0.163 0.460\nvt  0.274 0.175 0.482\nvt  0.250 0.185 0.436\nvt  0.164 0.208 0.388\nvt  0.270 0.356 0.342\nvt  0.270 0.341 0.347\nvt  0.297 0.296 0.359\nvt  0.157 0.188 0.388\nvt  0.144 0.175 0.386\nvt  0.494 0.243 0.257\nvt  0.400 0.029 0.419\nvt  0.350 0.036 0.373\nvt  0.364 0.064 0.409\nvt  0.352 0.052 0.389\nvt  0.427 0.055 0.479\nvt  0.985 0.611 0.499\nvt  0.973 0.619 0.494\nvt  0.940 0.614 0.544\nvt  0.968 0.611 0.520\nvt  0.507 0.282 0.257\nvt  0.121 0.192 0.368\nvt  0.134 0.253 0.361\nvt  0.301 0.395 0.336\nvt  0.186 0.473 0.330\nvt  0.983 0.184 -0.059\nvt  0.964 0.180 -0.059\nvt  0.176 0.469 0.332\nvt  0.217 0.164 0.460\nvt  0.245 0.188 0.433\nvt  0.251 0.161 0.472\nvt  0.244 0.168 0.464\nvt  0.255 0.171 0.463\nvt  0.243 0.177 0.453\nvt  0.244 0.162 0.481\nvt  0.230 0.169 0.459\nvt  0.227 0.172 0.460\nvt  0.237 0.178 0.464\nvt  0.228 0.165 0.461\nvt  0.236 0.146 0.465\nvt  0.232 0.146 0.470\nvt  0.210 0.587 0.312\nvt  0.196 0.578 0.310\nvt  0.197 0.592 0.312\nvt  0.990 0.344 -0.060\nvt  0.176 0.535 0.328\nvt  0.170 0.531 0.327\nvt  0.157 0.518 0.327\nvt  0.152 0.509 0.329\nvt  0.152 0.534 0.327\nvt  0.989 0.090 -0.058\nvt  0.299 0.595 0.303\nvt  0.281 0.600 0.302\nvt  0.294 0.608 0.301\nvt  0.935 0.346 -0.059\nvt  0.358 0.551 0.309\nvt  0.914 0.284 -0.059\nvt  0.353 0.537 0.303\nvt  0.344 0.550 0.307\nvt  0.927 0.112 -0.059\nvt  0.365 0.486 0.317\nvt  0.883 0.245 -0.060\nvt  0.357 0.480 0.312\nvt  0.356 0.491 0.316\nvt  0.991 0.220 -0.059\nvt  0.220 0.056 0.399\nvt  0.841 0.831 0.393\nvt  0.829 0.813 0.379\nvt  0.858 0.858 0.410\nvt  0.468 0.690 0.962\nvt  0.478 0.704 0.962\nvt  0.483 0.681 0.962\nvt  0.174 0.698 0.962\nvt  0.112 0.757 0.963\nvt  0.109 0.595 0.962\nvt  0.123 0.601 0.962\nvt  0.101 0.755 0.963\nvt  0.878 0.898 0.722\nvt  0.893 0.927 0.722\nvt  0.855 0.884 0.722\nvt  0.820 0.876 0.722\nvt  0.218 0.872 0.906\nvt  0.183 0.732 0.906\nvt  0.086 0.812 0.906\nvt  0.122 0.781 0.906\nvt  0.146 0.755 0.906\nvt  0.164 0.738 0.906\nvt  0.125 0.908 0.906\nvt  0.146 0.923 0.906\nvt  0.917 0.743 0.428\nvt  0.180 0.930 0.906\nvt  0.955 0.673 0.413\nvt  0.953 0.683 0.417\nvt  0.716 0.822 0.721\nvt  0.811 0.978 0.722\nvt  0.604 0.916 0.715\nvt  0.493 0.680 0.946\nvt  0.940 0.431 0.494\n# 3263 texture vertices\n\nvn  0.760 -0.649 0.033\nvn  0.982 -0.127 0.139\nvn  0.978 -0.195 -0.079\nvn  0.740 -0.425 0.521\nvn  0.924 -0.223 0.310\nvn  0.963 -0.145 0.228\nvn  0.830 -0.154 0.537\nvn  0.718 -0.501 0.483\nvn  0.563 0.011 0.826\nvn  0.487 -0.038 0.872\nvn  0.220 0.118 0.968\nvn  0.355 0.055 0.933\nvn  0.347 -0.199 0.916\nvn  0.941 -0.019 -0.339\nvn  0.968 -0.027 -0.251\nvn  0.990 0.074 -0.116\nvn  0.973 -0.011 0.231\nvn  0.926 -0.053 0.374\nvn  0.783 0.176 0.596\nvn  0.798 0.109 0.592\nvn  0.718 -0.257 0.646\nvn  0.410 0.238 0.881\nvn  0.418 0.124 0.900\nvn  0.561 0.192 0.805\nvn  0.677 0.407 0.614\nvn  0.572 0.121 0.811\nvn  0.479 0.413 0.775\nvn  0.056 0.253 0.966\nvn  0.070 -0.036 0.997\nvn  0.233 -0.432 0.871\nvn  0.207 -0.259 0.943\nvn  0.476 -0.109 0.873\nvn  0.118 0.100 0.988\nvn  -0.115 0.133 0.984\nvn  0.094 -0.325 0.941\nvn  0.667 -0.504 0.549\nvn  -0.310 0.255 0.916\nvn  0.287 0.104 0.952\nvn  0.810 -0.225 0.542\nvn  -0.172 0.397 0.901\nvn  0.458 0.123 0.881\nvn  0.654 -0.051 0.754\nvn  -0.188 0.392 0.901\nvn  -0.268 0.311 0.912\nvn  0.293 0.239 0.926\nvn  0.401 0.117 0.909\nvn  0.055 0.424 0.904\nvn  0.475 0.141 0.868\nvn  0.114 -0.170 0.979\nvn  0.619 -0.352 0.702\nvn  -0.300 -0.035 0.953\nvn  -0.006 -0.019 1.000\nvn  0.321 -0.104 0.941\nvn  0.152 -0.317 0.936\nvn  0.191 -0.631 0.752\nvn  0.365 0.080 0.928\nvn  -0.037 0.280 0.959\nvn  -0.101 0.072 0.992\nvn  -0.160 -0.184 0.970\nvn  -0.349 -0.486 0.801\nvn  0.338 0.508 0.792\nvn  0.374 0.621 0.689\nvn  0.317 0.920 0.232\nvn  0.761 0.631 0.151\nvn  -0.054 0.443 0.895\nvn  0.639 -0.190 0.746\nvn  0.371 -0.106 0.922\nvn  0.557 -0.288 -0.779\nvn  0.964 -0.251 0.091\nvn  0.984 0.034 0.176\nvn  0.737 -0.570 -0.364\nvn  0.936 -0.122 0.329\nvn  0.653 -0.556 0.514\nvn  0.242 -0.799 0.551\nvn  0.866 -0.263 0.426\nvn  0.465 -0.602 0.650\nvn  0.179 -0.803 0.569\nvn  0.685 -0.704 -0.187\nvn  0.599 -0.614 0.513\nvn  0.123 -0.776 0.619\nvn  0.918 -0.375 0.126\nvn  0.731 0.062 -0.680\nvn  0.606 -0.592 -0.532\nvn  0.946 0.121 -0.301\nvn  0.772 -0.611 -0.177\nvn  0.816 0.071 -0.574\nvn  0.848 -0.483 0.218\nvn  0.195 -0.811 0.552\nvn  0.920 -0.189 -0.343\nvn  0.349 -0.682 -0.643\nvn  0.503 -0.320 -0.803\nvn  0.565 -0.384 -0.730\nvn  0.046 0.040 -0.998\nvn  0.510 -0.351 -0.785\nvn  0.217 -0.525 -0.823\nvn  0.282 -0.947 0.151\nvn  0.888 0.390 -0.245\nvn  0.814 0.524 -0.250\nvn  0.108 -0.109 -0.988\nvn  0.010 0.148 -0.989\nvn  -0.110 0.152 0.982\nvn  -0.177 0.366 0.913\nvn  0.533 0.387 0.753\nvn  0.510 0.578 0.637\nvn  -0.246 0.841 -0.482\nvn  -0.275 0.958 -0.084\nvn  -0.116 0.904 0.411\nvn  0.000 0.451 0.893\nvn  -0.165 0.231 0.959\nvn  -0.256 0.654 0.712\nvn  0.118 0.737 0.665\nvn  -0.106 0.203 0.973\nvn  0.327 0.060 0.943\nvn  -0.164 0.318 0.934\nvn  0.185 0.107 0.977\nvn  0.090 0.361 0.928\nvn  -0.552 0.308 0.775\nvn  -0.638 0.446 0.627\nvn  -0.838 0.216 0.501\nvn  -0.297 0.215 0.930\nvn  -0.491 0.350 0.797\nvn  -0.663 0.301 0.686\nvn  -0.077 0.082 0.994\nvn  0.116 0.881 0.459\nvn  -0.078 -0.036 0.996\nvn  0.206 -0.039 0.978\nvn  0.321 0.056 0.946\nvn  0.741 -0.240 0.627\nvn  0.726 -0.196 0.659\nvn  0.508 0.244 0.826\nvn  0.647 -0.292 0.704\nvn  -0.246 0.582 0.775\nvn  0.011 0.107 0.994\nvn  0.395 -0.145 0.907\nvn  -0.752 -0.300 0.588\nvn  0.451 -0.532 0.717\nvn  -0.320 0.482 0.816\nvn  -0.806 0.309 0.505\nvn  -0.602 -0.614 0.511\nvn  -0.551 -0.627 0.550\nvn  -0.519 0.642 0.565\nvn  -0.268 0.165 0.949\nvn  -0.936 0.107 0.336\nvn  -0.718 0.204 0.666\nvn  -0.927 -0.040 0.372\nvn  -0.885 0.378 0.273\nvn  -0.697 0.219 0.683\nvn  -0.861 0.186 -0.473\nvn  0.873 -0.079 0.481\nvn  0.033 0.557 0.830\nvn  -0.744 0.039 0.667\nvn  0.566 -0.760 0.320\nvn  -0.417 -0.808 0.417\nvn  -0.107 -0.049 0.993\nvn  0.257 -0.940 0.223\nvn  0.621 -0.556 0.553\nvn  -0.148 -0.639 0.755\nvn  -0.188 -0.217 0.958\nvn  0.190 -0.931 0.311\nvn  -0.191 -0.951 0.245\nvn  0.205 -0.974 0.092\nvn  -0.971 -0.112 0.213\nvn  -0.572 0.320 0.755\nvn  -0.677 -0.534 0.505\nvn  0.810 -0.250 0.530\nvn  0.266 -0.124 0.956\nvn  0.449 -0.856 0.258\nvn  0.592 -0.786 0.179\nvn  0.892 0.192 0.410\nvn  0.855 -0.512 0.083\nvn  -0.566 -0.817 0.110\nvn  -0.412 -0.131 -0.901\nvn  -0.850 -0.420 -0.319\nvn  -0.923 0.376 0.080\nvn  -0.865 -0.486 0.124\nvn  -0.829 -0.508 0.234\nvn  -0.503 -0.859 0.096\nvn  -0.771 0.070 0.633\nvn  0.343 0.015 0.939\nvn  0.313 0.538 0.783\nvn  0.597 -0.000 0.802\nvn  0.652 0.430 0.624\nvn  0.910 0.206 0.360\nvn  0.522 0.064 0.850\nvn  0.735 0.360 0.574\nvn  0.175 -0.315 -0.933\nvn  -0.543 -0.057 -0.838\nvn  -0.966 0.219 0.138\nvn  -0.865 0.038 -0.500\nvn  0.003 -0.667 -0.745\nvn  -0.486 -0.352 -0.800\nvn  0.341 0.722 0.602\nvn  0.832 -0.177 0.525\nvn  0.224 0.046 0.974\nvn  0.587 -0.278 0.760\nvn  0.445 0.026 0.895\nvn  0.665 -0.173 0.727\nvn  -0.970 0.221 -0.106\nvn  -0.909 0.022 0.415\nvn  -0.987 -0.069 0.143\nvn  0.002 -0.351 -0.936\nvn  0.357 0.418 -0.835\nvn  0.793 -0.448 -0.412\nvn  -0.004 -0.977 -0.215\nvn  0.771 -0.436 -0.464\nvn  0.940 -0.341 0.024\nvn  0.941 -0.335 0.042\nvn  0.884 -0.266 0.386\nvn  0.929 -0.369 0.002\nvn  0.934 -0.201 -0.296\nvn  -0.588 0.783 -0.204\nvn  0.444 0.862 -0.246\nvn  0.779 0.616 -0.119\nvn  -0.552 0.731 -0.402\nvn  0.294 0.889 -0.350\nvn  -0.363 0.925 -0.115\nvn  0.399 0.914 -0.075\nvn  0.077 0.975 -0.206\nvn  -0.815 0.405 -0.414\nvn  -0.975 0.106 -0.196\nvn  -0.980 0.197 -0.038\nvn  -0.950 0.303 0.070\nvn  -0.941 -0.332 -0.065\nvn  -0.964 0.105 -0.243\nvn  -0.943 -0.322 0.084\nvn  -0.756 -0.651 0.069\nvn  -0.089 -0.996 0.024\nvn  0.520 -0.852 0.051\nvn  0.846 -0.530 -0.065\nvn  0.735 -0.677 -0.013\nvn  0.994 -0.085 -0.072\nvn  0.833 0.445 -0.329\nvn  -0.370 0.633 -0.680\nvn  0.492 -0.420 -0.762\nvn  0.884 0.116 -0.452\nvn  0.883 0.434 -0.178\nvn  0.966 -0.241 -0.096\nvn  -0.732 -0.679 0.061\nvn  -0.121 -0.992 0.037\nvn  0.899 -0.393 -0.193\nvn  -0.787 -0.558 0.263\nvn  0.208 -0.962 0.177\nvn  -0.367 -0.312 0.876\nvn  0.047 -0.811 0.583\nvn  0.459 -0.888 -0.012\nvn  0.758 -0.604 0.245\nvn  0.550 -0.835 -0.017\nvn  0.937 0.051 -0.345\nvn  0.518 -0.182 -0.836\nvn  0.689 0.645 -0.332\nvn  -0.514 -0.024 -0.857\nvn  -0.835 0.062 -0.546\nvn  -0.038 -0.139 -0.990\nvn  -0.077 -0.689 0.721\nvn  -0.897 -0.200 0.394\nvn  -0.991 0.118 0.062\nvn  -0.522 0.406 -0.750\nvn  -0.906 0.385 -0.173\nvn  0.439 0.453 -0.776\nvn  -0.576 0.766 -0.285\nvn  -0.044 0.405 -0.913\nvn  0.031 0.903 -0.428\nvn  0.716 -0.013 0.698\nvn  0.996 -0.061 -0.065\nvn  0.896 -0.016 0.443\nvn  0.980 -0.031 -0.199\nvn  0.504 -0.347 -0.791\nvn  0.556 -0.472 -0.684\nvn  0.193 -0.411 -0.891\nvn  0.397 -0.602 -0.693\nvn  0.783 -0.440 -0.439\nvn  0.936 -0.327 0.128\nvn  0.753 0.055 0.655\nvn  0.897 -0.093 0.432\nvn  0.745 0.018 0.667\nvn  0.852 -0.431 -0.298\nvn  0.630 -0.425 -0.651\nvn  0.611 -0.778 -0.143\nvn  0.756 -0.431 0.493\nvn  0.785 -0.384 -0.486\nvn  0.763 -0.644 0.060\nvn  0.860 -0.182 0.477\nvn  0.945 0.022 -0.327\nvn  0.449 -0.556 -0.699\nvn  0.688 -0.538 -0.487\nvn  -0.366 -0.169 -0.915\nvn  -0.877 0.016 -0.480\nvn  -0.905 0.113 -0.410\nvn  -0.958 0.144 0.247\nvn  -0.943 0.275 0.185\nvn  -0.512 0.707 0.488\nvn  -0.606 0.130 0.785\nvn  -0.376 0.533 0.758\nvn  -0.936 0.352 -0.018\nvn  -0.334 0.028 -0.942\nvn  -0.421 -0.347 -0.838\nvn  0.324 0.427 0.844\nvn  0.640 0.169 0.750\nvn  0.183 0.776 0.603\nvn  -0.497 0.815 0.298\nvn  0.380 0.844 0.378\nvn  -0.504 0.861 -0.065\nvn  0.504 0.844 0.185\nvn  -0.598 0.801 0.032\nvn  0.561 0.758 0.334\nvn  -0.669 0.539 0.511\nvn  0.498 0.419 0.759\nvn  -0.662 0.643 0.385\nvn  -0.891 0.399 0.214\nvn  0.614 0.444 0.652\nvn  -0.890 -0.435 -0.134\nvn  0.791 -0.441 0.423\nvn  0.009 -0.994 -0.113\nvn  -0.217 0.780 0.587\nvn  0.509 0.521 0.685\nvn  -0.324 0.399 0.858\nvn  -0.346 -0.233 0.909\nvn  0.619 -0.066 0.783\nvn  0.915 0.183 0.360\nvn  0.460 0.516 0.723\nvn  0.286 0.849 0.444\nvn  -0.939 0.172 0.298\nvn  -0.965 0.107 -0.241\nvn  0.900 0.264 0.347\nvn  0.935 -0.249 0.253\nvn  0.605 -0.668 0.433\nvn  -0.889 -0.174 -0.424\nvn  0.152 -0.899 -0.411\nvn  -0.058 -0.939 -0.340\nvn  -0.028 -0.995 -0.094\nvn  -0.298 -0.926 0.234\nvn  -0.991 -0.046 0.125\nvn  -0.832 -0.493 -0.254\nvn  0.835 -0.269 0.480\nvn  0.328 -0.722 -0.610\nvn  -0.893 -0.390 -0.226\nvn  0.460 0.887 -0.039\nvn  0.078 0.995 0.056\nvn  -0.651 0.755 -0.075\nvn  0.764 0.642 0.067\nvn  0.991 0.038 -0.130\nvn  -0.966 -0.017 -0.259\nvn  -0.572 0.759 -0.312\nvn  -0.572 0.609 0.550\nvn  0.776 -0.536 0.332\nvn  -0.963 -0.241 0.117\nvn  -0.763 -0.553 -0.335\nvn  0.147 -0.987 -0.065\nvn  0.905 -0.313 0.290\nvn  0.344 -0.760 0.551\nvn  -0.572 -0.715 0.403\nvn  0.051 -0.946 0.320\nvn  -0.149 0.697 -0.701\nvn  0.250 0.824 0.508\nvn  -0.252 0.683 -0.685\nvn  0.191 0.900 0.391\nvn  -0.665 0.554 -0.501\nvn  -0.264 0.738 0.621\nvn  -0.669 0.495 -0.554\nvn  -0.350 0.701 0.621\nvn  -0.778 0.625 0.069\nvn  -0.238 0.563 0.791\nvn  -0.954 0.169 0.248\nvn  0.126 -0.137 0.983\nvn  -0.815 0.214 -0.538\nvn  -0.298 -0.733 -0.611\nvn  -0.310 -0.870 0.383\nvn  -0.490 -0.312 -0.814\nvn  -0.192 -0.244 -0.951\nvn  -0.431 -0.335 -0.838\nvn  0.316 -0.157 0.936\nvn  0.275 0.315 0.908\nvn  0.247 0.297 0.922\nvn  0.433 -0.193 0.880\nvn  0.467 -0.867 -0.174\nvn  0.375 -0.864 -0.335\nvn  0.395 -0.909 0.134\nvn  0.109 -0.993 0.037\nvn  0.247 -0.024 0.969\nvn  -0.249 -0.611 -0.752\nvn  0.603 -0.779 0.172\nvn  -0.084 -0.987 0.138\nvn  0.342 -0.262 0.902\nvn  -0.101 -0.283 0.954\nvn  -0.729 0.234 -0.644\nvn  -0.650 -0.419 -0.634\nvn  -0.590 -0.581 -0.561\nvn  0.529 -0.373 -0.762\nvn  0.366 -0.623 -0.691\nvn  0.097 -0.989 -0.115\nvn  0.601 -0.647 -0.469\nvn  0.096 -0.766 -0.636\nvn  0.094 -0.764 -0.638\nvn  -0.512 -0.618 -0.596\nvn  -0.241 -0.958 0.153\nvn  0.634 -0.472 -0.613\nvn  0.771 0.624 0.127\nvn  0.964 0.097 -0.247\nvn  0.877 0.335 -0.344\nvn  0.928 0.183 -0.324\nvn  0.347 0.926 -0.151\nvn  0.530 -0.233 -0.816\nvn  -0.355 0.751 0.558\nvn  -0.319 0.921 0.225\nvn  0.559 0.762 -0.329\nvn  0.825 0.563 -0.042\nvn  -0.242 0.821 0.518\nvn  0.882 0.441 0.163\nvn  -0.203 0.593 0.779\nvn  0.596 0.400 0.696\nvn  -0.344 0.341 0.875\nvn  0.495 -0.080 0.865\nvn  -0.734 -0.251 0.631\nvn  -0.072 -0.969 0.238\nvn  0.999 -0.017 0.039\nvn  0.583 -0.718 -0.381\nvn  0.907 -0.117 -0.405\nvn  0.720 -0.256 -0.645\nvn  -0.833 -0.373 0.409\nvn  -0.953 -0.155 0.258\nvn  -0.724 0.305 0.619\nvn  -0.828 -0.272 0.490\nvn  -0.393 -0.655 -0.645\nvn  0.692 -0.566 -0.447\nvn  -0.372 -0.583 -0.722\nvn  -0.417 -0.893 -0.167\nvn  -0.177 -0.981 -0.080\nvn  -0.697 -0.162 0.699\nvn  0.764 -0.636 -0.106\nvn  -0.728 -0.566 -0.386\nvn  -0.055 -0.990 -0.126\nvn  0.259 -0.224 0.940\nvn  0.889 -0.457 -0.016\nvn  0.317 -0.925 0.211\nvn  0.213 -0.782 0.586\nvn  -0.597 -0.363 0.715\nvn  -0.548 -0.587 0.596\nvn  0.131 -0.281 0.951\nvn  0.280 -0.763 0.582\nvn  -0.390 -0.091 0.916\nvn  -0.376 -0.088 0.922\nvn  0.644 0.508 0.572\nvn  -0.161 -0.046 0.986\nvn  0.088 0.021 0.996\nvn  0.175 0.322 0.931\nvn  -0.345 0.638 0.689\nvn  -0.281 0.186 0.942\nvn  -0.470 0.090 0.878\nvn  -0.356 0.779 0.515\nvn  -0.926 0.227 -0.302\nvn  -0.486 -0.847 0.215\nvn  0.252 -0.921 0.298\nvn  0.191 -0.935 0.299\nvn  -0.584 -0.352 0.732\nvn  0.352 -0.788 0.505\nvn  -0.468 -0.350 0.812\nvn  0.374 -0.779 0.503\nvn  -0.268 -0.322 0.908\nvn  0.592 -0.795 0.132\nvn  0.177 -0.424 0.888\nvn  0.487 -0.836 -0.253\nvn  0.533 -0.606 0.591\nvn  0.091 -0.779 -0.620\nvn  0.755 -0.595 0.275\nvn  -0.395 -0.809 -0.435\nvn  0.720 -0.637 0.276\nvn  -0.528 -0.849 0.025\nvn  -0.860 0.099 0.501\nvn  -0.663 0.370 0.651\nvn  -0.277 0.351 0.894\nvn  0.298 0.229 0.927\nvn  0.785 0.116 0.609\nvn  0.258 0.429 0.866\nvn  -0.823 -0.146 0.549\nvn  -0.973 -0.163 0.163\nvn  -0.855 -0.225 0.467\nvn  -0.728 -0.586 -0.356\nvn  -0.732 0.455 -0.508\nvn  -0.791 -0.318 0.523\nvn  -0.901 -0.020 0.434\nvn  -0.927 0.369 -0.065\nvn  -0.773 0.127 0.622\nvn  -0.668 -0.301 0.680\nvn  -0.896 -0.042 0.443\nvn  -0.591 0.643 -0.487\nvn  -0.928 0.155 0.340\nvn  -0.938 0.179 0.297\nvn  -0.523 0.852 0.037\nvn  -0.632 -0.728 -0.267\nvn  -0.772 0.032 -0.634\nvn  -0.938 0.287 0.194\nvn  -0.932 0.181 -0.314\nvn  -0.575 -0.150 -0.804\nvn  -0.625 -0.005 -0.781\nvn  -0.360 0.754 -0.549\nvn  0.041 0.839 -0.543\nvn  0.009 0.137 -0.991\nvn  -0.970 0.242 0.009\nvn  -0.945 0.028 0.326\nvn  -0.679 0.521 -0.518\nvn  -0.898 0.423 0.117\nvn  -0.770 0.206 0.604\nvn  -0.823 -0.359 -0.441\nvn  -0.876 -0.468 0.115\nvn  -0.987 -0.040 -0.158\nvn  -0.830 0.491 0.265\nvn  -0.905 0.423 -0.033\nvn  -0.658 0.583 0.476\nvn  -0.476 0.831 -0.287\nvn  0.061 0.536 -0.842\nvn  -0.164 -0.537 -0.828\nvn  -0.606 0.332 -0.722\nvn  -0.463 0.467 -0.753\nvn  -0.487 0.250 -0.837\nvn  -0.926 -0.366 0.093\nvn  -0.891 0.157 0.426\nvn  -0.978 -0.204 -0.049\nvn  -0.646 0.764 -0.003\nvn  -0.809 0.260 0.527\nvn  -0.110 0.709 -0.696\nvn  -0.362 0.687 -0.630\nvn  -0.465 0.466 -0.753\nvn  -0.667 0.669 -0.327\nvn  -0.624 0.763 0.169\nvn  -0.335 0.803 0.493\nvn  0.158 0.771 0.617\nvn  -0.937 0.091 -0.339\nvn  -0.870 0.151 0.470\nvn  -0.752 0.322 -0.576\nvn  -0.398 0.785 -0.475\nvn  -0.862 0.422 0.280\nvn  -0.677 0.511 -0.529\nvn  -0.587 0.808 0.054\nvn  -0.714 0.182 -0.676\nvn  -0.279 -0.419 0.864\nvn  -0.535 0.193 -0.823\nvn  -0.124 0.702 -0.702\nvn  -0.898 -0.392 -0.200\nvn  -0.902 -0.422 -0.092\nvn  -0.783 0.125 0.609\nvn  -0.932 -0.332 -0.143\nvn  -0.157 0.491 -0.857\nvn  -0.862 -0.475 -0.175\nvn  -0.783 0.535 -0.318\nvn  -0.092 0.492 -0.866\nvn  -0.457 0.435 -0.776\nvn  -0.435 0.721 -0.539\nvn  -0.324 0.559 0.763\nvn  -0.084 0.215 0.973\nvn  0.322 0.189 0.927\nvn  0.207 0.288 0.935\nvn  -0.156 0.026 0.987\nvn  -0.386 0.535 0.751\nvn  -0.778 0.382 0.499\nvn  -0.577 0.233 0.783\nvn  -0.547 0.619 0.564\nvn  -0.804 0.576 0.147\nvn  -0.305 0.193 0.933\nvn  -0.278 -0.353 0.893\nvn  -0.440 -0.005 0.898\nvn  0.529 -0.209 0.823\nvn  0.470 0.195 0.861\nvn  -0.833 0.016 0.554\nvn  -0.333 0.767 0.549\nvn  -0.828 0.096 0.552\nvn  -0.740 0.646 -0.186\nvn  -0.388 0.558 0.734\nvn  -0.956 -0.071 0.283\nvn  -0.800 0.516 -0.307\nvn  -0.486 0.849 0.209\nvn  -0.966 -0.248 -0.066\nvn  -0.738 0.279 0.614\nvn  -0.912 -0.361 -0.194\nvn  -0.990 -0.124 -0.070\nvn  -0.914 -0.394 -0.096\nvn  -0.993 -0.044 0.111\nvn  -0.479 0.873 -0.090\nvn  -0.716 0.692 -0.088\nvn  -0.607 0.789 -0.090\nvn  0.043 0.981 -0.190\nvn  -0.674 0.640 -0.369\nvn  -0.207 0.792 0.575\nvn  -0.556 0.688 -0.465\nvn  0.315 0.928 -0.199\nvn  0.250 0.916 0.314\nvn  0.139 0.958 0.251\nvn  -0.208 0.919 0.336\nvn  -0.654 0.425 0.626\nvn  -0.613 -0.170 0.772\nvn  -0.527 0.307 0.792\nvn  -0.137 0.481 0.866\nvn  0.409 0.165 0.897\nvn  -0.257 0.531 0.808\nvn  0.160 0.262 0.952\nvn  0.524 -0.219 0.823\nvn  -0.308 -0.357 0.881\nvn  -0.318 0.700 0.639\nvn  -0.085 0.547 0.833\nvn  -0.526 0.126 0.841\nvn  -0.676 0.248 0.694\nvn  0.106 -0.341 0.934\nvn  0.500 -0.047 0.865\nvn  -0.055 -0.486 0.872\nvn  -0.507 0.290 0.812\nvn  -0.418 -0.012 0.908\nvn  -0.364 -0.279 0.888\nvn  -0.737 0.671 0.083\nvn  -0.859 -0.033 0.511\nvn  -0.683 -0.477 0.553\nvn  -0.798 -0.478 -0.369\nvn  -0.914 -0.404 0.038\nvn  0.076 -0.801 0.593\nvn  -0.801 -0.517 0.301\nvn  -0.603 -0.654 -0.456\nvn  -0.873 -0.475 -0.109\nvn  -0.646 0.577 -0.500\nvn  -0.612 -0.425 -0.667\nvn  -0.436 -0.705 -0.559\nvn  -0.950 -0.284 -0.128\nvn  -0.207 -0.385 -0.899\nvn  -0.868 -0.496 -0.014\nvn  -0.449 0.200 -0.871\nvn  -0.486 -0.172 -0.857\nvn  -0.027 0.994 0.102\nvn  -0.382 0.470 -0.796\nvn  0.142 0.980 0.136\nvn  0.166 0.919 -0.357\nvn  -0.382 0.790 -0.479\nvn  0.168 -0.286 0.943\nvn  0.195 -0.414 0.889\nvn  -0.199 -0.251 0.947\nvn  -0.225 -0.814 0.536\nvn  -0.046 -0.638 0.769\nvn  -0.408 -0.156 0.900\nvn  -0.374 -0.630 0.681\nvn  0.225 -0.034 0.974\nvn  -0.476 0.250 0.843\nvn  -0.419 -0.308 0.854\nvn  -0.414 -0.753 -0.512\nvn  -0.506 -0.280 -0.816\nvn  -0.823 -0.488 -0.291\nvn  -0.919 -0.259 -0.296\nvn  -0.284 -0.218 -0.934\nvn  -0.118 -0.531 -0.839\nvn  -0.566 0.180 -0.805\nvn  -0.498 -0.314 -0.809\nvn  -0.505 -0.382 -0.774\nvn  -0.313 -0.522 -0.794\nvn  -0.430 -0.692 -0.579\nvn  -0.758 0.519 0.396\nvn  -0.480 -0.086 -0.873\nvn  -0.931 -0.259 -0.256\nvn  -0.315 -0.812 -0.491\nvn  -0.686 -0.683 0.253\nvn  -0.727 -0.169 0.666\nvn  -0.309 -0.926 -0.215\nvn  0.194 -0.040 -0.980\nvn  -0.519 -0.222 0.825\nvn  -0.627 0.167 -0.761\nvn  0.526 0.137 -0.839\nvn  -0.913 0.044 0.405\nvn  -0.300 -0.952 -0.063\nvn  0.357 -0.040 -0.933\nvn  -0.609 -0.173 0.774\nvn  -0.235 -0.897 -0.375\nvn  -0.465 0.438 0.770\nvn  0.227 0.864 -0.450\nvn  -0.152 0.816 0.557\nvn  -0.155 0.978 -0.137\nvn  0.185 0.939 -0.292\nvn  -0.347 0.788 0.509\nvn  0.320 0.845 -0.429\nvn  0.281 -0.005 -0.960\nvn  -0.026 0.918 0.395\nvn  -0.861 -0.151 -0.486\nvn  -0.409 -0.471 -0.782\nvn  0.009 0.269 -0.963\nvn  -0.526 0.135 -0.840\nvn  -0.712 -0.692 0.122\nvn  -0.370 -0.688 -0.625\nvn  -0.095 -0.158 -0.983\nvn  -0.853 -0.148 -0.501\nvn  -0.463 -0.051 0.885\nvn  -0.500 -0.756 -0.422\nvn  -0.083 -0.093 -0.992\nvn  -0.332 -0.158 0.930\nvn  0.303 0.720 -0.624\nvn  -0.099 0.722 -0.684\nvn  0.024 0.703 0.711\nvn  0.415 0.907 0.075\nvn  -0.439 0.898 0.024\nvn  -0.497 0.486 -0.719\nvn  -0.576 0.788 -0.217\nvn  -0.001 0.829 -0.559\nvn  -0.315 0.885 -0.342\nvn  0.105 0.507 -0.856\nvn  0.150 0.989 0.004\nvn  -0.458 0.889 -0.004\nvn  -0.134 0.368 -0.920\nvn  -0.521 0.391 -0.759\nvn  0.312 0.859 0.406\nvn  -0.518 0.750 -0.411\nvn  0.096 0.854 0.511\nvn  -0.225 0.843 0.488\nvn  -0.851 0.522 0.064\nvn  -0.293 0.503 0.813\nvn  -0.449 0.878 -0.169\nvn  -0.261 0.866 -0.426\nvn  -0.767 0.641 0.036\nvn  -0.572 -0.652 0.497\nvn  0.161 0.583 0.796\nvn  -0.600 -0.735 -0.314\nvn  -0.122 -0.149 -0.981\nvn  -0.462 -0.186 0.867\nvn  0.381 0.659 -0.649\nvn  -0.665 -0.612 0.427\nvn  -0.039 0.457 0.889\nvn  -0.327 -0.517 -0.791\nvn  0.146 0.988 -0.040\nvn  -0.522 -0.606 0.600\nvn  -0.221 0.474 0.853\nvn  0.393 0.902 0.176\nvn  0.189 0.527 -0.829\nvn  -0.448 -0.891 -0.080\nvn  -0.529 0.046 0.848\nvn  -0.296 0.921 -0.252\nvn  -0.151 0.008 -0.989\nvn  -0.967 0.003 -0.256\nvn  -0.714 0.242 -0.657\nvn  -0.826 -0.233 -0.514\nvn  -0.341 -0.771 -0.538\nvn  -0.876 -0.476 -0.081\nvn  -0.195 0.967 -0.166\nvn  -0.894 0.393 0.216\nvn  -0.502 0.426 -0.753\nvn  -0.415 -0.584 -0.698\nvn  -0.880 -0.367 -0.302\nvn  -0.182 0.969 -0.168\nvn  -0.906 0.417 0.080\nvn  0.529 -0.135 0.838\nvn  0.388 -0.162 0.907\nvn  0.333 -0.409 0.850\nvn  0.333 -0.215 0.918\nvn  0.365 -0.255 0.896\nvn  0.525 -0.231 0.819\nvn  -0.032 -0.064 0.997\nvn  -0.052 0.368 0.928\nvn  -0.177 -0.213 0.961\nvn  0.128 0.981 -0.149\nvn  -0.365 0.847 0.386\nvn  -0.374 0.794 -0.478\nvn  -0.659 0.593 -0.463\nvn  -0.369 0.814 -0.449\nvn  -0.382 0.769 -0.512\nvn  -0.500 0.797 -0.339\nvn  -0.273 0.868 -0.414\nvn  -0.892 0.397 -0.215\nvn  -0.404 0.856 -0.324\nvn  -0.722 0.610 -0.325\nvn  -0.523 0.764 0.378\nvn  -0.747 0.652 -0.130\nvn  -0.530 0.848 0.002\nvn  -0.558 0.739 0.378\nvn  -0.464 0.840 0.281\nvn  -0.583 0.744 -0.325\nvn  -0.336 0.315 -0.888\nvn  -0.648 -0.101 -0.755\nvn  -0.876 0.135 0.462\nvn  -0.855 0.322 -0.406\nvn  -0.166 -0.540 -0.825\nvn  -0.244 -0.596 -0.765\nvn  -0.102 -0.059 -0.993\nvn  -0.633 0.771 0.067\nvn  -0.381 0.542 0.749\nvn  -0.842 0.445 0.305\nvn  -0.488 0.871 0.060\nvn  -0.341 0.788 -0.513\nvn  -0.186 0.396 0.899\nvn  -0.748 0.154 -0.646\nvn  -0.239 0.149 -0.959\nvn  -0.470 0.880 -0.066\nvn  -0.182 0.890 -0.417\nvn  -0.242 0.894 -0.378\nvn  -0.013 0.483 -0.876\nvn  -0.795 0.592 -0.133\nvn  -0.967 -0.099 -0.233\nvn  -0.545 0.819 0.178\nvn  -0.235 -0.111 0.966\nvn  -0.541 0.822 -0.180\nvn  -0.616 0.704 0.353\nvn  -0.803 0.227 0.551\nvn  -0.777 0.623 -0.093\nvn  -0.600 0.354 0.718\nvn  -0.703 0.355 0.616\nvn  -0.710 0.597 -0.375\nvn  -0.649 0.269 0.712\nvn  -0.105 0.350 0.931\nvn  0.158 0.806 0.570\nvn  -0.578 0.471 0.666\nvn  -0.438 0.545 0.715\nvn  -0.667 0.534 0.520\nvn  -0.761 0.119 -0.637\nvn  -0.801 0.531 -0.275\nvn  0.052 -0.869 -0.491\nvn  0.023 0.716 0.698\nvn  -0.598 0.132 0.791\nvn  -0.574 0.153 0.804\nvn  -0.042 0.524 0.851\nvn  -0.597 0.098 0.796\nvn  -0.117 0.442 0.889\nvn  -0.013 0.584 0.812\nvn  0.298 0.498 0.815\nvn  0.265 0.334 0.904\nvn  0.009 0.950 0.313\nvn  0.175 0.757 0.630\nvn  -0.452 0.816 0.360\nvn  -0.413 0.084 0.907\nvn  0.100 0.680 0.727\nvn  -0.305 0.267 0.914\nvn  -0.540 0.575 0.615\nvn  -0.436 0.765 0.474\nvn  -0.688 0.274 0.671\nvn  -0.405 0.913 0.045\nvn  -0.749 0.643 -0.162\nvn  -0.967 -0.096 -0.234\nvn  -0.820 0.572 0.016\nvn  -0.672 0.325 -0.666\nvn  -0.604 0.460 -0.650\nvn  -0.609 0.502 0.614\nvn  -0.649 0.358 0.672\nvn  -0.891 0.451 -0.057\nvn  -0.239 0.864 -0.443\nvn  -0.820 0.316 -0.477\nvn  -0.457 0.855 -0.247\nvn  -0.768 0.630 0.119\nvn  -0.786 0.460 -0.413\nvn  -0.605 0.791 -0.085\nvn  -0.870 0.490 0.059\nvn  -0.961 0.022 -0.276\nvn  -0.979 -0.013 -0.205\nvn  -0.932 0.354 0.080\nvn  -0.485 0.716 0.502\nvn  -0.753 0.576 0.318\nvn  -0.670 0.713 0.205\nvn  0.079 0.489 0.869\nvn  0.344 0.130 0.930\nvn  -0.783 0.620 0.047\nvn  -0.889 0.100 -0.446\nvn  -0.561 0.753 0.345\nvn  -0.838 0.506 -0.202\nvn  -0.464 0.857 0.224\nvn  -0.053 0.693 0.719\nvn  0.760 -0.051 0.648\nvn  0.620 0.033 0.784\nvn  -0.756 0.584 -0.296\nvn  0.506 0.860 -0.069\nvn  -0.282 0.950 -0.133\nvn  -0.968 0.140 -0.206\nvn  -0.963 -0.112 -0.244\nvn  -0.871 -0.156 -0.467\nvn  -0.704 -0.499 -0.504\nvn  -0.279 0.642 0.715\nvn  -0.876 0.474 -0.089\nvn  -0.240 0.880 0.409\nvn  -0.293 0.897 0.331\nvn  0.349 0.032 0.937\nvn  0.416 0.656 0.629\nvn  -0.807 0.578 0.121\nvn  0.669 0.635 0.386\nvn  0.763 0.337 0.551\nvn  0.370 0.022 0.929\nvn  0.866 0.500 0.025\nvn  0.342 0.846 0.409\nvn  -0.846 0.150 -0.511\nvn  -0.309 0.919 0.244\nvn  -0.992 -0.128 -0.022\nvn  -0.867 0.499 0.006\nvn  -0.980 -0.118 0.159\nvn  -0.878 0.450 0.161\nvn  -0.831 0.520 0.198\nvn  -0.975 -0.136 0.178\nvn  -0.992 0.073 0.100\nvn  -0.840 0.536 0.082\nvn  -0.223 0.973 0.066\nvn  -0.962 -0.249 0.109\nvn  -0.840 -0.244 -0.484\nvn  -0.929 -0.255 -0.267\nvn  -0.489 -0.722 -0.490\nvn  -0.635 -0.735 0.237\nvn  -0.562 -0.763 -0.320\nvn  -0.628 -0.775 -0.074\nvn  -0.912 -0.238 -0.335\nvn  -0.787 -0.615 0.050\nvn  -0.643 -0.695 0.323\nvn  -0.466 -0.743 -0.480\nvn  -0.761 -0.219 -0.611\nvn  -0.282 -0.956 -0.087\nvn  -0.954 -0.280 0.106\nvn  0.768 -0.622 0.152\nvn  -0.996 -0.037 -0.081\nvn  0.369 -0.873 -0.318\nvn  -0.635 -0.671 -0.382\nvn  -0.997 -0.017 0.078\nvn  -0.201 -0.493 -0.846\nvn  0.028 -0.113 -0.993\nvn  0.192 -0.222 -0.956\nvn  -0.539 -0.213 -0.815\nvn  -0.916 0.312 -0.251\nvn  -0.275 -0.079 -0.958\nvn  -0.359 0.854 -0.376\nvn  0.222 0.460 -0.859\nvn  -0.995 -0.069 0.075\nvn  -0.694 -0.536 -0.481\nvn  0.166 -0.786 0.595\nvn  -0.992 -0.046 0.121\nvn  0.219 -0.922 -0.318\nvn  -0.711 -0.700 0.058\nvn  -0.636 -0.711 -0.300\nvn  -0.991 -0.047 -0.124\nvn  -0.495 -0.156 -0.855\nvn  -0.075 -0.446 -0.892\nvn  -0.077 0.401 -0.913\nvn  -0.348 -0.842 -0.413\nvn  -0.299 0.954 0.008\nvn  -0.086 0.405 -0.910\nvn  -0.766 -0.560 -0.315\nvn  -0.792 -0.486 -0.370\nvn  -0.180 -0.857 -0.482\nvn  0.885 -0.350 0.308\nvn  0.047 -0.871 0.489\nvn  0.572 -0.143 0.808\nvn  0.826 0.106 0.553\nvn  0.830 -0.349 0.435\nvn  0.789 -0.498 0.360\nvn  0.820 -0.428 0.379\nvn  0.193 -0.639 0.745\nvn  0.707 -0.504 0.495\nvn  0.226 -0.968 -0.113\nvn  -0.279 -0.862 -0.424\nvn  -0.013 -0.991 0.137\nvn  0.036 -0.985 -0.167\nvn  -0.130 -0.932 0.338\nvn  -0.162 -0.935 0.314\nvn  0.631 -0.713 0.306\nvn  0.430 -0.839 0.333\nvn  -0.146 0.982 0.120\nvn  0.947 0.268 0.179\nvn  0.988 0.145 0.053\nvn  0.558 0.807 0.194\nvn  0.943 0.323 0.076\nvn  0.913 -0.374 0.161\nvn  0.860 -0.317 0.400\nvn  0.764 -0.576 0.292\nvn  0.499 -0.864 0.063\nvn  0.565 -0.818 0.111\nvn  0.970 -0.190 0.149\nvn  -0.188 0.884 0.428\nvn  0.641 0.739 0.211\nvn  0.968 0.095 -0.233\nvn  -0.716 0.639 0.280\nvn  -0.429 0.755 0.495\nvn  -0.134 0.856 0.498\nvn  0.371 0.804 0.465\nvn  -0.925 0.283 -0.254\nvn  -0.342 0.820 0.459\nvn  0.389 0.835 0.389\nvn  -0.577 0.817 -0.010\nvn  0.207 0.953 0.222\nvn  -0.626 0.779 0.016\nvn  0.302 0.927 0.224\nvn  -0.586 0.729 0.354\nvn  0.269 0.804 0.530\nvn  -0.710 0.557 0.431\nvn  -0.838 0.361 0.410\nvn  0.643 0.454 0.616\nvn  -0.140 0.654 0.743\nvn  0.263 0.741 0.618\nvn  0.731 0.035 0.681\nvn  0.739 0.225 -0.635\nvn  0.957 0.021 0.288\nvn  0.926 0.264 0.270\nvn  0.978 -0.115 0.176\nvn  0.950 0.191 0.249\nvn  -0.961 -0.146 0.234\nvn  0.826 0.142 0.545\nvn  -0.226 0.528 0.818\nvn  -0.168 0.044 0.985\nvn  0.427 -0.230 -0.874\nvn  -0.005 -0.815 -0.579\nvn  -0.104 -0.928 -0.358\nvn  0.028 -0.783 -0.621\nvn  0.438 -0.758 -0.484\nvn  -0.942 0.064 0.329\nvn  -0.975 -0.181 0.127\nvn  -0.900 -0.342 -0.272\nvn  -0.765 -0.610 0.207\nvn  -0.290 0.917 -0.275\nvn  -0.611 0.783 0.111\nvn  -0.694 0.530 0.487\nvn  -0.581 0.813 -0.031\nvn  -0.502 0.852 0.150\nvn  -0.755 0.633 -0.170\nvn  -0.418 0.875 0.245\nvn  -0.222 0.905 -0.363\nvn  -0.323 0.642 0.696\nvn  -0.262 0.955 0.141\nvn  -0.075 0.930 0.359\nvn  -0.209 0.958 0.195\nvn  -0.654 0.751 -0.090\nvn  -0.672 0.701 -0.240\nvn  -0.354 0.929 0.110\nvn  -0.844 0.516 0.145\nvn  -0.279 0.942 0.187\nvn  -0.332 0.915 -0.228\nvn  -0.738 0.552 0.388\nvn  -0.678 0.423 0.601\nvn  -0.234 0.841 0.487\nvn  -0.755 0.605 0.250\nvn  -0.743 0.669 -0.016\nvn  -0.524 0.765 -0.374\nvn  -0.424 0.840 -0.339\nvn  -0.417 0.834 0.361\nvn  -0.575 0.809 0.123\nvn  -0.700 0.671 -0.245\nvn  -0.978 -0.153 -0.142\nvn  -0.979 -0.205 -0.017\nvn  -0.876 0.031 0.482\nvn  -0.982 0.170 -0.085\nvn  0.575 -0.772 -0.271\nvn  0.754 -0.582 -0.305\nvn  -0.368 -0.779 -0.508\nvn  -0.364 -0.856 -0.366\nvn  0.735 -0.678 0.008\nvn  -0.495 -0.842 -0.214\nvn  0.925 -0.375 0.059\nvn  -0.570 -0.759 -0.314\nvn  0.784 -0.620 -0.018\nvn  0.681 -0.723 0.113\nvn  -0.517 -0.842 -0.158\nvn  0.123 -0.920 0.372\nvn  0.887 0.255 -0.385\nvn  0.829 0.419 0.370\nvn  0.871 0.190 0.454\nvn  0.960 0.118 -0.255\nvn  0.702 0.411 0.582\nvn  0.877 0.298 -0.377\nvn  0.598 0.682 0.421\nvn  0.757 0.516 -0.400\nvn  0.590 0.781 -0.206\nvn  0.429 0.773 0.467\nvn  0.559 0.449 -0.697\nvn  0.186 -0.322 -0.928\nvn  0.045 -0.207 -0.977\nvn  0.094 -0.516 -0.851\nvn  0.724 0.690 0.017\nvn  0.372 0.420 0.828\nvn  0.618 0.186 -0.764\nvn  0.939 0.293 0.181\nvn  -0.026 -0.547 0.837\nvn  0.144 -0.743 -0.654\nvn  0.116 0.013 0.993\nvn  -0.061 0.116 0.991\nvn  -0.485 -0.857 -0.175\nvn  -0.469 -0.604 0.645\nvn  0.113 -0.993 -0.019\nvn  -0.023 -0.773 0.634\nvn  0.209 -0.793 -0.572\nvn  -0.015 -0.442 0.897\nvn  -0.612 -0.551 0.567\nvn  -0.665 -0.589 -0.459\nvn  0.059 -0.891 0.450\nvn  0.654 -0.755 0.051\nvn  0.893 0.120 0.435\nvn  0.046 -0.922 -0.385\nvn  0.645 -0.727 0.235\nvn  0.144 -0.981 -0.127\nvn  -0.280 0.675 0.683\nvn  -0.612 0.565 0.554\nvn  -0.804 0.488 0.341\nvn  0.091 0.685 0.723\nvn  -0.867 0.216 0.450\nvn  0.044 0.425 0.904\nvn  -0.824 -0.108 0.557\nvn  0.070 0.083 0.994\nvn  -0.843 -0.146 0.518\nvn  -0.061 0.020 0.998\nvn  -0.406 -0.266 0.875\nvn  -0.909 -0.384 0.164\nvn  0.443 -0.096 0.891\nvn  0.048 0.166 0.985\nvn  0.788 0.200 0.583\nvn  0.675 0.151 0.722\nvn  0.937 0.058 0.344\nvn  -0.303 -0.630 0.715\nvn  -0.762 -0.553 -0.337\nvn  0.766 -0.259 0.589\nvn  0.100 -0.980 0.172\nvn  -0.122 -0.060 -0.991\nvn  0.979 0.155 -0.132\nvn  -0.956 -0.145 -0.255\nvn  -0.889 -0.179 -0.421\nvn  -0.786 -0.317 -0.531\nvn  -0.899 -0.051 0.434\nvn  0.859 -0.066 -0.508\nvn  0.956 0.205 -0.211\nvn  0.008 0.026 -1.000\nvn  0.048 -0.202 -0.978\nvn  0.952 -0.091 -0.291\nvn  -0.015 -0.196 -0.981\nvn  -0.253 -0.479 -0.841\nvn  0.932 -0.288 -0.221\nvn  0.458 -0.888 0.035\nvn  0.592 -0.482 -0.647\nvn  -0.622 0.463 0.632\nvn  -0.822 0.392 0.414\nvn  -0.904 0.246 0.350\nvn  -0.054 0.455 0.889\nvn  -0.932 -0.041 0.360\nvn  -0.139 0.207 0.968\nvn  -0.717 -0.568 0.404\nvn  0.015 -0.354 0.935\nvn  -0.575 -0.750 0.326\nvn  0.247 -0.488 0.837\nvn  -0.070 -0.832 0.551\nvn  -0.609 -0.793 -0.006\nvn  0.561 -0.321 0.763\nvn  -0.193 0.040 0.980\nvn  0.677 0.078 0.732\nvn  0.788 0.202 0.581\nvn  0.863 0.257 0.434\nvn  0.007 -0.915 0.403\nvn  -0.535 -0.731 -0.424\nvn  0.795 -0.291 0.532\nvn  0.585 -0.308 -0.750\nvn  -0.907 -0.295 -0.300\nvn  -0.798 -0.283 -0.532\nvn  -0.729 -0.360 -0.582\nvn  -0.964 -0.264 -0.027\nvn  0.643 0.634 -0.430\nvn  0.681 0.698 -0.224\nvn  -0.142 0.495 -0.857\nvn  -0.188 0.288 -0.939\nvn  0.858 0.450 -0.247\nvn  -0.282 0.048 -0.958\nvn  -0.200 -0.266 -0.943\nvn  0.992 0.005 -0.123\nvn  0.339 -0.881 -0.329\nvn  0.412 -0.886 -0.213\nvn  -0.504 -0.544 -0.670\nvn  -0.418 -0.546 -0.726\nvn  -0.359 -0.847 -0.393\nvn  -0.925 0.134 -0.356\nvn  -0.810 0.330 0.485\nvn  -0.932 0.351 0.094\nvn  -0.917 0.325 0.233\nvn  -0.286 0.268 0.920\nvn  -0.934 -0.169 0.315\nvn  -0.223 -0.093 0.970\nvn  -0.876 -0.482 -0.007\nvn  -0.302 -0.508 0.807\nvn  -0.634 -0.757 -0.157\nvn  -0.085 -0.770 0.633\nvn  -0.078 -0.996 0.048\nvn  -0.399 -0.617 -0.678\nvn  0.402 -0.690 0.602\nvn  -0.091 -0.267 0.959\nvn  0.420 -0.047 0.906\nvn  0.494 -0.143 0.858\nvn  0.611 -0.030 0.791\nvn  0.231 -0.943 -0.239\nvn  -0.221 -0.377 -0.899\nvn  0.665 -0.409 0.625\nvn  0.840 0.271 -0.470\nvn  -0.791 -0.011 -0.612\nvn  -0.581 -0.062 -0.811\nvn  -0.372 0.073 -0.925\nvn  -0.819 -0.039 -0.573\nvn  0.504 0.662 0.554\nvn  0.767 0.543 0.343\nvn  0.149 0.782 -0.605\nvn  0.112 0.904 -0.413\nvn  0.693 0.564 0.450\nvn  -0.068 0.424 -0.903\nvn  0.224 -0.097 -0.970\nvn  0.883 -0.317 0.345\nvn  -0.141 -0.617 -0.774\nvn  -0.415 -0.828 -0.377\nvn  -0.420 -0.354 0.835\nvn  -0.266 0.155 0.951\nvn  0.210 0.575 0.790\nvn  0.502 0.103 0.859\nvn  0.362 0.532 0.765\nvn  -0.468 -0.654 -0.594\nvn  -0.438 -0.861 0.257\nvn  0.317 0.301 0.899\nvn  -0.011 0.362 0.932\nvn  -0.734 -0.461 -0.500\nvn  -0.363 -0.866 -0.345\nvn  -0.950 -0.156 -0.272\nvn  0.437 0.768 -0.468\nvn  -0.660 0.501 0.560\nvn  -0.992 -0.074 -0.103\nvn  -0.996 -0.083 0.024\nvn  -0.983 -0.010 -0.184\nvn  -0.956 0.119 -0.270\nvn  -0.762 0.404 0.506\nvn  -0.953 -0.185 -0.239\nvn  -0.794 0.524 0.307\nvn  -0.895 -0.233 -0.381\nvn  -0.348 -0.450 -0.823\nvn  -0.212 -0.264 -0.941\nvn  0.018 -0.306 -0.952\nvn  0.117 -0.065 -0.991\nvn  0.924 -0.014 -0.383\nvn  0.916 0.065 -0.397\nvn  0.491 0.704 -0.513\nvn  0.794 0.405 -0.453\nvn  -0.045 0.991 0.126\nvn  0.493 0.828 0.268\nvn  0.420 0.896 0.142\nvn  0.893 0.414 0.179\nvn  0.781 0.497 0.378\nvn  0.587 -0.233 -0.775\nvn  -0.203 0.860 0.468\nvn  0.190 0.722 0.665\nvn  -0.086 0.719 0.690\nvn  -0.390 0.532 -0.752\nvn  -0.519 -0.418 -0.745\nvn  -0.257 -0.964 -0.073\nvn  -0.689 -0.568 -0.451\nvn  -0.695 -0.688 -0.210\nvn  -0.497 -0.339 0.799\nvn  -0.696 -0.701 0.155\nvn  -0.676 -0.188 0.712\nvn  -0.439 -0.195 0.877\nvn  -0.581 -0.375 0.723\nvn  -0.760 -0.649 -0.025\nvn  -0.719 -0.544 -0.433\nvn  -0.729 0.042 0.684\nvn  -0.531 -0.641 0.554\nvn  -0.588 -0.069 0.806\nvn  -0.864 -0.067 0.499\nvn  -0.798 -0.460 0.389\nvn  -0.524 -0.290 0.801\nvn  -0.811 -0.535 0.236\nvn  -0.521 -0.606 0.601\nvn  -0.627 -0.631 0.458\nvn  -0.683 -0.703 0.200\nvn  -0.439 -0.787 0.433\nvn  -0.375 -0.817 0.438\nvn  -0.298 -0.397 0.868\nvn  -0.377 -0.065 0.924\nvn  -0.533 -0.169 0.829\nvn  -0.794 -0.381 0.473\nvn  -0.148 0.250 0.957\nvn  -0.138 0.216 0.967\nvn  -0.619 -0.288 0.730\nvn  -0.007 -0.217 0.976\nvn  -0.153 -0.371 0.916\nvn  -0.319 0.137 0.938\nvn  -0.173 -0.112 0.979\nvn  -0.051 -0.075 0.996\nvn  -0.300 -0.084 0.950\nvn  -0.447 -0.392 0.804\nvn  -0.048 -0.087 0.995\nvn  -0.338 -0.813 0.475\nvn  -0.023 -0.362 0.932\nvn  -0.610 -0.662 0.436\nvn  -0.014 0.346 0.938\nvn  -0.422 -0.114 0.899\nvn  -0.609 -0.439 0.660\nvn  -0.179 0.377 0.908\nvn  -0.554 -0.205 0.807\nvn  -0.054 0.377 0.925\nvn  -0.904 0.033 -0.426\nvn  -0.899 0.432 -0.071\nvn  -0.524 -0.007 0.852\nvn  -0.176 -0.181 0.968\nvn  -0.188 0.036 0.982\nvn  0.075 -0.594 0.801\nvn  -0.218 -0.188 0.958\nvn  -0.068 -0.524 0.849\nvn  -0.331 -0.304 0.893\nvn  -0.073 -0.388 0.919\nvn  -0.131 -0.286 0.949\nvn  -0.468 -0.176 0.866\nvn  0.102 -0.104 0.989\nvn  0.449 -0.241 0.860\nvn  -0.092 0.074 0.993\nvn  0.093 -0.660 0.745\nvn  -0.114 -0.011 0.993\nvn  -0.805 0.575 0.148\nvn  -0.842 0.455 0.289\nvn  -0.381 -0.103 -0.919\nvn  -0.934 0.167 0.317\nvn  -0.107 -0.902 -0.417\nvn  -0.778 -0.212 0.592\nvn  0.063 -0.994 0.088\nvn  -0.590 -0.212 0.779\nvn  0.025 -0.104 0.994\nvn  -0.114 -0.969 0.217\nvn  -0.407 -0.064 0.911\nvn  -0.272 -0.114 0.955\nvn  -0.540 -0.178 0.823\nvn  0.012 0.452 0.892\nvn  -0.746 0.276 0.606\nvn  0.654 0.683 0.324\nvn  0.212 0.928 0.305\nvn  0.165 -0.687 -0.707\nvn  -0.767 -0.463 0.444\nvn  -0.823 -0.291 0.488\nvn  0.486 -0.781 -0.392\nvn  -0.734 -0.389 0.557\nvn  -0.482 -0.809 -0.337\nvn  -0.199 0.798 0.569\nvn  -0.419 0.850 0.319\nvn  -0.631 0.773 -0.067\nvn  -0.453 0.379 -0.807\nvn  0.278 0.862 -0.423\nvn  0.055 0.995 -0.078\nvn  0.457 0.238 -0.857\nvn  0.206 0.606 -0.768\nvn  0.602 -0.712 -0.363\nvn  -0.811 -0.274 0.517\nvn  -0.692 0.203 0.692\nvn  0.486 0.844 -0.226\nvn  0.191 0.904 0.383\nvn  0.007 0.698 0.716\nvn  -0.374 0.316 0.872\nvn  -0.996 0.091 0.019\nvn  -0.292 0.956 -0.021\nvn  -0.313 0.883 0.351\nvn  0.003 0.659 0.752\nvn  -0.279 0.382 0.881\nvn  -0.398 0.325 0.858\nvn  0.214 0.751 0.625\nvn  -0.564 0.750 0.344\nvn  -0.660 0.456 0.596\nvn  -0.843 -0.281 -0.459\nvn  -0.909 -0.092 -0.407\nvn  -0.789 -0.068 0.611\nvn  -0.852 0.114 0.512\nvn  -0.518 -0.545 0.660\nvn  -0.369 -0.335 0.867\nvn  0.462 -0.585 -0.667\nvn  0.734 -0.677 0.056\nvn  -0.049 -0.573 -0.818\nvn  0.816 -0.403 -0.414\nvn  0.390 -0.494 -0.777\nvn  0.777 -0.413 -0.476\nvn  0.725 -0.245 -0.643\nvn  0.208 -0.969 0.130\nvn  0.672 -0.229 -0.704\nvn  0.058 0.853 0.519\nvn  0.916 -0.274 0.293\nvn  0.445 -0.063 0.893\nvn  0.223 -0.971 0.082\nvn  -0.263 -0.619 -0.740\nvn  -0.693 -0.714 -0.104\nvn  -0.847 -0.529 0.039\nvn  -0.100 -0.897 -0.431\nvn  -0.829 -0.550 0.104\nvn  -0.805 -0.549 0.226\nvn  -0.271 -0.851 0.449\nvn  -0.114 -0.814 0.569\nvn  -0.604 -0.735 0.308\nvn  -0.111 -0.989 -0.101\nvn  -0.639 -0.293 -0.711\nvn  -0.215 -0.838 -0.502\nvn  -0.498 -0.864 0.072\nvn  -0.783 -0.405 -0.471\nvn  -0.231 -0.861 0.453\nvn  -0.472 -0.871 0.134\nvn  -0.221 -0.961 -0.166\nvn  -0.655 -0.288 -0.698\nvn  -0.047 -0.428 -0.902\nvn  -0.541 -0.441 -0.716\nvn  -0.621 -0.609 -0.494\nvn  0.577 0.806 0.132\nvn  0.588 0.804 0.092\nvn  0.588 -0.246 0.771\nvn  0.743 -0.174 0.646\nvn  0.903 -0.254 0.347\nvn  0.256 -0.796 0.549\nvn  0.346 0.168 0.923\nvn  0.468 -0.041 0.883\nvn  0.570 0.233 0.788\nvn  0.431 0.129 0.893\nvn  0.121 -0.979 0.164\nvn  0.699 -0.710 0.092\nvn  0.085 -0.982 0.169\nvn  0.083 -0.987 0.138\nvn  0.055 -0.984 -0.169\nvn  0.438 0.296 0.849\nvn  0.779 0.186 0.599\nvn  0.912 0.409 0.023\nvn  0.329 0.590 0.738\nvn  0.433 0.340 0.835\nvn  0.914 0.405 0.031\nvn  0.977 0.213 0.009\nvn  0.870 -0.105 -0.482\nvn  0.965 -0.031 0.260\nvn  0.915 0.343 0.212\nvn  0.978 -0.142 -0.154\nvn  0.840 0.488 0.236\nvn  0.593 0.442 0.673\nvn  0.795 -0.235 0.559\nvn  0.602 0.525 0.601\nvn  0.676 0.328 0.659\nvn  0.779 -0.407 0.478\nvn  0.653 -0.265 0.709\nvn  0.707 -0.205 0.677\nvn  0.870 -0.491 0.050\nvn  0.690 0.722 -0.052\nvn  0.770 -0.098 0.630\nvn  0.866 0.469 0.171\nvn  0.994 -0.098 0.043\nvn  0.876 -0.451 0.168\nvn  0.919 -0.380 -0.110\nvn  0.944 0.310 -0.112\nvn  0.827 -0.092 0.554\nvn  0.872 -0.489 -0.013\nvn  0.973 0.201 0.111\nvn  0.934 0.103 0.342\nvn  0.962 0.269 0.049\nvn  0.960 -0.212 -0.185\nvn  0.996 0.089 -0.019\nvn  0.970 -0.212 0.117\nvn  0.917 -0.333 0.219\nvn  0.789 -0.347 0.507\nvn  0.968 0.147 0.202\nvn  0.987 0.035 0.154\nvn  0.949 0.179 0.260\nvn  -0.466 0.559 0.685\nvn  -0.708 0.420 0.569\nvn  -0.876 0.301 -0.377\nvn  -0.864 -0.276 -0.421\nvn  -0.669 -0.732 0.126\nvn  0.416 -0.566 0.712\nvn  0.969 0.124 0.212\nvn  0.775 0.607 -0.177\nvn  0.705 -0.345 0.619\nvn  0.916 -0.400 0.036\nvn  0.856 -0.107 -0.506\nvn  0.993 0.066 -0.102\nvn  0.479 0.656 -0.583\nvn  0.413 -0.041 0.910\nvn  0.048 -0.245 0.968\nvn  0.405 0.076 0.911\nvn  0.148 -0.245 0.958\nvn  0.292 0.082 0.953\nvn  0.736 0.218 0.641\nvn  0.697 0.428 0.575\nvn  0.888 0.333 0.317\nvn  0.582 0.159 0.798\nvn  0.593 0.315 0.741\nvn  0.689 0.375 0.620\nvn  0.305 -0.046 0.951\nvn  -0.172 0.914 0.367\nvn  0.026 -0.071 0.997\nvn  0.122 -0.325 0.938\nvn  0.051 -0.132 0.990\nvn  -0.393 -0.478 0.785\nvn  -0.386 -0.514 0.766\nvn  -0.234 0.062 0.970\nvn  -0.274 -0.489 0.828\nvn  0.342 0.588 0.733\nvn  0.298 0.049 0.953\nvn  -0.010 -0.292 0.956\nvn  0.948 -0.137 0.287\nvn  -0.044 -0.666 0.744\nvn  0.459 0.498 0.736\nvn  0.833 0.478 0.277\nvn  0.858 -0.467 0.215\nvn  0.831 -0.492 0.260\nvn  0.504 0.726 0.468\nvn  0.528 0.180 0.830\nvn  0.944 0.327 0.050\nvn  0.827 0.340 0.447\nvn  0.981 0.179 0.071\nvn  0.855 0.508 0.101\nvn  0.844 0.247 0.476\nvn  0.538 0.571 -0.619\nvn  -0.609 -0.338 0.718\nvn  0.125 0.473 0.872\nvn  0.892 0.182 0.414\nvn  -0.232 -0.900 0.369\nvn  0.700 -0.698 0.152\nvn  0.445 -0.079 0.892\nvn  0.061 -0.984 0.168\nvn  -0.233 -0.726 0.647\nvn  0.533 -0.626 0.569\nvn  0.546 -0.221 0.808\nvn  0.162 -0.960 0.228\nvn  0.477 -0.878 0.045\nvn  0.111 -0.974 0.197\nvn  0.987 0.127 -0.098\nvn  0.706 0.411 0.576\nvn  0.903 -0.377 0.204\nvn  -0.488 -0.488 0.724\nvn  0.101 -0.247 0.964\nvn  -0.125 -0.953 0.275\nvn  -0.255 -0.912 0.321\nvn  -0.698 -0.105 0.708\nvn  -0.626 -0.702 0.339\nvn  0.700 -0.662 -0.269\nvn  0.182 0.169 -0.969\nvn  0.696 -0.284 -0.660\nvn  0.796 0.605 -0.005\nvn  0.966 -0.233 -0.114\nvn  0.955 -0.278 -0.100\nvn  0.747 -0.664 -0.030\nvn  0.904 0.215 0.370\nvn  -0.211 -0.271 0.939\nvn  -0.445 0.386 0.808\nvn  -0.351 -0.500 0.792\nvn  -0.633 -0.011 0.774\nvn  -0.949 0.132 0.285\nvn  -0.474 -0.177 0.862\nvn  -0.537 -0.128 0.834\nvn  -0.443 -0.053 -0.895\nvn  0.137 0.388 -0.911\nvn  0.899 0.438 0.017\nvn  0.826 0.267 -0.497\nvn  0.189 -0.679 -0.709\nvn  0.729 -0.212 -0.651\nvn  -0.337 0.429 0.838\nvn  -0.564 -0.582 0.587\nvn  0.107 -0.317 0.942\nvn  -0.180 -0.649 0.739\nvn  -0.079 -0.358 0.930\nvn  -0.317 -0.550 0.773\nvn  0.800 0.460 -0.385\nvn  0.971 0.211 0.114\nvn  0.963 0.192 -0.189\nvn  -0.369 -0.086 -0.925\nvn  -0.687 0.327 -0.650\nvn  -0.842 -0.453 -0.292\nvn  -0.818 -0.538 -0.203\nvn  -0.817 -0.551 0.169\nvn  -0.777 -0.567 0.273\nvn  -0.623 -0.600 0.501\nvn  -0.760 -0.590 0.273\nvn  -0.907 -0.422 0.006\nvn  0.287 0.840 -0.460\nvn  -0.722 0.671 -0.167\nvn  -0.930 0.360 0.077\nvn  0.198 0.786 -0.585\nvn  -0.612 0.743 -0.271\nvn  0.050 0.963 -0.266\nvn  -0.630 0.777 0.014\nvn  -0.403 0.869 -0.287\nvn  0.486 0.560 -0.671\nvn  0.808 0.308 -0.503\nvn  0.840 0.398 -0.368\nvn  0.806 0.537 -0.250\nvn  0.931 -0.070 -0.359\nvn  0.785 0.305 -0.539\nvn  0.983 -0.064 -0.174\nvn  0.920 -0.379 -0.098\nvn  0.421 -0.901 0.106\nvn  -0.194 -0.929 0.315\nvn  -0.633 -0.727 0.267\nvn  -0.486 -0.828 0.279\nvn  -0.906 -0.342 0.248\nvn  -0.981 0.184 -0.063\nvn  -0.084 0.671 -0.737\nvn  -0.726 -0.375 -0.577\nvn  -0.984 -0.082 -0.158\nvn  -0.979 0.178 0.098\nvn  -0.850 -0.476 0.226\nvn  0.884 -0.431 -0.182\nvn  0.400 -0.916 -0.009\nvn  -0.768 -0.630 0.119\nvn  0.931 -0.361 -0.061\nvn  -0.174 -0.960 0.218\nvn  -0.491 -0.715 0.498\nvn  -0.269 -0.945 0.186\nvn  -0.966 -0.257 -0.034\nvn  -0.646 -0.453 -0.614\nvn  -0.910 0.386 -0.148\nvn  0.273 -0.085 -0.958\nvn  0.615 0.150 -0.774\nvn  -0.169 -0.327 -0.930\nvn  0.454 -0.524 0.721\nvn  0.988 0.132 0.081\nvn  0.895 0.354 -0.270\nvn  0.167 0.390 -0.906\nvn  0.680 0.559 -0.474\nvn  -0.738 0.184 -0.649\nvn  0.244 0.826 -0.509\nvn  -0.310 0.242 -0.919\nvn  -0.390 0.788 -0.477\nvn  -0.408 0.037 0.912\nvn  -0.923 -0.304 0.236\nvn  -0.694 -0.047 0.718\nvn  -0.939 -0.335 0.074\nvn  -0.508 -0.692 -0.513\nvn  -0.617 -0.709 -0.340\nvn  -0.287 -0.659 -0.696\nvn  -0.487 -0.761 -0.428\nvn  -0.733 -0.679 -0.034\nvn  -0.699 -0.454 0.552\nvn  -0.400 0.038 0.916\nvn  -0.630 -0.156 0.761\nvn  -0.381 0.058 0.923\nvn  -0.794 -0.595 0.126\nvn  -0.757 -0.587 -0.288\nvn  -0.459 -0.877 0.144\nvn  -0.346 -0.499 0.795\nvn  -0.854 -0.516 -0.063\nvn  -0.537 -0.739 0.406\nvn  -0.513 -0.287 0.809\nvn  -0.980 -0.136 0.147\nvn  -0.565 -0.728 -0.388\nvn  -0.608 -0.787 -0.107\nvn  0.148 -0.309 -0.939\nvn  0.682 0.098 -0.724\nvn  0.638 0.177 -0.749\nvn  0.908 0.411 -0.080\nvn  0.853 0.477 -0.214\nvn  0.591 0.779 0.209\nvn  0.715 0.442 0.541\nvn  0.543 0.647 0.535\nvn  0.652 0.553 -0.519\nvn  -0.038 -0.069 -0.997\nvn  -0.001 -0.321 -0.947\nvn  -0.013 0.428 0.904\nvn  -0.272 0.154 0.950\nvn  0.064 0.745 0.665\nvn  0.521 0.853 0.028\nvn  -0.299 0.859 0.415\nvn  0.380 0.889 -0.257\nvn  -0.502 0.842 0.197\nvn  0.564 0.817 -0.119\nvn  -0.478 0.762 0.436\nvn  0.792 0.494 0.359\nvn  -0.271 0.412 0.870\nvn  0.756 0.580 0.302\nvn  0.946 0.324 0.005\nvn  -0.399 0.421 0.815\nvn  0.787 -0.467 -0.402\nvn  -0.681 -0.437 0.588\nvn  -0.112 -0.977 -0.179\nvn  0.416 0.712 0.565\nvn  -0.385 0.428 0.818\nvn  0.568 0.303 0.765\nvn  0.556 -0.332 0.762\nvn  -0.456 -0.095 0.885\nvn  -0.870 -0.010 0.494\nvn  -0.095 0.609 0.788\nvn  -0.117 0.770 0.627\nvn  0.951 0.285 -0.119\nvn  0.873 0.269 -0.407\nvn  -0.848 0.073 0.525\nvn  -0.912 -0.301 0.280\nvn  -0.624 -0.610 0.488\nvn  0.896 -0.054 -0.440\nvn  -0.002 -0.866 -0.500\nvn  -0.092 -0.940 -0.330\nvn  -0.072 -0.983 -0.169\nvn  0.268 -0.957 0.108\nvn  0.989 -0.123 -0.086\nvn  0.765 -0.536 -0.358\nvn  -0.696 -0.268 0.666\nvn  -0.530 -0.646 -0.550\nvn  0.770 -0.413 -0.486\nvn  -0.726 0.687 -0.030\nvn  -0.323 0.940 -0.109\nvn  0.412 0.830 -0.377\nvn  -0.891 0.391 0.232\nvn  -0.959 -0.215 0.183\nvn  0.684 0.139 -0.716\nvn  0.317 0.788 -0.527\nvn  0.685 0.676 0.273\nvn  -0.698 -0.522 0.491\nvn  0.940 -0.300 -0.162\nvn  0.829 -0.265 -0.492\nvn  0.140 -0.983 -0.117\nvn  -0.715 -0.558 0.420\nvn  0.109 -0.795 0.596\nvn  0.817 -0.577 0.015\nvn  0.262 -0.937 0.231\nvn  0.106 0.711 -0.695\nvn  -0.052 0.858 0.510\nvn  0.239 0.689 -0.684\nvn  -0.046 0.905 0.422\nvn  0.611 0.538 -0.581\nvn  0.367 0.735 0.570\nvn  0.586 0.503 -0.635\nvn  0.412 0.725 0.552\nvn  0.750 0.657 -0.070\nvn  0.319 0.607 0.728\nvn  0.972 0.219 0.087\nvn  0.037 -0.106 0.994\nvn  0.714 0.224 -0.663\nvn  0.233 -0.743 -0.628\nvn  0.409 -0.841 0.355\nvn  0.321 -0.303 -0.897\nvn  0.109 -0.270 -0.957\nvn  0.321 -0.356 -0.878\nvn  -0.207 -0.114 0.972\nvn  -0.169 0.266 0.949\nvn  -0.026 0.243 0.970\nvn  -0.397 -0.183 0.899\nvn  -0.471 -0.880 -0.055\nvn  -0.463 -0.858 -0.222\nvn  -0.325 -0.919 0.223\nvn  -0.058 -0.994 0.088\nvn  -0.092 0.002 0.996\nvn  0.157 -0.627 -0.763\nvn  -0.529 -0.797 0.290\nvn  0.140 -0.988 -0.070\nvn  -0.192 -0.377 0.906\nvn  0.518 -0.277 0.809\nvn  0.346 0.214 -0.913\nvn  0.231 -0.299 -0.926\nvn  0.310 -0.509 -0.803\nvn  -0.766 -0.495 -0.411\nvn  -0.585 -0.689 -0.428\nvn  -0.005 -0.993 -0.114\nvn  -0.670 -0.731 -0.133\nvn  -0.328 -0.769 -0.548\nvn  -0.319 -0.771 -0.551\nvn  0.180 -0.571 -0.801\nvn  0.378 -0.923 -0.065\nvn  -0.796 -0.558 -0.236\nvn  -0.636 0.485 0.600\nvn  -0.956 -0.051 0.288\nvn  -0.925 0.273 0.264\nvn  -0.972 0.039 0.230\nvn  -0.413 0.876 0.250\nvn  -0.754 -0.442 -0.487\nvn  0.563 0.751 0.345\nvn  0.458 0.870 0.183\nvn  -0.648 0.750 0.133\nvn  -0.705 0.589 0.396\nvn  0.533 0.774 0.341\nvn  -0.662 0.547 0.513\nvn  0.617 0.605 0.503\nvn  -0.142 0.575 0.805\nvn  0.757 0.384 0.529\nvn  -0.011 0.114 0.993\nvn  0.925 -0.288 0.248\nvn  0.099 -0.929 0.357\nvn  -0.852 0.152 0.502\nvn  -0.753 -0.653 0.083\nvn  -0.982 -0.118 0.148\nvn  -0.944 -0.255 -0.211\nvn  0.895 -0.444 0.048\nvn  0.938 -0.241 -0.250\nvn  0.959 0.257 0.118\nvn  0.941 -0.330 -0.080\nvn  0.006 -0.787 -0.617\nvn  -0.862 -0.505 0.044\nvn  -0.059 -0.697 -0.715\nvn  0.205 -0.964 -0.168\nvn  0.029 -0.999 0.046\nvn  0.933 -0.187 0.307\nvn  -0.771 -0.510 0.381\nvn  0.395 -0.725 -0.565\nvn  -0.070 -0.986 -0.150\nvn  0.393 -0.253 0.884\nvn  -0.721 -0.559 0.410\nvn  -0.026 -0.960 0.280\nvn  0.257 -0.844 0.470\nvn  -0.742 0.471 0.477\nvn  0.402 0.685 0.608\nvn  0.407 0.415 0.814\nvn  0.736 0.551 0.393\nvn  0.620 0.767 0.164\nvn  0.467 -0.213 -0.858\nvn  0.860 -0.422 -0.286\nvn  0.807 -0.531 -0.259\nvn  0.552 -0.343 -0.760\nvn  0.087 -0.188 -0.978\nvn  -0.504 0.019 -0.864\nvn  -0.899 0.184 -0.398\nvn  -0.902 0.335 0.274\nvn  0.677 -0.120 -0.726\nvn  -0.042 0.264 -0.964\nvn  -0.458 0.526 -0.717\nvn  -0.653 0.682 -0.330\nvn  -0.561 0.813 0.157\nvn  0.750 -0.276 -0.601\nvn  0.439 -0.264 -0.859\nvn  0.717 -0.321 -0.619\nvn  -0.157 -0.570 -0.806\nvn  -0.102 0.462 -0.881\nvn  0.786 -0.358 -0.504\nvn  0.751 -0.081 -0.655\nvn  0.383 0.336 -0.861\nvn  0.890 0.065 -0.451\nvn  0.890 -0.353 -0.290\nvn  0.807 -0.022 -0.590\nvn  -0.116 0.674 -0.729\nvn  0.721 0.127 -0.681\nvn  0.541 -0.092 -0.836\nvn  0.319 0.748 -0.582\nvn  -0.324 -0.780 -0.536\nvn  -0.286 0.012 -0.958\nvn  0.374 -0.068 -0.925\nvn  -0.200 0.006 -0.980\nvn  -0.339 0.919 -0.201\nvn  -0.891 0.321 -0.320\nvn  0.314 0.090 -0.945\nvn  0.630 -0.161 -0.760\nvn  -0.079 0.497 -0.864\nvn  0.536 0.300 -0.789\nvn  0.905 0.134 -0.405\nvn  -0.101 -0.380 -0.920\nvn  0.461 -0.518 -0.720\nvn  0.191 -0.114 -0.975\nvn  0.651 0.412 -0.638\nvn  0.415 0.422 -0.806\nvn  0.746 0.547 -0.380\nvn  -0.077 0.837 -0.541\nvn  -0.732 0.580 -0.359\nvn  -0.696 -0.462 -0.549\nvn  -0.333 0.327 -0.884\nvn  -0.535 0.309 -0.787\nvn  0.573 -0.178 -0.800\nvn  0.608 0.411 -0.679\nvn  0.590 0.030 -0.807\nvn  -0.176 0.887 -0.427\nvn  0.825 0.255 -0.505\nvn  -0.533 0.689 -0.492\nvn  -0.561 0.084 -0.823\nvn  0.292 0.016 -0.956\nvn  -0.605 0.346 -0.717\nvn  0.367 0.130 -0.921\nvn  0.094 0.467 -0.879\nvn  -0.531 0.731 -0.429\nvn  0.642 0.040 -0.765\nvn  0.442 0.194 -0.875\nvn  0.602 0.536 -0.593\nvn  0.474 0.218 -0.853\nvn  -0.633 0.479 -0.608\nvn  0.241 0.126 -0.962\nvn  -0.486 0.596 -0.639\nvn  -0.950 0.195 -0.245\nvn  0.992 -0.072 -0.104\nvn  0.677 0.736 -0.020\nvn  0.961 0.143 -0.237\nvn  0.119 0.376 -0.919\nvn  0.829 0.548 -0.110\nvn  0.816 0.064 -0.575\nvn  0.246 0.228 -0.942\nvn  0.462 0.846 -0.268\nvn  0.887 0.019 -0.462\nvn  0.866 0.383 -0.322\nvn  0.458 -0.515 -0.725\nvn  0.684 0.213 -0.698\nvn  0.484 0.021 -0.875\nvn  0.556 0.369 -0.745\nvn  -0.236 0.834 -0.499\nvn  0.450 0.753 -0.479\nvn  -0.349 0.819 -0.455\nvn  -0.293 0.956 -0.014\nvn  0.241 0.647 -0.723\nvn  0.447 0.893 -0.051\nvn  -0.345 0.442 -0.828\nvn  -0.447 0.894 0.020\nvn  0.044 0.980 0.196\nvn  0.043 0.987 0.154\nvn  0.400 0.915 0.056\nvn  0.794 0.531 0.296\nvn  0.856 0.238 0.458\nvn  0.835 0.451 0.317\nvn  0.467 0.705 0.534\nvn  0.958 0.271 0.088\nvn  0.995 -0.004 0.099\nvn  0.905 -0.401 -0.140\nvn  0.635 0.641 -0.431\nvn  0.887 -0.074 -0.457\nvn  0.800 -0.469 -0.374\nvn  0.166 -0.549 -0.819\nvn  0.483 -0.407 -0.775\nvn  0.878 -0.219 -0.426\nvn  0.706 -0.453 -0.544\nvn  -0.067 -0.633 -0.772\nvn  0.305 -0.406 -0.862\nvn  -0.309 0.541 -0.782\nvn  -0.151 -0.420 -0.895\nvn  -0.298 -0.737 -0.607\nvn  0.297 -0.259 -0.919\nvn  -0.699 -0.466 -0.543\nvn  0.431 -0.420 -0.799\nvn  -0.614 0.162 -0.772\nvn  0.113 0.993 -0.025\nvn  -0.090 0.966 0.241\nvn  -0.412 0.906 0.096\nvn  -0.091 0.802 -0.590\nvn  -0.259 -0.776 -0.576\nvn  -0.438 -0.339 -0.833\nvn  0.096 -0.522 -0.847\nvn  0.217 -0.274 -0.937\nvn  -0.712 -0.242 -0.659\nvn  -0.726 -0.485 -0.487\nvn  -0.497 0.132 -0.857\nvn  -0.543 -0.538 -0.645\nvn  0.601 0.583 -0.546\nvn  -0.558 -0.059 -0.828\nvn  0.215 -0.267 -0.939\nvn  -0.283 -0.716 -0.638\nvn  0.543 -0.603 -0.585\nvn  0.914 -0.143 -0.379\nvn  0.091 -0.820 -0.565\nvn  -0.940 -0.142 -0.311\nvn  0.992 -0.075 -0.097\nvn  -0.422 0.195 -0.885\nvn  -0.994 -0.065 0.083\nvn  0.749 0.271 -0.604\nvn  0.258 -0.852 -0.456\nvn  -0.973 -0.185 -0.137\nvn  0.980 0.047 -0.192\nvn  -0.054 -0.867 -0.496\nvn  0.902 0.430 -0.026\nvn  -0.634 0.761 0.139\nvn  0.457 0.840 0.294\nvn  -0.241 0.967 -0.081\nvn  -0.511 0.845 0.161\nvn  0.460 0.886 0.059\nvn  -0.614 0.759 0.217\nvn  -0.977 0.002 -0.214\nvn  0.311 0.900 0.307\nvn  -0.026 -0.067 -0.997\nvn  -0.572 -0.451 -0.685\nvn  -0.876 0.262 -0.404\nvn  -0.548 0.212 -0.809\nvn  0.550 -0.536 -0.640\nvn  -0.244 -0.674 -0.697\nvn  -0.788 -0.252 -0.562\nvn  0.246 0.298 -0.922\nvn  0.991 0.134 0.028\nvn  -0.000 -0.690 -0.724\nvn  -0.815 -0.192 -0.547\nvn  0.993 0.026 0.117\nvn  -0.821 0.568 0.059\nvn  -0.697 0.641 -0.321\nvn  0.463 0.762 0.452\nvn  -0.293 0.810 0.509\nvn  0.040 0.963 -0.267\nvn  -0.060 0.861 -0.504\nvn  -0.627 0.764 -0.152\nvn  -0.895 0.375 -0.242\nvn  -0.259 0.926 0.274\nvn  0.025 0.955 -0.297\nvn  -0.819 0.276 -0.503\nvn  0.050 0.823 0.565\nvn  -0.282 0.783 -0.554\nvn  0.256 0.866 0.431\nvn  0.384 0.913 0.137\nvn  -0.077 0.865 -0.496\nvn  0.810 0.556 0.184\nvn  -0.105 0.921 -0.376\nvn  -0.404 0.849 -0.341\nvn  0.241 0.782 -0.574\nvn  0.815 -0.465 -0.346\nvn  0.511 0.630 0.585\nvn  0.134 -0.636 -0.760\nvn  -0.776 -0.238 -0.583\nvn  1.000 0.012 -0.021\nvn  -0.865 0.490 0.109\nvn  0.787 -0.416 -0.456\nvn  0.707 0.558 0.435\nvn  -0.448 -0.533 -0.718\nvn  -0.292 0.929 0.227\nvn  0.874 -0.417 -0.248\nvn  0.752 0.605 0.261\nvn  -0.195 0.823 0.534\nvn  -0.912 0.377 -0.160\nvn  0.300 -0.789 -0.535\nvn  0.967 0.248 -0.061\nvn  -0.270 0.925 -0.268\nvn  -0.801 -0.080 -0.593\nvn  0.202 0.161 -0.966\nvn  -0.307 0.273 -0.912\nvn  -0.114 -0.164 -0.980\nvn  0.313 -0.473 -0.824\nvn  0.546 0.482 -0.686\nvn  0.143 -0.305 -0.942\nvn  0.421 0.511 -0.750\nvn  0.590 0.776 0.224\nvn  -0.333 0.926 0.176\nvn  0.352 0.935 -0.048\nvn  -0.211 0.654 -0.727\nvn  -0.354 0.822 -0.445\nvn  -0.213 0.835 -0.508\nvn  0.132 0.546 -0.827\nvn  -0.259 0.880 -0.399\nvn  -0.074 0.707 -0.703\nvn  0.417 0.892 -0.176\nvn  0.087 0.772 -0.629\nvn  0.027 0.933 -0.359\nvn  0.495 0.839 -0.228\nvn  0.430 0.770 -0.472\nvn  -0.205 0.802 -0.561\nvn  -0.704 0.262 -0.660\nvn  -0.260 -0.116 -0.959\nvn  0.785 0.297 -0.544\nvn  -0.026 0.384 -0.923\nvn  -0.624 -0.481 -0.616\nvn  -0.451 -0.607 -0.654\nvn  -0.817 -0.160 -0.555\nvn  0.208 0.878 -0.431\nvn  0.584 0.810 0.048\nvn  0.559 0.622 -0.548\nvn  -0.086 0.886 -0.456\nvn  0.818 0.449 -0.359\nvn  0.329 0.471 -0.818\nvn  -0.217 0.651 -0.727\nvn  0.164 0.975 -0.152\nvn  -0.370 0.879 -0.302\nvn  -0.158 0.480 -0.863\nvn  0.939 0.206 -0.275\nvn  0.821 0.475 -0.317\nvn  0.064 0.560 -0.826\nvn  0.644 0.675 -0.358\nvn  -0.071 0.884 -0.461\nvn  0.407 0.872 -0.271\nvn  0.761 0.607 -0.229\nvn  0.088 0.789 -0.608\nvn  0.784 0.614 0.096\nvn  0.694 0.691 -0.202\nvn  -0.151 0.685 -0.713\nvn  0.837 0.508 -0.204\nvn  0.785 0.491 0.378\nvn  0.232 0.893 0.385\nvn  0.758 0.651 0.038\nvn  0.586 0.794 0.163\nvn  0.478 0.862 -0.169\nvn  0.575 0.406 -0.710\nvn  0.502 0.858 -0.107\nvn  0.347 -0.372 -0.861\nvn  0.846 0.333 -0.417\nvn  0.897 0.192 -0.397\nvn  0.976 0.213 -0.044\nvn  0.557 0.657 0.509\nvn  0.936 0.254 -0.244\nvn  0.839 0.542 0.038\nvn  0.741 0.562 0.368\nvn  0.066 0.864 0.499\nvn  0.236 0.860 0.453\nvn  0.477 0.879 -0.018\nvn  0.906 0.298 0.300\nvn  0.933 0.205 0.295\nvn  0.767 0.559 0.313\nvn  0.507 0.798 0.326\nvn  0.432 0.900 -0.054\nvn  0.614 0.785 -0.084\nvn  -0.355 0.926 -0.127\nvn  0.380 0.840 -0.387\nvn  0.352 0.333 -0.875\nvn  -0.144 0.908 -0.393\nvn  -0.870 0.417 -0.263\nvn  -0.224 0.639 -0.736\nvn  0.570 0.816 -0.097\nvn  0.338 0.941 0.032\nvn  -0.152 0.863 -0.481\nvn  -0.004 0.988 0.155\nvn  -0.242 0.672 -0.700\nvn  -0.053 0.897 -0.439\nvn  0.463 0.781 -0.419\nvn  0.155 0.767 -0.622\nvn  0.034 0.975 0.221\nvn  0.644 0.206 -0.737\nvn  0.313 0.140 -0.939\nvn  0.287 0.261 -0.922\nvn  0.676 0.170 -0.717\nvn  0.931 0.127 -0.343\nvn  0.893 0.096 -0.440\nvn  0.858 0.449 -0.249\nvn  0.928 -0.340 0.151\nvn  0.618 -0.670 0.412\nvn  0.568 0.425 -0.705\nvn  -0.187 0.460 -0.868\nvn  0.833 0.328 -0.445\nvn  0.335 0.553 -0.763\nvn  0.822 0.487 -0.294\nvn  0.996 0.029 0.078\nvn  0.343 -0.516 0.785\nvn  0.553 -0.572 0.606\nvn  -0.002 0.705 -0.709\nvn  0.733 0.578 0.359\nvn  0.466 0.829 -0.308\nvn  -0.397 0.288 -0.871\nvn  -0.157 0.183 -0.971\nvn  -0.345 0.275 -0.897\nvn  -0.799 0.140 -0.585\nvn  0.955 -0.291 0.051\nvn  0.625 0.537 -0.566\nvn  0.990 0.136 0.046\nvn  0.941 0.328 0.083\nvn  0.932 -0.169 0.319\nvn  0.145 0.355 -0.923\nvn  0.830 0.153 0.536\nvn  0.847 0.094 0.523\nvn  0.791 -0.564 0.237\nvn  0.663 0.255 0.704\nvn  0.931 0.227 0.286\nvn  -0.507 0.477 -0.718\nvn  0.598 0.540 -0.592\nvn  -0.450 -0.025 -0.893\nvn  0.010 0.355 -0.935\nvn  -0.233 -0.283 -0.930\nvn  0.082 0.177 -0.981\nvn  0.155 0.080 -0.985\nvn  -0.359 -0.187 -0.914\nvn  -0.261 -0.007 -0.965\nvn  0.083 0.363 -0.928\nvn  0.584 0.671 -0.457\nvn  -0.450 -0.248 -0.858\nvn  -0.798 0.171 -0.578\nvn  -0.693 0.008 -0.721\nvn  -0.830 -0.113 -0.547\nvn  -0.551 -0.691 -0.467\nvn  -0.914 -0.329 -0.235\nvn  -0.782 -0.506 -0.363\nvn  -0.661 -0.153 -0.735\nvn  -0.674 -0.447 -0.588\nvn  -0.534 -0.666 -0.521\nvn  -0.956 -0.272 -0.113\nvn  -0.791 0.168 -0.588\nvn  0.848 0.071 -0.526\nvn  0.609 -0.175 -0.773\nvn  0.526 0.057 0.849\nvn  0.624 0.051 -0.780\nvn  -0.240 -0.238 -0.941\nvn  -0.053 -0.603 -0.796\nvn  0.556 0.042 -0.830\nvn  -0.561 -0.403 -0.723\nvn  -0.880 -0.141 -0.454\nvn  -0.926 -0.222 -0.305\nvn  -0.489 -0.166 -0.856\nvn  0.200 0.391 -0.898\nvn  -0.734 -0.069 -0.676\nvn  -0.185 0.884 -0.429\nvn  -0.883 0.450 -0.132\nvn  0.098 -0.235 -0.967\nvn  -0.388 0.206 -0.898\nvn  -0.607 0.148 -0.781\nvn  0.100 0.181 -0.978\nvn  -0.637 -0.154 -0.755\nvn  0.510 -0.467 -0.722\nvn  0.114 -0.555 -0.824\nvn  0.396 0.112 -0.911\nvn  -0.515 -0.112 -0.850\nvn  -0.710 -0.440 -0.550\nvn  -0.853 0.293 -0.431\nvn  -0.138 -0.733 -0.666\nvn  -0.005 0.955 -0.297\nvn  -0.841 0.325 -0.433\nvn  -0.604 -0.088 -0.792\nvn  -0.310 -0.012 -0.951\nvn  -0.803 -0.169 -0.572\nvn  0.940 -0.281 -0.195\nvn  0.876 -0.482 -0.015\nvn  0.715 -0.697 0.047\nvn  0.948 -0.075 0.310\nvn  0.295 -0.623 0.724\nvn  -0.372 -0.656 0.657\nvn  -0.294 -0.549 0.783\nvn  0.853 -0.472 -0.225\nvn  0.592 -0.721 0.360\nvn  -0.845 -0.400 0.355\nvn  -0.979 -0.182 -0.096\nvn  -0.547 -0.813 0.200\nvn  -0.696 -0.637 0.330\nvn  -0.461 -0.885 0.058\nvn  -0.465 -0.885 -0.000\nvn  0.004 -0.759 0.652\nvn  -0.145 -0.842 0.520\nvn  0.660 0.632 -0.406\nvn  0.657 0.056 0.752\nvn  0.481 0.032 0.876\nvn  0.807 0.528 0.265\nvn  0.603 0.155 0.782\nvn  0.216 -0.391 0.895\nvn  0.391 -0.546 0.741\nvn  -0.328 -0.682 0.653\nvn  -0.724 -0.434 0.536\nvn  -0.260 -0.677 0.688\nvn  0.341 -0.236 0.910\nvn  0.700 0.350 -0.622\nvn  0.692 0.666 0.280\nvn  0.063 0.406 0.912\nvn  0.486 0.042 -0.873\nvn  0.742 0.141 -0.656\nvn  0.829 0.357 -0.430\nvn  0.817 0.576 0.008\nvn  -0.143 -0.155 -0.978\nvn  0.761 0.266 -0.591\nvn  0.739 0.673 0.040\nvn  0.389 0.340 -0.856\nvn  0.659 0.731 -0.175\nvn  0.399 0.272 -0.876\nvn  0.659 0.748 -0.083\nvn  0.660 0.110 -0.743\nvn  0.866 0.500 0.011\nvn  0.632 -0.110 -0.767\nvn  0.509 -0.306 -0.805\nvn  0.779 0.374 0.503\nvn  0.964 0.099 -0.245\nvn  0.910 0.411 0.048\nvn  0.780 0.054 0.624\nvn  -0.448 0.780 0.437\nvn  0.295 0.362 0.884\nvn  0.389 0.530 0.754\nvn  0.126 0.297 0.946\nvn  0.338 0.484 0.807\nvn  0.103 -0.670 -0.735\nvn  0.569 0.257 0.781\nvn  0.965 -0.070 -0.252\nvn  0.874 -0.484 0.037\nvn  -0.880 0.356 0.314\nvn  -0.888 -0.308 0.341\nvn  -0.736 -0.608 0.298\nvn  -0.912 -0.276 0.302\nvn  -0.692 -0.229 0.684\nvn  0.824 -0.055 -0.563\nvn  0.624 -0.216 -0.751\nvn  0.176 -0.408 -0.896\nvn  0.612 -0.596 -0.520\nvn  -0.165 0.922 0.351\nvn  0.328 0.943 -0.057\nvn  0.835 0.538 -0.117\nvn  0.232 0.972 -0.047\nvn  0.492 0.870 0.024\nvn  0.401 0.850 -0.341\nvn  0.822 0.562 0.097\nvn  -0.196 0.950 0.244\nvn  0.711 0.692 0.123\nvn  0.220 0.904 0.366\nvn  -0.087 0.836 0.541\nvn  0.045 0.980 0.193\nvn  -0.233 0.918 0.320\nvn  -0.113 0.926 0.361\nvn  0.325 0.944 -0.052\nvn  0.647 0.661 -0.380\nvn  0.801 0.578 0.157\nvn  0.206 0.970 0.127\nvn  0.456 0.847 0.272\nvn  0.475 0.876 0.081\nvn  0.292 0.852 0.434\nvn  -0.060 0.985 0.164\nvn  0.671 0.711 -0.211\nvn  0.223 0.969 -0.104\nvn  0.134 0.982 -0.130\nvn  0.251 0.889 0.383\nvn  0.800 0.599 0.043\nvn  0.397 0.836 -0.378\nvn  -0.225 -0.521 -0.823\nvn  -0.144 -0.611 -0.778\nvn  0.377 -0.591 -0.713\nvn  -0.006 -0.321 -0.947\nvn  -0.599 -0.193 0.777\nvn  -0.533 0.055 0.845\nvn  -0.837 -0.538 -0.095\nvn  -0.750 -0.660 -0.033\nvn  -0.303 -0.172 0.937\nvn  -0.613 -0.780 -0.122\nvn  -0.103 0.127 0.987\nvn  -0.664 -0.707 -0.243\nvn  -0.307 -0.088 0.948\nvn  -0.227 -0.282 0.932\nvn  -0.556 -0.821 -0.132\nvn  -0.123 -0.806 0.578\nvn  -0.245 0.912 0.329\nvn  0.641 0.671 0.372\nvn  0.688 0.591 0.421\nvn  -0.157 0.905 0.396\nvn  0.773 0.525 0.357\nvn  -0.143 0.884 0.445\nvn  0.758 0.456 0.467\nvn  -0.245 0.782 0.572\nvn  0.127 0.788 0.602\nvn  0.792 0.429 0.435\nvn  -0.506 0.717 0.479\nvn  -0.986 0.146 0.085\nvn  -0.936 0.345 0.065\nvn  -0.995 -0.067 0.074\nvn  0.303 0.657 0.690\nvn  0.913 0.015 0.408\nvn  -0.621 0.554 0.554\nvn  0.271 0.297 0.915\nvn  0.492 -0.865 0.099\nvn  -0.926 -0.340 0.165\nvn  0.956 -0.229 0.184\nvn  0.938 -0.346 0.017\nvn  -0.539 -0.739 -0.403\nvn  0.317 -0.883 -0.345\nvn  -0.481 -0.854 0.197\nvn  0.212 -0.972 0.096\nvn  -0.878 -0.414 0.242\nvn  0.587 -0.803 0.102\nvn  0.348 -0.925 -0.153\nvn  -0.769 -0.552 -0.324\nvn  0.063 -0.821 0.567\nvn  -0.319 -0.605 0.729\nvn  0.523 0.308 0.795\nvn  -0.758 -0.512 0.403\nvn  -0.076 -0.407 0.910\nvn  -0.534 -0.658 0.531\nvn  0.886 0.085 -0.457\nvn  0.702 -0.091 -0.707\nvn  0.449 -0.108 -0.887\nvn  0.958 0.261 -0.117\nvn  0.408 -0.328 -0.852\nvn  0.998 0.029 -0.048\nvn  0.421 -0.536 -0.732\nvn  0.980 -0.193 0.056\nvn  0.390 -0.477 -0.787\nvn  0.973 -0.208 -0.097\nvn  0.782 -0.488 -0.388\nvn  0.022 -0.601 -0.799\nvn  0.914 -0.128 0.384\nvn  0.946 -0.316 0.070\nvn  0.663 0.255 0.704\nvn  0.790 0.177 0.586\nvn  0.443 0.219 0.870\nvn  0.597 -0.778 -0.198\nvn  -0.481 -0.655 -0.583\nvn  0.629 -0.163 0.760\nvn  0.058 -0.947 0.317\nvn  -0.998 0.060 -0.032\nvn  -0.008 0.388 0.921\nvn  -0.393 -0.383 -0.836\nvn  -0.553 -0.310 -0.774\nvn  -0.647 -0.403 -0.647\nvn  0.276 -0.627 -0.729\nvn  -0.420 0.207 0.884\nvn  -0.095 0.495 0.864\nvn  -0.969 0.244 0.050\nvn  -0.986 -0.037 0.165\nvn  -0.199 0.169 0.965\nvn  -0.993 -0.049 0.104\nvn  -0.984 -0.168 -0.054\nvn  -0.263 0.199 0.944\nvn  -0.340 -0.507 0.792\nvn  -0.636 -0.237 0.734\nvn  0.711 -0.217 -0.669\nvn  0.480 -0.268 -0.835\nvn  0.340 -0.309 -0.888\nvn  0.992 -0.035 -0.125\nvn  0.228 -0.448 -0.864\nvn  0.970 -0.195 -0.143\nvn  0.198 -0.781 -0.592\nvn  0.834 -0.542 0.104\nvn  0.161 -0.877 -0.452\nvn  0.772 -0.566 0.289\nvn  0.419 -0.907 0.037\nvn  -0.168 -0.868 -0.467\nvn  0.753 -0.339 0.563\nvn  0.864 -0.499 -0.064\nvn  0.740 0.070 0.669\nvn  0.665 0.227 0.711\nvn  0.534 0.321 0.782\nvn  0.273 -0.953 0.134\nvn  -0.562 -0.733 -0.384\nvn  0.551 -0.241 0.799\nvn  -0.734 -0.106 0.671\nvn  -0.486 -0.404 -0.775\nvn  -0.629 -0.324 -0.707\nvn  -0.683 -0.377 -0.625\nvn  -0.224 -0.624 -0.749\nvn  -0.289 0.777 0.559\nvn  -0.060 0.817 0.574\nvn  -0.798 0.574 -0.185\nvn  -0.905 0.387 -0.177\nvn  -0.115 0.604 0.789\nvn  -0.963 0.145 -0.228\nvn  -0.993 0.102 -0.060\nvn  -0.100 0.400 0.911\nvn  -0.669 -0.372 0.643\nvn  -0.565 -0.396 0.724\nvn  -0.917 -0.290 -0.274\nvn  -0.884 -0.401 -0.238\nvn  -0.915 -0.401 -0.039\nvn  -0.367 -0.027 -0.930\nvn  0.511 -0.346 -0.787\nvn  0.199 -0.245 -0.949\nvn  0.265 -0.295 -0.918\nvn  0.909 -0.343 -0.236\nvn  0.079 -0.705 -0.705\nvn  0.768 -0.640 -0.027\nvn  -0.348 -0.761 -0.548\nvn  0.407 -0.910 0.081\nvn  -0.563 -0.785 -0.259\nvn  0.176 -0.922 0.346\nvn  -0.414 -0.843 0.342\nvn  -0.906 -0.366 -0.212\nvn  0.269 -0.645 0.716\nvn  0.711 -0.694 0.117\nvn  0.810 -0.274 0.518\nvn  0.731 -0.273 0.626\nvn  0.740 -0.110 0.663\nvn  -0.602 -0.587 0.541\nvn  -0.986 -0.031 -0.165\nvn  0.433 -0.333 0.838\nvn  -0.264 0.740 0.619\nvn  -0.631 -0.103 -0.769\nvn  -0.796 0.087 -0.599\nvn  -0.821 0.297 -0.488\nvn  -0.521 -0.286 -0.804\nvn  0.827 0.498 0.263\nvn  0.635 0.609 0.475\nvn  -0.089 0.947 -0.308\nvn  0.028 0.955 -0.295\nvn  0.690 0.547 0.473\nvn  -0.643 0.694 -0.325\nvn  -0.830 0.546 0.112\nvn  0.276 0.006 0.961\nvn  -0.952 -0.304 0.013\nvn  -0.672 -0.707 0.219\nvn  0.934 -0.149 0.326\nvn  0.985 0.017 0.174\nvn  0.500 0.578 0.645\nvn  0.398 0.039 0.917\nvn  0.334 0.517 0.788\nvn  0.955 -0.164 -0.249\nvn  0.835 -0.550 -0.015\nvn  0.605 0.237 0.760\nvn  0.803 0.445 0.397\nvn  0.924 0.019 -0.383\nvn  0.850 -0.455 -0.265\nvn  0.890 0.361 -0.278\nvn  -0.728 0.410 -0.549\nvn  0.274 0.757 0.593\nvn  0.860 0.509 0.047\nvn  0.862 0.482 0.159\nvn  0.850 0.525 -0.047\nvn  0.755 0.639 -0.147\nvn  0.343 0.737 0.583\nvn  0.923 0.356 -0.144\nvn  0.318 0.865 0.388\nvn  0.910 0.323 -0.259\nvn  0.621 -0.057 -0.782\nvn  0.448 -0.053 -0.893\nvn  0.269 -0.243 -0.932\nvn  0.066 -0.081 -0.995\nvn  -0.700 -0.507 -0.503\nvn  -0.732 -0.441 -0.520\nvn  -0.728 0.332 -0.599\nvn  -0.818 -0.092 -0.568\nvn  -0.531 0.842 0.093\nvn  -0.897 0.406 0.176\nvn  -0.795 0.585 0.163\nvn  -0.987 -0.082 0.140\nvn  -0.959 -0.031 0.283\nvn  -0.250 -0.479 -0.841\nvn  -0.296 0.827 0.478\nvn  -0.487 0.543 0.684\nvn  -0.401 0.614 0.680\nvn  0.116 0.696 -0.709\nvn  0.718 0.651 -0.246\nvn  0.504 0.863 0.034\nvn  0.395 0.836 0.382\nvn  0.511 0.205 -0.835\nvn  0.628 0.647 0.433\nvn  0.680 -0.658 -0.324\nvn  0.674 0.234 0.701\nvn  0.519 -0.843 0.144\nvn  0.473 0.201 0.858\nvn  -0.097 -0.142 0.985\nvn  0.570 -0.772 0.280\nvn  0.213 0.139 0.967\nvn  0.157 0.019 0.987\nvn  -0.383 0.331 0.862\nvn  -0.961 0.187 0.203\nvn  -0.734 0.638 0.235\nvn  0.345 -0.632 -0.694\nvn  0.827 0.027 0.561\nvn  0.766 0.196 0.612\nvn  0.093 -0.902 -0.421\nvn  0.742 0.065 0.667\nvn  0.892 -0.386 -0.235\nvn  -0.356 0.741 0.569\nvn  -0.187 0.922 0.339\nvn  0.093 0.996 -0.012\nvn  0.268 0.600 -0.753\nvn  -0.671 0.566 -0.478\nvn  -0.450 0.881 -0.144\nvn  -0.411 -0.020 -0.911\nvn  -0.403 0.419 -0.814\nvn  -0.046 -0.910 -0.412\nvn  0.747 0.204 0.633\nvn  -0.864 0.404 -0.301\nvn  -0.809 0.495 0.318\nvn  -0.495 0.535 0.685\nvn  0.097 -0.760 -0.642\nvn  -0.223 -0.975 -0.004\nvn  0.591 -0.333 -0.735\nvn  -0.383 -0.783 -0.491\nvn  0.043 -0.563 -0.825\nvn  -0.343 -0.752 -0.563\nvn  -0.372 -0.581 -0.724\nvn  0.354 -0.925 0.141\nvn  -0.325 -0.537 -0.779\nvn  -0.594 0.652 0.470\nvn  -0.636 -0.751 0.178\nvn  0.656 -0.582 -0.480\nvn  -0.110 -0.595 -0.796\nvn  -0.006 -0.206 -0.979\nvn  -0.033 -0.090 -0.995\nvn  0.951 0.194 -0.239\nvn  0.525 -0.349 -0.776\nvn  0.273 -0.239 -0.932\nvn  0.244 0.667 -0.704\nvn  0.804 0.501 0.320\nvn  0.816 0.492 0.303\nvn  0.600 0.754 -0.267\nvn  0.922 0.331 -0.202\nvn  0.951 -0.170 0.258\nvn  -0.121 -0.731 0.672\nvn  -0.882 -0.470 0.025\nvn  -0.937 0.051 -0.344\nvn  -0.464 -0.711 0.529\nvn  -0.495 -0.865 -0.077\n# 2519 vertex normals\n\ng objDiablo3\ns 1\nf 6/1/6 5/2/5 8/3/8\nf 6/1/6 8/3/8 7/4/7\nf 12/5/12 11/6/11 10/7/10\nf 12/5/12 10/7/10 9/8/9\nf 15/9/15 14/10/14 1/11/1\nf 15/9/15 1/11/1 2/12/2\nf 16/13/16 15/9/15 2/12/2\nf 16/13/16 2/12/2 17/14/17\nf 25/15/25 24/16/24 23/17/23\nf 25/15/25 23/17/23 22/18/22\nf 5/2/5 10/7/10 13/19/13\nf 5/2/5 13/19/13 8/3/8\nf 9/8/9 10/7/10 5/2/5\nf 9/8/9 5/2/5 4/20/4\nf 13/19/13 24/16/24 7/4/7\nf 13/19/13 7/4/7 8/3/8\nf 11/6/11 23/17/23 24/16/24\nf 11/6/11 24/16/24 13/19/13\nf 20/21/20 27/22/27 25/15/25\nf 20/21/20 25/15/25 22/18/22\nf 29/23/29 28/24/28 27/22/27\nf 29/23/29 27/22/27 20/21/20\nf 30/25/30 27/22/27 28/24/28\nf 30/25/30 28/24/28 31/26/31\nf 31/26/31 28/24/28 1255/27/1255\nf 31/26/31 1255/27/1255 1265/28/1265\nf 1256/29/1256 1255/27/1255 28/24/28\nf 1256/29/1256 28/24/28 29/23/29\nf 33/30/33 32/31/32 1258/32/1258\nf 33/30/33 1258/32/1258 1262/33/1262\nf 1258/32/1258 32/31/32 31/26/31\nf 1258/32/1258 31/26/31 1265/28/1265\nf 34/34/34 1256/29/1256 29/23/29\nf 34/34/34 29/23/29 35/35/35\nf 35/35/35 29/23/29 20/21/20\nf 35/35/35 20/21/20 36/36/36\nf 37/37/37 34/34/34 35/35/35\nf 37/37/37 35/35/35 38/38/38\nf 35/35/35 36/36/36 39/39/39\nf 35/35/35 39/39/39 38/38/38\nf 40/40/40 37/37/37 38/38/38\nf 40/40/40 38/38/38 41/41/41\nf 41/41/41 38/38/38 39/39/39\nf 41/41/41 39/39/39 42/42/42\nf 43/43/43 37/37/37 40/40/40\nf 43/43/43 40/40/40 44/44/44\nf 45/45/45 12/5/12 9/8/9\nf 45/45/45 9/8/9 46/46/46\nf 41/41/41 42/42/42 12/5/12\nf 41/41/41 12/5/12 45/45/45\nf 47/47/47 44/44/44 40/40/40\nf 47/47/47 40/40/40 45/45/45\nf 48/48/48 50/49/50 18/50/18\nf 48/48/48 18/50/18 19/51/19\nf 52/52/52 1280/53/1280 50/49/50\nf 52/52/52 50/49/50 48/48/48\nf 53/54/53 25/15/25 27/22/27\nf 53/54/53 27/22/27 30/25/30\nf 54/55/54 26/56/26 25/15/25\nf 54/55/54 25/15/25 53/54/53\nf 59/57/59 54/55/54 53/54/53\nf 59/57/59 53/54/53 60/58/60\nf 30/25/30 55/59/55 60/58/60\nf 30/25/30 60/58/60 53/54/53\nf 48/48/48 49/60/49 57/61/57\nf 48/48/48 57/61/57 52/52/52\nf 52/52/52 57/61/57 33/30/33\nf 52/52/52 33/30/33 51/62/51\nf 61/63/61 45/45/45 46/46/46\nf 61/63/61 46/46/46 62/64/62\nf 109/65/109 44/44/44 65/66/65\nf 109/65/109 65/66/65 108/67/108\nf 67/68/67 42/42/42 66/69/66\nf 67/68/67 66/69/66 21/70/21\nf 69/71/69 16/13/16 17/14/17\nf 69/71/69 17/14/17 70/72/70\nf 17/14/17 6/1/6 18/50/18\nf 17/14/17 18/50/18 72/73/72\nf 72/73/72 18/50/18 50/49/50\nf 72/73/72 50/49/50 73/74/73\nf 73/74/73 50/49/50 1280/53/1280\nf 73/74/73 1280/53/1280 74/75/74\nf 75/76/75 72/73/72 73/74/73\nf 75/76/75 73/74/73 76/77/76\nf 76/77/76 73/74/73 74/75/74\nf 76/77/76 74/75/74 77/78/77\nf 75/76/75 76/77/76 79/79/79\nf 75/76/75 79/79/79 78/80/78\nf 84/81/84 81/82/81 83/83/83\nf 84/81/84 83/83/83 82/84/82\nf 85/85/85 79/79/79 87/86/87\nf 85/85/85 87/86/87 86/87/86\nf 79/79/79 80/88/80 88/89/88\nf 79/79/79 88/89/88 87/86/87\nf 85/85/85 83/83/83 81/82/81\nf 85/85/85 81/82/81 78/80/78\nf 92/90/92 91/91/91 90/92/90\nf 92/90/92 90/92/90 68/93/68\nf 92/90/92 86/94/86 93/95/93\nf 92/90/92 93/95/93 91/91/91\nf 82/96/82 83/97/83 94/98/94\nf 82/96/82 94/98/94 92/90/92\nf 86/94/86 89/99/89 95/100/95\nf 86/94/86 95/100/95 93/95/93\nf 96/101/96 89/102/89 87/86/87\nf 96/101/96 87/86/87 88/89/88\nf 100/103/100 99/104/99 98/105/98\nf 100/103/100 98/105/98 97/106/97\nf 97/106/97 98/105/98 104/107/104\nf 97/106/97 104/107/104 103/108/103\nf 97/106/97 107/109/107 106/110/106\nf 97/106/97 106/110/106 100/103/100\nf 101/111/101 109/112/109 108/113/108\nf 101/111/101 108/113/108 103/108/103\nf 103/108/103 111/114/111 107/109/107\nf 103/108/103 107/109/107 97/106/97\nf 112/115/112 113/116/113 115/117/115\nf 112/115/112 115/117/115 114/118/114\nf 194/119/194 126/120/126 115/117/115\nf 194/119/194 115/117/115 196/121/196\nf 117/122/117 112/115/112 114/118/114\nf 117/122/117 114/118/114 118/123/118\nf 146/124/146 117/122/117 118/123/118\nf 146/124/146 118/123/118 174/125/174\nf 113/116/113 127/126/127 128/127/128\nf 113/116/113 128/127/128 129/128/129\nf 127/126/127 120/129/120 132/130/132\nf 127/126/127 132/130/132 130/131/130\nf 139/132/139 138/133/138 137/134/137\nf 139/132/139 137/134/137 140/135/140\nf 120/129/120 144/136/144 141/137/141\nf 120/129/120 141/137/141 132/130/132\nf 143/138/143 141/137/141 144/136/144\nf 143/138/143 144/136/144 145/139/145\nf 139/132/139 135/140/135 157/141/157\nf 139/132/139 157/141/157 136/142/136\nf 131/143/131 134/144/134 150/145/150\nf 131/143/131 150/145/150 149/146/149\nf 134/144/134 157/141/157 151/147/151\nf 134/144/134 151/147/151 150/145/150\nf 152/148/152 153/149/153 159/150/159\nf 152/148/152 159/150/159 155/151/155\nf 157/141/157 158/152/158 160/153/160\nf 157/141/157 160/153/160 159/150/159\nf 143/138/143 145/139/145 162/154/162\nf 143/138/143 162/154/162 178/155/178\nf 153/149/153 151/147/151 157/141/157\nf 153/149/153 157/141/157 159/150/159\nf 167/156/167 161/157/161 168/158/168\nf 167/156/167 168/158/168 169/159/169\nf 171/160/171 190/161/190 191/162/191\nf 171/160/171 191/162/191 173/163/173\nf 189/164/189 148/165/148 174/125/174\nf 189/164/189 174/125/174 188/166/188\nf 116/167/116 179/168/179 123/169/123\nf 116/167/116 123/169/123 115/117/115\nf 125/170/125 179/168/179 184/171/184\nf 125/170/125 184/171/184 183/172/183\nf 179/168/179 116/167/116 182/173/182\nf 179/168/179 182/173/182 184/171/184\nf 181/174/181 126/120/126 194/119/194\nf 181/174/181 194/119/194 185/175/185\nf 186/176/186 201/177/201 187/178/187\nf 186/176/186 187/178/187 172/179/172\nf 172/179/172 191/162/191 190/161/190\nf 172/179/172 190/161/190 186/176/186\nf 129/128/129 208/180/208 197/181/197\nf 129/128/129 197/181/197 196/121/196\nf 199/182/199 147/183/147 146/124/146\nf 199/182/199 146/124/146 198/184/198\nf 200/185/200 162/154/162 145/139/145\nf 200/185/200 145/139/145 199/182/199\nf 200/186/200 225/187/225 175/188/175\nf 200/186/200 175/188/175 162/189/162\nf 186/176/186 190/161/190 204/190/204\nf 186/176/186 204/190/204 203/191/203\nf 205/192/205 210/193/210 235/194/235\nf 205/192/205 235/194/235 234/195/234\nf 206/196/206 207/197/207 205/192/205\nf 206/196/206 205/192/205 203/191/203\nf 207/198/207 206/199/206 208/180/208\nf 207/198/207 208/180/208 129/128/129\nf 205/192/205 207/197/207 209/200/209\nf 205/192/205 209/200/209 210/193/210\nf 339/201/339 219/202/219 233/203/233\nf 339/201/339 233/203/233 338/204/338\nf 213/205/213 212/206/212 337/207/337\nf 213/205/213 337/207/337 340/208/340\nf 214/209/214 215/210/215 217/211/217\nf 214/209/214 217/211/217 216/212/216\nf 224/213/224 211/214/211 214/209/214\nf 224/213/224 214/209/214 220/215/220\nf 214/209/214 216/212/216 222/216/222\nf 214/209/214 222/216/222 220/215/220\nf 216/212/216 260/217/260 258/218/258\nf 216/212/216 258/218/258 222/216/222\nf 225/187/225 221/219/221 224/213/224\nf 225/187/225 224/213/224 223/220/223\nf 238/221/238 226/222/226 225/187/225\nf 238/221/238 225/187/225 223/220/223\nf 231/223/231 213/205/213 340/208/340\nf 231/223/231 340/208/340 341/224/341\nf 230/225/230 231/223/231 341/224/341\nf 230/225/230 341/224/341 229/226/229\nf 232/227/232 213/205/213 231/223/231\nf 232/227/232 231/223/231 240/228/240\nf 212/206/212 213/205/213 232/227/232\nf 212/206/212 232/227/232 215/210/215\nf 202/229/202 233/230/233 187/178/187\nf 202/229/202 187/178/187 201/177/201\nf 202/231/202 337/207/337 338/204/338\nf 202/231/202 338/204/338 233/203/233\nf 202/229/202 201/177/201 234/195/234\nf 202/229/202 234/195/234 235/194/235\nf 232/227/232 240/228/240 237/232/237\nf 232/227/232 237/232/237 236/233/236\nf 236/233/236 237/232/237 248/234/248\nf 236/233/236 248/234/248 250/235/250\nf 215/210/215 232/227/232 236/233/236\nf 215/210/215 236/233/236 217/211/217\nf 227/236/227 226/222/226 238/221/238\nf 227/236/227 238/221/238 239/237/239\nf 245/238/245 227/236/227 239/237/239\nf 245/238/245 239/237/239 247/239/247\nf 242/240/242 206/196/206 203/191/203\nf 242/240/242 203/191/203 204/190/204\nf 243/241/243 181/174/181 193/242/193\nf 243/241/243 193/242/193 244/243/244\nf 208/180/208 242/244/242 244/243/244\nf 208/180/208 244/243/244 193/242/193\nf 228/245/228 245/238/245 230/246/230\nf 228/245/228 230/246/230 229/247/229\nf 246/248/246 237/249/237 240/250/240\nf 246/248/246 240/250/240 247/239/247\nf 249/251/249 253/252/253 261/253/261\nf 249/251/249 261/253/261 259/254/259\nf 254/255/254 246/248/246 247/239/247\nf 254/255/254 247/239/247 239/237/239\nf 238/221/238 255/256/255 254/255/254\nf 238/221/238 254/255/254 239/237/239\nf 255/256/255 238/221/238 223/220/223\nf 255/256/255 223/220/223 220/215/220\nf 261/253/261 262/257/262 250/235/250\nf 261/253/261 250/235/250 259/254/259\nf 257/258/257 260/217/260 262/257/262\nf 257/258/257 262/257/262 261/253/261\nf 251/259/251 257/258/257 261/253/261\nf 251/259/251 261/253/261 253/252/253\nf 264/260/264 263/261/263 265/262/265\nf 264/260/264 265/262/265 266/263/266\nf 273/264/273 283/265/283 271/266/271\nf 273/264/273 271/266/271 274/267/274\nf 274/267/274 265/262/265 263/261/263\nf 274/267/274 263/261/263 275/268/275\nf 270/269/270 284/270/284 276/271/276\nf 270/269/270 276/271/276 277/272/277\nf 268/273/268 271/266/271 283/265/283\nf 268/273/268 283/265/283 284/270/284\nf 278/274/278 279/275/279 282/276/282\nf 278/274/278 282/276/282 281/277/281\nf 279/275/279 273/264/273 298/278/298\nf 279/275/279 298/278/298 282/276/282\nf 273/264/273 274/267/274 275/268/275\nf 273/264/273 275/268/275 298/278/298\nf 269/279/269 402/280/402 295/281/295\nf 269/279/269 295/281/295 286/282/286\nf 286/282/286 295/281/295 288/283/288\nf 286/282/286 288/283/288 287/284/287\nf 287/284/287 288/283/288 290/285/290\nf 287/284/287 290/285/290 289/286/289\nf 292/287/292 289/286/289 290/285/290\nf 292/287/292 290/285/290 293/288/293\nf 255/289/255 256/290/256 289/286/289\nf 255/289/255 289/286/289 292/287/292\nf 263/261/263 254/291/254 297/292/297\nf 263/261/263 297/292/297 298/278/298\nf 292/287/292 293/288/293 297/292/297\nf 292/287/292 297/292/297 254/291/254\nf 296/293/296 387/294/387 288/283/288\nf 296/293/296 288/283/288 295/281/295\nf 286/282/286 251/259/251 253/252/253\nf 286/282/286 253/252/253 269/279/269\nf 287/284/287 289/286/289 256/290/256\nf 287/284/287 256/290/256 252/295/252\nf 251/259/251 286/282/286 287/284/287\nf 251/259/251 287/284/287 252/295/252\nf 266/296/266 267/297/267 253/252/253\nf 266/296/266 253/252/253 249/251/249\nf 293/288/293 291/298/291 299/299/299\nf 293/288/293 299/299/299 297/292/297\nf 299/299/299 291/298/291 300/300/300\nf 299/299/299 300/300/300 301/301/301\nf 301/302/301 300/303/300 302/304/302\nf 301/302/301 302/304/302 303/305/303\nf 303/305/303 302/304/302 304/306/304\nf 303/305/303 304/306/304 305/307/305\nf 305/307/305 304/306/304 306/308/306\nf 305/307/305 306/308/306 307/309/307\nf 306/308/306 308/310/308 315/311/315\nf 306/308/306 315/311/315 307/309/307\nf 310/312/310 314/313/314 316/314/316\nf 310/312/310 316/314/316 334/315/334\nf 316/314/316 317/316/317 312/317/312\nf 316/314/316 312/317/312 334/315/334\nf 309/318/309 336/319/336 316/314/316\nf 309/318/309 316/314/316 314/313/314\nf 336/319/336 311/320/311 317/316/317\nf 336/319/336 317/316/317 316/314/316\nf 323/321/323 327/322/327 308/310/308\nf 323/321/323 308/310/308 306/308/306\nf 305/307/305 319/323/319 324/324/324\nf 305/307/305 324/324/324 303/305/303\nf 299/299/299 301/301/301 320/325/320\nf 299/299/299 320/325/320 321/326/321\nf 303/305/303 324/324/324 320/327/320\nf 303/305/303 320/327/320 301/302/301\nf 300/300/300 291/298/291 344/328/344\nf 300/300/300 344/328/344 322/329/322\nf 302/304/302 300/303/300 322/330/322\nf 302/304/302 322/330/322 323/321/323\nf 319/323/319 315/311/315 325/331/325\nf 319/323/319 325/331/325 349/332/349\nf 325/331/325 315/311/315 318/333/318\nf 325/331/325 318/333/318 326/334/326\nf 320/327/320 324/324/324 349/332/349\nf 320/327/320 349/332/349 432/335/432\nf 332/336/332 308/310/308 327/322/327\nf 332/336/332 327/322/327 333/337/333\nf 333/337/333 327/322/327 328/338/328\nf 333/337/333 328/338/328 329/339/329\nf 325/331/325 326/334/326 329/340/329\nf 325/331/325 329/340/329 328/341/328\nf 326/334/326 318/333/318 330/342/330\nf 326/334/326 330/342/330 331/343/331\nf 331/344/331 330/345/330 332/336/332\nf 331/344/331 332/336/332 333/337/333\nf 330/342/330 345/346/345 334/315/334\nf 330/342/330 334/315/334 335/347/335\nf 336/319/336 346/348/346 330/345/330\nf 336/319/336 330/345/330 335/349/335\nf 312/317/312 313/350/313 335/347/335\nf 312/317/312 335/347/335 334/315/334\nf 335/349/335 313/350/313 311/320/311\nf 335/349/335 311/320/311 336/319/336\nf 337/207/337 212/206/212 218/351/218\nf 337/207/337 218/351/218 338/204/338\nf 338/204/338 218/351/218 211/214/211\nf 338/204/338 211/214/211 339/201/339\nf 202/231/202 235/352/235 340/208/340\nf 202/231/202 340/208/340 337/207/337\nf 235/352/235 210/353/210 341/224/341\nf 235/352/235 341/224/341 340/208/340\nf 342/354/342 290/285/290 288/283/288\nf 342/354/342 288/283/288 387/294/387\nf 328/338/328 327/322/327 347/355/347\nf 328/338/328 347/355/347 348/356/348\nf 325/331/325 328/341/328 348/357/348\nf 325/331/325 348/357/348 349/332/349\nf 348/356/348 347/355/347 351/358/351\nf 348/356/348 351/358/351 352/359/352\nf 349/332/349 348/357/348 352/360/352\nf 349/332/349 352/360/352 350/361/350\nf 347/355/347 323/321/323 322/330/322\nf 347/355/347 322/330/322 351/358/351\nf 354/362/354 344/363/344 343/364/343\nf 354/362/354 343/364/343 353/365/353\nf 354/362/354 353/365/353 355/366/355\nf 354/362/354 355/366/355 356/367/356\nf 356/367/356 355/366/355 357/368/357\nf 356/367/356 357/368/357 358/369/358\nf 357/368/357 359/370/359 360/371/360\nf 357/368/357 360/371/360 358/369/358\nf 362/372/362 361/373/361 363/374/363\nf 362/372/362 363/374/363 364/375/364\nf 365/376/365 366/377/366 363/374/363\nf 365/376/365 363/374/363 361/373/361\nf 368/378/368 369/379/369 359/370/359\nf 368/378/368 359/370/359 357/368/357\nf 362/372/362 371/380/371 374/381/374\nf 362/372/362 374/381/374 360/371/360\nf 356/367/356 372/382/372 373/383/373\nf 356/367/356 373/383/373 354/362/354\nf 372/382/372 360/371/360 374/381/374\nf 372/382/372 374/381/374 383/384/383\nf 370/385/370 369/379/369 376/386/376\nf 370/385/370 376/386/376 375/387/375\nf 374/381/374 371/380/371 375/388/375\nf 374/381/374 375/388/375 376/389/376\nf 377/390/377 379/391/379 364/375/364\nf 377/390/377 364/375/364 381/392/381\nf 366/377/366 380/393/380 377/394/377\nf 366/377/366 377/394/377 381/395/381\nf 376/386/376 369/379/369 368/378/368\nf 376/386/376 368/378/368 382/396/382\nf 374/381/374 376/389/376 382/397/382\nf 374/381/374 382/397/382 383/384/383\nf 294/398/294 342/354/342 386/399/386\nf 294/398/294 386/399/386 385/400/385\nf 353/365/353 343/364/343 385/401/385\nf 353/365/353 385/401/385 368/378/368\nf 296/293/296 295/281/295 402/280/402\nf 296/293/296 402/280/402 388/402/388\nf 387/294/387 296/293/296 388/402/388\nf 387/294/387 388/402/388 389/403/389\nf 352/404/352 351/405/351 395/406/395\nf 352/404/352 395/406/395 390/407/390\nf 350/408/350 352/404/352 390/407/390\nf 350/408/350 390/407/390 434/409/434\nf 390/407/390 395/406/395 394/410/394\nf 390/407/390 394/410/394 392/411/392\nf 434/409/434 390/407/390 392/411/392\nf 434/409/434 392/411/392 391/412/391\nf 392/411/392 394/410/394 386/399/386\nf 392/411/392 386/399/386 393/413/393\nf 391/412/391 392/411/392 393/413/393\nf 391/412/391 393/413/393 396/414/396\nf 359/370/359 369/379/369 370/385/370\nf 359/370/359 370/385/370 365/376/365\nf 394/415/394 395/416/395 382/396/382\nf 394/415/394 382/396/382 368/378/368\nf 297/292/297 321/326/321 397/417/397\nf 297/292/297 397/417/397 298/278/298\nf 281/277/281 282/276/282 398/418/398\nf 281/277/281 398/418/398 396/419/396\nf 433/420/433 391/421/391 400/422/400\nf 433/420/433 400/422/400 399/423/399\nf 396/419/396 398/418/398 400/422/400\nf 396/419/396 400/422/400 391/421/391\nf 298/278/298 397/417/397 398/418/398\nf 298/278/298 398/418/398 282/276/282\nf 321/326/321 403/424/403 401/425/401\nf 321/326/321 401/425/401 397/417/397\nf 395/426/395 384/427/384 383/384/383\nf 395/426/395 383/384/383 382/397/382\nf 280/428/280 281/277/281 396/419/396\nf 280/428/280 396/419/396 389/429/389\nf 280/428/280 389/429/389 388/430/388\nf 280/428/280 388/430/388 277/272/277\nf 402/431/402 270/269/270 277/272/277\nf 402/431/402 277/272/277 388/430/388\nf 403/432/403 404/433/404 405/434/405\nf 403/432/403 405/434/405 401/435/401\nf 404/433/404 407/436/407 406/437/406\nf 404/433/404 406/437/406 405/434/405\nf 406/437/406 407/436/407 409/438/409\nf 406/437/406 409/438/409 408/439/408\nf 412/440/412 410/441/410 411/442/411\nf 412/440/412 411/442/411 413/443/413\nf 415/444/415 410/441/410 412/440/412\nf 415/444/415 412/440/412 416/445/416\nf 417/446/417 406/437/406 408/439/408\nf 417/446/417 408/439/408 418/447/418\nf 411/442/411 409/438/409 420/448/420\nf 411/442/411 420/448/420 419/449/419\nf 421/450/421 422/451/422 420/448/420\nf 421/450/421 420/448/420 409/438/409\nf 424/452/424 423/453/423 425/454/425\nf 424/452/424 425/454/425 418/447/418\nf 420/448/420 425/455/425 423/456/423\nf 420/448/420 423/456/423 419/449/419\nf 426/457/426 430/458/430 413/443/413\nf 426/457/426 413/443/413 428/459/428\nf 416/445/416 430/460/430 426/461/426\nf 416/445/416 426/461/426 429/462/429\nf 425/454/425 431/463/431 417/446/417\nf 425/454/425 417/446/417 418/447/418\nf 420/448/420 422/451/422 431/464/431\nf 420/448/420 431/464/431 425/455/425\nf 408/439/408 415/444/415 424/452/424\nf 408/439/408 424/452/424 418/447/418\nf 431/463/431 435/465/435 433/466/433\nf 431/463/431 433/466/433 417/446/417\nf 435/467/435 431/464/431 422/451/422\nf 435/467/435 422/451/422 432/468/432\nf 243/469/243 244/470/244 437/471/437\nf 243/469/243 437/471/437 436/472/436\nf 436/472/436 437/471/437 439/473/439\nf 436/472/436 439/473/439 438/474/438\nf 436/472/436 438/474/438 444/475/444\nf 436/472/436 444/475/444 440/476/440\nf 436/472/436 440/476/440 441/477/441\nf 436/472/436 441/477/441 243/469/243\nf 184/171/184 243/241/243 441/478/441\nf 184/171/184 441/478/441 442/479/442\nf 441/477/441 440/476/440 443/480/443\nf 441/477/441 443/480/443 558/481/558\nf 443/480/443 440/476/440 444/475/444\nf 443/480/443 444/475/444 445/482/445\nf 441/478/441 558/483/558 447/484/447\nf 441/478/441 447/484/447 446/485/446\nf 446/485/446 447/484/447 122/486/122\nf 446/485/446 122/486/122 121/487/121\nf 439/473/439 437/471/437 451/488/451\nf 439/473/439 451/488/451 1389/489/1389\nf 451/488/451 437/471/437 244/470/244\nf 451/488/451 244/470/244 242/490/242\nf 1389/489/1389 451/488/451 204/491/204\nf 1389/489/1389 204/491/204 1392/492/1392\nf 1392/493/1392 204/494/204 171/495/171\nf 1392/493/1392 171/495/171 452/496/452\nf 452/496/452 171/495/171 483/497/483\nf 452/496/452 483/497/483 453/498/453\nf 453/498/453 483/497/483 454/499/454\nf 453/498/453 454/499/454 455/500/455\nf 455/500/455 454/499/454 456/501/456\nf 455/500/455 456/501/456 457/502/457\nf 457/502/457 456/501/456 458/503/458\nf 457/502/457 458/503/458 459/504/459\nf 459/504/459 458/503/458 460/505/460\nf 459/504/459 460/505/460 461/506/461\nf 461/506/461 460/505/460 462/507/462\nf 461/506/461 462/507/462 463/508/463\nf 463/508/463 462/507/462 464/509/464\nf 463/508/463 464/509/464 465/510/465\nf 465/510/465 464/509/464 466/511/466\nf 465/510/465 466/511/466 467/512/467\nf 458/503/458 456/501/456 468/513/468\nf 458/503/458 468/513/468 528/514/528\nf 460/505/460 458/503/458 469/515/469\nf 460/505/460 469/515/469 470/516/470\nf 462/507/462 460/505/460 470/516/470\nf 462/507/462 470/516/470 471/517/471\nf 464/509/464 462/507/462 471/517/471\nf 464/509/464 471/517/471 472/518/472\nf 466/511/466 464/509/464 472/518/472\nf 466/511/466 472/518/472 473/519/473\nf 468/513/468 456/501/456 454/499/454\nf 468/513/468 454/499/454 474/520/474\nf 468/513/468 474/520/474 475/521/475\nf 468/513/468 475/521/475 498/522/498\nf 475/521/475 474/520/474 476/523/476\nf 475/521/475 476/523/476 477/524/477\nf 476/523/476 474/520/474 479/525/479\nf 476/523/476 479/525/479 480/526/480\nf 482/527/482 479/525/479 483/497/483\nf 482/527/482 483/497/483 484/528/484\nf 482/527/482 484/528/484 486/529/486\nf 482/527/482 486/529/486 519/530/519\nf 487/531/487 488/532/488 490/533/490\nf 487/531/487 490/533/490 489/534/489\nf 487/531/487 489/534/489 492/535/492\nf 487/531/487 492/535/492 491/536/491\nf 492/535/492 489/534/489 493/537/493\nf 492/535/492 493/537/493 494/538/494\nf 488/532/488 498/522/498 495/539/495\nf 488/532/488 495/539/495 496/540/496\nf 490/533/490 488/532/488 496/540/496\nf 490/533/490 496/540/496 497/541/497\nf 171/495/171 173/542/173 484/528/484\nf 171/495/171 484/528/484 483/497/483\nf 479/525/479 474/520/474 454/499/454\nf 479/525/479 454/499/454 483/497/483\nf 489/534/489 490/533/490 497/541/497\nf 489/534/489 497/541/497 493/537/493\nf 499/543/499 475/521/475 505/544/505\nf 499/543/499 505/544/505 503/545/503\nf 507/546/507 502/547/502 508/548/508\nf 507/546/507 508/548/508 509/549/509\nf 481/550/481 519/530/519 508/548/508\nf 481/550/481 508/548/508 502/547/502\nf 503/545/503 514/551/514 537/552/537\nf 503/545/503 537/552/537 501/553/501\nf 511/554/511 510/555/510 514/551/514\nf 511/554/511 514/551/514 503/545/503\nf 515/556/515 486/529/486 484/528/484\nf 515/556/515 484/528/484 173/542/173\nf 513/557/513 514/551/514 510/555/510\nf 513/557/513 510/555/510 521/558/521\nf 520/559/520 542/560/542 546/561/546\nf 520/559/520 546/561/546 522/562/522\nf 470/516/470 469/515/469 523/563/523\nf 470/516/470 523/563/523 524/564/524\nf 471/517/471 470/516/470 524/564/524\nf 471/517/471 524/564/524 525/565/525\nf 472/518/472 471/517/471 525/565/525\nf 472/518/472 525/565/525 526/566/526\nf 531/567/531 491/536/491 492/535/492\nf 531/567/531 492/535/492 533/568/533\nf 541/569/541 515/556/515 538/570/538\nf 541/569/541 538/570/538 539/571/539\nf 539/571/539 540/572/540 543/573/543\nf 539/571/539 543/573/543 541/569/541\nf 542/560/542 545/574/545 547/575/547\nf 542/560/542 547/575/547 546/561/546\nf 550/576/550 551/577/551 552/578/552\nf 550/576/550 552/578/552 445/482/445\nf 551/577/551 549/579/549 555/580/555\nf 551/577/551 555/580/555 557/581/557\nf 548/582/548 600/583/600 555/580/555\nf 548/582/548 555/580/555 549/579/549\nf 450/584/450 568/585/568 189/164/189\nf 450/584/450 189/164/189 188/166/188\nf 568/585/568 572/586/572 573/587/573\nf 568/585/568 573/587/573 571/588/571\nf 569/589/569 578/590/578 586/591/586\nf 569/589/569 586/591/586 577/592/577\nf 448/593/448 564/594/564 591/595/591\nf 448/593/448 591/595/591 590/596/590\nf 561/597/561 743/598/743 744/599/744\nf 561/597/561 744/599/744 595/600/595\nf 600/583/600 593/601/593 598/602/598\nf 600/583/600 598/602/598 599/603/599\nf 559/604/559 599/603/599 594/605/594\nf 559/604/559 594/605/594 601/606/601\nf 594/605/594 598/602/598 593/601/593\nf 594/605/594 593/601/593 592/607/592\nf 555/608/555 600/609/600 605/610/605\nf 555/608/555 605/610/605 604/611/604\nf 604/611/604 590/612/590 591/613/591\nf 604/611/604 591/613/591 555/608/555\nf 605/610/605 600/609/600 599/614/599\nf 605/610/605 599/614/599 559/615/559\nf 635/616/635 930/617/930 936/618/936\nf 635/616/635 936/618/936 603/619/603\nf 993/620/993 994/621/994 610/622/610\nf 993/620/993 610/622/610 607/623/607\nf 610/622/610 995/624/995 618/625/618\nf 610/622/610 618/625/618 617/626/617\nf 619/627/619 620/628/620 618/625/618\nf 619/627/619 618/625/618 995/624/995\nf 648/629/648 618/630/618 620/631/620\nf 648/629/648 620/631/620 643/632/643\nf 547/575/547 545/574/545 627/633/627\nf 547/575/547 627/633/627 625/634/625\nf 624/635/624 628/636/628 627/633/627\nf 624/635/624 627/633/627 626/637/626\nf 581/638/581 628/636/628 624/635/624\nf 581/638/581 624/635/624 580/639/580\nf 581/640/581 610/641/610 617/642/617\nf 581/640/581 617/642/617 628/643/628\nf 555/608/555 591/613/591 556/644/556\nf 555/608/555 556/644/556 557/645/557\nf 630/646/630 629/647/629 631/648/631\nf 630/646/630 631/648/631 632/649/632\nf 560/650/560 630/646/630 634/651/634\nf 560/650/560 634/651/634 635/652/635\nf 632/649/632 631/648/631 633/653/633\nf 632/649/632 633/653/633 634/651/634\nf 603/654/603 638/655/638 637/656/637\nf 603/654/603 637/656/637 636/657/636\nf 559/615/559 638/658/638 606/659/606\nf 559/615/559 606/659/606 605/610/605\nf 643/632/643 644/660/644 647/661/647\nf 643/632/643 647/661/647 646/662/646\nf 647/661/647 644/660/644 676/663/676\nf 647/661/647 676/663/676 649/664/649\nf 641/665/641 640/666/640 651/667/651\nf 641/665/641 651/667/651 652/668/652\nf 639/669/639 641/665/641 654/670/654\nf 639/669/639 654/670/654 653/671/653\nf 641/665/641 652/668/652 655/672/655\nf 641/665/641 655/672/655 654/670/654\nf 673/673/673 653/674/653 656/675/656\nf 673/673/673 656/675/656 657/676/657\nf 654/670/654 655/672/655 658/677/658\nf 654/670/654 658/677/658 656/678/656\nf 656/675/656 662/679/662 663/680/663\nf 656/675/656 663/680/663 657/676/657\nf 656/678/656 658/677/658 664/681/664\nf 656/678/656 664/681/664 662/682/662\nf 662/679/662 665/683/665 660/684/660\nf 662/679/662 660/684/660 663/680/663\nf 661/685/661 665/686/665 662/682/662\nf 661/685/661 662/682/662 664/681/664\nf 673/673/673 657/676/657 667/687/667\nf 673/673/673 667/687/667 672/688/672\nf 658/677/658 655/672/655 666/689/666\nf 658/677/658 666/689/666 668/690/668\nf 663/680/663 660/684/660 669/691/669\nf 663/680/663 669/691/669 670/692/670\nf 664/681/664 658/677/658 668/690/668\nf 664/681/664 668/690/668 671/693/671\nf 657/676/657 663/680/663 670/692/670\nf 657/676/657 670/692/670 667/687/667\nf 661/685/661 664/681/664 671/693/671\nf 661/685/661 671/693/671 669/691/669\nf 671/693/671 668/690/668 667/687/667\nf 671/693/671 667/687/667 670/692/670\nf 668/690/668 674/694/674 672/688/672\nf 668/690/668 672/688/672 667/687/667\nf 674/694/674 666/689/666 675/695/675\nf 674/694/674 675/695/675 677/696/677\nf 675/695/675 666/689/666 655/672/655\nf 675/695/675 655/672/655 652/668/652\nf 673/673/673 672/688/672 678/697/678\nf 673/673/673 678/697/678 676/698/676\nf 915/699/915 679/700/679 680/701/680\nf 915/699/915 680/701/680 767/702/767\nf 915/699/915 682/703/682 683/704/683\nf 915/699/915 683/704/683 679/700/679\nf 681/705/681 680/706/680 684/707/684\nf 681/705/681 684/707/684 685/708/685\nf 681/705/681 685/708/685 687/709/687\nf 681/705/681 687/709/687 699/710/699\nf 686/711/686 683/704/683 689/712/689\nf 686/711/686 689/712/689 711/713/711\nf 687/709/687 690/714/690 698/715/698\nf 687/709/687 698/715/698 699/710/699\nf 693/716/693 694/717/694 696/718/696\nf 693/716/693 696/718/696 697/719/697\nf 688/720/688 701/721/701 697/719/697\nf 688/720/688 697/719/697 696/718/696\nf 691/722/691 688/720/688 699/710/699\nf 691/722/691 699/710/699 698/715/698\nf 697/719/697 701/721/701 703/723/703\nf 697/719/697 703/723/703 704/724/704\nf 706/725/706 689/712/689 683/704/683\nf 706/725/706 683/704/683 682/703/682\nf 707/726/707 708/727/708 749/728/749\nf 707/726/707 749/728/749 750/729/750\nf 679/700/679 683/704/683 686/711/686\nf 679/700/679 686/711/686 710/730/710\nf 685/708/685 684/707/684 712/731/712\nf 685/708/685 712/731/712 713/732/713\nf 710/730/710 686/711/686 714/733/714\nf 710/730/710 714/733/714 716/734/716\nf 715/735/715 687/709/687 685/708/685\nf 715/735/715 685/708/685 713/732/713\nf 711/713/711 690/714/690 722/736/722\nf 711/713/711 722/736/722 717/737/717\nf 690/714/690 687/709/687 715/735/715\nf 690/714/690 715/735/715 722/736/722\nf 684/738/684 710/730/710 716/734/716\nf 684/738/684 716/734/716 712/739/712\nf 686/711/686 711/713/711 717/737/717\nf 686/711/686 717/737/717 714/733/714\nf 712/739/712 716/734/716 720/740/720\nf 712/739/712 720/740/720 718/741/718\nf 715/735/715 713/732/713 718/742/718\nf 715/735/715 718/742/718 723/743/723\nf 714/733/714 717/737/717 721/744/721\nf 714/733/714 721/744/721 720/740/720\nf 721/744/721 717/737/717 722/736/722\nf 721/744/721 722/736/722 719/745/719\nf 723/743/723 719/745/719 722/736/722\nf 723/743/723 722/736/722 715/735/715\nf 718/742/718 724/746/724 727/747/727\nf 718/742/718 727/747/727 723/743/723\nf 720/740/720 721/744/721 725/748/725\nf 720/740/720 725/748/725 724/749/724\nf 721/744/721 719/745/719 726/750/726\nf 721/744/721 726/750/726 725/748/725\nf 723/743/723 727/747/727 726/750/726\nf 723/743/723 726/750/726 719/745/719\nf 772/751/772 729/752/729 771/753/771\nf 772/751/772 771/753/771 681/705/681\nf 649/754/649 676/755/676 732/756/732\nf 649/754/649 732/756/732 731/757/731\nf 729/758/729 700/759/700 733/760/733\nf 729/758/729 733/760/733 734/761/734\nf 678/762/678 730/763/730 734/761/734\nf 678/762/678 734/761/734 732/756/732\nf 732/756/732 737/764/737 736/765/736\nf 732/756/732 736/765/736 731/757/731\nf 734/761/734 733/760/733 738/766/738\nf 734/761/734 738/766/738 739/767/739\nf 734/761/734 739/767/739 737/764/737\nf 734/761/734 737/764/737 732/756/732\nf 743/598/743 561/597/561 740/768/740\nf 743/598/743 740/768/740 742/769/742\nf 743/598/743 603/654/603 636/657/636\nf 743/598/743 636/657/636 744/599/744\nf 744/599/744 596/770/596 601/606/601\nf 744/599/744 601/606/601 745/771/745\nf 757/772/757 752/773/752 759/774/759\nf 757/772/757 759/774/759 761/775/761\nf 760/776/760 757/772/757 761/775/761\nf 760/776/760 761/775/761 762/777/762\nf 677/778/677 921/779/921 922/780/922\nf 677/778/677 922/780/922 730/781/730\nf 681/705/681 696/718/696 692/782/692\nf 681/705/681 692/782/692 772/751/772\nf 763/783/763 758/784/758 773/785/773\nf 763/783/763 773/785/773 775/786/775\nf 760/776/760 762/777/762 773/785/773\nf 760/776/760 773/785/773 758/784/758\nf 777/787/777 754/788/754 787/789/787\nf 777/787/777 787/789/787 776/790/776\nf 756/791/756 782/792/782 784/793/784\nf 756/791/756 784/793/784 783/794/783\nf 791/795/791 794/796/794 801/797/801\nf 791/795/791 801/797/801 800/798/800\nf 786/799/786 781/800/781 779/801/779\nf 786/799/786 779/801/779 806/802/806\nf 774/803/774 799/804/799 810/805/810\nf 774/803/774 810/805/810 809/806/809\nf 811/807/811 807/808/807 809/806/809\nf 811/807/811 809/806/809 810/805/810\nf 808/809/808 811/807/811 810/805/810\nf 808/809/808 810/805/810 819/810/819\nf 814/811/814 808/809/808 819/810/819\nf 814/811/814 819/810/819 820/812/820\nf 830/813/830 822/814/822 801/797/801\nf 830/813/830 801/797/801 829/815/829\nf 839/816/839 838/817/838 841/818/841\nf 839/816/839 841/818/841 840/819/840\nf 838/817/838 839/816/839 848/820/848\nf 838/817/838 848/820/848 847/821/847\nf 842/822/842 838/817/838 847/821/847\nf 842/822/842 847/821/847 849/823/849\nf 847/821/847 848/820/848 859/824/859\nf 847/821/847 859/824/859 850/825/850\nf 849/823/849 847/821/847 850/825/850\nf 849/823/849 850/825/850 851/826/851\nf 852/827/852 845/828/845 842/822/842\nf 852/827/852 842/822/842 849/823/849\nf 845/828/845 852/827/852 854/829/854\nf 845/828/845 854/829/854 853/830/853\nf 852/827/852 873/831/873 871/832/871\nf 852/827/852 871/832/871 854/829/854\nf 863/833/863 825/834/825 840/819/840\nf 863/833/863 840/819/840 841/818/841\nf 863/833/863 841/818/841 843/835/843\nf 863/833/863 843/835/843 844/836/844\nf 843/835/843 862/837/862 864/838/864\nf 843/835/843 864/838/864 844/836/844\nf 857/839/857 855/840/855 883/841/883\nf 857/839/857 883/841/883 884/842/884\nf 856/843/856 857/839/857 884/842/884\nf 856/843/856 884/842/884 1380/844/1380\nf 869/845/869 870/846/870 871/832/871\nf 869/845/869 871/832/871 873/831/873\nf 851/826/851 850/825/850 855/840/855\nf 851/826/851 855/840/855 857/839/857\nf 881/847/881 876/848/876 877/849/877\nf 881/847/881 877/849/877 868/850/868\nf 877/849/877 876/848/876 878/851/878\nf 877/849/877 878/851/878 879/852/879\nf 879/852/879 878/851/878 892/853/892\nf 879/852/879 892/853/892 880/854/880\nf 881/847/881 868/850/868 883/841/883\nf 881/847/881 883/841/883 882/855/882\nf 868/850/868 946/856/946 884/842/884\nf 868/850/868 884/842/884 883/841/883\nf 887/857/887 886/858/886 890/859/890\nf 887/857/887 890/859/890 891/860/891\nf 885/861/885 887/857/887 891/860/891\nf 885/861/885 891/860/891 889/862/889\nf 896/863/896 860/864/860 888/865/888\nf 896/863/896 888/865/888 895/866/895\nf 878/851/878 876/848/876 893/867/893\nf 878/851/878 893/867/893 892/853/892\nf 876/848/876 881/847/881 894/868/894\nf 876/848/876 894/868/894 893/867/893\nf 881/847/881 885/861/885 889/862/889\nf 881/847/881 889/862/889 894/868/894\nf 875/869/875 877/849/877 879/852/879\nf 875/869/875 879/852/879 880/854/880\nf 895/866/895 890/859/890 886/858/886\nf 895/866/895 886/858/886 896/863/896\nf 861/870/861 848/820/848 839/816/839\nf 861/870/861 839/816/839 927/871/927\nf 825/834/825 914/872/914 913/873/913\nf 825/834/825 913/873/913 840/819/840\nf 520/559/520 522/562/522 521/558/521\nf 520/559/520 521/558/521 510/555/510\nf 615/874/615 613/875/613 897/876/897\nf 615/874/615 897/876/897 898/877/898\nf 901/878/901 900/879/900 898/877/898\nf 901/878/901 898/877/898 897/876/897\nf 615/880/615 898/881/898 903/882/903\nf 615/880/615 903/882/903 902/883/902\nf 903/882/903 919/884/919 910/885/910\nf 903/882/903 910/885/910 908/886/908\nf 902/883/902 903/882/903 908/886/908\nf 902/883/902 908/886/908 907/887/907\nf 675/695/675 652/668/652 904/888/904\nf 675/695/675 904/888/904 905/889/905\nf 905/890/905 904/891/904 906/892/906\nf 905/890/905 906/892/906 909/893/909\nf 910/885/910 911/894/911 907/887/907\nf 910/885/910 907/887/907 908/886/908\nf 910/885/910 919/884/919 909/893/909\nf 910/885/910 909/893/909 911/895/911\nf 913/873/913 914/872/914 915/896/915\nf 913/873/913 915/896/915 916/897/916\nf 912/898/912 900/899/900 916/897/916\nf 912/898/912 916/897/916 915/896/915\nf 914/872/914 828/900/828 827/901/827\nf 914/872/914 827/901/827 682/902/682\nf 768/903/768 769/904/769 918/905/918\nf 768/903/768 918/905/918 917/906/917\nf 912/907/912 768/903/768 917/906/917\nf 912/907/912 917/906/917 919/908/919\nf 921/779/921 677/778/677 675/909/675\nf 921/779/921 675/909/675 923/910/923\nf 905/911/905 909/912/909 923/913/923\nf 905/911/905 923/913/923 675/914/675\nf 919/908/919 917/906/917 923/913/923\nf 919/908/919 923/913/923 909/912/909\nf 768/903/768 915/915/915 767/916/767\nf 768/903/768 767/916/767 924/917/924\nf 930/617/930 633/918/633 932/919/932\nf 930/617/930 932/919/932 931/920/931\nf 853/830/853 854/829/854 934/921/934\nf 853/830/853 934/921/934 935/922/935\nf 854/829/854 871/832/871 933/923/933\nf 854/829/854 933/923/933 953/924/953\nf 930/617/930 931/920/931 937/925/937\nf 930/617/930 937/925/937 936/618/936\nf 853/830/853 937/925/937 846/926/846\nf 853/830/853 846/926/846 845/828/845\nf 953/924/953 938/927/938 954/928/954\nf 953/924/953 954/928/954 934/921/934\nf 941/929/941 895/866/895 888/865/888\nf 941/929/941 888/865/888 938/930/938\nf 939/931/939 954/932/954 938/930/938\nf 939/931/939 938/930/938 888/865/888\nf 861/870/861 927/871/927 928/933/928\nf 861/870/861 928/933/928 939/931/939\nf 939/931/939 928/933/928 901/934/901\nf 939/931/939 901/934/901 954/932/954\nf 890/859/890 895/866/895 941/929/941\nf 890/859/890 941/929/941 940/935/940\nf 892/853/892 893/867/893 942/936/942\nf 892/853/892 942/936/942 1151/937/1151\nf 1151/938/1151 942/939/942 944/940/944\nf 1151/938/1151 944/940/944 992/941/992\nf 942/939/942 943/942/943 945/943/945\nf 942/939/942 945/943/945 944/940/944\nf 944/940/944 948/944/948 959/945/959\nf 944/940/944 959/945/959 992/941/992\nf 948/944/948 944/940/944 952/946/952\nf 948/944/948 952/946/952 947/947/947\nf 947/947/947 950/948/950 872/949/872\nf 947/947/947 872/949/872 1380/844/1380\nf 951/950/951 950/948/950 947/947/947\nf 951/950/951 947/947/947 952/946/952\nf 945/943/945 955/951/955 956/952/956\nf 945/943/945 956/952/956 951/950/951\nf 870/846/870 869/845/869 872/949/872\nf 870/846/870 872/949/872 950/948/950\nf 951/950/951 956/952/956 870/846/870\nf 951/950/951 870/846/870 950/948/950\nf 940/953/940 941/954/941 955/951/955\nf 940/953/940 955/951/955 945/943/945\nf 955/951/955 941/954/941 938/927/938\nf 955/951/955 938/927/938 953/924/953\nf 954/928/954 901/955/901 899/956/899\nf 954/928/954 899/956/899 934/921/934\nf 949/957/949 875/869/875 957/958/957\nf 949/957/949 957/958/957 958/959/958\nf 949/957/949 958/959/958 979/960/979\nf 949/957/949 979/960/979 959/945/959\nf 961/961/961 957/958/957 880/854/880\nf 961/961/961 880/854/880 960/962/960\nf 963/963/963 958/959/958 957/958/957\nf 963/963/963 957/958/957 962/964/962\nf 1152/965/1152 964/966/964 960/962/960\nf 1152/965/1152 960/962/960 880/854/880\nf 1077/967/1077 962/964/962 961/961/961\nf 1077/967/1077 961/961/961 1078/968/1078\nf 961/961/961 960/962/960 1115/969/1115\nf 961/961/961 1115/969/1115 1114/970/1114\nf 963/963/963 962/964/962 965/971/965\nf 963/963/963 965/971/965 966/972/966\nf 960/962/960 964/966/964 1154/973/1154\nf 960/962/960 1154/973/1154 1153/974/1153\nf 966/972/966 965/971/965 967/975/967\nf 966/972/966 967/975/967 968/976/968\nf 968/976/968 967/975/967 969/977/969\nf 968/976/968 969/977/969 970/978/970\nf 970/978/970 969/977/969 971/979/971\nf 970/978/970 971/979/971 972/980/972\nf 972/980/972 971/979/971 973/981/973\nf 972/980/972 973/981/973 977/982/977\nf 958/959/958 1042/983/1042 1041/984/1041\nf 958/959/958 1041/984/1041 979/960/979\nf 966/972/966 968/976/968 981/985/981\nf 966/972/966 981/985/981 980/986/980\nf 972/980/972 977/982/977 983/987/983\nf 972/980/972 983/987/983 981/985/981\nf 983/987/983 977/982/977 975/988/975\nf 983/987/983 975/988/975 982/989/982\nf 986/990/986 976/991/976 974/992/974\nf 986/990/986 974/992/974 984/993/984\nf 975/988/975 976/991/976 986/990/986\nf 975/988/975 986/990/986 985/994/985\nf 987/995/987 986/990/986 984/993/984\nf 987/995/987 984/993/984 1036/996/1036\nf 985/994/985 986/990/986 987/995/987\nf 985/994/985 987/995/987 1035/997/1035\nf 979/960/979 1041/984/1041 1052/998/1052\nf 979/960/979 1052/998/1052 988/999/988\nf 992/941/992 959/945/959 979/960/979\nf 992/941/992 979/960/979 988/999/988\nf 608/1000/608 611/1001/611 994/621/994\nf 608/1000/608 994/621/994 993/620/993\nf 995/624/995 994/621/994 611/1001/611\nf 995/624/995 611/1001/611 642/1002/642\nf 1000/1003/1000 816/1004/816 814/811/814\nf 1000/1003/1000 814/811/814 997/1005/997\nf 830/813/830 1010/1006/1010 1009/1007/1009\nf 830/813/830 1009/1007/1009 822/814/822\nf 837/1008/837 832/1009/832 1010/1006/1010\nf 837/1008/837 1010/1006/1010 830/813/830\nf 1003/1010/1003 844/836/844 865/1011/865\nf 1003/1010/1003 865/1011/865 1013/1012/1013\nf 1016/1013/1016 1007/1014/1007 1022/1015/1022\nf 1016/1013/1016 1022/1015/1022 1015/1016/1015\nf 865/1011/865 999/1017/999 1019/1018/1019\nf 865/1011/865 1019/1018/1019 1023/1019/1023\nf 824/1020/824 1012/1021/1012 835/1022/835\nf 824/1020/824 835/1022/835 836/1023/836\nf 1028/1024/1028 1025/1025/1025 973/981/973\nf 1028/1024/1028 973/981/973 971/979/971\nf 1025/1025/1025 1026/1026/1026 974/992/974\nf 1025/1025/1025 974/992/974 973/981/973\nf 1027/1027/1027 1028/1024/1028 967/975/967\nf 1027/1027/1027 967/975/967 965/971/965\nf 1029/1028/1029 1030/1029/1030 983/987/983\nf 1029/1028/1029 983/987/983 982/989/982\nf 1031/1030/1031 1032/1031/1032 1026/1026/1026\nf 1031/1030/1031 1026/1026/1026 1025/1025/1025\nf 1030/1032/1030 1029/1033/1029 1032/1034/1032\nf 1030/1032/1030 1032/1034/1032 1031/1035/1031\nf 1033/1036/1033 1034/1037/1034 1032/1034/1032\nf 1033/1036/1033 1032/1034/1032 1029/1033/1029\nf 1035/1038/1035 1036/1039/1036 1034/1037/1034\nf 1035/1038/1035 1034/1037/1034 1033/1036/1033\nf 1039/1040/1039 1037/1041/1037 1030/1032/1030\nf 1039/1040/1039 1030/1032/1030 1031/1035/1031\nf 1112/1042/1112 1038/1043/1038 1037/1041/1037\nf 1112/1042/1112 1037/1041/1037 1039/1040/1039\nf 1028/1024/1028 1039/1044/1039 1031/1030/1031\nf 1028/1024/1028 1031/1030/1031 1025/1025/1025\nf 1027/1027/1027 1112/1045/1112 1039/1044/1039\nf 1027/1027/1027 1039/1044/1039 1028/1024/1028\nf 1038/1046/1038 980/986/980 981/985/981\nf 1038/1046/1038 981/985/981 1037/1047/1037\nf 1041/984/1041 1042/983/1042 1043/1048/1043\nf 1041/984/1041 1043/1048/1043 1044/1049/1044\nf 1044/1049/1044 1043/1048/1043 1045/1050/1045\nf 1044/1049/1044 1045/1050/1045 1046/1051/1046\nf 1046/1051/1046 1045/1050/1045 1047/1052/1047\nf 1046/1051/1046 1047/1052/1047 1048/1053/1048\nf 1041/984/1041 1044/1049/1044 1053/1054/1053\nf 1041/984/1041 1053/1054/1053 1052/998/1052\nf 1053/1054/1053 1048/1053/1048 1051/1055/1051\nf 1053/1054/1053 1051/1055/1051 1054/1056/1054\nf 1055/1057/1055 1049/1058/1049 1050/1059/1050\nf 1055/1057/1055 1050/1059/1050 1056/1060/1056\nf 1051/1055/1051 1049/1058/1049 1055/1057/1055\nf 1051/1055/1051 1055/1057/1055 1057/1061/1057\nf 1058/1062/1058 1055/1057/1055 1056/1060/1056\nf 1058/1062/1058 1056/1060/1056 1059/1063/1059\nf 1057/1061/1057 1055/1057/1055 1058/1062/1058\nf 1057/1061/1057 1058/1062/1058 1060/1064/1060\nf 1061/1065/1061 1062/1066/1062 1050/1059/1050\nf 1061/1065/1061 1050/1059/1050 1047/1052/1047\nf 978/1067/978 1061/1065/1061 1043/1048/1043\nf 978/1067/978 1043/1048/1043 1042/983/1042\nf 1063/1068/1063 1070/1069/1070 1053/1054/1053\nf 1063/1068/1063 1053/1054/1053 1054/1056/1054\nf 1069/1070/1069 1064/1071/1064 1062/1066/1062\nf 1069/1070/1069 1062/1066/1062 1061/1065/1061\nf 1070/1072/1070 1063/1073/1063 1064/1074/1064\nf 1070/1072/1070 1064/1074/1064 1069/1075/1069\nf 1065/1076/1065 1066/1077/1066 1064/1074/1064\nf 1065/1076/1065 1064/1074/1064 1063/1073/1063\nf 1067/1078/1067 1068/1079/1068 1066/1077/1066\nf 1067/1078/1067 1066/1077/1066 1065/1076/1065\nf 1060/1080/1060 1059/1081/1059 1068/1079/1068\nf 1060/1080/1060 1068/1079/1068 1067/1078/1067\nf 1071/1082/1071 1187/1083/1187 1070/1072/1070\nf 1071/1082/1071 1070/1072/1070 1069/1075/1069\nf 1061/1065/1061 978/1067/978 1071/1084/1071\nf 1061/1065/1061 1071/1084/1071 1069/1070/1069\nf 1187/1085/1187 1052/998/1052 1053/1054/1053\nf 1187/1085/1187 1053/1054/1053 1070/1069/1070\nf 1073/1086/1073 963/963/963 966/972/966\nf 1073/1086/1073 966/972/966 980/986/980\nf 1076/1087/1076 1074/1088/1074 990/1089/990\nf 1076/1087/1076 990/1089/990 1187/1090/1187\nf 1073/1086/1073 980/986/980 1038/1046/1038\nf 1073/1086/1073 1038/1046/1038 1075/1091/1075\nf 1075/1092/1075 1038/1043/1038 1112/1042/1112\nf 1075/1092/1075 1112/1042/1112 1076/1087/1076\nf 981/985/981 983/987/983 1030/1029/1030\nf 981/985/981 1030/1029/1030 1037/1047/1037\nf 1077/967/1077 1078/968/1078 1079/1093/1079\nf 1077/967/1077 1079/1093/1079 1080/1094/1080\nf 1080/1094/1080 1079/1093/1079 1081/1095/1081\nf 1080/1094/1080 1081/1095/1081 1082/1096/1082\nf 1082/1096/1082 1081/1095/1081 1083/1097/1083\nf 1082/1096/1082 1083/1097/1083 1084/1098/1084\nf 1084/1098/1084 1083/1097/1083 1085/1099/1085\nf 1084/1098/1084 1085/1099/1085 1086/1100/1086\nf 1077/967/1077 1080/1094/1080 1091/1101/1091\nf 1077/967/1077 1091/1101/1091 1090/1102/1090\nf 1084/1098/1084 1086/1100/1086 1092/1103/1092\nf 1084/1098/1084 1092/1103/1092 1091/1101/1091\nf 1092/1103/1092 1086/1100/1086 1089/1104/1089\nf 1092/1103/1092 1089/1104/1089 1093/1105/1093\nf 1094/1106/1094 1087/1107/1087 1088/1108/1088\nf 1094/1106/1094 1088/1108/1088 1095/1109/1095\nf 1089/1104/1089 1087/1107/1087 1094/1106/1094\nf 1089/1104/1089 1094/1106/1094 1096/1110/1096\nf 1097/1111/1097 1094/1106/1094 1095/1109/1095\nf 1097/1111/1097 1095/1109/1095 1098/1112/1098\nf 1096/1110/1096 1094/1106/1094 1097/1111/1097\nf 1096/1110/1096 1097/1111/1097 1099/1113/1099\nf 1100/1114/1100 1101/1115/1101 1085/1099/1085\nf 1100/1114/1100 1085/1099/1085 1083/1097/1083\nf 1101/1115/1101 1102/1116/1102 1088/1108/1088\nf 1101/1115/1101 1088/1108/1088 1085/1099/1085\nf 1103/1117/1103 1100/1114/1100 1079/1093/1079\nf 1103/1117/1103 1079/1093/1079 1078/968/1078\nf 1093/1105/1093 1104/1118/1104 1105/1119/1105\nf 1093/1105/1093 1105/1119/1105 1092/1103/1092\nf 1106/1120/1106 1107/1121/1107 1102/1116/1102\nf 1106/1120/1106 1102/1116/1102 1101/1115/1101\nf 1105/1122/1105 1104/1123/1104 1107/1124/1107\nf 1105/1122/1105 1107/1124/1107 1106/1125/1106\nf 1108/1126/1108 1109/1127/1109 1107/1124/1107\nf 1108/1126/1108 1107/1124/1107 1104/1123/1104\nf 1099/1128/1099 1098/1129/1098 1109/1127/1109\nf 1099/1128/1099 1109/1127/1109 1108/1126/1108\nf 1110/1130/1110 1111/1131/1111 1105/1122/1105\nf 1110/1130/1110 1105/1122/1105 1106/1125/1106\nf 1148/1132/1148 1112/1042/1112 1111/1131/1111\nf 1148/1132/1148 1111/1131/1111 1110/1130/1110\nf 1100/1114/1100 1110/1133/1110 1106/1120/1106\nf 1100/1114/1100 1106/1120/1106 1101/1115/1101\nf 1103/1117/1103 1148/1134/1148 1110/1133/1110\nf 1103/1117/1103 1110/1133/1110 1100/1114/1100\nf 1112/1045/1112 1090/1102/1090 1091/1101/1091\nf 1112/1045/1112 1091/1101/1091 1111/1135/1111\nf 1091/1101/1091 1092/1103/1092 1105/1119/1105\nf 1091/1101/1091 1105/1119/1105 1111/1135/1111\nf 1077/967/1077 1090/1102/1090 1027/1027/1027\nf 1077/967/1077 1027/1027/1027 965/971/965\nf 1114/970/1114 1115/969/1115 1116/1136/1116\nf 1114/970/1114 1116/1136/1116 1117/1137/1117\nf 1117/1137/1117 1116/1136/1116 1118/1138/1118\nf 1117/1137/1117 1118/1138/1118 1119/1139/1119\nf 1119/1139/1119 1118/1138/1118 1120/1140/1120\nf 1119/1139/1119 1120/1140/1120 1121/1141/1121\nf 1121/1141/1121 1120/1140/1120 1122/1142/1122\nf 1121/1141/1121 1122/1142/1122 1123/1143/1123\nf 1114/970/1114 1117/1137/1117 1128/1144/1128\nf 1114/970/1114 1128/1144/1128 1127/1145/1127\nf 1121/1141/1121 1123/1143/1123 1129/1146/1129\nf 1121/1141/1121 1129/1146/1129 1128/1144/1128\nf 1129/1146/1129 1123/1143/1123 1126/1147/1126\nf 1129/1146/1129 1126/1147/1126 1130/1148/1130\nf 1131/1149/1131 1124/1150/1124 1125/1151/1125\nf 1131/1149/1131 1125/1151/1125 1132/1152/1132\nf 1126/1147/1126 1124/1150/1124 1131/1149/1131\nf 1126/1147/1126 1131/1149/1131 1133/1153/1133\nf 1135/1154/1135 1136/1155/1136 1122/1142/1122\nf 1135/1154/1135 1122/1142/1122 1120/1140/1120\nf 1136/1155/1136 1137/1156/1137 1125/1151/1125\nf 1136/1155/1136 1125/1151/1125 1122/1142/1122\nf 1138/1157/1138 1135/1154/1135 1116/1136/1116\nf 1138/1157/1138 1116/1136/1116 1115/969/1115\nf 1139/1158/1139 1140/1159/1140 1129/1146/1129\nf 1139/1158/1139 1129/1146/1129 1130/1148/1130\nf 1141/1160/1141 1142/1161/1142 1137/1156/1137\nf 1141/1160/1141 1137/1156/1137 1136/1155/1136\nf 1140/1162/1140 1139/1163/1139 1142/1164/1142\nf 1140/1162/1140 1142/1164/1142 1141/1165/1141\nf 1143/1166/1143 1144/1167/1144 1142/1164/1142\nf 1143/1166/1143 1142/1164/1142 1139/1163/1139\nf 1145/1168/1145 1146/1169/1146 1140/1162/1140\nf 1145/1168/1145 1140/1162/1140 1141/1165/1141\nf 1147/1170/1147 1148/1171/1148 1146/1169/1146\nf 1147/1170/1147 1146/1169/1146 1145/1168/1145\nf 1135/1154/1135 1145/1172/1145 1141/1160/1141\nf 1135/1154/1135 1141/1160/1141 1136/1155/1136\nf 1138/1157/1138 1147/1173/1147 1145/1172/1145\nf 1138/1157/1138 1145/1172/1145 1135/1154/1135\nf 1148/1134/1148 1127/1145/1127 1128/1144/1128\nf 1148/1134/1148 1128/1144/1128 1146/1174/1146\nf 1128/1144/1128 1129/1146/1129 1140/1159/1140\nf 1128/1144/1128 1140/1159/1140 1146/1174/1146\nf 1103/1117/1103 1078/968/1078 1114/970/1114\nf 1103/1117/1103 1114/970/1114 1127/1145/1127\nf 1148/1132/1148 1074/1088/1074 1076/1087/1076\nf 1148/1132/1148 1076/1087/1076 1112/1042/1112\nf 1150/1175/1150 1149/1176/1149 989/1177/989\nf 1150/1175/1150 989/1177/989 1074/1178/1074\nf 1149/1179/1149 1152/965/1152 892/853/892\nf 1149/1179/1149 892/853/892 1151/937/1151\nf 964/966/964 1152/965/1152 1149/1179/1149\nf 964/966/964 1149/1179/1149 1150/1180/1150\nf 606/659/606 638/658/638 603/1181/603\nf 606/659/606 603/1181/603 936/1182/936\nf 1153/974/1153 1154/973/1154 1155/1183/1155\nf 1153/974/1153 1155/1183/1155 1156/1184/1156\nf 1156/1184/1156 1155/1183/1155 1157/1185/1157\nf 1156/1184/1156 1157/1185/1157 1158/1186/1158\nf 1158/1186/1158 1157/1185/1157 1159/1187/1159\nf 1158/1186/1158 1159/1187/1159 1160/1188/1160\nf 1160/1188/1160 1159/1187/1159 1161/1189/1161\nf 1160/1188/1160 1161/1189/1161 1162/1190/1162\nf 1153/974/1153 1156/1184/1156 1167/1191/1167\nf 1153/974/1153 1167/1191/1167 1166/1192/1166\nf 1160/1188/1160 1162/1190/1162 1168/1193/1168\nf 1160/1188/1160 1168/1193/1168 1167/1191/1167\nf 1168/1193/1168 1162/1190/1162 1165/1194/1165\nf 1168/1193/1168 1165/1194/1165 1169/1195/1169\nf 1170/1196/1170 1163/1197/1163 1164/1198/1164\nf 1170/1196/1170 1164/1198/1164 1171/1199/1171\nf 1165/1194/1165 1163/1197/1163 1170/1196/1170\nf 1165/1194/1165 1170/1196/1170 1172/1200/1172\nf 1174/1201/1174 1175/1202/1175 1161/1189/1161\nf 1174/1201/1174 1161/1189/1161 1159/1187/1159\nf 1175/1202/1175 1176/1203/1176 1164/1198/1164\nf 1175/1202/1175 1164/1198/1164 1161/1189/1161\nf 1177/1204/1177 1174/1201/1174 1155/1183/1155\nf 1177/1204/1177 1155/1183/1155 1154/973/1154\nf 1178/1205/1178 1179/1206/1179 1168/1193/1168\nf 1178/1205/1178 1168/1193/1168 1169/1195/1169\nf 1180/1207/1180 1181/1208/1181 1176/1203/1176\nf 1180/1207/1180 1176/1203/1176 1175/1202/1175\nf 1179/1209/1179 1178/1210/1178 1181/1211/1181\nf 1179/1209/1179 1181/1211/1181 1180/1212/1180\nf 1182/1213/1182 1183/1214/1183 1181/1211/1181\nf 1182/1213/1182 1181/1211/1181 1178/1210/1178\nf 1184/1215/1184 1185/1216/1185 1179/1209/1179\nf 1184/1215/1184 1179/1209/1179 1180/1212/1180\nf 1186/1217/1186 1147/1170/1147 1185/1216/1185\nf 1186/1217/1186 1185/1216/1185 1184/1215/1184\nf 1174/1201/1174 1184/1218/1184 1180/1207/1180\nf 1174/1201/1174 1180/1207/1180 1175/1202/1175\nf 1177/1204/1177 1186/1219/1186 1184/1218/1184\nf 1177/1204/1177 1184/1218/1184 1174/1201/1174\nf 1147/1173/1147 1166/1192/1166 1167/1191/1167\nf 1147/1173/1147 1167/1191/1167 1185/1220/1185\nf 1167/1191/1167 1168/1193/1168 1179/1206/1179\nf 1167/1191/1167 1179/1206/1179 1185/1220/1185\nf 1138/1157/1138 1115/969/1115 1153/974/1153\nf 1138/1157/1138 1153/974/1153 1166/1192/1166\nf 1074/1178/1074 1148/1171/1148 1147/1170/1147\nf 1074/1178/1074 1147/1170/1147 1186/1217/1186\nf 1177/1204/1177 964/966/964 1150/1180/1150\nf 1177/1204/1177 1150/1180/1150 1186/1219/1186\nf 963/963/963 1073/1086/1073 978/1067/978\nf 963/963/963 978/1067/978 1042/983/1042\nf 1075/1091/1075 1071/1084/1071 978/1067/978\nf 1075/1091/1075 978/1067/978 1073/1086/1073\nf 807/808/807 1189/1221/1189 1197/1222/1197\nf 807/808/807 1197/1222/1197 809/806/809\nf 1195/1223/1195 1196/1224/1196 1190/1225/1190\nf 1195/1223/1195 1190/1225/1190 1192/1226/1192\nf 812/1227/812 562/1228/562 1192/1226/1192\nf 812/1227/812 1192/1226/1192 1190/1225/1190\nf 1194/1229/1194 1193/1230/1193 1188/1231/1188\nf 1194/1229/1194 1188/1231/1188 1191/1232/1191\nf 1195/1223/1195 1191/1232/1191 1188/1231/1188\nf 1195/1223/1195 1188/1231/1188 1189/1221/1189\nf 1196/1224/1196 1195/1223/1195 1189/1221/1189\nf 1196/1224/1196 1189/1221/1189 807/808/807\nf 1200/1233/1200 1331/1234/1331 783/1235/783\nf 1200/1233/1200 783/1235/783 784/1236/784\nf 1202/1237/1202 1203/1238/1203 1204/1239/1204\nf 1202/1237/1202 1204/1239/1204 1201/1240/1201\nf 1206/1241/1206 1207/1242/1207 1205/1243/1205\nf 1206/1241/1206 1205/1243/1205 1201/1240/1201\nf 1206/1241/1206 1208/1244/1208 1209/1245/1209\nf 1206/1241/1206 1209/1245/1209 1207/1242/1207\nf 1211/1246/1211 1210/1247/1210 1202/1237/1202\nf 1211/1246/1211 1202/1237/1202 1205/1243/1205\nf 1212/1248/1212 1211/1246/1211 1205/1243/1205\nf 1212/1248/1212 1205/1243/1205 1207/1242/1207\nf 1209/1245/1209 1213/1249/1213 1212/1248/1212\nf 1209/1245/1209 1212/1248/1212 1207/1242/1207\nf 1202/1237/1202 1210/1247/1210 786/1250/786\nf 1202/1237/1202 786/1250/786 1203/1238/1203\nf 784/1251/784 1223/1252/1223 1214/1253/1214\nf 784/1251/784 1214/1253/1214 1200/1254/1200\nf 1218/1255/1218 1219/1256/1219 1217/1257/1217\nf 1218/1255/1218 1217/1257/1217 1216/1258/1216\nf 1219/1256/1219 1222/1259/1222 1215/1260/1215\nf 1219/1256/1219 1215/1260/1215 1217/1257/1217\nf 1222/1259/1222 1221/1261/1221 1214/1253/1214\nf 1222/1259/1222 1214/1253/1214 1215/1260/1215\nf 1221/1261/1221 1220/1262/1220 1200/1254/1200\nf 1221/1261/1221 1200/1254/1200 1214/1253/1214\nf 1215/1260/1215 1223/1252/1223 1211/1263/1211\nf 1215/1260/1215 1211/1263/1211 1212/1264/1212\nf 1206/1241/1206 1201/1240/1201 1225/1265/1225\nf 1206/1241/1206 1225/1265/1225 1226/1266/1226\nf 1206/1241/1206 1226/1266/1226 1218/1255/1218\nf 1206/1241/1206 1218/1255/1218 1208/1244/1208\nf 1228/1267/1228 1229/1268/1229 1198/1269/1198\nf 1228/1267/1228 1198/1269/1198 1193/1230/1193\nf 1233/1270/1233 1250/1271/1250 1248/1272/1248\nf 1233/1270/1233 1248/1272/1248 1231/1273/1231\nf 1235/1274/1235 1236/1275/1236 1232/1276/1232\nf 1235/1274/1235 1232/1276/1232 1252/1277/1252\nf 1230/1278/1230 1237/1279/1237 1229/1280/1229\nf 1230/1278/1230 1229/1280/1229 1228/1281/1228\nf 1238/1282/1238 1362/1283/1362 1237/1279/1237\nf 1238/1282/1238 1237/1279/1237 1230/1278/1230\nf 1242/1284/1242 1241/1285/1241 1253/1286/1253\nf 1242/1284/1242 1253/1286/1253 1234/1287/1234\nf 1248/1272/1248 1250/1271/1250 1251/1288/1251\nf 1248/1272/1248 1251/1288/1251 1232/1276/1232\nf 1236/1275/1236 1249/1289/1249 1248/1272/1248\nf 1236/1275/1236 1248/1272/1248 1232/1276/1232\nf 1251/1288/1251 1250/1271/1250 1247/1290/1247\nf 1251/1288/1251 1247/1290/1247 1234/1287/1234\nf 1252/1277/1252 1251/1288/1251 1234/1287/1234\nf 1252/1277/1252 1234/1287/1234 1253/1286/1253\nf 1254/1291/1254 1241/1285/1241 1242/1284/1242\nf 1254/1291/1254 1242/1284/1242 1239/1292/1239\nf 1261/1293/1261 1254/1291/1254 1239/1292/1239\nf 1261/1293/1261 1239/1292/1239 1260/1294/1260\nf 1282/1295/1282 1259/1296/1259 1260/1294/1260\nf 1282/1295/1282 1260/1294/1260 1239/1292/1239\nf 1259/1296/1259 1265/28/1265 1255/27/1255\nf 1259/1296/1259 1255/27/1255 1260/1294/1260\nf 1256/29/1256 1261/1293/1261 1260/1294/1260\nf 1256/29/1256 1260/1294/1260 1255/27/1255\nf 1263/1297/1263 1262/33/1262 1258/32/1258\nf 1263/1297/1263 1258/32/1258 1264/1298/1264\nf 1258/32/1258 1265/28/1265 1259/1296/1259\nf 1258/32/1258 1259/1296/1259 1264/1298/1264\nf 34/34/34 1267/1299/1267 1261/1293/1261\nf 34/34/34 1261/1293/1261 1256/29/1256\nf 1267/1299/1267 1266/1300/1266 1254/1291/1254\nf 1267/1299/1267 1254/1291/1254 1261/1293/1261\nf 1269/1301/1269 1270/1302/1270 1267/1299/1267\nf 1269/1301/1269 1267/1299/1267 34/34/34\nf 1267/1299/1267 1270/1302/1270 1268/1303/1268\nf 1267/1299/1267 1268/1303/1268 1266/1300/1266\nf 1272/1304/1272 1273/1305/1273 1270/1302/1270\nf 1272/1304/1272 1270/1302/1270 1269/1301/1269\nf 1273/1305/1273 1271/1306/1271 1268/1303/1268\nf 1273/1305/1273 1268/1303/1268 1270/1302/1270\nf 43/43/43 1274/1307/1274 1272/1304/1272\nf 43/43/43 1272/1304/1272 1269/1301/1269\nf 1203/1308/1203 1275/1309/1275 1276/1310/1276\nf 1203/1308/1203 1276/1310/1276 1204/1311/1204\nf 1277/1312/1277 1304/1313/1304 1236/1275/1236\nf 1277/1312/1277 1236/1275/1236 1235/1274/1235\nf 1273/1305/1273 1277/1312/1277 1235/1274/1235\nf 1273/1305/1273 1235/1274/1235 1271/1306/1271\nf 1329/1314/1329 1277/1312/1277 1272/1304/1272\nf 1329/1314/1329 1272/1304/1272 1274/1307/1274\nf 1244/1315/1244 1243/1316/1243 1245/1317/1245\nf 1244/1315/1244 1245/1317/1245 1246/1318/1246\nf 1278/1319/1278 1244/1315/1244 1246/1318/1246\nf 1278/1319/1278 1246/1318/1246 1280/53/1280\nf 1283/1320/1283 1282/1295/1282 1239/1292/1239\nf 1283/1320/1283 1239/1292/1239 1242/1284/1242\nf 1284/1321/1284 1283/1320/1283 1242/1284/1242\nf 1284/1321/1284 1242/1284/1242 1257/1322/1257\nf 1287/1323/1287 1288/1324/1288 1283/1320/1283\nf 1287/1323/1287 1283/1320/1283 1284/1321/1284\nf 1282/1295/1282 1283/1320/1283 1288/1324/1288\nf 1282/1295/1282 1288/1324/1288 1290/1325/1290\nf 1244/1315/1244 1278/1319/1278 1279/1326/1279\nf 1244/1315/1244 1279/1326/1279 1285/1327/1285\nf 1278/1319/1278 1291/1328/1291 1263/1297/1263\nf 1278/1319/1278 1263/1297/1263 1279/1326/1279\nf 1325/1329/1325 1306/1330/1306 1304/1313/1304\nf 1325/1329/1325 1304/1313/1304 1277/1312/1277\nf 1292/1331/1292 1330/1332/1330 1204/1311/1204\nf 1292/1331/1292 1204/1311/1204 1276/1310/1276\nf 1295/1333/1295 1293/1334/1293 1436/1335/1436\nf 1295/1333/1295 1436/1335/1436 1437/1336/1437\nf 1438/1337/1438 1297/1338/1297 1295/1333/1295\nf 1438/1337/1438 1295/1333/1295 1437/1336/1437\nf 1298/1339/1298 1301/1340/1301 1302/1341/1302\nf 1298/1339/1298 1302/1341/1302 1299/1342/1299\nf 1300/1343/1300 1302/1341/1302 1301/1340/1301\nf 1300/1343/1300 1301/1340/1301 1352/1344/1352\nf 1295/1333/1295 1305/1345/1305 1303/1346/1303\nf 1295/1333/1295 1303/1346/1303 1293/1334/1293\nf 1299/1342/1299 1354/1347/1354 1305/1345/1305\nf 1299/1342/1299 1305/1345/1305 1297/1338/1297\nf 1300/1343/1300 1307/1348/1307 1308/1349/1308\nf 1300/1343/1300 1308/1349/1308 1302/1341/1302\nf 1302/1341/1302 1308/1349/1308 1354/1347/1354\nf 1302/1341/1302 1354/1347/1354 1299/1342/1299\nf 1310/1350/1310 1309/1351/1309 1204/1352/1204\nf 1310/1350/1310 1204/1352/1204 1311/1353/1311\nf 1313/1354/1313 1312/1355/1312 1309/1351/1309\nf 1313/1354/1313 1309/1351/1309 1310/1350/1310\nf 1315/1356/1315 1316/1357/1316 1310/1350/1310\nf 1315/1356/1315 1310/1350/1310 1311/1353/1311\nf 1316/1357/1316 1317/1358/1317 1313/1354/1313\nf 1316/1357/1316 1313/1354/1313 1310/1350/1310\nf 1326/1359/1326 1319/1360/1319 1316/1357/1316\nf 1326/1359/1326 1316/1357/1316 1315/1356/1315\nf 1316/1357/1316 1319/1360/1319 1322/1361/1322\nf 1316/1357/1316 1322/1361/1322 1317/1358/1317\nf 1326/1359/1326 1320/1362/1320 1321/1363/1321\nf 1326/1359/1326 1321/1363/1321 1319/1360/1319\nf 1323/1364/1323 1312/1355/1312 1313/1354/1313\nf 1323/1364/1323 1313/1354/1313 1324/1365/1324\nf 1317/1358/1317 1318/1366/1318 1324/1365/1324\nf 1317/1358/1317 1324/1365/1324 1313/1354/1313\nf 1325/1367/1325 1328/1368/1328 1315/1356/1315\nf 1325/1367/1325 1315/1356/1315 1311/1353/1311\nf 1332/1369/1332 1331/1234/1331 1220/1370/1220\nf 1332/1369/1332 1220/1370/1220 1224/1371/1224\nf 106/1372/106 1332/1369/1332 1224/1371/1224\nf 106/1372/106 1224/1371/1224 1327/1373/1327\nf 1333/1374/1333 1334/1375/1334 1335/1376/1335\nf 1333/1374/1333 1335/1376/1335 1338/1377/1338\nf 109/65/109 1334/1375/1334 1274/1307/1274\nf 109/65/109 1274/1307/1274 43/43/43\nf 1315/1356/1315 1328/1368/1328 1327/1378/1327\nf 1315/1356/1315 1327/1378/1327 1326/1359/1326\nf 1333/1374/1333 1338/1377/1338 1337/1379/1337\nf 1333/1374/1333 1337/1379/1337 1336/1380/1336\nf 100/1381/100 1339/1382/1339 1340/1383/1340\nf 100/1381/100 1340/1383/1340 99/1384/99\nf 1339/1382/1339 1341/1385/1341 1342/1386/1342\nf 1339/1382/1339 1342/1386/1342 1340/1383/1340\nf 1339/1382/1339 100/1381/100 106/1387/106\nf 1339/1382/1339 106/1387/106 1337/1388/1337\nf 101/111/101 1341/1385/1341 1335/1389/1335\nf 101/111/101 1335/1389/1335 109/112/109\nf 1341/1385/1341 1339/1382/1339 1337/1388/1337\nf 1341/1385/1341 1337/1388/1337 1338/1390/1338\nf 1344/1391/1344 1240/1392/1240 1343/1393/1343\nf 1344/1391/1344 1343/1393/1343 1271/1306/1271\nf 1346/1394/1346 1345/1395/1345 1198/1396/1198\nf 1346/1394/1346 1198/1396/1198 1229/1397/1229\nf 1197/1398/1197 1345/1399/1345 1294/1400/1294\nf 1197/1398/1197 1294/1400/1294 1275/1401/1275\nf 1350/1402/1350 1296/1403/1296 1347/1404/1347\nf 1350/1402/1350 1347/1404/1347 1348/1405/1348\nf 1346/1394/1346 1229/1397/1229 1249/1406/1249\nf 1346/1394/1346 1249/1406/1249 1439/1407/1439\nf 1442/1408/1442 1440/1409/1440 1348/1405/1348\nf 1442/1408/1442 1348/1405/1348 1443/1410/1443\nf 1301/1411/1301 1298/1412/1298 1350/1402/1350\nf 1301/1411/1301 1350/1402/1350 1351/1413/1351\nf 1353/1414/1353 1352/1415/1352 1301/1411/1301\nf 1353/1414/1353 1301/1411/1301 1351/1413/1351\nf 1351/1413/1351 1308/1349/1308 1307/1348/1307\nf 1351/1413/1351 1307/1348/1307 1353/1414/1353\nf 1441/1416/1441 1308/1349/1308 1351/1413/1351\nf 1441/1416/1441 1351/1413/1351 1350/1402/1350\nf 1440/1409/1440 1441/1416/1441 1350/1402/1350\nf 1440/1409/1440 1350/1402/1350 1348/1405/1348\nf 1356/1417/1356 1357/1418/1357 1194/1229/1194\nf 1356/1417/1356 1194/1229/1194 1191/1232/1191\nf 90/1419/90 1358/1420/1358 1194/1229/1194\nf 90/1419/90 1194/1229/1194 1357/1418/1357\nf 1359/1421/1359 1360/1422/1360 1362/1283/1362\nf 1359/1421/1359 1362/1283/1362 1238/1282/1238\nf 1362/1283/1362 1363/1423/1363 1245/1317/1245\nf 1362/1283/1362 1245/1317/1245 1233/1270/1233\nf 1363/1423/1363 1364/1424/1364 1246/1318/1246\nf 1363/1423/1363 1246/1318/1246 1245/1317/1245\nf 1364/1424/1364 74/75/74 1280/53/1280\nf 1364/1424/1364 1280/53/1280 1246/1318/1246\nf 1366/1425/1366 1365/1426/1365 1364/1424/1364\nf 1366/1425/1366 1364/1424/1364 1363/1423/1363\nf 1365/1426/1365 77/78/77 74/75/74\nf 1365/1426/1365 74/75/74 1364/1424/1364\nf 1366/1425/1366 1367/1427/1367 1372/1428/1372\nf 1366/1425/1366 1372/1428/1372 1365/1426/1365\nf 1371/1429/1371 1368/1430/1368 1369/1431/1369\nf 1371/1429/1371 1369/1431/1369 1370/1432/1370\nf 1373/1433/1373 1372/1428/1372 1374/1434/1374\nf 1373/1433/1373 1374/1434/1374 1375/1435/1375\nf 1372/1428/1372 1373/1433/1373 88/89/88\nf 1372/1428/1372 88/89/88 80/88/80\nf 1374/1434/1374 1367/1427/1367 1370/1432/1370\nf 1374/1434/1374 1370/1432/1370 1369/1431/1369\nf 1376/1436/1376 1358/1437/1358 90/1438/90\nf 1376/1436/1376 90/1438/90 91/1439/91\nf 1376/1436/1376 91/1439/91 93/1440/93\nf 1376/1436/1376 93/1440/93 1375/1441/1375\nf 1368/1442/1368 1376/1436/1376 1377/1443/1377\nf 1368/1442/1368 1377/1443/1377 1369/1444/1369\nf 95/1445/95 1378/1446/1378 1375/1441/1375\nf 95/1445/95 1375/1441/1375 93/1440/93\nf 1373/1433/1373 1378/1447/1378 96/101/96\nf 1373/1433/1373 96/101/96 88/89/88\nf 948/944/948 1379/1448/1379 949/957/949\nf 948/944/948 949/957/949 959/945/959\nf 947/947/947 1380/844/1380 1379/1448/1379\nf 947/947/947 1379/1448/1379 948/944/948\nf 1381/1449/1381 1382/1450/1382 1383/1451/1383\nf 1381/1449/1381 1383/1451/1383 1384/1452/1384\nf 1382/1450/1382 438/1453/438 439/1454/439\nf 1382/1450/1382 439/1454/439 1383/1451/1383\nf 1382/1450/1382 1385/1455/1385 444/1456/444\nf 1382/1450/1382 444/1456/444 438/1453/438\nf 1382/1450/1382 1381/1449/1381 1386/1457/1386\nf 1382/1450/1382 1386/1457/1386 1385/1455/1385\nf 1386/1457/1386 1387/1458/1387 1388/1459/1388\nf 1386/1457/1386 1388/1459/1388 1385/1455/1385\nf 1388/1459/1388 445/1460/445 444/1456/444\nf 1388/1459/1388 444/1456/444 1385/1455/1385\nf 439/1454/439 1389/1461/1389 1390/1462/1390\nf 439/1454/439 1390/1462/1390 1383/1451/1383\nf 1390/1462/1390 1391/1463/1391 1384/1452/1384\nf 1390/1462/1390 1384/1452/1384 1383/1451/1383\nf 1389/1461/1389 1392/1464/1392 1393/1465/1393\nf 1389/1461/1389 1393/1465/1393 1390/1462/1390\nf 550/1466/550 445/1460/445 1398/1467/1398\nf 550/1466/550 1398/1467/1398 1397/1468/1397\nf 1397/1468/1397 1401/1469/1401 1402/1470/1402\nf 1397/1468/1397 1402/1470/1402 1395/1471/1395\nf 1396/1472/1396 1395/1471/1395 1402/1470/1402\nf 1396/1472/1396 1402/1470/1402 1404/1473/1404\nf 561/1474/561 595/1475/595 1411/1476/1411\nf 561/1474/561 1411/1476/1411 1412/1477/1412\nf 1404/1473/1404 1417/1478/1417 1416/1479/1416\nf 1404/1473/1404 1416/1479/1416 1405/1480/1405\nf 1418/1481/1418 1410/1482/1410 1409/1483/1409\nf 1418/1481/1418 1409/1483/1409 1417/1478/1417\nf 1409/1483/1409 1394/1484/1394 1405/1480/1405\nf 1409/1483/1409 1405/1480/1405 1416/1479/1416\nf 1421/1485/1421 1422/1486/1422 1423/1487/1423\nf 1421/1485/1421 1423/1487/1423 1424/1488/1424\nf 1425/1489/1425 1426/1490/1426 1427/1491/1427\nf 1425/1489/1425 1427/1491/1427 1421/1485/1421\nf 1422/1486/1422 1427/1491/1427 1428/1492/1428\nf 1422/1486/1422 1428/1492/1428 1423/1487/1423\nf 1429/1493/1429 1415/1494/1415 1420/1495/1420\nf 1429/1493/1429 1420/1495/1420 1419/1496/1419\nf 1412/1477/1412 1430/1497/1430 740/1498/740\nf 1412/1477/1412 740/1498/740 561/1474/561\nf 1412/1477/1412 1411/1476/1411 1415/1494/1415\nf 1412/1477/1412 1415/1494/1415 1429/1493/1429\nf 1411/1476/1411 745/1499/745 1410/1482/1410\nf 1411/1476/1411 1410/1482/1410 1413/1500/1413\nf 1434/1501/1434 111/1502/111 108/67/108\nf 1434/1501/1434 108/67/108 65/66/65\nf 1434/1501/1434 1435/1503/1435 107/1504/107\nf 1434/1501/1434 107/1504/107 111/1502/111\nf 1437/1336/1437 1436/1335/1436 1294/1400/1294\nf 1437/1336/1437 1294/1400/1294 1347/1505/1347\nf 1296/1506/1296 1438/1337/1438 1437/1336/1437\nf 1296/1506/1296 1437/1336/1437 1347/1505/1347\nf 1303/1346/1303 1439/1407/1439 1249/1406/1249\nf 1303/1346/1303 1249/1406/1249 1304/1507/1304\nf 1354/1347/1354 1441/1416/1441 1440/1409/1440\nf 1354/1347/1354 1440/1409/1440 1305/1345/1305\nf 1447/1508/1447 1449/1509/1449 1450/1510/1450\nf 1447/1508/1447 1450/1510/1450 1448/1511/1448\nf 1529/1512/1529 1531/1513/1531 1450/1510/1450\nf 1529/1512/1529 1450/1510/1450 1461/1514/1461\nf 1452/1515/1452 1453/1516/1453 1449/1509/1449\nf 1452/1515/1452 1449/1509/1449 1447/1508/1447\nf 1481/1517/1481 1509/1518/1509 1453/1516/1453\nf 1481/1517/1481 1453/1516/1453 1452/1515/1452\nf 1448/1511/1448 1464/1519/1464 1463/1520/1463\nf 1448/1511/1448 1463/1520/1463 1462/1521/1462\nf 1462/1521/1462 1465/1522/1465 1467/1523/1467\nf 1462/1521/1462 1467/1523/1467 1455/1524/1455\nf 1474/1525/1474 1475/1526/1475 1472/1527/1472\nf 1474/1525/1474 1472/1527/1472 1473/1528/1473\nf 1455/1524/1455 1467/1523/1467 1476/1529/1476\nf 1455/1524/1455 1476/1529/1476 1479/1530/1479\nf 1478/1531/1478 1480/1532/1480 1479/1530/1479\nf 1478/1531/1478 1479/1530/1479 1476/1529/1476\nf 1474/1525/1474 1471/1533/1471 1492/1534/1492\nf 1474/1525/1474 1492/1534/1492 1470/1535/1470\nf 1466/1536/1466 1484/1537/1484 1485/1538/1485\nf 1466/1536/1466 1485/1538/1485 1469/1539/1469\nf 1469/1539/1469 1485/1538/1485 1486/1540/1486\nf 1469/1539/1469 1486/1540/1486 1492/1534/1492\nf 1487/1541/1487 1490/1542/1490 1494/1543/1494\nf 1487/1541/1487 1494/1543/1494 1488/1544/1488\nf 1492/1534/1492 1494/1543/1494 1495/1545/1495\nf 1492/1534/1492 1495/1545/1495 1493/1546/1493\nf 1478/1531/1478 1513/1547/1513 1497/1548/1497\nf 1478/1531/1478 1497/1548/1497 1480/1532/1480\nf 1488/1544/1488 1494/1543/1494 1492/1534/1492\nf 1488/1544/1488 1492/1534/1492 1486/1540/1486\nf 1502/1549/1502 1504/1550/1504 1503/1551/1503\nf 1502/1549/1502 1503/1551/1503 1496/1552/1496\nf 1506/1553/1506 1508/1554/1508 1526/1555/1526\nf 1506/1553/1506 1526/1555/1526 1525/1556/1525\nf 1524/1557/1524 1523/1558/1523 1509/1518/1509\nf 1524/1557/1524 1509/1518/1509 1483/1559/1483\nf 1451/1560/1451 1450/1510/1450 1458/1561/1458\nf 1451/1560/1451 1458/1561/1458 1514/1562/1514\nf 1460/1563/1460 1518/1564/1518 1519/1565/1519\nf 1460/1563/1460 1519/1565/1519 1514/1562/1514\nf 1514/1562/1514 1519/1565/1519 1517/1566/1517\nf 1514/1562/1514 1517/1566/1517 1451/1560/1451\nf 1516/1567/1516 1520/1568/1520 1529/1512/1529\nf 1516/1567/1516 1529/1512/1529 1461/1514/1461\nf 1521/1569/1521 1507/1570/1507 1522/1571/1522\nf 1521/1569/1521 1522/1571/1522 1536/1572/1536\nf 1507/1570/1507 1521/1569/1521 1525/1556/1525\nf 1507/1570/1507 1525/1556/1525 1526/1555/1526\nf 1464/1519/1464 1531/1513/1531 1532/1573/1532\nf 1464/1519/1464 1532/1573/1532 1542/1574/1542\nf 1534/1575/1534 1533/1576/1533 1481/1517/1481\nf 1534/1575/1534 1481/1517/1481 1482/1577/1482\nf 1535/1578/1535 1534/1575/1534 1480/1532/1480\nf 1535/1578/1535 1480/1532/1480 1497/1548/1497\nf 1535/1579/1535 1497/1580/1497 1510/1581/1510\nf 1535/1579/1535 1510/1581/1510 1559/1582/1559\nf 1521/1569/1521 1538/1583/1538 1393/1584/1393\nf 1521/1569/1521 1393/1584/1393 1525/1556/1525\nf 1539/1585/1539 1568/1586/1568 1569/1587/1569\nf 1539/1585/1539 1569/1587/1569 1544/1588/1544\nf 1540/1589/1540 1538/1583/1538 1539/1585/1539\nf 1540/1589/1540 1539/1585/1539 1541/1590/1541\nf 1541/1591/1541 1464/1519/1464 1542/1574/1542\nf 1541/1591/1541 1542/1574/1542 1540/1592/1540\nf 1539/1585/1539 1544/1588/1544 1543/1593/1543\nf 1539/1585/1539 1543/1593/1543 1541/1590/1541\nf 1670/1594/1670 1669/1595/1669 1567/1596/1567\nf 1670/1594/1670 1567/1596/1567 1553/1597/1553\nf 1547/1598/1547 1671/1599/1671 1668/1600/1668\nf 1547/1598/1547 1668/1600/1668 1546/1601/1546\nf 1548/1602/1548 1550/1603/1550 1551/1604/1551\nf 1548/1602/1548 1551/1604/1551 1549/1605/1549\nf 1558/1606/1558 1554/1607/1554 1548/1602/1548\nf 1558/1606/1558 1548/1602/1548 1545/1608/1545\nf 1548/1602/1548 1554/1607/1554 1556/1609/1556\nf 1548/1602/1548 1556/1609/1556 1550/1603/1550\nf 1550/1603/1550 1556/1609/1556 1589/1610/1589\nf 1550/1603/1550 1589/1610/1589 1591/1611/1591\nf 1559/1582/1559 1557/1612/1557 1558/1606/1558\nf 1559/1582/1559 1558/1606/1558 1555/1613/1555\nf 1572/1614/1572 1557/1612/1557 1559/1582/1559\nf 1572/1614/1572 1559/1582/1559 1560/1615/1560\nf 1565/1616/1565 1672/1617/1672 1671/1599/1671\nf 1565/1616/1565 1671/1599/1671 1547/1598/1547\nf 1564/1618/1564 1563/1619/1563 1672/1617/1672\nf 1564/1618/1564 1672/1617/1672 1565/1616/1565\nf 1566/1620/1566 1574/1621/1574 1565/1616/1565\nf 1566/1620/1566 1565/1616/1565 1547/1598/1547\nf 1546/1601/1546 1549/1605/1549 1566/1620/1566\nf 1546/1601/1546 1566/1620/1566 1547/1598/1547\nf 1537/1622/1537 1536/1572/1536 1522/1571/1522\nf 1537/1622/1537 1522/1571/1522 1567/1623/1567\nf 1537/1624/1537 1567/1596/1567 1669/1595/1669\nf 1537/1624/1537 1669/1595/1669 1668/1600/1668\nf 1537/1622/1537 1569/1587/1569 1568/1586/1568\nf 1537/1622/1537 1568/1586/1568 1536/1572/1536\nf 1566/1620/1566 1570/1625/1570 1571/1626/1571\nf 1566/1620/1566 1571/1626/1571 1574/1621/1574\nf 1570/1625/1570 1581/1627/1581 1579/1628/1579\nf 1570/1625/1570 1579/1628/1579 1571/1626/1571\nf 1549/1605/1549 1551/1604/1551 1570/1625/1570\nf 1549/1605/1549 1570/1625/1570 1566/1620/1566\nf 1561/1629/1561 1573/1630/1573 1572/1614/1572\nf 1561/1629/1561 1572/1614/1572 1560/1615/1560\nf 1576/1631/1576 1578/1632/1578 1573/1630/1573\nf 1576/1631/1576 1573/1630/1573 1561/1629/1561\nf 1391/1633/1391 1393/1584/1393 1538/1583/1538\nf 1391/1633/1391 1538/1583/1538 1540/1589/1540\nf 1381/1634/1381 1384/1635/1384 1528/1636/1528\nf 1381/1634/1381 1528/1636/1528 1516/1567/1516\nf 1542/1574/1542 1528/1636/1528 1384/1635/1384\nf 1542/1574/1542 1384/1635/1384 1391/1637/1391\nf 1562/1638/1562 1563/1639/1563 1564/1640/1564\nf 1562/1638/1562 1564/1640/1564 1576/1631/1576\nf 1577/1641/1577 1578/1632/1578 1574/1642/1574\nf 1577/1641/1577 1574/1642/1574 1571/1643/1571\nf 1580/1644/1580 1590/1645/1590 1592/1646/1592\nf 1580/1644/1580 1592/1646/1592 1584/1647/1584\nf 1585/1648/1585 1573/1630/1573 1578/1632/1578\nf 1585/1648/1585 1578/1632/1578 1577/1641/1577\nf 1572/1614/1572 1573/1630/1573 1585/1648/1585\nf 1572/1614/1572 1585/1648/1585 1586/1649/1586\nf 1586/1649/1586 1554/1607/1554 1557/1612/1557\nf 1586/1649/1586 1557/1612/1557 1572/1614/1572\nf 1592/1646/1592 1590/1645/1590 1581/1627/1581\nf 1592/1646/1592 1581/1627/1581 1593/1650/1593\nf 1588/1651/1588 1592/1646/1592 1593/1650/1593\nf 1588/1651/1588 1593/1650/1593 1591/1611/1591\nf 1582/1652/1582 1584/1647/1584 1592/1646/1592\nf 1582/1652/1582 1592/1646/1592 1588/1651/1588\nf 1595/1653/1595 1597/1654/1597 1596/1655/1596\nf 1595/1653/1595 1596/1655/1596 1594/1656/1594\nf 1604/1657/1604 1605/1658/1605 1602/1659/1602\nf 1604/1657/1604 1602/1659/1602 1614/1660/1614\nf 1605/1658/1605 1606/1661/1606 1594/1656/1594\nf 1605/1658/1605 1594/1656/1594 1596/1655/1596\nf 1601/1662/1601 1608/1663/1608 1607/1664/1607\nf 1601/1662/1601 1607/1664/1607 1615/1665/1615\nf 1599/1666/1599 1615/1665/1615 1614/1660/1614\nf 1599/1666/1599 1614/1660/1614 1602/1659/1602\nf 1609/1667/1609 1612/1668/1612 1613/1669/1613\nf 1609/1667/1609 1613/1669/1613 1610/1670/1610\nf 1610/1670/1610 1613/1669/1613 1629/1671/1629\nf 1610/1670/1610 1629/1671/1629 1604/1657/1604\nf 1604/1657/1604 1629/1671/1629 1606/1661/1606\nf 1604/1657/1604 1606/1661/1606 1605/1658/1605\nf 1600/1672/1600 1617/1673/1617 1626/1674/1626\nf 1600/1672/1600 1626/1674/1626 1733/1675/1733\nf 1617/1673/1617 1618/1676/1618 1619/1677/1619\nf 1617/1673/1617 1619/1677/1619 1626/1674/1626\nf 1618/1676/1618 1620/1678/1620 1621/1679/1621\nf 1618/1676/1618 1621/1679/1621 1619/1677/1619\nf 1623/1680/1623 1624/1681/1624 1621/1679/1621\nf 1623/1680/1623 1621/1679/1621 1620/1678/1620\nf 1586/1682/1586 1623/1680/1623 1620/1678/1620\nf 1586/1682/1586 1620/1678/1620 1587/1683/1587\nf 1594/1656/1594 1629/1671/1629 1628/1684/1628\nf 1594/1656/1594 1628/1684/1628 1585/1685/1585\nf 1623/1680/1623 1585/1685/1585 1628/1684/1628\nf 1623/1680/1623 1628/1684/1628 1624/1681/1624\nf 1627/1686/1627 1626/1674/1626 1619/1677/1619\nf 1627/1686/1627 1619/1677/1619 1718/1687/1718\nf 1617/1673/1617 1600/1672/1600 1584/1647/1584\nf 1617/1673/1617 1584/1647/1584 1582/1652/1582\nf 1618/1676/1618 1583/1688/1583 1587/1683/1587\nf 1618/1676/1618 1587/1683/1587 1620/1678/1620\nf 1582/1652/1582 1583/1688/1583 1618/1676/1618\nf 1582/1652/1582 1618/1676/1618 1617/1673/1617\nf 1597/1689/1597 1580/1644/1580 1584/1647/1584\nf 1597/1689/1597 1584/1647/1584 1598/1690/1598\nf 1624/1681/1624 1628/1684/1628 1630/1691/1630\nf 1624/1681/1624 1630/1691/1630 1622/1692/1622\nf 1630/1691/1630 1632/1693/1632 1631/1694/1631\nf 1630/1691/1630 1631/1694/1631 1622/1692/1622\nf 1632/1695/1632 1634/1696/1634 1633/1697/1633\nf 1632/1695/1632 1633/1697/1633 1631/1698/1631\nf 1634/1696/1634 1636/1699/1636 1635/1700/1635\nf 1634/1696/1634 1635/1700/1635 1633/1697/1633\nf 1636/1699/1636 1638/1701/1638 1637/1702/1637\nf 1636/1699/1636 1637/1702/1637 1635/1700/1635\nf 1637/1702/1637 1638/1701/1638 1646/1703/1646\nf 1637/1702/1637 1646/1703/1646 1639/1704/1639\nf 1641/1705/1641 1665/1706/1665 1647/1707/1647\nf 1641/1705/1641 1647/1707/1647 1645/1708/1645\nf 1647/1707/1647 1665/1706/1665 1643/1709/1643\nf 1647/1707/1647 1643/1709/1643 1648/1710/1648\nf 1640/1711/1640 1645/1708/1645 1647/1707/1647\nf 1640/1711/1640 1647/1707/1647 1667/1712/1667\nf 1667/1712/1667 1647/1707/1647 1648/1710/1648\nf 1667/1712/1667 1648/1710/1648 1642/1713/1642\nf 1654/1714/1654 1637/1702/1637 1639/1704/1639\nf 1654/1714/1654 1639/1704/1639 1658/1715/1658\nf 1636/1699/1636 1634/1696/1634 1655/1716/1655\nf 1636/1699/1636 1655/1716/1655 1650/1717/1650\nf 1630/1691/1630 1652/1718/1652 1651/1719/1651\nf 1630/1691/1630 1651/1719/1651 1632/1693/1632\nf 1634/1696/1634 1632/1695/1632 1651/1720/1651\nf 1634/1696/1634 1651/1720/1651 1655/1716/1655\nf 1631/1694/1631 1653/1721/1653 1675/1722/1675\nf 1631/1694/1631 1675/1722/1675 1622/1692/1622\nf 1633/1697/1633 1654/1714/1654 1653/1723/1653\nf 1633/1697/1633 1653/1723/1653 1631/1698/1631\nf 1650/1717/1650 1680/1724/1680 1656/1725/1656\nf 1650/1717/1650 1656/1725/1656 1646/1703/1646\nf 1656/1725/1656 1657/1726/1657 1649/1727/1649\nf 1656/1725/1656 1649/1727/1649 1646/1703/1646\nf 1651/1720/1651 1763/1728/1763 1680/1724/1680\nf 1651/1720/1651 1680/1724/1680 1655/1716/1655\nf 1663/1729/1663 1664/1730/1664 1658/1715/1658\nf 1663/1729/1663 1658/1715/1658 1639/1704/1639\nf 1664/1730/1664 1660/1731/1660 1659/1732/1659\nf 1664/1730/1664 1659/1732/1659 1658/1715/1658\nf 1656/1725/1656 1659/1733/1659 1660/1734/1660\nf 1656/1725/1656 1660/1734/1660 1657/1726/1657\nf 1657/1726/1657 1662/1735/1662 1661/1736/1661\nf 1657/1726/1657 1661/1736/1661 1649/1727/1649\nf 1662/1737/1662 1664/1730/1664 1663/1729/1663\nf 1662/1737/1662 1663/1729/1663 1661/1738/1661\nf 1661/1736/1661 1666/1739/1666 1665/1706/1665\nf 1661/1736/1661 1665/1706/1665 1676/1740/1676\nf 1667/1712/1667 1666/1741/1666 1661/1738/1661\nf 1667/1712/1667 1661/1738/1661 1677/1742/1677\nf 1643/1709/1643 1665/1706/1665 1666/1739/1666\nf 1643/1709/1643 1666/1739/1666 1644/1743/1644\nf 1666/1741/1666 1667/1712/1667 1642/1713/1642\nf 1666/1741/1666 1642/1713/1642 1644/1743/1644\nf 1668/1600/1668 1669/1595/1669 1552/1744/1552\nf 1668/1600/1668 1552/1744/1552 1546/1601/1546\nf 1669/1595/1669 1670/1594/1670 1545/1608/1545\nf 1669/1595/1669 1545/1608/1545 1552/1744/1552\nf 1537/1624/1537 1668/1600/1668 1671/1599/1671\nf 1537/1624/1537 1671/1599/1671 1569/1745/1569\nf 1569/1745/1569 1671/1599/1671 1672/1617/1672\nf 1569/1745/1569 1672/1617/1672 1544/1746/1544\nf 1673/1747/1673 1718/1687/1718 1619/1677/1619\nf 1673/1747/1673 1619/1677/1619 1621/1679/1621\nf 1659/1732/1659 1679/1748/1679 1678/1749/1678\nf 1659/1732/1659 1678/1749/1678 1658/1715/1658\nf 1656/1725/1656 1680/1724/1680 1679/1750/1679\nf 1656/1725/1656 1679/1750/1679 1659/1733/1659\nf 1679/1748/1679 1683/1751/1683 1682/1752/1682\nf 1679/1748/1679 1682/1752/1682 1678/1749/1678\nf 1680/1724/1680 1681/1753/1681 1683/1754/1683\nf 1680/1724/1680 1683/1754/1683 1679/1750/1679\nf 1678/1749/1678 1682/1752/1682 1653/1723/1653\nf 1678/1749/1678 1653/1723/1653 1654/1714/1654\nf 1685/1755/1685 1684/1756/1684 1674/1757/1674\nf 1685/1755/1685 1674/1757/1674 1675/1758/1675\nf 1685/1755/1685 1687/1759/1687 1686/1760/1686\nf 1685/1755/1685 1686/1760/1686 1684/1756/1684\nf 1687/1759/1687 1689/1761/1689 1688/1762/1688\nf 1687/1759/1687 1688/1762/1688 1686/1760/1686\nf 1688/1762/1688 1689/1761/1689 1691/1763/1691\nf 1688/1762/1688 1691/1763/1691 1690/1764/1690\nf 1693/1765/1693 1695/1766/1695 1694/1767/1694\nf 1693/1765/1693 1694/1767/1694 1692/1768/1692\nf 1696/1769/1696 1692/1768/1692 1694/1767/1694\nf 1696/1769/1696 1694/1767/1694 1697/1770/1697\nf 1699/1771/1699 1688/1762/1688 1690/1764/1690\nf 1699/1771/1699 1690/1764/1690 1700/1772/1700\nf 1693/1765/1693 1691/1763/1691 1705/1773/1705\nf 1693/1765/1693 1705/1773/1705 1702/1774/1702\nf 1687/1759/1687 1685/1755/1685 1704/1775/1704\nf 1687/1759/1687 1704/1775/1704 1703/1776/1703\nf 1703/1776/1703 1714/1777/1714 1705/1773/1705\nf 1703/1776/1703 1705/1773/1705 1691/1763/1691\nf 1701/1778/1701 1706/1779/1706 1707/1780/1707\nf 1701/1778/1701 1707/1780/1707 1700/1772/1700\nf 1705/1773/1705 1707/1781/1707 1706/1782/1706\nf 1705/1773/1705 1706/1782/1706 1702/1774/1702\nf 1708/1783/1708 1712/1784/1712 1695/1766/1695\nf 1708/1783/1708 1695/1766/1695 1710/1785/1710\nf 1697/1770/1697 1712/1786/1712 1708/1787/1708\nf 1697/1770/1697 1708/1787/1708 1711/1788/1711\nf 1707/1780/1707 1713/1789/1713 1699/1771/1699\nf 1707/1780/1707 1699/1771/1699 1700/1772/1700\nf 1705/1773/1705 1714/1777/1714 1713/1790/1713\nf 1705/1773/1705 1713/1790/1713 1707/1781/1707\nf 1625/1791/1625 1716/1792/1716 1717/1793/1717\nf 1625/1791/1625 1717/1793/1717 1673/1747/1673\nf 1684/1756/1684 1699/1771/1699 1716/1794/1716\nf 1684/1756/1684 1716/1794/1716 1674/1757/1674\nf 1627/1686/1627 1719/1795/1719 1733/1675/1733\nf 1627/1686/1627 1733/1675/1733 1626/1674/1626\nf 1718/1687/1718 1720/1796/1720 1719/1795/1719\nf 1718/1687/1718 1719/1795/1719 1627/1686/1627\nf 1683/1797/1683 1721/1798/1721 1726/1799/1726\nf 1683/1797/1683 1726/1799/1726 1682/1800/1682\nf 1681/1801/1681 1765/1802/1765 1721/1798/1721\nf 1681/1801/1681 1721/1798/1721 1683/1797/1683\nf 1721/1798/1721 1723/1803/1723 1725/1804/1725\nf 1721/1798/1721 1725/1804/1725 1726/1799/1726\nf 1765/1802/1765 1722/1805/1722 1723/1803/1723\nf 1765/1802/1765 1723/1803/1723 1721/1798/1721\nf 1723/1803/1723 1724/1806/1724 1717/1793/1717\nf 1723/1803/1723 1717/1793/1717 1725/1804/1725\nf 1722/1805/1722 1727/1807/1727 1724/1806/1724\nf 1722/1805/1722 1724/1806/1724 1723/1803/1723\nf 1690/1764/1690 1696/1769/1696 1701/1778/1701\nf 1690/1764/1690 1701/1778/1701 1700/1772/1700\nf 1725/1808/1725 1699/1771/1699 1713/1789/1713\nf 1725/1808/1725 1713/1789/1713 1726/1809/1726\nf 1628/1684/1628 1629/1671/1629 1728/1810/1728\nf 1628/1684/1628 1728/1810/1728 1652/1718/1652\nf 1612/1668/1612 1727/1811/1727 1729/1812/1729\nf 1612/1668/1612 1729/1812/1729 1613/1669/1613\nf 1764/1813/1764 1730/1814/1730 1731/1815/1731\nf 1764/1813/1764 1731/1815/1731 1722/1816/1722\nf 1727/1811/1727 1722/1816/1722 1731/1815/1731\nf 1727/1811/1727 1731/1815/1731 1729/1812/1729\nf 1629/1671/1629 1613/1669/1613 1729/1812/1729\nf 1629/1671/1629 1729/1812/1729 1728/1810/1728\nf 1652/1718/1652 1728/1810/1728 1732/1817/1732\nf 1652/1718/1652 1732/1817/1732 1734/1818/1734\nf 1726/1819/1726 1713/1790/1713 1714/1777/1714\nf 1726/1819/1726 1714/1777/1714 1715/1820/1715\nf 1611/1821/1611 1720/1822/1720 1727/1811/1727\nf 1611/1821/1611 1727/1811/1727 1612/1668/1612\nf 1611/1821/1611 1608/1663/1608 1719/1823/1719\nf 1611/1821/1611 1719/1823/1719 1720/1822/1720\nf 1733/1824/1733 1719/1823/1719 1608/1663/1608\nf 1733/1824/1733 1608/1663/1608 1601/1662/1601\nf 1734/1825/1734 1732/1826/1732 1736/1827/1736\nf 1734/1825/1734 1736/1827/1736 1735/1828/1735\nf 1735/1828/1735 1736/1827/1736 1737/1829/1737\nf 1735/1828/1735 1737/1829/1737 1738/1830/1738\nf 1737/1829/1737 1739/1831/1739 1740/1832/1740\nf 1737/1829/1737 1740/1832/1740 1738/1830/1738\nf 1743/1833/1743 1744/1834/1744 1742/1835/1742\nf 1743/1833/1743 1742/1835/1742 1741/1836/1741\nf 1746/1837/1746 1747/1838/1747 1743/1833/1743\nf 1746/1837/1746 1743/1833/1743 1741/1836/1741\nf 1748/1839/1748 1749/1840/1749 1739/1831/1739\nf 1748/1839/1748 1739/1831/1739 1737/1829/1737\nf 1742/1835/1742 1750/1841/1750 1751/1842/1751\nf 1742/1835/1742 1751/1842/1751 1740/1832/1740\nf 1752/1843/1752 1740/1832/1740 1751/1842/1751\nf 1752/1843/1752 1751/1842/1751 1753/1844/1753\nf 1755/1845/1755 1749/1840/1749 1756/1846/1756\nf 1755/1845/1755 1756/1846/1756 1754/1847/1754\nf 1751/1842/1751 1750/1841/1750 1754/1848/1754\nf 1751/1842/1751 1754/1848/1754 1756/1849/1756\nf 1757/1850/1757 1759/1851/1759 1744/1834/1744\nf 1757/1850/1757 1744/1834/1744 1761/1852/1761\nf 1747/1838/1747 1760/1853/1760 1757/1854/1757\nf 1747/1838/1747 1757/1854/1757 1761/1855/1761\nf 1756/1846/1756 1749/1840/1749 1748/1839/1748\nf 1756/1846/1756 1748/1839/1748 1762/1856/1762\nf 1751/1842/1751 1756/1849/1756 1762/1857/1762\nf 1751/1842/1751 1762/1857/1762 1753/1844/1753\nf 1739/1831/1739 1749/1840/1749 1755/1845/1755\nf 1739/1831/1739 1755/1845/1755 1746/1837/1746\nf 1762/1856/1762 1748/1839/1748 1764/1858/1764\nf 1762/1856/1762 1764/1858/1764 1766/1859/1766\nf 1766/1860/1766 1763/1861/1763 1753/1844/1753\nf 1766/1860/1766 1753/1844/1753 1762/1857/1762\nf 1519/1565/1519 1767/1862/1767 1386/1863/1386\nf 1519/1565/1519 1386/1863/1386 1381/1634/1381\nf 1386/1863/1386 1768/1864/1768 1769/1865/1769\nf 1386/1863/1386 1769/1865/1769 1387/1866/1387\nf 1768/1864/1768 1456/1867/1456 1457/1868/1457\nf 1768/1864/1768 1457/1868/1457 1769/1865/1769\nf 1392/1869/1392 452/1870/452 1506/1871/1506\nf 1392/1869/1392 1506/1871/1506 1393/1872/1393\nf 452/1870/452 453/1873/453 1794/1874/1794\nf 452/1870/452 1794/1874/1794 1506/1871/1506\nf 453/1873/453 455/1875/455 1773/1876/1773\nf 453/1873/453 1773/1876/1773 1794/1874/1794\nf 455/1875/455 457/1877/457 1774/1878/1774\nf 455/1875/455 1774/1878/1774 1773/1876/1773\nf 457/1877/457 459/1879/459 1775/1880/1775\nf 457/1877/457 1775/1880/1775 1774/1878/1774\nf 459/1879/459 461/1881/461 1776/1882/1776\nf 459/1879/459 1776/1882/1776 1775/1880/1775\nf 461/1881/461 463/1883/463 1777/1884/1777\nf 461/1881/461 1777/1884/1777 1776/1882/1776\nf 463/1883/463 465/1885/465 1778/1886/1778\nf 463/1883/463 1778/1886/1778 1777/1884/1777\nf 465/1885/465 467/1887/467 1779/1888/1779\nf 465/1885/465 1779/1888/1779 1778/1886/1778\nf 1775/1880/1775 1829/1889/1829 1780/1890/1780\nf 1775/1880/1775 1780/1890/1780 1774/1878/1774\nf 1776/1882/1776 1782/1891/1782 1781/1892/1781\nf 1776/1882/1776 1781/1892/1781 1775/1880/1775\nf 1777/1884/1777 1783/1893/1783 1782/1891/1782\nf 1777/1884/1777 1782/1891/1782 1776/1882/1776\nf 1778/1886/1778 1784/1894/1784 1783/1893/1783\nf 1778/1886/1778 1783/1893/1783 1777/1884/1777\nf 1779/1888/1779 473/1895/473 1784/1894/1784\nf 1779/1888/1779 1784/1894/1784 1778/1886/1778\nf 1780/1890/1780 1785/1896/1785 1773/1876/1773\nf 1780/1890/1780 1773/1876/1773 1774/1878/1774\nf 1780/1890/1780 1806/1897/1806 1786/1898/1786\nf 1780/1890/1780 1786/1898/1786 1785/1896/1785\nf 1786/1898/1786 1788/1899/1788 1787/1900/1787\nf 1786/1898/1786 1787/1900/1787 1785/1896/1785\nf 1787/1900/1787 1791/1901/1791 1790/1902/1790\nf 1787/1900/1787 1790/1902/1790 1785/1896/1785\nf 1793/1903/1793 1795/1904/1795 1794/1874/1794\nf 1793/1903/1793 1794/1874/1794 1790/1902/1790\nf 1793/1903/1793 1826/1905/1826 1797/1906/1797\nf 1793/1903/1793 1797/1906/1797 1795/1904/1795\nf 1798/1907/1798 1800/1908/1800 1801/1909/1801\nf 1798/1907/1798 1801/1909/1801 1799/1910/1799\nf 1798/1907/1798 1802/1911/1802 1803/1912/1803\nf 1798/1907/1798 1803/1912/1803 1800/1908/1800\nf 1803/1912/1803 494/1913/494 493/1914/493\nf 1803/1912/1803 493/1914/493 1800/1908/1800\nf 1799/1910/1799 1804/1915/1804 495/1916/495\nf 1799/1910/1799 495/1916/495 1806/1897/1806\nf 1801/1909/1801 1805/1917/1805 1804/1915/1804\nf 1801/1909/1801 1804/1915/1804 1799/1910/1799\nf 1506/1871/1506 1794/1874/1794 1795/1904/1795\nf 1506/1871/1506 1795/1904/1795 1508/1918/1508\nf 1790/1902/1790 1794/1874/1794 1773/1876/1773\nf 1790/1902/1790 1773/1876/1773 1785/1896/1785\nf 1800/1908/1800 493/1914/493 1805/1917/1805\nf 1800/1908/1800 1805/1917/1805 1801/1909/1801\nf 1807/1919/1807 1811/1920/1811 1813/1921/1813\nf 1807/1919/1807 1813/1921/1813 1786/1898/1786\nf 1815/1922/1815 1817/1923/1817 1816/1924/1816\nf 1815/1922/1815 1816/1924/1816 1810/1925/1810\nf 1792/1926/1792 1810/1925/1810 1816/1924/1816\nf 1792/1926/1792 1816/1924/1816 1826/1905/1826\nf 1811/1920/1811 1809/1927/1809 1833/1928/1833\nf 1811/1920/1811 1833/1928/1833 1821/1929/1821\nf 1819/1930/1819 1811/1920/1811 1821/1929/1821\nf 1819/1930/1819 1821/1929/1821 1818/1931/1818\nf 1822/1932/1822 1508/1918/1508 1795/1904/1795\nf 1822/1932/1822 1795/1904/1795 1797/1906/1797\nf 513/1933/513 521/1934/521 1818/1931/1818\nf 513/1933/513 1818/1931/1818 1821/1929/1821\nf 1827/1935/1827 522/1936/522 546/1937/546\nf 1827/1935/1827 546/1937/546 1838/1938/1838\nf 1782/1891/1782 524/1939/524 523/1940/523\nf 1782/1891/1782 523/1940/523 1781/1892/1781\nf 1783/1893/1783 525/1941/525 524/1939/524\nf 1783/1893/1783 524/1939/524 1782/1891/1782\nf 1784/1894/1784 526/1942/526 525/1941/525\nf 1784/1894/1784 525/1941/525 1783/1893/1783\nf 1831/1943/1831 1832/1944/1832 1803/1912/1803\nf 1831/1943/1831 1803/1912/1803 1802/1911/1802\nf 1837/1945/1837 1835/1946/1835 1834/1947/1834\nf 1837/1945/1837 1834/1947/1834 1822/1932/1822\nf 1835/1946/1835 1837/1945/1837 1839/1948/1839\nf 1835/1946/1835 1839/1948/1839 1836/1949/1836\nf 1838/1938/1838 546/1937/546 547/1950/547\nf 1838/1938/1838 547/1950/547 1841/1951/1841\nf 1772/1952/1772 1523/1558/1523 1524/1557/1524\nf 1772/1952/1772 1524/1557/1524 1847/1953/1847\nf 1847/1953/1847 1850/1954/1850 1852/1955/1852\nf 1847/1953/1847 1852/1955/1852 1851/1956/1851\nf 1848/1957/1848 1856/1958/1856 1865/1959/1865\nf 1848/1957/1848 1865/1959/1865 1857/1960/1857\nf 1770/1961/1770 1869/1962/1869 1870/1963/1870\nf 1770/1961/1770 1870/1963/1870 1843/1964/1843\nf 1402/1965/1402 1871/1966/1871 1872/1967/1872\nf 1402/1965/1402 1872/1967/1872 1404/1968/1404\nf 1871/1966/1871 1402/1965/1402 1870/1969/1870\nf 1871/1966/1871 1870/1969/1870 1869/1970/1869\nf 1872/1967/1872 1418/1971/1418 1417/1972/1417\nf 1872/1967/1872 1417/1972/1417 1404/1968/1404\nf 1426/1973/1426 1429/1974/1429 2164/1975/2164\nf 1426/1973/1426 2164/1975/2164 2158/1976/2158\nf 2221/1977/2221 1874/1978/1874 1877/1979/1877\nf 2221/1977/2221 1877/1979/1877 2222/1980/2222\nf 1877/1979/1877 1884/1981/1884 1885/1982/1885\nf 1877/1979/1877 1885/1982/1885 2223/1983/2223\nf 1886/1984/1886 2223/1983/2223 1885/1982/1885\nf 1886/1984/1886 1885/1982/1885 1887/1985/1887\nf 1901/1986/1901 1898/1987/1898 1887/1988/1887\nf 1901/1986/1901 1887/1988/1887 1885/1989/1885\nf 547/1950/547 625/1990/625 1892/1991/1892\nf 547/1950/547 1892/1991/1892 1841/1951/1841\nf 1890/1992/1890 1891/1993/1891 1892/1991/1892\nf 1890/1992/1890 1892/1991/1892 1893/1994/1893\nf 1860/1995/1860 1859/1996/1859 1890/1992/1890\nf 1860/1995/1860 1890/1992/1890 1893/1994/1893\nf 1860/1997/1860 1893/1998/1893 1884/1999/1884\nf 1860/1997/1860 1884/1999/1884 1877/2000/1877\nf 1402/1965/1402 1401/2001/1401 1403/2002/1403\nf 1402/1965/1402 1403/2002/1403 1870/1969/1870\nf 1418/1971/1418 1872/1967/1872 1873/2003/1873\nf 1418/1971/1418 1873/2003/1873 1419/2004/1419\nf 1898/1987/1898 646/2005/646 647/2006/647\nf 1898/1987/1898 647/2006/647 1899/2007/1899\nf 647/2006/647 649/2008/649 1928/2009/1928\nf 647/2006/647 1928/2009/1928 1899/2007/1899\nf 1896/2010/1896 1904/2011/1904 1903/2012/1903\nf 1896/2010/1896 1903/2012/1903 1895/2013/1895\nf 1894/2014/1894 1905/2015/1905 1906/2016/1906\nf 1894/2014/1894 1906/2016/1906 1896/2010/1896\nf 1896/2010/1896 1906/2016/1906 1907/2017/1907\nf 1896/2010/1896 1907/2017/1907 1904/2011/1904\nf 1925/2018/1925 1909/2019/1909 1908/2020/1908\nf 1925/2018/1925 1908/2020/1908 1905/2021/1905\nf 1906/2016/1906 1908/2022/1908 1910/2023/1910\nf 1906/2016/1906 1910/2023/1910 1907/2017/1907\nf 1908/2020/1908 1909/2019/1909 1915/2024/1915\nf 1908/2020/1908 1915/2024/1915 1914/2025/1914\nf 1908/2022/1908 1914/2026/1914 1916/2027/1916\nf 1908/2022/1908 1916/2027/1916 1910/2023/1910\nf 1914/2025/1914 1915/2024/1915 1912/2028/1912\nf 1914/2025/1914 1912/2028/1912 1917/2029/1917\nf 1913/2030/1913 1916/2027/1916 1914/2026/1914\nf 1913/2030/1913 1914/2026/1914 1917/2031/1917\nf 1925/2018/1925 1924/2032/1924 1919/2033/1919\nf 1925/2018/1925 1919/2033/1919 1909/2019/1909\nf 1910/2023/1910 1920/2034/1920 1918/2035/1918\nf 1910/2023/1910 1918/2035/1918 1907/2017/1907\nf 1915/2024/1915 1922/2036/1922 1921/2037/1921\nf 1915/2024/1915 1921/2037/1921 1912/2028/1912\nf 1916/2027/1916 1923/2038/1923 1920/2034/1920\nf 1916/2027/1916 1920/2034/1920 1910/2023/1910\nf 1909/2019/1909 1919/2033/1919 1922/2036/1922\nf 1909/2019/1909 1922/2036/1922 1915/2024/1915\nf 1913/2030/1913 1921/2037/1921 1923/2038/1923\nf 1913/2030/1913 1923/2038/1923 1916/2027/1916\nf 1923/2038/1923 1922/2036/1922 1919/2033/1919\nf 1923/2038/1923 1919/2033/1919 1920/2034/1920\nf 1920/2034/1920 1919/2033/1919 1924/2032/1924\nf 1920/2034/1920 1924/2032/1924 1926/2039/1926\nf 1926/2039/1926 1929/2040/1929 1927/2041/1927\nf 1926/2039/1926 1927/2041/1927 1918/2035/1918\nf 1927/2041/1927 1904/2011/1904 1907/2017/1907\nf 1927/2041/1927 1907/2017/1907 1918/2035/1918\nf 1925/2018/1925 1928/2042/1928 1930/2043/1930\nf 1925/2018/1925 1930/2043/1930 1924/2032/1924\nf 2143/2044/2143 2000/2045/2000 1932/2046/1932\nf 2143/2044/2143 1932/2046/1932 1931/2047/1931\nf 2143/2044/2143 1931/2047/1931 1935/2048/1935\nf 2143/2044/2143 1935/2048/1935 1934/2049/1934\nf 1933/2050/1933 1937/2051/1937 1936/2052/1936\nf 1933/2050/1933 1936/2052/1936 1932/2053/1932\nf 1933/2050/1933 1949/2054/1949 1939/2055/1939\nf 1933/2050/1933 1939/2055/1939 1937/2051/1937\nf 1938/2056/1938 1960/2057/1960 1941/2058/1941\nf 1938/2056/1938 1941/2058/1941 1935/2048/1935\nf 1939/2055/1939 1949/2054/1949 1948/2059/1948\nf 1939/2055/1939 1948/2059/1948 1942/2060/1942\nf 1944/2061/1944 1947/2062/1947 1946/2063/1946\nf 1944/2061/1944 1946/2063/1946 1945/2064/1945\nf 1940/2065/1940 1946/2063/1946 1947/2062/1947\nf 1940/2065/1940 1947/2062/1947 1950/2066/1950\nf 1943/2067/1943 1948/2059/1948 1949/2054/1949\nf 1943/2067/1943 1949/2054/1949 1940/2065/1940\nf 1947/2062/1947 1953/2068/1953 1952/2069/1952\nf 1947/2062/1947 1952/2069/1952 1950/2066/1950\nf 1955/2070/1955 1934/2049/1934 1935/2048/1935\nf 1955/2070/1955 1935/2048/1935 1941/2058/1941\nf 1956/2071/1956 1986/2072/1986 1985/2073/1985\nf 1956/2071/1956 1985/2073/1985 1957/2074/1957\nf 1931/2047/1931 1959/2075/1959 1938/2056/1938\nf 1931/2047/1931 1938/2056/1938 1935/2048/1935\nf 1937/2051/1937 1962/2076/1962 1961/2077/1961\nf 1937/2051/1937 1961/2077/1961 1936/2052/1936\nf 1959/2075/1959 1965/2078/1965 1963/2079/1963\nf 1959/2075/1959 1963/2079/1963 1938/2056/1938\nf 1964/2080/1964 1962/2076/1962 1937/2051/1937\nf 1964/2080/1964 1937/2051/1937 1939/2055/1939\nf 1960/2057/1960 1966/2081/1966 1971/2082/1971\nf 1960/2057/1960 1971/2082/1971 1942/2060/1942\nf 1942/2060/1942 1971/2082/1971 1964/2080/1964\nf 1942/2060/1942 1964/2080/1964 1939/2055/1939\nf 1936/2083/1936 1961/2084/1961 1965/2078/1965\nf 1936/2083/1936 1965/2078/1965 1959/2075/1959\nf 1938/2056/1938 1963/2079/1963 1966/2081/1966\nf 1938/2056/1938 1966/2081/1966 1960/2057/1960\nf 1961/2084/1961 1967/2085/1967 1969/2086/1969\nf 1961/2084/1961 1969/2086/1969 1965/2078/1965\nf 1964/2080/1964 1972/2087/1972 1967/2088/1967\nf 1964/2080/1964 1967/2088/1967 1962/2076/1962\nf 1963/2079/1963 1969/2086/1969 1970/2089/1970\nf 1963/2079/1963 1970/2089/1970 1966/2081/1966\nf 1970/2089/1970 1968/2090/1968 1971/2082/1971\nf 1970/2089/1970 1971/2082/1971 1966/2081/1966\nf 1972/2087/1972 1964/2080/1964 1971/2082/1971\nf 1972/2087/1972 1971/2082/1971 1968/2090/1968\nf 1967/2088/1967 1972/2087/1972 1976/2091/1976\nf 1967/2088/1967 1976/2091/1976 1973/2092/1973\nf 1969/2086/1969 1973/2093/1973 1974/2094/1974\nf 1969/2086/1969 1974/2094/1974 1970/2089/1970\nf 1970/2089/1970 1974/2094/1974 1975/2095/1975\nf 1970/2089/1970 1975/2095/1975 1968/2090/1968\nf 1972/2087/1972 1968/2090/1968 1975/2095/1975\nf 1972/2087/1972 1975/2095/1975 1976/2091/1976\nf 2005/2096/2005 1933/2050/1933 2004/2097/2004\nf 2005/2096/2005 2004/2097/2004 1978/2098/1978\nf 649/2099/649 731/2100/731 1980/2101/1980\nf 649/2099/649 1980/2101/1980 1928/2102/1928\nf 1978/2103/1978 1981/2104/1981 733/2105/733\nf 1978/2103/1978 733/2105/733 700/2106/700\nf 1930/2107/1930 1980/2101/1980 1981/2104/1981\nf 1930/2107/1930 1981/2104/1981 1979/2108/1979\nf 1980/2101/1980 731/2100/731 736/2109/736\nf 1980/2101/1980 736/2109/736 1982/2110/1982\nf 1981/2104/1981 1983/2111/1983 738/2112/738\nf 1981/2104/1981 738/2112/738 733/2105/733\nf 1981/2104/1981 1980/2101/1980 1982/2110/1982\nf 1981/2104/1981 1982/2110/1982 1983/2111/1983\nf 1990/2113/1990 1994/2114/1994 1992/2115/1992\nf 1990/2113/1990 1992/2115/1992 1987/2116/1987\nf 1993/2117/1993 1995/2118/1995 1994/2114/1994\nf 1993/2117/1993 1994/2114/1994 1990/2113/1990\nf 1929/2119/1929 1979/2120/1979 2150/2121/2150\nf 1929/2119/1929 2150/2121/2150 2149/2122/2149\nf 1933/2050/1933 2005/2096/2005 692/2123/692\nf 1933/2050/1933 692/2123/692 1946/2063/1946\nf 1996/2124/1996 2008/2125/2008 2006/2126/2006\nf 1996/2124/1996 2006/2126/2006 1991/2127/1991\nf 1993/2117/1993 1991/2127/1991 2006/2126/2006\nf 1993/2117/1993 2006/2126/2006 1995/2118/1995\nf 777/2128/777 2009/2129/2009 2018/2130/2018\nf 777/2128/777 2018/2130/2018 754/2131/754\nf 756/2132/756 783/2133/783 2015/2134/2015\nf 756/2132/756 2015/2134/2015 2014/2135/2014\nf 2022/2136/2022 2031/2137/2031 2032/2138/2032\nf 2022/2136/2022 2032/2138/2032 2025/2139/2025\nf 2017/2140/2017 2037/2141/2037 2011/2142/2011\nf 2017/2140/2017 2011/2142/2011 2013/2143/2013\nf 2007/2144/2007 2040/2145/2040 2041/2146/2041\nf 2007/2144/2007 2041/2146/2041 2030/2147/2030\nf 2042/2148/2042 2041/2146/2041 2040/2145/2040\nf 2042/2148/2042 2040/2145/2040 2038/2149/2038\nf 2039/2150/2039 2048/2151/2048 2041/2146/2041\nf 2039/2150/2039 2041/2146/2041 2042/2148/2042\nf 2043/2152/2043 2049/2153/2049 2048/2151/2048\nf 2043/2152/2043 2048/2151/2048 2039/2150/2039\nf 2059/2154/2059 2058/2155/2058 2032/2138/2032\nf 2059/2154/2059 2032/2138/2032 2051/2156/2051\nf 2068/2157/2068 2069/2158/2069 2070/2159/2070\nf 2068/2157/2068 2070/2159/2070 2067/2160/2067\nf 2067/2160/2067 2076/2161/2076 2077/2162/2077\nf 2067/2160/2067 2077/2162/2077 2068/2157/2068\nf 2071/2163/2071 2078/2164/2078 2076/2161/2076\nf 2071/2163/2071 2076/2161/2076 2067/2160/2067\nf 2076/2161/2076 2079/2165/2079 2088/2166/2088\nf 2076/2161/2076 2088/2166/2088 2077/2162/2077\nf 2078/2164/2078 2080/2167/2080 2079/2165/2079\nf 2078/2164/2078 2079/2165/2079 2076/2161/2076\nf 2081/2168/2081 2078/2164/2078 2071/2163/2071\nf 2081/2168/2081 2071/2163/2071 2074/2169/2074\nf 2074/2169/2074 2082/2170/2082 2083/2171/2083\nf 2074/2169/2074 2083/2171/2083 2081/2168/2081\nf 2081/2168/2081 2083/2171/2083 2099/2172/2099\nf 2081/2168/2081 2099/2172/2099 2101/2173/2101\nf 2092/2174/2092 2070/2159/2070 2069/2158/2069\nf 2092/2174/2092 2069/2158/2069 2054/2175/2054\nf 2092/2174/2092 2073/2176/2073 2072/2177/2072\nf 2092/2174/2092 2072/2177/2072 2070/2159/2070\nf 2072/2177/2072 2073/2176/2073 2093/2178/2093\nf 2072/2177/2072 2093/2178/2093 2091/2179/2091\nf 2086/2180/2086 2112/2181/2112 2111/2182/2111\nf 2086/2180/2086 2111/2182/2111 2084/2183/2084\nf 2085/2184/2085 2511/2185/2511 2112/2181/2112\nf 2085/2184/2085 2112/2181/2112 2086/2180/2086\nf 2097/2186/2097 2101/2173/2101 2099/2172/2099\nf 2097/2186/2097 2099/2172/2099 2098/2187/2098\nf 2080/2167/2080 2086/2180/2086 2084/2183/2084\nf 2080/2167/2080 2084/2183/2084 2079/2165/2079\nf 2109/2188/2109 2096/2189/2096 2105/2190/2105\nf 2109/2188/2109 2105/2190/2105 2104/2191/2104\nf 2105/2190/2105 2107/2192/2107 2106/2193/2106\nf 2105/2190/2105 2106/2193/2106 2104/2191/2104\nf 2107/2192/2107 2108/2194/2108 2120/2195/2120\nf 2107/2192/2107 2120/2195/2120 2106/2193/2106\nf 2109/2188/2109 2110/2196/2110 2111/2182/2111\nf 2109/2188/2109 2111/2182/2111 2096/2189/2096\nf 2096/2189/2096 2111/2182/2111 2112/2181/2112\nf 2096/2189/2096 2112/2181/2112 2174/2197/2174\nf 2115/2198/2115 2119/2199/2119 2118/2200/2118\nf 2115/2198/2115 2118/2200/2118 2114/2201/2114\nf 2113/2202/2113 2117/2203/2117 2119/2199/2119\nf 2113/2202/2113 2119/2199/2119 2115/2198/2115\nf 2124/2204/2124 2123/2205/2123 2116/2206/2116\nf 2124/2204/2124 2116/2206/2116 2089/2207/2089\nf 2106/2193/2106 2120/2195/2120 2121/2208/2121\nf 2106/2193/2106 2121/2208/2121 2104/2191/2104\nf 2104/2191/2104 2121/2208/2121 2122/2209/2122\nf 2104/2191/2104 2122/2209/2122 2109/2188/2109\nf 2109/2188/2109 2122/2209/2122 2117/2203/2117\nf 2109/2188/2109 2117/2203/2117 2113/2202/2113\nf 2103/2210/2103 2108/2194/2108 2107/2192/2107\nf 2103/2210/2103 2107/2192/2107 2105/2190/2105\nf 2123/2205/2123 2124/2204/2124 2114/2201/2114\nf 2123/2205/2123 2114/2201/2114 2118/2200/2118\nf 2090/2211/2090 2155/2212/2155 2068/2157/2068\nf 2090/2211/2090 2068/2157/2068 2077/2162/2077\nf 2054/2175/2054 2069/2158/2069 2141/2213/2141\nf 2054/2175/2054 2141/2213/2141 2142/2214/2142\nf 1827/1935/1827 1818/1931/1818 521/1934/521\nf 1827/1935/1827 521/1934/521 522/1936/522\nf 1882/2215/1882 2126/2216/2126 2125/2217/2125\nf 1882/2215/1882 2125/2217/2125 1880/2218/1880\nf 2129/2219/2129 2125/2217/2125 2126/2216/2126\nf 2129/2219/2129 2126/2216/2126 2128/2220/2128\nf 1882/2221/1882 2130/2222/2130 2131/2223/2131\nf 1882/2221/1882 2131/2223/2131 2126/2224/2126\nf 2131/2223/2131 2136/2225/2136 2138/2226/2138\nf 2131/2223/2131 2138/2226/2138 2147/2227/2147\nf 2130/2222/2130 2135/2228/2135 2136/2225/2136\nf 2130/2222/2130 2136/2225/2136 2131/2223/2131\nf 1927/2041/1927 2133/2229/2133 2132/2230/2132\nf 1927/2041/1927 2132/2230/2132 1904/2011/1904\nf 2133/2231/2133 2137/2232/2137 2134/2233/2134\nf 2133/2231/2133 2134/2233/2134 2132/2234/2132\nf 2138/2226/2138 2136/2225/2136 2135/2228/2135\nf 2138/2226/2138 2135/2228/2135 2139/2235/2139\nf 2138/2226/2138 2139/2236/2139 2137/2232/2137\nf 2138/2226/2138 2137/2232/2137 2147/2227/2147\nf 2141/2213/2141 2144/2237/2144 2143/2238/2143\nf 2141/2213/2141 2143/2238/2143 2142/2214/2142\nf 2140/2239/2140 2143/2238/2143 2144/2237/2144\nf 2140/2239/2140 2144/2237/2144 2128/2240/2128\nf 2142/2214/2142 1934/2241/1934 2056/2242/2056\nf 2142/2214/2142 2056/2242/2056 2057/2243/2057\nf 2001/2244/2001 2145/2245/2145 2146/2246/2146\nf 2001/2244/2001 2146/2246/2146 2002/2247/2002\nf 2140/2248/2140 2147/2249/2147 2145/2245/2145\nf 2140/2248/2140 2145/2245/2145 2001/2244/2001\nf 2149/2122/2149 2151/2250/2151 1927/2251/1927\nf 2149/2122/2149 1927/2251/1927 1929/2119/1929\nf 2147/2249/2147 2137/2252/2137 2151/2253/2151\nf 2147/2249/2147 2151/2253/2151 2145/2245/2145\nf 2133/2254/2133 1927/2255/1927 2151/2253/2151\nf 2133/2254/2133 2151/2253/2151 2137/2252/2137\nf 2001/2244/2001 2152/2256/2152 2000/2257/2000\nf 2001/2244/2001 2000/2257/2000 2143/2258/2143\nf 2158/1976/2158 2159/2259/2159 2160/2260/2160\nf 2158/1976/2158 2160/2260/2160 1428/2261/1428\nf 2082/2170/2082 2163/2262/2163 2162/2263/2162\nf 2082/2170/2082 2162/2263/2162 2083/2171/2083\nf 2083/2171/2083 2181/2264/2181 2161/2265/2161\nf 2083/2171/2083 2161/2265/2161 2099/2172/2099\nf 2158/1976/2158 2164/1975/2164 2165/2266/2165\nf 2158/1976/2158 2165/2266/2165 2159/2259/2159\nf 2082/2170/2082 2074/2169/2074 2075/2267/2075\nf 2082/2170/2082 2075/2267/2075 2165/2266/2165\nf 2181/2264/2181 2162/2263/2162 2182/2268/2182\nf 2181/2264/2181 2182/2268/2182 2166/2269/2166\nf 2169/2270/2169 2166/2271/2166 2116/2206/2116\nf 2169/2270/2169 2116/2206/2116 2123/2205/2123\nf 2167/2272/2167 2116/2206/2116 2166/2271/2166\nf 2167/2272/2167 2166/2271/2166 2182/2273/2182\nf 2090/2211/2090 2167/2272/2167 2156/2274/2156\nf 2090/2211/2090 2156/2274/2156 2155/2212/2155\nf 2167/2272/2167 2182/2273/2182 2129/2275/2129\nf 2167/2272/2167 2129/2275/2129 2156/2274/2156\nf 2118/2200/2118 2168/2276/2168 2169/2270/2169\nf 2118/2200/2118 2169/2270/2169 2123/2205/2123\nf 2120/2195/2120 2379/2277/2379 2170/2278/2170\nf 2120/2195/2120 2170/2278/2170 2121/2208/2121\nf 2379/2279/2379 2220/2280/2220 2172/2281/2172\nf 2379/2279/2379 2172/2281/2172 2170/2282/2170\nf 2170/2282/2170 2172/2281/2172 2173/2283/2173\nf 2170/2282/2170 2173/2283/2173 2171/2284/2171\nf 2172/2281/2172 2220/2280/2220 2187/2285/2187\nf 2172/2281/2172 2187/2285/2187 2176/2286/2176\nf 2176/2286/2176 2175/2287/2175 2180/2288/2180\nf 2176/2286/2176 2180/2288/2180 2172/2281/2172\nf 2175/2287/2175 2511/2185/2511 2100/2289/2100\nf 2175/2287/2175 2100/2289/2100 2178/2290/2178\nf 2179/2291/2179 2180/2288/2180 2175/2287/2175\nf 2179/2291/2179 2175/2287/2175 2178/2290/2178\nf 2173/2283/2173 2179/2291/2179 2184/2292/2184\nf 2173/2283/2173 2184/2292/2184 2183/2293/2183\nf 2098/2187/2098 2178/2290/2178 2100/2289/2100\nf 2098/2187/2098 2100/2289/2100 2097/2186/2097\nf 2179/2291/2179 2178/2290/2178 2098/2187/2098\nf 2179/2291/2179 2098/2187/2098 2184/2292/2184\nf 2168/2294/2168 2173/2283/2173 2183/2293/2183\nf 2168/2294/2168 2183/2293/2183 2169/2295/2169\nf 2183/2293/2183 2181/2264/2181 2166/2269/2166\nf 2183/2293/2183 2166/2269/2166 2169/2295/2169\nf 2182/2268/2182 2162/2263/2162 2127/2296/2127\nf 2182/2268/2182 2127/2296/2127 2129/2297/2129\nf 2177/2298/2177 2186/2299/2186 2185/2300/2185\nf 2177/2298/2177 2185/2300/2185 2103/2210/2103\nf 2177/2298/2177 2187/2285/2187 2207/2301/2207\nf 2177/2298/2177 2207/2301/2207 2186/2299/2186\nf 2189/2302/2189 2188/2303/2188 2108/2194/2108\nf 2189/2302/2189 2108/2194/2108 2185/2300/2185\nf 2191/2304/2191 2190/2305/2190 2185/2300/2185\nf 2191/2304/2191 2185/2300/2185 2186/2299/2186\nf 2380/2306/2380 2108/2194/2108 2188/2303/2188\nf 2380/2306/2380 2188/2303/2188 2192/2307/2192\nf 2305/2308/2305 2306/2309/2306 2189/2302/2189\nf 2305/2308/2305 2189/2302/2189 2190/2305/2190\nf 2189/2302/2189 2342/2310/2342 2343/2311/2343\nf 2189/2302/2189 2343/2311/2343 2188/2303/2188\nf 2191/2304/2191 2194/2312/2194 2193/2313/2193\nf 2191/2304/2191 2193/2313/2193 2190/2305/2190\nf 2188/2303/2188 2381/2314/2381 2382/2315/2382\nf 2188/2303/2188 2382/2315/2382 2192/2307/2192\nf 2194/2312/2194 2196/2316/2196 2195/2317/2195\nf 2194/2312/2194 2195/2317/2195 2193/2313/2193\nf 2196/2316/2196 2198/2318/2198 2197/2319/2197\nf 2196/2316/2196 2197/2319/2197 2195/2317/2195\nf 2198/2318/2198 2200/2320/2200 2199/2321/2199\nf 2198/2318/2198 2199/2321/2199 2197/2319/2197\nf 2200/2320/2200 2205/2322/2205 2201/2323/2201\nf 2200/2320/2200 2201/2323/2201 2199/2321/2199\nf 2186/2299/2186 2207/2301/2207 2269/2324/2269\nf 2186/2299/2186 2269/2324/2269 2270/2325/2270\nf 2194/2312/2194 2208/2326/2208 2209/2327/2209\nf 2194/2312/2194 2209/2327/2209 2196/2316/2196\nf 2200/2320/2200 2209/2327/2209 2211/2328/2211\nf 2200/2320/2200 2211/2328/2211 2205/2322/2205\nf 2211/2328/2211 2210/2329/2210 2203/2330/2203\nf 2211/2328/2211 2203/2330/2203 2205/2322/2205\nf 2214/2331/2214 2212/2332/2212 2202/2333/2202\nf 2214/2331/2214 2202/2333/2202 2204/2334/2204\nf 2203/2330/2203 2213/2335/2213 2214/2331/2214\nf 2203/2330/2203 2214/2331/2214 2204/2334/2204\nf 2215/2336/2215 2264/2337/2264 2212/2332/2212\nf 2215/2336/2215 2212/2332/2212 2214/2331/2214\nf 2213/2335/2213 2263/2338/2263 2215/2336/2215\nf 2213/2335/2213 2215/2336/2215 2214/2331/2214\nf 2207/2301/2207 2216/2339/2216 2280/2340/2280\nf 2207/2301/2207 2280/2340/2280 2269/2324/2269\nf 2220/2280/2220 2216/2339/2216 2207/2301/2207\nf 2220/2280/2220 2207/2301/2207 2187/2285/2187\nf 1875/2341/1875 2221/1977/2221 2222/1980/2222\nf 1875/2341/1875 2222/1980/2222 1878/2342/1878\nf 2223/1983/2223 1897/2343/1897 1878/2342/1878\nf 2223/1983/2223 1878/2342/1878 2222/1980/2222\nf 2228/2344/2228 2225/2345/2225 2043/2152/2043\nf 2228/2344/2228 2043/2152/2043 2045/2346/2045\nf 2059/2154/2059 2051/2156/2051 2237/2347/2237\nf 2059/2154/2059 2237/2347/2237 2238/2348/2238\nf 2066/2349/2066 2059/2154/2059 2238/2348/2238\nf 2066/2349/2066 2238/2348/2238 2061/2350/2061\nf 2231/2351/2231 2241/2352/2241 2094/2353/2094\nf 2231/2351/2231 2094/2353/2094 2073/2176/2073\nf 2244/2354/2244 2243/2355/2243 2250/2356/2250\nf 2244/2354/2244 2250/2356/2250 2235/2357/2235\nf 2094/2353/2094 2251/2358/2251 2247/2359/2247\nf 2094/2353/2094 2247/2359/2247 2227/2360/2227\nf 2053/2361/2053 2065/2362/2065 2064/2363/2064\nf 2053/2361/2053 2064/2363/2064 2240/2364/2240\nf 2256/2365/2256 2199/2321/2199 2201/2323/2201\nf 2256/2365/2256 2201/2323/2201 2253/2366/2253\nf 2253/2366/2253 2201/2323/2201 2202/2333/2202\nf 2253/2366/2253 2202/2333/2202 2254/2367/2254\nf 2255/2368/2255 2193/2313/2193 2195/2317/2195\nf 2255/2368/2255 2195/2317/2195 2256/2365/2256\nf 2257/2369/2257 2210/2329/2210 2211/2328/2211\nf 2257/2369/2257 2211/2328/2211 2258/2370/2258\nf 2259/2371/2259 2253/2366/2253 2254/2367/2254\nf 2259/2371/2259 2254/2367/2254 2260/2372/2260\nf 2258/2373/2258 2259/2374/2259 2260/2375/2260\nf 2258/2373/2258 2260/2375/2260 2257/2376/2257\nf 2261/2377/2261 2257/2376/2257 2260/2375/2260\nf 2261/2377/2261 2260/2375/2260 2262/2378/2262\nf 2263/2379/2263 2261/2377/2261 2262/2378/2262\nf 2263/2379/2263 2262/2378/2262 2264/2380/2264\nf 2267/2381/2267 2259/2374/2259 2258/2373/2258\nf 2267/2381/2267 2258/2373/2258 2265/2382/2265\nf 2340/2383/2340 2267/2381/2267 2265/2382/2265\nf 2340/2383/2340 2265/2382/2265 2266/2384/2266\nf 2256/2365/2256 2253/2366/2253 2259/2371/2259\nf 2256/2365/2256 2259/2371/2259 2267/2385/2267\nf 2255/2368/2255 2256/2365/2256 2267/2385/2267\nf 2255/2368/2255 2267/2385/2267 2340/2386/2340\nf 2266/2387/2266 2265/2388/2265 2209/2327/2209\nf 2266/2387/2266 2209/2327/2209 2208/2326/2208\nf 2269/2324/2269 2272/2389/2272 2271/2390/2271\nf 2269/2324/2269 2271/2390/2271 2270/2325/2270\nf 2272/2389/2272 2274/2391/2274 2273/2392/2273\nf 2272/2389/2272 2273/2392/2273 2271/2390/2271\nf 2274/2391/2274 2276/2393/2276 2275/2394/2275\nf 2274/2391/2274 2275/2394/2275 2273/2392/2273\nf 2269/2324/2269 2280/2340/2280 2281/2395/2281\nf 2269/2324/2269 2281/2395/2281 2272/2389/2272\nf 2281/2395/2281 2282/2396/2282 2279/2397/2279\nf 2281/2395/2281 2279/2397/2279 2276/2393/2276\nf 2283/2398/2283 2284/2399/2284 2278/2400/2278\nf 2283/2398/2283 2278/2400/2278 2277/2401/2277\nf 2279/2397/2279 2285/2402/2285 2283/2398/2283\nf 2279/2397/2279 2283/2398/2283 2277/2401/2277\nf 2286/2403/2286 2287/2404/2287 2284/2399/2284\nf 2286/2403/2286 2284/2399/2284 2283/2398/2283\nf 2285/2402/2285 2288/2405/2288 2286/2403/2286\nf 2285/2402/2285 2286/2403/2286 2283/2398/2283\nf 2289/2406/2289 2275/2394/2275 2278/2400/2278\nf 2289/2406/2289 2278/2400/2278 2290/2407/2290\nf 2206/2408/2206 2270/2325/2270 2271/2390/2271\nf 2206/2408/2206 2271/2390/2271 2289/2406/2289\nf 2291/2409/2291 2282/2396/2282 2281/2395/2281\nf 2291/2409/2291 2281/2395/2281 2298/2410/2298\nf 2297/2411/2297 2289/2406/2289 2290/2407/2290\nf 2297/2411/2297 2290/2407/2290 2292/2412/2292\nf 2298/2413/2298 2297/2414/2297 2292/2415/2292\nf 2298/2413/2298 2292/2415/2292 2291/2416/2291\nf 2293/2417/2293 2291/2416/2291 2292/2415/2292\nf 2293/2417/2293 2292/2415/2292 2294/2418/2294\nf 2295/2419/2295 2293/2417/2293 2294/2418/2294\nf 2295/2419/2295 2294/2418/2294 2296/2420/2296\nf 2288/2421/2288 2295/2419/2295 2296/2420/2296\nf 2288/2421/2288 2296/2420/2296 2287/2422/2287\nf 2299/2423/2299 2297/2414/2297 2298/2413/2298\nf 2299/2423/2299 2298/2413/2298 2415/2424/2415\nf 2289/2406/2289 2297/2411/2297 2299/2425/2299\nf 2289/2406/2289 2299/2425/2299 2206/2408/2206\nf 2415/2426/2415 2298/2410/2298 2281/2395/2281\nf 2415/2426/2415 2281/2395/2281 2280/2340/2280\nf 2301/2427/2301 2208/2326/2208 2194/2312/2194\nf 2301/2427/2301 2194/2312/2194 2191/2304/2191\nf 2304/2428/2304 2415/2429/2415 2218/2430/2218\nf 2304/2428/2304 2218/2430/2218 2302/2431/2302\nf 2301/2427/2301 2303/2432/2303 2266/2387/2266\nf 2301/2427/2301 2266/2387/2266 2208/2326/2208\nf 2303/2433/2303 2304/2428/2304 2340/2383/2340\nf 2303/2433/2303 2340/2383/2340 2266/2384/2266\nf 2209/2327/2209 2265/2388/2265 2258/2370/2258\nf 2209/2327/2209 2258/2370/2258 2211/2328/2211\nf 2305/2308/2305 2308/2434/2308 2307/2435/2307\nf 2305/2308/2305 2307/2435/2307 2306/2309/2306\nf 2308/2434/2308 2310/2436/2310 2309/2437/2309\nf 2308/2434/2308 2309/2437/2309 2307/2435/2307\nf 2310/2436/2310 2312/2438/2312 2311/2439/2311\nf 2310/2436/2310 2311/2439/2311 2309/2437/2309\nf 2312/2438/2312 2314/2440/2314 2313/2441/2313\nf 2312/2438/2312 2313/2441/2313 2311/2439/2311\nf 2305/2308/2305 2318/2442/2318 2319/2443/2319\nf 2305/2308/2305 2319/2443/2319 2308/2434/2308\nf 2312/2438/2312 2319/2443/2319 2320/2444/2320\nf 2312/2438/2312 2320/2444/2320 2314/2440/2314\nf 2320/2444/2320 2321/2445/2321 2317/2446/2317\nf 2320/2444/2320 2317/2446/2317 2314/2440/2314\nf 2322/2447/2322 2323/2448/2323 2316/2449/2316\nf 2322/2447/2322 2316/2449/2316 2315/2450/2315\nf 2317/2446/2317 2324/2451/2324 2322/2447/2322\nf 2317/2446/2317 2322/2447/2322 2315/2450/2315\nf 2325/2452/2325 2326/2453/2326 2323/2448/2323\nf 2325/2452/2325 2323/2448/2323 2322/2447/2322\nf 2324/2451/2324 2327/2454/2327 2325/2452/2325\nf 2324/2451/2324 2325/2452/2325 2322/2447/2322\nf 2328/2455/2328 2311/2439/2311 2313/2441/2313\nf 2328/2455/2328 2313/2441/2313 2329/2456/2329\nf 2329/2456/2329 2313/2441/2313 2316/2449/2316\nf 2329/2456/2329 2316/2449/2316 2330/2457/2330\nf 2331/2458/2331 2306/2309/2306 2307/2435/2307\nf 2331/2458/2331 2307/2435/2307 2328/2455/2328\nf 2321/2445/2321 2320/2444/2320 2333/2459/2333\nf 2321/2445/2321 2333/2459/2333 2332/2460/2332\nf 2334/2461/2334 2329/2456/2329 2330/2457/2330\nf 2334/2461/2334 2330/2457/2330 2335/2462/2335\nf 2333/2463/2333 2334/2464/2334 2335/2465/2335\nf 2333/2463/2333 2335/2465/2335 2332/2466/2332\nf 2336/2467/2336 2332/2466/2332 2335/2465/2335\nf 2336/2467/2336 2335/2465/2335 2337/2468/2337\nf 2327/2469/2327 2336/2467/2336 2337/2468/2337\nf 2327/2469/2327 2337/2468/2337 2326/2470/2326\nf 2338/2471/2338 2334/2464/2334 2333/2463/2333\nf 2338/2471/2338 2333/2463/2333 2339/2472/2339\nf 2376/2473/2376 2338/2471/2338 2339/2472/2339\nf 2376/2473/2376 2339/2472/2339 2340/2383/2340\nf 2328/2455/2328 2329/2456/2329 2334/2461/2334\nf 2328/2455/2328 2334/2461/2334 2338/2474/2338\nf 2331/2458/2331 2328/2455/2328 2338/2474/2338\nf 2331/2458/2331 2338/2474/2338 2376/2475/2376\nf 2340/2386/2340 2339/2476/2339 2319/2443/2319\nf 2340/2386/2340 2319/2443/2319 2318/2442/2318\nf 2319/2443/2319 2339/2476/2339 2333/2459/2333\nf 2319/2443/2319 2333/2459/2333 2320/2444/2320\nf 2305/2308/2305 2193/2313/2193 2255/2368/2255\nf 2305/2308/2305 2255/2368/2255 2318/2442/2318\nf 2342/2310/2342 2345/2477/2345 2344/2478/2344\nf 2342/2310/2342 2344/2478/2344 2343/2311/2343\nf 2345/2477/2345 2347/2479/2347 2346/2480/2346\nf 2345/2477/2345 2346/2480/2346 2344/2478/2344\nf 2347/2479/2347 2349/2481/2349 2348/2482/2348\nf 2347/2479/2347 2348/2482/2348 2346/2480/2346\nf 2349/2481/2349 2351/2483/2351 2350/2484/2350\nf 2349/2481/2349 2350/2484/2350 2348/2482/2348\nf 2342/2310/2342 2355/2485/2355 2356/2486/2356\nf 2342/2310/2342 2356/2486/2356 2345/2477/2345\nf 2349/2481/2349 2356/2486/2356 2357/2487/2357\nf 2349/2481/2349 2357/2487/2357 2351/2483/2351\nf 2357/2487/2357 2358/2488/2358 2354/2489/2354\nf 2357/2487/2357 2354/2489/2354 2351/2483/2351\nf 2359/2490/2359 2360/2491/2360 2353/2492/2353\nf 2359/2490/2359 2353/2492/2353 2352/2493/2352\nf 2354/2489/2354 2361/2494/2361 2359/2490/2359\nf 2354/2489/2354 2359/2490/2359 2352/2493/2352\nf 2363/2495/2363 2348/2482/2348 2350/2484/2350\nf 2363/2495/2363 2350/2484/2350 2364/2496/2364\nf 2364/2496/2364 2350/2484/2350 2353/2492/2353\nf 2364/2496/2364 2353/2492/2353 2365/2497/2365\nf 2366/2498/2366 2343/2311/2343 2344/2478/2344\nf 2366/2498/2366 2344/2478/2344 2363/2495/2363\nf 2367/2499/2367 2358/2488/2358 2357/2487/2357\nf 2367/2499/2367 2357/2487/2357 2368/2500/2368\nf 2369/2501/2369 2364/2496/2364 2365/2497/2365\nf 2369/2501/2369 2365/2497/2365 2370/2502/2370\nf 2368/2503/2368 2369/2504/2369 2370/2505/2370\nf 2368/2503/2368 2370/2505/2370 2367/2506/2367\nf 2371/2507/2371 2367/2506/2367 2370/2505/2370\nf 2371/2507/2371 2370/2505/2370 2372/2508/2372\nf 2373/2509/2373 2369/2504/2369 2368/2503/2368\nf 2373/2509/2373 2368/2503/2368 2374/2510/2374\nf 2375/2511/2375 2373/2509/2373 2374/2510/2374\nf 2375/2511/2375 2374/2510/2374 2376/2512/2376\nf 2363/2495/2363 2364/2496/2364 2369/2501/2369\nf 2363/2495/2363 2369/2501/2369 2373/2513/2373\nf 2366/2498/2366 2363/2495/2363 2373/2513/2373\nf 2366/2498/2366 2373/2513/2373 2375/2514/2375\nf 2376/2475/2376 2374/2515/2374 2356/2486/2356\nf 2376/2475/2376 2356/2486/2356 2355/2485/2355\nf 2356/2486/2356 2374/2515/2374 2368/2500/2368\nf 2356/2486/2356 2368/2500/2368 2357/2487/2357\nf 2331/2458/2331 2355/2485/2355 2342/2310/2342\nf 2331/2458/2331 2342/2310/2342 2306/2309/2306\nf 2376/2473/2376 2340/2383/2340 2304/2428/2304\nf 2376/2473/2376 2304/2428/2304 2302/2431/2302\nf 2378/2516/2378 2302/2517/2302 2217/2518/2217\nf 2378/2516/2378 2217/2518/2217 2377/2519/2377\nf 2377/2520/2377 2379/2277/2379 2120/2195/2120\nf 2377/2520/2377 2120/2195/2120 2380/2306/2380\nf 2192/2307/2192 2378/2521/2378 2377/2520/2377\nf 2192/2307/2192 2377/2520/2377 2380/2306/2380\nf 1873/2003/1873 2164/2522/2164 1429/2523/1429\nf 1873/2003/1873 1429/2523/1429 1419/2004/1419\nf 2381/2314/2381 2384/2524/2384 2383/2525/2383\nf 2381/2314/2381 2383/2525/2383 2382/2315/2382\nf 2384/2524/2384 2386/2526/2386 2385/2527/2385\nf 2384/2524/2384 2385/2527/2385 2383/2525/2383\nf 2386/2526/2386 2388/2528/2388 2387/2529/2387\nf 2386/2526/2386 2387/2529/2387 2385/2527/2385\nf 2388/2528/2388 2390/2530/2390 2389/2531/2389\nf 2388/2528/2388 2389/2531/2389 2387/2529/2387\nf 2381/2314/2381 2394/2532/2394 2395/2533/2395\nf 2381/2314/2381 2395/2533/2395 2384/2524/2384\nf 2388/2528/2388 2395/2533/2395 2396/2534/2396\nf 2388/2528/2388 2396/2534/2396 2390/2530/2390\nf 2396/2534/2396 2397/2535/2397 2393/2536/2393\nf 2396/2534/2396 2393/2536/2393 2390/2530/2390\nf 2398/2537/2398 2399/2538/2399 2392/2539/2392\nf 2398/2537/2398 2392/2539/2392 2391/2540/2391\nf 2393/2536/2393 2400/2541/2400 2398/2537/2398\nf 2393/2536/2393 2398/2537/2398 2391/2540/2391\nf 2402/2542/2402 2387/2529/2387 2389/2531/2389\nf 2402/2542/2402 2389/2531/2389 2403/2543/2403\nf 2403/2543/2403 2389/2531/2389 2392/2539/2392\nf 2403/2543/2403 2392/2539/2392 2404/2544/2404\nf 2405/2545/2405 2382/2315/2382 2383/2525/2383\nf 2405/2545/2405 2383/2525/2383 2402/2542/2402\nf 2406/2546/2406 2397/2535/2397 2396/2534/2396\nf 2406/2546/2406 2396/2534/2396 2407/2547/2407\nf 2408/2548/2408 2403/2543/2403 2404/2544/2404\nf 2408/2548/2408 2404/2544/2404 2409/2549/2409\nf 2407/2550/2407 2408/2551/2408 2409/2552/2409\nf 2407/2550/2407 2409/2552/2409 2406/2553/2406\nf 2410/2554/2410 2406/2553/2406 2409/2552/2409\nf 2410/2554/2410 2409/2552/2409 2411/2555/2411\nf 2412/2556/2412 2408/2551/2408 2407/2550/2407\nf 2412/2556/2412 2407/2550/2407 2413/2557/2413\nf 2414/2558/2414 2412/2556/2412 2413/2557/2413\nf 2414/2558/2414 2413/2557/2413 2375/2511/2375\nf 2402/2542/2402 2403/2543/2403 2408/2548/2408\nf 2402/2542/2402 2408/2548/2408 2412/2559/2412\nf 2405/2545/2405 2402/2542/2402 2412/2559/2412\nf 2405/2545/2405 2412/2559/2412 2414/2560/2414\nf 2375/2514/2375 2413/2561/2413 2395/2533/2395\nf 2375/2514/2375 2395/2533/2395 2394/2532/2394\nf 2395/2533/2395 2413/2561/2413 2407/2547/2407\nf 2395/2533/2395 2407/2547/2407 2396/2534/2396\nf 2366/2498/2366 2394/2532/2394 2381/2314/2381\nf 2366/2498/2366 2381/2314/2381 2343/2311/2343\nf 2302/2517/2302 2414/2558/2414 2375/2511/2375\nf 2302/2517/2302 2375/2511/2375 2376/2512/2376\nf 2405/2545/2405 2414/2560/2414 2378/2521/2378\nf 2405/2545/2405 2378/2521/2378 2192/2307/2192\nf 2191/2304/2191 2270/2325/2270 2206/2408/2206\nf 2191/2304/2191 2206/2408/2206 2301/2427/2301\nf 2303/2432/2303 2301/2427/2301 2206/2408/2206\nf 2303/2432/2303 2206/2408/2206 2299/2425/2299\nf 2038/2149/2038 2040/2145/2040 2425/2562/2425\nf 2038/2149/2038 2425/2562/2425 2417/2563/2417\nf 2423/2564/2423 2420/2565/2420 2418/2566/2418\nf 2423/2564/2423 2418/2566/2418 2424/2567/2424\nf 1406/2568/1406 2418/2566/2418 2420/2565/2420\nf 1406/2568/1406 2420/2565/2420 562/2569/562\nf 2422/2570/2422 2419/2571/2419 2416/2572/2416\nf 2422/2570/2422 2416/2572/2416 2421/2573/2421\nf 2423/2564/2423 2417/2563/2417 2416/2572/2416\nf 2423/2564/2423 2416/2572/2416 2419/2571/2419\nf 2424/2567/2424 2038/2149/2038 2417/2563/2417\nf 2424/2567/2424 2417/2563/2417 2423/2564/2423\nf 2428/2574/2428 2015/2575/2015 783/2576/783\nf 2428/2574/2428 783/2576/783 1331/2577/1331\nf 2430/2578/2430 2429/2579/2429 2432/2580/2432\nf 2430/2578/2430 2432/2580/2432 2431/2581/2431\nf 2434/2582/2434 2429/2579/2429 2433/2583/2433\nf 2434/2582/2434 2433/2583/2433 2435/2584/2435\nf 2434/2582/2434 2435/2584/2435 2437/2585/2437\nf 2434/2582/2434 2437/2585/2437 2436/2586/2436\nf 2439/2587/2439 2433/2583/2433 2430/2578/2430\nf 2439/2587/2439 2430/2578/2430 2438/2588/2438\nf 2440/2589/2440 2435/2584/2435 2433/2583/2433\nf 2440/2589/2440 2433/2583/2433 2439/2587/2439\nf 2437/2585/2437 2435/2584/2435 2440/2589/2440\nf 2437/2585/2437 2440/2589/2440 2441/2590/2441\nf 2430/2578/2430 2431/2581/2431 2017/2591/2017\nf 2430/2578/2430 2017/2591/2017 2438/2588/2438\nf 2015/2592/2015 2428/2593/2428 2442/2594/2442\nf 2015/2592/2015 2442/2594/2442 2451/2595/2451\nf 2446/2596/2446 2444/2597/2444 2445/2598/2445\nf 2446/2596/2446 2445/2598/2445 2447/2599/2447\nf 2447/2599/2447 2445/2598/2445 2443/2600/2443\nf 2447/2599/2447 2443/2600/2443 2450/2601/2450\nf 2450/2601/2450 2443/2600/2443 2442/2594/2442\nf 2450/2601/2450 2442/2594/2442 2449/2602/2449\nf 2449/2602/2449 2442/2594/2442 2428/2593/2428\nf 2449/2602/2449 2428/2593/2428 2448/2603/2448\nf 2443/2600/2443 2440/2604/2440 2439/2605/2439\nf 2443/2600/2443 2439/2605/2439 2451/2595/2451\nf 2434/2582/2434 2454/2606/2454 2453/2607/2453\nf 2434/2582/2434 2453/2607/2453 2429/2579/2429\nf 2434/2582/2434 2436/2586/2436 2446/2596/2446\nf 2434/2582/2434 2446/2596/2446 2454/2606/2454\nf 14/2608/14 2421/2573/2421 2426/2609/2426\nf 14/2608/14 2426/2609/2426 1/2610/1\nf 2431/2611/2431 2432/2612/2432 2457/2613/2457\nf 2431/2611/2431 2457/2613/2457 2456/2614/2456\nf 63/2615/63 2457/2613/2457 2432/2612/2432\nf 63/2615/63 2432/2612/2432 64/2616/64\nf 2460/2617/2460 2513/2618/2513 2512/2619/2512\nf 2460/2617/2460 2512/2619/2512 2458/2620/2458\nf 2514/2621/2514 2513/2618/2513 2460/2617/2460\nf 2514/2621/2514 2460/2617/2460 2462/2622/2462\nf 2463/2623/2463 2464/2624/2464 2467/2625/2467\nf 2463/2623/2463 2467/2625/2467 2466/2626/2466\nf 2465/2627/2465 2498/2628/2498 2466/2626/2466\nf 2465/2627/2465 2466/2626/2466 2467/2625/2467\nf 2460/2617/2460 2458/2620/2458 2468/2629/2468\nf 2460/2617/2460 2468/2629/2468 2469/2630/2469\nf 2464/2624/2464 2462/2622/2462 2469/2630/2469\nf 2464/2624/2464 2469/2630/2469 2500/2631/2500\nf 2465/2627/2465 2467/2625/2467 2471/2632/2471\nf 2465/2627/2465 2471/2632/2471 2470/2633/2470\nf 2467/2625/2467 2464/2624/2464 2500/2631/2500\nf 2467/2625/2467 2500/2631/2500 2471/2632/2471\nf 2473/2634/2473 2474/2635/2474 2432/2636/2432\nf 2473/2634/2473 2432/2636/2432 2472/2637/2472\nf 2476/2638/2476 2473/2634/2473 2472/2637/2472\nf 2476/2638/2476 2472/2637/2472 2475/2639/2475\nf 2478/2640/2478 2474/2635/2474 2473/2634/2473\nf 2478/2640/2478 2473/2634/2473 2479/2641/2479\nf 2479/2641/2479 2473/2634/2473 2476/2638/2476\nf 2479/2641/2479 2476/2638/2476 2480/2642/2480\nf 2488/2643/2488 2478/2640/2478 2479/2641/2479\nf 2488/2643/2488 2479/2641/2479 2482/2644/2482\nf 2479/2641/2479 2480/2642/2480 2485/2645/2485\nf 2479/2641/2479 2485/2645/2485 2482/2644/2482\nf 2488/2643/2488 2482/2644/2482 2484/2646/2484\nf 2488/2643/2488 2484/2646/2484 2483/2647/2483\nf 2486/2648/2486 2487/2649/2487 2476/2638/2476\nf 2486/2648/2486 2476/2638/2476 2475/2639/2475\nf 2480/2642/2480 2476/2638/2476 2487/2649/2487\nf 2480/2642/2480 2487/2649/2487 2481/2650/2481\nf 61/2651/61 2474/2635/2474 2478/2640/2478\nf 61/2651/61 2478/2640/2478 2490/2652/2490\nf 1332/2653/1332 2452/2654/2452 2448/2655/2448\nf 1332/2653/1332 2448/2655/2448 1331/2577/1331\nf 106/2656/106 2489/2657/2489 2452/2654/2452\nf 106/2656/106 2452/2654/2452 1332/2653/1332\nf 2478/2640/2478 2488/2643/2488 2489/2658/2489\nf 2478/2640/2478 2489/2658/2489 2490/2652/2490\nf 2492/2659/2492 1/2660/1 2426/2661/2426\nf 2492/2659/2492 2426/2661/2426 2491/2662/2491\nf 2425/2663/2425 2459/2664/2459 2491/2665/2491\nf 2425/2663/2425 2491/2665/2491 2426/2666/2426\nf 2496/2667/2496 2493/2668/2493 2461/2669/2461\nf 2496/2667/2496 2461/2669/2461 2463/2670/2463\nf 2492/2659/2492 2515/2671/2515 4/2672/4\nf 2492/2659/2492 4/2672/4 1/2660/1\nf 2518/2673/2518 2519/2674/2519 2494/2675/2494\nf 2518/2673/2518 2494/2675/2494 2516/2676/2516\nf 2466/2677/2466 2497/2678/2497 2496/2667/2496\nf 2466/2677/2466 2496/2667/2496 2463/2670/2463\nf 2499/2679/2499 2497/2678/2497 2466/2677/2466\nf 2499/2679/2499 2466/2677/2466 2498/2680/2498\nf 2497/2678/2497 2499/2679/2499 2470/2633/2470\nf 2497/2678/2497 2470/2633/2470 2471/2632/2471\nf 2517/2681/2517 2496/2667/2496 2497/2678/2497\nf 2517/2681/2517 2497/2678/2497 2471/2632/2471\nf 2516/2676/2516 2494/2675/2494 2496/2667/2496\nf 2516/2676/2516 2496/2667/2496 2517/2681/2517\nf 1356/2682/1356 2419/2571/2419 2422/2570/2422\nf 1356/2682/1356 2422/2570/2422 1357/2683/1357\nf 90/2684/90 1357/2683/1357 2422/2570/2422\nf 90/2684/90 2422/2570/2422 2502/2685/2502\nf 2507/2686/2507 1444/2687/1444 90/2688/90\nf 2507/2686/2507 90/2688/90 2502/2689/2502\nf 2507/2686/2507 2506/2690/2506 1445/2691/1445\nf 2507/2686/2507 1445/2691/1445 1444/2687/1444\nf 2504/2692/2504 2505/2693/2505 2508/2694/2508\nf 2504/2692/2504 2508/2694/2508 2507/2686/2507\nf 1446/2695/1446 1445/2691/1445 2506/2690/2506\nf 1446/2695/1446 2506/2690/2506 2509/2696/2509\nf 2176/2286/2176 2187/2285/2187 2177/2298/2177\nf 2176/2286/2176 2177/2298/2177 2510/2697/2510\nf 2175/2287/2175 2176/2286/2176 2510/2697/2510\nf 2175/2287/2175 2510/2697/2510 2511/2185/2511\nf 2513/2618/2513 2493/2698/2493 2459/2664/2459\nf 2513/2618/2513 2459/2664/2459 2512/2619/2512\nf 2461/2699/2461 2493/2698/2493 2513/2618/2513\nf 2461/2699/2461 2513/2618/2513 2514/2621/2514\nf 2468/2629/2468 46/2700/46 4/2672/4\nf 2468/2629/2468 4/2672/4 2515/2671/2515\nf 2500/2631/2500 2469/2630/2469 2516/2676/2516\nf 2500/2631/2500 2516/2676/2516 2517/2681/2517\nf 1/11/1 3/2701/3 2/12/2\nf 1/11/1 4/20/4 3/2701/3\nf 3/2701/3 4/20/4 5/2/5\nf 5/2/5 6/1/6 3/2701/3\nf 10/7/10 11/6/11 13/19/13\nf 7/4/7 19/51/19 18/50/18\nf 2/12/2 3/2701/3 6/1/6\nf 20/21/20 22/18/22 21/70/21\nf 25/15/25 26/56/26 24/16/24\nf 19/51/19 7/4/7 24/16/24\nf 24/16/24 26/56/26 19/51/19\nf 37/37/37 43/43/43 34/34/34\nf 46/46/46 9/8/9 4/20/4\nf 41/41/41 45/45/45 40/40/40\nf 26/56/26 49/60/49 48/48/48\nf 19/51/19 26/56/26 48/48/48\nf 1262/33/1262 51/62/51 33/30/33\nf 1262/33/1262 1281/2702/1281 51/62/51\nf 52/52/52 1281/2702/1281 1280/53/1280\nf 49/60/49 26/56/26 54/55/54\nf 31/26/31 55/59/55 30/25/30\nf 32/31/32 56/2703/56 31/26/31\nf 33/30/33 56/2703/56 32/31/32\nf 57/61/57 58/2704/58 56/2703/56\nf 57/61/57 56/2703/56 33/30/33\nf 54/55/54 59/57/59 49/60/49\nf 58/2704/58 60/58/60 56/2703/56\nf 60/58/60 58/2704/58 59/57/59\nf 58/2704/58 49/60/49 59/57/59\nf 58/2704/58 57/61/57 49/60/49\nf 60/58/60 55/59/55 56/2703/56\nf 55/59/55 31/26/31 56/2703/56\nf 51/62/51 1281/2702/1281 52/52/52\nf 63/2705/63 61/63/61 62/64/62\nf 63/2705/63 64/2706/64 61/63/61\nf 45/45/45 61/63/61 47/47/47\nf 47/47/47 65/66/65 44/44/44\nf 109/65/109 43/43/43 44/44/44\nf 21/70/21 36/36/36 20/21/20\nf 21/70/21 66/69/66 36/36/36\nf 39/39/39 66/69/66 42/42/42\nf 36/36/36 66/69/66 39/39/39\nf 12/5/12 67/68/67 11/6/11\nf 11/6/11 67/68/67 23/17/23\nf 22/18/22 67/68/67 21/70/21\nf 23/17/23 67/68/67 22/18/22\nf 42/42/42 67/68/67 12/5/12\nf 68/2707/68 14/10/14 15/9/15\nf 68/2707/68 15/9/15 16/13/16\nf 69/71/69 71/2708/71 16/13/16\nf 2/12/2 6/1/6 17/14/17\nf 77/78/77 80/88/80 79/79/79\nf 77/78/77 79/79/79 76/77/76\nf 72/73/72 70/72/70 17/14/17\nf 70/72/70 72/73/72 75/76/75\nf 75/76/75 81/82/81 70/72/70\nf 84/81/84 70/72/70 81/82/81\nf 84/81/84 69/71/69 70/72/70\nf 81/82/81 75/76/75 78/80/78\nf 86/87/86 87/86/87 89/102/89\nf 79/79/79 85/85/85 78/80/78\nf 7/4/7 18/50/18 6/1/6\nf 92/2709/92 69/71/69 84/81/84\nf 69/71/69 92/2709/92 71/2708/71\nf 82/84/82 92/2709/92 84/81/84\nf 86/87/86 94/2710/94 85/85/85\nf 92/90/92 94/98/94 86/94/86\nf 85/85/85 94/2710/94 83/83/83\nf 89/102/89 96/101/96 95/2711/95\nf 68/93/68 71/2712/71 92/90/92\nf 71/2708/71 68/2707/68 16/13/16\nf 101/111/101 103/108/103 102/2713/102\nf 102/2713/102 103/108/103 104/107/104\nf 98/105/98 99/104/99 105/2714/105\nf 110/2715/110 104/107/104 105/2714/105\nf 102/2713/102 104/107/104 110/2715/110\nf 103/108/103 108/113/108 111/114/111\nf 105/2714/105 104/107/104 98/105/98\nf 114/118/114 121/487/121 122/486/122\nf 126/120/126 116/167/116 115/117/115\nf 113/116/113 112/115/112 127/126/127\nf 112/115/112 117/122/117 120/129/120\nf 122/486/122 119/2716/119 118/123/118\nf 446/485/446 121/487/121 124/2717/124\nf 114/118/114 115/117/115 123/169/123\nf 121/487/121 125/170/125 124/2717/124\nf 121/487/121 123/169/123 125/170/125\nf 118/123/118 119/2716/119 174/125/174\nf 174/125/174 148/165/148 146/124/146\nf 127/126/127 130/131/130 131/143/131\nf 130/131/130 132/130/132 133/2718/133\nf 133/2718/133 136/142/136 130/131/130\nf 134/144/134 131/143/131 130/131/130\nf 136/142/136 133/2718/133 139/132/139\nf 157/141/157 134/144/134 136/142/136\nf 136/142/136 134/144/134 130/131/130\nf 132/130/132 137/134/137 138/133/138\nf 138/133/138 133/2718/133 132/130/132\nf 140/135/140 135/140/135 139/132/139\nf 133/2718/133 138/133/138 139/132/139\nf 137/134/137 132/130/132 141/137/141\nf 141/137/141 143/138/143 142/2719/142\nf 142/2719/142 137/134/137 141/137/141\nf 145/139/145 144/136/144 199/182/199\nf 117/122/117 146/124/146 147/183/147\nf 147/183/147 120/129/120 117/122/117\nf 144/136/144 120/129/120 147/183/147\nf 119/2716/119 188/166/188 174/125/174\nf 149/146/149 150/145/150 154/2720/154\nf 150/145/150 151/147/151 154/2720/154\nf 153/149/153 152/148/152 154/2720/154\nf 149/146/149 154/2720/154 152/148/152\nf 153/149/153 154/2720/154 151/147/151\nf 159/150/159 161/157/161 155/151/155\nf 149/146/149 152/148/152 165/2721/165\nf 157/141/157 135/140/135 158/152/158\nf 160/153/160 177/2722/177 161/157/161\nf 137/134/137 142/2719/142 140/135/140\nf 142/2719/142 143/138/143 164/2723/164\nf 140/135/140 142/2719/142 164/2723/164\nf 140/135/140 164/2723/164 135/140/135\nf 178/155/178 162/154/162 163/2724/163\nf 158/152/158 135/140/135 241/2725/241\nf 135/140/135 164/2723/164 241/2725/241\nf 160/153/160 158/152/158 241/2725/241\nf 152/148/152 155/151/155 165/2721/165\nf 131/143/131 149/146/149 165/2721/165\nf 165/2721/165 156/2726/156 131/143/131\nf 165/2721/165 155/151/155 166/2727/166\nf 166/2727/166 155/151/155 167/156/167\nf 155/151/155 161/157/161 167/156/167\nf 169/159/169 166/2727/166 167/156/167\nf 169/159/169 165/2721/165 166/2727/166\nf 156/2726/156 165/2721/165 168/158/168\nf 165/2721/165 169/159/169 168/158/168\nf 156/2726/156 170/2728/170 128/127/128\nf 156/2726/156 168/158/168 170/2728/170\nf 131/143/131 128/127/128 127/126/127\nf 571/588/571 173/163/173 191/162/191\nf 118/123/118 114/118/114 122/486/122\nf 172/179/172 148/165/148 189/164/189\nf 161/2729/161 177/2730/177 227/236/227\nf 176/2731/176 177/2722/177 164/2723/164\nf 163/2724/163 162/154/162 176/2731/176\nf 162/154/162 175/2732/175 176/2731/176\nf 176/2731/176 175/2732/175 177/2722/177\nf 163/2724/163 164/2723/164 178/155/178\nf 178/155/178 164/2723/164 143/138/143\nf 164/2723/164 163/2724/163 176/2731/176\nf 121/487/121 114/118/114 123/169/123\nf 125/170/125 123/169/123 179/168/179\nf 116/167/116 126/120/126 180/2733/180\nf 116/167/116 180/2733/180 182/173/182\nf 180/2733/180 181/174/181 182/173/182\nf 180/2733/180 126/120/126 181/174/181\nf 124/2717/124 125/170/125 183/172/183\nf 185/175/185 194/119/194 192/2734/192\nf 148/165/148 172/179/172 187/178/187\nf 568/585/568 571/588/571 189/164/189\nf 191/162/191 189/164/189 571/588/571\nf 194/119/194 195/2735/195 192/2734/192\nf 185/175/185 192/2734/192 193/242/193\nf 192/2734/192 195/2735/195 193/242/193\nf 113/116/113 129/128/129 196/121/196\nf 197/181/197 208/180/208 193/242/193\nf 181/174/181 185/175/185 193/242/193\nf 115/117/115 113/116/113 196/121/196\nf 193/242/193 195/2735/195 197/181/197\nf 197/181/197 195/2735/195 194/119/194\nf 197/181/197 194/119/194 196/121/196\nf 198/184/198 219/2736/219 200/185/200\nf 200/185/200 199/182/199 198/184/198\nf 148/165/148 198/184/198 146/124/146\nf 148/165/148 219/2736/219 198/184/198\nf 148/165/148 187/178/187 219/2736/219\nf 219/2736/219 187/178/187 233/230/233\nf 186/176/186 203/191/203 234/195/234\nf 129/128/129 128/127/128 207/198/207\nf 207/198/207 128/127/128 209/2737/209\nf 128/127/128 170/2728/170 209/2737/209\nf 209/200/209 170/2738/170 210/193/210\nf 218/351/218 212/206/212 215/210/215\nf 216/212/216 217/211/217 262/257/262\nf 214/209/214 211/214/211 218/351/218\nf 211/214/211 224/213/224 221/219/221\nf 220/215/220 223/220/223 224/213/224\nf 219/202/219 339/201/339 200/186/200\nf 225/187/225 226/222/226 175/188/175\nf 226/222/226 177/2730/177 175/188/175\nf 168/2739/168 228/245/228 170/2740/170\nf 168/2739/168 161/2729/161 228/245/228\nf 228/245/228 227/236/227 245/238/245\nf 228/245/228 229/247/229 170/2740/170\nf 231/223/231 230/225/230 240/228/240\nf 203/191/203 205/192/205 234/195/234\nf 234/195/234 201/177/201 186/176/186\nf 217/211/217 236/233/236 250/235/250\nf 230/246/230 247/239/247 240/250/240\nf 164/2723/164 177/2722/177 241/2725/241\nf 241/2725/241 177/2722/177 160/153/160\nf 161/157/161 159/150/159 160/153/160\nf 191/162/191 172/179/172 189/164/189\nf 243/241/243 182/173/182 181/174/181\nf 243/241/243 184/171/184 182/173/182\nf 206/199/206 242/244/242 208/180/208\nf 161/2729/161 227/236/227 228/245/228\nf 247/239/247 230/246/230 245/238/245\nf 226/222/226 227/236/227 177/2730/177\nf 246/2741/246 264/260/264 237/2742/237\nf 248/234/248 264/2743/264 249/251/249\nf 250/235/250 262/257/262 217/211/217\nf 216/212/216 262/257/262 260/217/260\nf 248/234/248 249/251/249 259/254/259\nf 257/258/257 251/259/251 252/295/252\nf 260/217/260 257/258/257 258/218/258\nf 220/215/220 222/216/222 255/256/255\nf 222/216/222 256/290/256 255/289/255\nf 258/218/258 252/295/252 256/290/256\nf 257/258/257 252/295/252 258/218/258\nf 250/235/250 248/234/248 259/254/259\nf 218/351/218 215/210/215 214/209/214\nf 246/2741/246 263/261/263 264/260/264\nf 266/263/266 265/262/265 285/2744/285\nf 267/2745/267 285/2744/285 269/2746/269\nf 269/2746/269 268/273/268 402/431/402\nf 271/266/271 265/262/265 274/267/274\nf 270/269/270 268/273/268 284/270/284\nf 246/2741/246 254/291/254 263/261/263\nf 273/264/273 276/271/276 272/2747/272\nf 276/271/276 273/264/273 279/275/279\nf 284/270/284 272/2747/272 276/271/276\nf 277/272/277 278/274/278 280/428/280\nf 278/274/278 281/277/281 280/428/280\nf 279/275/279 278/274/278 276/271/276\nf 276/271/276 278/274/278 277/272/277\nf 273/264/273 272/2747/272 283/265/283\nf 283/265/283 272/2747/272 284/270/284\nf 285/2744/285 265/262/265 271/266/271\nf 285/2744/285 271/266/271 268/273/268\nf 285/2744/285 267/2745/267 266/263/266\nf 285/2744/285 268/273/268 269/2746/269\nf 254/291/254 255/289/255 292/287/292\nf 290/285/290 342/354/342 294/398/294\nf 294/398/294 291/298/291 290/285/290\nf 298/278/298 275/268/275 263/261/263\nf 290/285/290 291/298/291 293/288/293\nf 249/251/249 264/2743/264 266/296/266\nf 267/297/267 269/279/269 253/252/253\nf 308/310/308 314/313/314 315/311/315\nf 312/317/312 317/316/317 313/350/313\nf 308/310/308 309/318/309 314/313/314\nf 314/313/314 310/312/310 315/311/315\nf 317/316/317 311/320/311 313/350/313\nf 306/308/306 304/306/304 323/321/323\nf 309/318/309 308/310/308 332/336/332\nf 315/311/315 310/312/310 318/333/318\nf 305/307/305 307/309/307 319/323/319\nf 307/309/307 315/311/315 319/323/319\nf 320/325/320 403/424/403 321/326/321\nf 323/321/323 304/306/304 302/304/302\nf 324/324/324 319/323/319 349/332/349\nf 403/424/403 320/325/320 432/2748/432\nf 331/344/331 333/337/333 329/339/329\nf 329/340/329 326/334/326 331/343/331\nf 318/333/318 310/312/310 345/346/345\nf 336/319/336 309/318/309 346/348/346\nf 339/201/339 211/214/211 221/219/221\nf 339/201/339 221/219/221 200/186/200\nf 221/219/221 225/187/225 200/186/200\nf 170/2749/170 341/224/341 210/353/210\nf 291/298/291 343/2750/343 344/328/344\nf 310/312/310 334/315/334 345/346/345\nf 309/318/309 332/336/332 346/348/346\nf 330/342/330 318/333/318 345/346/345\nf 346/348/346 332/336/332 330/345/330\nf 347/355/347 327/322/327 323/321/323\nf 322/329/322 384/2751/384 351/2752/351\nf 344/328/344 384/2751/384 322/329/322\nf 359/370/359 361/373/361 360/371/360\nf 363/374/363 367/2753/367 364/375/364\nf 359/370/359 365/376/365 361/373/361\nf 361/373/361 362/372/362 360/371/360\nf 366/377/366 367/2753/367 363/374/363\nf 357/368/357 355/366/355 368/378/368\nf 356/367/356 358/369/358 372/382/372\nf 358/369/358 360/371/360 372/382/372\nf 368/378/368 355/366/355 353/365/353\nf 373/383/373 372/382/372 383/384/383\nf 371/380/371 377/390/377 378/2754/378\nf 378/2755/378 377/394/377 370/385/370\nf 378/2755/378 370/385/370 375/387/375\nf 375/388/375 371/380/371 378/2754/378\nf 371/380/371 362/372/362 379/391/379\nf 366/377/366 365/376/365 380/393/380\nf 367/2753/367 381/392/381 364/375/364\nf 381/395/381 367/2753/367 366/377/366\nf 362/372/362 364/375/364 379/391/379\nf 365/376/365 370/385/370 380/393/380\nf 377/390/377 371/380/371 379/391/379\nf 380/393/380 370/385/370 377/394/377\nf 373/383/373 383/384/383 384/427/384\nf 344/363/344 354/362/354 373/383/373\nf 373/383/373 384/427/384 344/363/344\nf 343/2750/343 294/398/294 385/400/385\nf 291/298/291 294/398/294 343/2750/343\nf 386/399/386 342/354/342 387/294/387\nf 351/405/351 384/2756/384 395/406/395\nf 349/332/349 350/361/350 432/335/432\nf 393/413/393 386/399/386 387/294/387\nf 396/414/396 393/413/393 389/403/389\nf 385/400/385 386/399/386 394/410/394\nf 393/413/393 387/294/387 389/403/389\nf 297/292/297 299/299/299 321/326/321\nf 434/2757/434 391/421/391 433/420/433\nf 400/422/400 398/418/398 397/417/397\nf 397/417/397 399/423/399 400/422/400\nf 368/378/368 385/401/385 394/415/394\nf 401/425/401 399/423/399 397/417/397\nf 268/273/268 270/269/270 402/431/402\nf 408/439/408 409/438/409 410/441/410\nf 412/440/412 413/443/413 414/2758/414\nf 408/439/408 410/441/410 415/444/415\nf 410/441/410 409/438/409 411/442/411\nf 416/445/416 412/440/412 414/2758/414\nf 406/437/406 417/446/417 405/434/405\nf 404/433/404 421/450/421 407/436/407\nf 407/436/407 421/450/421 409/438/409\nf 419/449/419 427/2759/427 426/457/426\nf 427/2760/427 424/452/424 426/461/426\nf 427/2760/427 423/453/423 424/452/424\nf 423/456/423 427/2759/427 419/449/419\nf 419/449/419 428/459/428 411/442/411\nf 416/445/416 429/462/429 415/444/415\nf 413/443/413 430/458/430 414/2758/414\nf 430/460/430 416/445/416 414/2758/414\nf 411/442/411 428/459/428 413/443/413\nf 415/444/415 429/462/429 424/452/424\nf 426/457/426 428/459/428 419/449/419\nf 429/462/429 426/461/426 424/452/424\nf 421/450/421 432/468/432 422/451/422\nf 403/432/403 421/450/421 404/433/404\nf 421/450/421 403/432/403 432/468/432\nf 405/434/405 417/446/417 399/2761/399\nf 417/446/417 433/466/433 399/2761/399\nf 405/434/405 399/2761/399 401/435/401\nf 432/2762/432 350/2763/350 435/2764/435\nf 435/2764/435 434/2757/434 433/420/433\nf 350/2763/350 434/2757/434 435/2764/435\nf 441/478/441 446/485/446 442/479/442\nf 183/172/183 442/479/442 124/2717/124\nf 183/172/183 184/171/184 442/479/442\nf 442/479/442 446/485/446 124/2717/124\nf 588/2765/588 564/594/564 119/2716/119\nf 447/484/447 558/483/558 449/2766/449\nf 449/2766/449 122/486/122 447/484/447\nf 451/488/451 242/490/242 204/491/204\nf 477/524/477 476/523/476 478/2767/478\nf 478/2767/478 480/526/480 481/550/481\nf 478/2767/478 476/523/476 480/526/480\nf 481/550/481 480/526/480 485/2768/485\nf 480/526/480 479/525/479 482/527/482\nf 480/526/480 482/527/482 485/2768/485\nf 482/527/482 519/530/519 485/2768/485\nf 498/522/498 488/532/488 487/531/487\nf 487/531/487 468/513/468 498/522/498\nf 468/513/468 487/531/487 491/536/491\nf 497/541/497 496/540/496 493/537/493\nf 171/160/171 204/190/204 190/161/190\nf 475/521/475 499/543/499 498/522/498\nf 498/522/498 501/553/501 500/2769/500\nf 499/543/499 503/545/503 501/553/501\nf 475/521/475 477/524/477 505/544/505\nf 477/524/477 478/2767/478 505/544/505\nf 478/2767/478 481/550/481 505/544/505\nf 481/550/481 504/2770/504 505/544/505\nf 481/550/481 502/547/502 504/2770/504\nf 504/2770/504 503/545/503 505/544/505\nf 504/2770/504 506/2771/506 512/2772/512\nf 504/2770/504 502/547/502 506/2771/506\nf 506/2771/506 502/547/502 507/546/507\nf 506/2771/506 507/546/507 510/555/510\nf 510/555/510 512/2772/512 506/2771/506\nf 507/546/507 509/549/509 510/555/510\nf 481/550/481 485/2768/485 519/530/519\nf 503/545/503 504/2770/504 511/554/511\nf 504/2770/504 512/2772/512 511/554/511\nf 510/555/510 511/554/511 512/2772/512\nf 514/551/514 513/557/513 537/552/537\nf 500/2769/500 501/553/501 537/552/537\nf 498/522/498 499/543/499 501/553/501\nf 516/2773/516 517/2774/517 519/530/519\nf 517/2774/517 508/548/508 519/530/519\nf 517/2774/517 516/2773/516 518/2775/518\nf 519/530/519 515/556/515 516/2773/516\nf 486/529/486 515/556/515 519/530/519\nf 515/556/515 173/542/173 538/570/538\nf 173/163/173 571/588/571 538/2776/538\nf 508/548/508 517/2774/517 520/559/520\nf 520/559/520 509/549/509 508/548/508\nf 517/2774/517 518/2775/518 520/559/520\nf 520/559/520 510/555/510 509/549/509\nf 518/2775/518 516/2773/516 542/560/542\nf 542/560/542 520/559/520 518/2775/518\nf 526/566/526 473/519/473 472/518/472\nf 532/2777/532 523/563/523 527/2778/527\nf 523/563/523 469/515/469 527/2778/527\nf 534/2779/534 527/2778/527 529/2780/529\nf 529/2780/529 528/514/528 531/567/531\nf 527/2778/527 469/515/469 528/514/528\nf 529/2780/529 531/567/531 533/568/533\nf 530/2781/530 492/535/492 494/538/494\nf 534/2779/534 532/2777/532 527/2778/527\nf 492/535/492 530/2781/530 533/568/533\nf 533/568/533 530/2781/530 529/2780/529\nf 528/514/528 469/515/469 458/503/458\nf 529/2780/529 530/2781/530 534/2779/534\nf 468/513/468 491/536/491 531/567/531\nf 531/567/531 528/514/528 468/513/468\nf 528/514/528 529/2780/529 527/2778/527\nf 535/2782/535 467/512/467 466/511/466\nf 466/511/466 473/519/473 535/2782/535\nf 496/540/496 495/539/495 493/537/493\nf 498/522/498 500/2769/500 536/2783/536\nf 500/2769/500 537/552/537 536/2783/536\nf 513/557/513 536/2783/536 537/552/537\nf 495/539/495 498/522/498 536/2783/536\nf 516/2773/516 515/556/515 541/569/541\nf 541/569/541 542/560/542 516/2773/516\nf 541/569/541 543/573/543 542/560/542\nf 543/573/543 540/572/540 544/2784/544\nf 543/573/543 544/2784/544 545/574/545\nf 542/560/542 543/573/543 545/574/545\nf 592/607/592 548/582/548 549/579/549\nf 549/579/549 551/577/551 550/576/550\nf 552/578/552 443/480/443 445/482/445\nf 552/578/552 551/577/551 553/2785/553\nf 554/2786/554 558/481/558 443/480/443\nf 443/480/443 552/578/552 554/2786/554\nf 557/581/557 553/2785/553 551/577/551\nf 553/2785/553 557/581/557 556/2787/556\nf 554/2786/554 552/578/552 556/2787/556\nf 556/2787/556 552/578/552 553/2785/553\nf 556/2787/556 558/481/558 554/2786/554\nf 558/483/558 556/2788/556 449/2766/449\nf 548/582/548 592/607/592 593/601/593\nf 812/2789/812 813/2790/813 741/2791/741\nf 565/2792/565 450/584/450 188/166/188\nf 564/594/564 448/593/448 119/2716/119\nf 119/2716/119 448/593/448 589/2793/589\nf 119/2716/119 589/2793/589 188/166/188\nf 563/2794/563 565/2792/565 188/166/188\nf 563/2794/563 567/2795/567 587/2796/587\nf 565/2792/565 587/2796/587 566/2797/566\nf 566/2797/566 450/584/450 565/2792/565\nf 587/2796/587 565/2792/565 563/2794/563\nf 569/589/569 571/588/571 573/587/573\nf 568/585/568 570/2798/570 572/586/572\nf 570/2798/570 585/2799/585 572/586/572\nf 572/586/572 583/2800/583 573/587/573\nf 573/587/573 583/2800/583 569/589/569\nf 576/2801/576 579/2802/579 575/2803/575\nf 571/588/571 569/589/569 574/2804/574\nf 579/2802/579 539/571/539 575/2803/575\nf 539/571/539 538/570/538 575/2803/575\nf 575/2803/575 538/570/538 576/2801/576\nf 576/2805/576 574/2804/574 577/592/577\nf 577/592/577 574/2804/574 569/589/569\nf 538/2776/538 574/2804/574 576/2805/576\nf 574/2804/574 538/2776/538 571/588/571\nf 576/2801/576 582/2806/582 579/2802/579\nf 586/591/586 581/2807/581 580/2808/580\nf 578/590/578 581/2807/581 586/591/586\nf 576/2801/576 580/639/580 582/2806/582\nf 580/2808/580 576/2805/576 577/592/577\nf 569/589/569 584/2809/584 578/590/578\nf 578/590/578 584/2809/584 570/2798/570\nf 569/589/569 583/2800/583 584/2809/584\nf 583/2800/583 572/586/572 585/2799/585\nf 570/2798/570 584/2809/584 585/2799/585\nf 585/2799/585 584/2809/584 583/2800/583\nf 580/2808/580 577/592/577 586/591/586\nf 570/2798/570 568/585/568 450/584/450\nf 450/584/450 566/2797/566 607/2810/607\nf 566/2797/566 587/2796/587 607/2810/607\nf 607/2810/607 570/2798/570 450/584/450\nf 607/2810/607 578/590/578 570/2798/570\nf 587/2796/587 567/2795/567 590/596/590\nf 567/2795/567 448/593/448 590/596/590\nf 119/2716/119 122/486/122 588/2765/588\nf 448/593/448 567/2795/567 589/2793/589\nf 589/2793/589 567/2795/567 563/2794/563\nf 589/2793/589 563/2794/563 188/166/188\nf 122/486/122 449/2766/449 588/2765/588\nf 564/594/564 588/2765/588 591/595/591\nf 449/2766/449 556/2788/556 588/2765/588\nf 549/579/549 550/576/550 592/607/592\nf 550/576/550 602/2811/602 592/607/592\nf 602/2811/602 601/606/601 594/605/594\nf 745/771/745 595/600/595 744/599/744\nf 596/770/596 636/657/636 597/2812/597\nf 598/602/598 594/605/594 599/603/599\nf 548/582/548 593/601/593 600/583/600\nf 596/770/596 559/604/559 601/606/601\nf 559/604/559 596/770/596 638/655/638\nf 602/2811/602 594/605/594 592/607/592\nf 607/2810/607 587/2796/587 590/596/590\nf 607/623/607 590/612/590 604/611/604\nf 638/655/638 597/2812/597 637/656/637\nf 637/656/637 597/2812/597 636/657/636\nf 604/611/604 993/620/993 607/623/607\nf 605/610/605 606/659/606 609/2813/609\nf 604/611/604 605/610/605 608/1000/608\nf 578/2814/578 607/2815/607 610/641/610\nf 610/641/610 581/640/581 578/2814/578\nf 610/622/610 994/621/994 995/624/995\nf 609/2813/609 897/876/897 613/875/613\nf 996/2816/996 621/2817/621 611/1001/611\nf 611/1001/611 621/2817/621 614/2818/614\nf 609/2813/609 613/875/613 996/2816/996\nf 609/2813/609 608/1000/608 605/610/605\nf 642/1002/642 650/2819/650 619/627/619\nf 619/627/619 616/2820/616 620/628/620\nf 613/875/613 615/874/615 621/2817/621\nf 621/2817/621 615/874/615 622/2821/622\nf 614/2818/614 621/2817/621 622/2821/622\nf 614/2818/614 642/1002/642 611/1001/611\nf 619/627/619 995/624/995 642/1002/642\nf 616/2822/616 645/2823/645 643/632/643\nf 650/2819/650 642/1002/642 645/2824/645\nf 617/642/617 618/630/618 648/629/648\nf 620/631/620 616/2822/616 643/632/643\nf 628/636/628 625/634/625 627/633/627\nf 624/635/624 626/637/626 540/572/540\nf 626/637/626 545/574/545 544/2784/544\nf 626/637/626 544/2784/544 540/572/540\nf 624/635/624 540/572/540 539/571/539\nf 539/571/539 579/2802/579 624/635/624\nf 579/2802/579 582/2806/582 624/635/624\nf 545/574/545 626/637/626 627/633/627\nf 624/635/624 582/2806/582 580/639/580\nf 591/595/591 588/2765/588 556/2788/556\nf 630/646/630 632/649/632 634/651/634\nf 603/654/603 560/650/560 635/652/635\nf 936/1182/936 612/2825/612 606/659/606\nf 596/770/596 597/2812/597 638/655/638\nf 630/646/630 560/650/560 603/654/603\nf 614/2818/614 622/2821/622 640/2826/640\nf 622/2821/622 651/2827/651 640/2826/640\nf 622/2821/622 615/874/615 651/2827/651\nf 614/2818/614 639/2828/639 642/1002/642\nf 639/2828/639 645/2824/645 642/1002/642\nf 614/2818/614 640/2826/640 641/2829/641\nf 639/2830/639 644/660/644 645/2823/645\nf 644/660/644 643/632/643 645/2823/645\nf 623/2831/623 643/632/643 646/662/646\nf 643/632/643 623/2831/623 648/629/648\nf 625/2832/625 628/643/628 617/642/617\nf 648/629/648 623/2831/623 625/2832/625\nf 617/642/617 648/629/648 625/2832/625\nf 645/2824/645 616/2820/616 650/2819/650\nf 650/2819/650 616/2820/616 619/627/619\nf 614/2818/614 641/2829/641 639/2828/639\nf 644/2833/644 639/2834/639 653/674/653\nf 644/2833/644 653/674/653 673/673/673\nf 653/671/653 654/670/654 656/678/656\nf 665/683/665 659/2835/659 660/684/660\nf 661/685/661 659/2835/659 665/686/665\nf 661/685/661 669/691/669 659/2835/659\nf 669/691/669 660/684/660 659/2835/659\nf 671/693/671 670/692/670 669/691/669\nf 668/690/668 666/689/666 674/694/674\nf 673/673/673 676/698/676 644/2833/644\nf 672/688/672 674/694/674 677/696/677\nf 672/688/672 677/696/677 678/697/678\nf 729/2836/729 730/2837/730 771/2838/771\nf 680/701/680 679/700/679 684/738/684\nf 679/700/679 710/730/710 684/738/684\nf 690/714/690 703/723/703 698/715/698\nf 705/2839/705 702/2840/702 704/2841/704\nf 705/2839/705 706/2842/706 682/902/682\nf 692/2843/692 694/2844/694 695/2845/695\nf 681/705/681 699/710/699 696/718/696\nf 699/710/699 688/720/688 696/718/696\nf 696/718/696 694/717/694 692/782/692\nf 688/720/688 691/722/691 701/721/701\nf 701/721/701 691/722/691 703/723/703\nf 703/723/703 691/722/691 698/715/698\nf 704/724/704 703/723/703 689/712/689\nf 706/2842/706 705/2839/705 704/2841/704\nf 694/2844/694 693/2846/693 709/2847/709\nf 704/724/704 689/712/689 706/725/706\nf 708/727/708 695/2845/695 694/2844/694\nf 693/2846/693 750/729/750 709/2847/709\nf 694/2844/694 749/728/749 708/727/708\nf 689/712/689 690/714/690 711/713/711\nf 720/740/720 716/734/716 714/733/714\nf 718/742/718 713/732/713 712/731/712\nf 690/714/690 689/712/689 703/723/703\nf 718/741/718 720/740/720 724/749/724\nf 724/749/724 725/748/725 728/2848/728\nf 725/748/725 726/750/726 728/2848/728\nf 726/750/726 727/747/727 728/2848/728\nf 727/747/727 724/746/724 728/2848/728\nf 730/781/730 678/2849/678 677/778/677\nf 676/755/676 678/762/678 732/756/732\nf 730/763/730 729/758/729 734/761/734\nf 737/764/737 735/2850/735 736/765/736\nf 738/766/738 735/2850/735 739/767/739\nf 739/767/739 735/2850/735 737/764/737\nf 609/2813/609 606/659/606 612/2825/612\nf 629/647/629 742/769/742 741/2791/741\nf 813/2790/813 746/2851/746 741/2791/741\nf 741/2791/741 740/768/740 562/2852/562\nf 629/647/629 630/646/630 742/769/742\nf 742/769/742 740/768/740 741/2791/741\nf 742/769/742 630/646/630 743/598/743\nf 743/598/743 630/646/630 603/654/603\nf 744/599/744 636/657/636 596/770/596\nf 601/606/601 602/2811/602 745/771/745\nf 741/2791/741 562/2852/562 812/2789/812\nf 746/2851/746 629/647/629 741/2791/741\nf 813/2853/813 747/2854/747 748/2855/748\nf 748/2856/748 746/2851/746 813/2790/813\nf 629/647/629 746/2851/746 748/2856/748\nf 694/2844/694 709/2847/709 749/728/749\nf 749/728/749 709/2847/709 750/729/750\nf 693/2846/693 704/2841/704 750/729/750\nf 693/716/693 697/719/697 704/724/704\nf 704/2841/704 702/2840/702 750/729/750\nf 702/2840/702 707/726/707 750/729/750\nf 695/2845/695 708/727/708 751/2857/751\nf 751/2857/751 753/2858/753 754/788/754\nf 753/2858/753 755/2859/755 754/788/754\nf 788/2860/788 776/790/776 787/789/787\nf 751/2857/751 752/773/752 753/2858/753\nf 753/2858/753 752/773/752 758/784/758\nf 752/773/752 757/772/757 758/784/758\nf 752/773/752 707/726/707 759/774/759\nf 758/784/758 757/772/757 760/776/760\nf 755/2859/755 753/2858/753 763/783/763\nf 753/2858/753 758/784/758 763/783/763\nf 763/783/763 774/803/774 764/2861/764\nf 759/774/759 707/726/707 765/2862/765\nf 765/2862/765 707/726/707 702/2840/702\nf 702/2840/702 705/2839/705 766/2863/766\nf 765/2862/765 702/2840/702 766/2863/766\nf 705/2839/705 765/2862/765 766/2863/766\nf 765/2862/765 761/775/761 759/774/759\nf 771/2838/771 730/2837/730 920/2864/920\nf 924/917/924 769/904/769 768/903/768\nf 767/702/767 680/701/680 771/2838/771\nf 771/753/771 680/706/680 681/705/681\nf 692/782/692 700/2865/700 772/751/772\nf 772/751/772 700/2865/700 729/752/729\nf 708/727/708 707/726/707 751/2857/751\nf 707/726/707 752/773/752 751/2857/751\nf 763/783/763 799/804/799 774/803/774\nf 775/786/775 773/785/773 762/777/762\nf 763/783/763 775/786/775 799/804/799\nf 776/790/776 780/2866/780 777/787/777\nf 764/2861/764 788/2860/788 787/789/787\nf 788/2860/788 764/2861/764 778/2867/778\nf 764/2861/764 774/803/774 778/2867/778\nf 764/2861/764 755/2859/755 763/783/763\nf 788/2860/788 778/2867/778 805/2868/805\nf 805/2868/805 776/790/776 788/2860/788\nf 804/2869/804 780/2866/780 805/2868/805\nf 780/2866/780 776/790/776 805/2868/805\nf 782/792/782 756/791/756 780/2866/780\nf 780/2866/780 756/791/756 777/787/777\nf 782/792/782 803/2870/803 784/793/784\nf 785/2871/785 782/792/782 781/800/781\nf 785/2871/785 781/800/781 802/2872/802\nf 754/788/754 755/2859/755 787/789/787\nf 787/789/787 755/2859/755 764/2861/764\nf 761/775/761 795/2873/795 789/2874/789\nf 762/777/762 789/2874/789 790/2875/790\nf 775/786/775 762/777/762 798/2876/798\nf 790/2875/790 789/2874/789 791/795/791\nf 761/775/761 765/2862/765 792/2877/792\nf 789/2874/789 762/777/762 761/775/761\nf 761/775/761 792/2877/792 795/2873/795\nf 762/777/762 790/2875/790 798/2876/798\nf 798/2876/798 799/804/799 775/786/775\nf 790/2875/790 793/2878/793 798/2876/798\nf 790/2875/790 791/795/791 793/2878/793\nf 795/2873/795 796/2879/796 789/2874/789\nf 795/2873/795 792/2877/792 796/2879/796\nf 796/2879/796 792/2877/792 794/796/794\nf 796/2879/796 794/796/794 797/2880/797\nf 797/2880/797 789/2874/789 796/2879/796\nf 794/796/794 791/795/791 797/2880/797\nf 797/2880/797 791/795/791 789/2874/789\nf 792/2877/792 765/2862/765 826/2881/826\nf 798/2876/798 793/2878/793 799/804/799\nf 802/2872/802 803/2870/803 785/2871/785\nf 803/2870/803 802/2872/802 784/793/784\nf 804/2869/804 805/2868/805 806/802/806\nf 780/2866/780 779/801/779 781/800/781\nf 804/2869/804 779/801/779 780/2866/780\nf 780/2866/780 781/800/781 782/792/782\nf 779/801/779 804/2869/804 806/802/806\nf 806/802/806 805/2868/805 778/2867/778\nf 800/798/800 793/2878/793 791/795/791\nf 799/804/799 793/2878/793 810/805/810\nf 793/2878/793 800/798/800 810/805/810\nf 809/806/809 806/802/806 778/2867/778\nf 811/807/811 812/1227/812 1196/1224/1196\nf 813/2853/813 811/807/811 815/2882/815\nf 808/809/808 814/811/814 815/2882/815\nf 815/2882/815 814/811/814 816/1004/816\nf 815/2882/815 816/1004/816 817/2883/817\nf 747/2854/747 813/2853/813 815/2882/815\nf 747/2854/747 815/2882/815 818/2884/818\nf 815/2882/815 817/2883/817 818/2884/818\nf 818/2884/818 748/2855/748 747/2854/747\nf 820/812/820 819/810/819 821/2885/821\nf 821/2885/821 819/810/819 800/798/800\nf 800/798/800 801/797/801 821/2885/821\nf 822/814/822 820/812/820 821/2885/821\nf 821/2885/821 801/797/801 822/814/822\nf 765/2862/765 705/2839/705 826/2881/826\nf 705/2839/705 823/2886/823 826/2881/826\nf 824/1020/824 823/2886/823 828/900/828\nf 828/900/828 825/834/825 824/1020/824\nf 833/2887/833 823/2886/823 836/1023/836\nf 825/834/825 828/900/828 914/872/914\nf 823/2886/823 827/901/827 828/900/828\nf 827/901/827 823/2886/823 705/2839/705\nf 826/2881/826 830/813/830 829/815/829\nf 829/815/829 801/797/801 794/796/794\nf 792/2877/792 826/2881/826 829/815/829\nf 829/815/829 794/796/794 792/2877/792\nf 830/813/830 826/2881/826 831/2888/831\nf 830/813/830 831/2888/831 837/1008/837\nf 831/2888/831 833/2887/833 837/1008/837\nf 837/1008/837 833/2887/833 834/2889/834\nf 832/1009/832 834/2889/834 835/1022/835\nf 835/1022/835 834/2889/834 836/1023/836\nf 823/2886/823 824/1020/824 836/1023/836\nf 836/1023/836 834/2889/834 833/2887/833\nf 834/2889/834 832/1009/832 837/1008/837\nf 831/2888/831 826/2881/826 833/2887/833\nf 833/2887/833 826/2881/826 823/2886/823\nf 824/1020/824 825/834/825 863/833/863\nf 841/818/841 838/817/838 843/835/843\nf 824/1020/824 863/833/863 1024/2890/1024\nf 865/1011/865 844/836/844 864/838/864\nf 862/837/862 842/822/842 845/828/845\nf 846/926/846 867/2891/867 862/837/862\nf 862/837/862 845/828/845 846/926/846\nf 851/826/851 873/831/873 852/827/852\nf 849/823/849 851/826/851 852/827/852\nf 858/2892/858 855/840/855 874/2893/874\nf 857/839/857 856/843/856 873/831/873\nf 859/824/859 861/870/861 926/2894/926\nf 859/824/859 848/820/848 861/870/861\nf 838/817/838 842/822/842 843/835/843\nf 843/835/843 842/822/842 862/837/862\nf 867/2891/867 864/838/864 862/837/862\nf 927/871/927 839/816/839 840/819/840\nf 840/819/840 913/873/913 927/871/927\nf 864/838/864 818/2884/818 865/1011/865\nf 865/1011/865 818/2884/818 817/2883/817\nf 748/2855/748 818/2884/818 866/2895/866\nf 629/2896/629 748/2855/748 866/2895/866\nf 866/2897/866 633/653/633 631/648/631\nf 631/648/631 629/647/629 866/2897/866\nf 866/2895/866 867/2891/867 932/919/932\nf 855/840/855 858/2892/858 883/841/883\nf 858/2892/858 882/855/882 883/841/883\nf 873/831/873 872/949/872 869/845/869\nf 872/949/872 856/843/856 1380/844/1380\nf 856/843/856 872/949/872 873/831/873\nf 873/831/873 851/826/851 857/839/857\nf 855/840/855 850/825/850 874/2893/874\nf 874/2893/874 850/825/850 860/864/860\nf 946/856/946 868/850/868 875/869/875\nf 946/856/946 875/869/875 949/957/949\nf 877/849/877 875/869/875 868/850/868\nf 882/855/882 858/2892/858 885/861/885\nf 885/861/885 881/847/881 882/855/882\nf 946/856/946 1380/844/1380 884/842/884\nf 858/2892/858 887/857/887 885/861/885\nf 874/2893/874 886/858/886 887/857/887\nf 887/857/887 858/2892/858 874/2893/874\nf 860/864/860 926/2894/926 888/865/888\nf 896/863/896 874/2893/874 860/864/860\nf 896/863/896 886/858/886 874/2893/874\nf 897/876/897 899/2898/899 901/878/901\nf 898/881/898 900/2899/900 903/882/903\nf 900/2899/900 919/884/919 903/882/903\nf 902/883/902 651/2900/651 615/880/615\nf 651/2900/651 902/883/902 906/2901/906\nf 902/883/902 907/887/907 906/2901/906\nf 906/2901/906 904/2902/904 651/2900/651\nf 904/888/904 652/668/652 651/667/651\nf 906/2901/906 907/887/907 911/894/911\nf 911/895/911 909/893/909 906/892/906\nf 919/884/919 900/2899/900 912/2903/912\nf 927/871/927 913/873/913 916/897/916\nf 915/915/915 768/903/768 912/907/912\nf 827/901/827 705/2839/705 682/902/682\nf 915/896/915 914/872/914 682/902/682\nf 769/904/769 770/2904/770 918/2905/918\nf 770/2904/770 921/779/921 923/910/923\nf 918/2905/918 770/2904/770 923/910/923\nf 767/916/767 920/2906/920 922/780/922\nf 920/2864/920 767/702/767 771/2838/771\nf 921/779/921 925/2907/925 922/780/922\nf 922/780/922 925/2907/925 767/916/767\nf 923/913/923 917/906/917 918/905/918\nf 922/780/922 920/2906/920 730/781/730\nf 770/2904/770 769/904/769 925/2907/925\nf 925/2907/925 769/904/769 924/917/924\nf 925/2907/925 924/917/924 767/916/767\nf 921/779/921 770/2904/770 925/2907/925\nf 900/899/900 901/934/901 928/933/928\nf 928/933/928 927/871/927 916/897/916\nf 928/933/928 916/897/916 900/899/900\nf 899/2898/899 897/876/897 612/2825/612\nf 899/2898/899 612/2825/612 929/2908/929\nf 612/2825/612 936/1182/936 929/2908/929\nf 609/2813/609 612/2825/612 897/876/897\nf 634/2909/634 633/918/633 930/617/930\nf 635/616/635 634/2909/634 930/617/930\nf 932/919/932 867/2891/867 931/920/931\nf 867/2891/867 846/926/846 931/920/931\nf 932/919/932 633/918/633 866/2895/866\nf 811/807/811 813/2853/813 812/1227/812\nf 854/829/854 953/924/953 934/921/934\nf 937/925/937 931/920/931 846/926/846\nf 853/830/853 935/922/935 937/925/937\nf 936/618/936 937/925/937 929/2910/929\nf 933/923/933 955/951/955 953/924/953\nf 888/865/888 926/2894/926 939/931/939\nf 926/2894/926 861/870/861 939/931/939\nf 933/923/933 871/832/871 870/846/870\nf 889/862/889 940/935/940 943/2911/943\nf 891/860/891 890/859/890 940/935/940\nf 889/862/889 891/860/891 940/935/940\nf 894/868/894 889/862/889 943/2911/943\nf 893/867/893 894/868/894 942/936/942\nf 894/868/894 943/2911/943 942/936/942\nf 946/856/946 1379/1448/1379 1380/844/1380\nf 1379/1448/1379 946/856/946 949/957/949\nf 945/943/945 943/942/943 940/953/940\nf 952/946/952 945/943/945 951/950/951\nf 944/940/944 945/943/945 952/946/952\nf 955/951/955 933/923/933 956/952/956\nf 956/952/956 933/923/933 870/846/870\nf 935/922/935 899/956/899 929/2910/929\nf 929/2910/929 937/925/937 935/922/935\nf 935/922/935 934/921/934 899/956/899\nf 875/869/875 880/854/880 957/958/957\nf 957/958/957 961/961/961 962/964/962\nf 1115/969/1115 960/962/960 1153/974/1153\nf 1078/968/1078 961/961/961 1114/970/1114\nf 965/971/965 962/964/962 1077/967/1077\nf 973/981/973 976/991/976 977/982/977\nf 973/981/973 974/992/974 976/991/976\nf 976/991/976 975/988/975 977/982/977\nf 968/976/968 970/978/970 981/985/981\nf 970/978/970 972/980/972 981/985/981\nf 969/977/969 967/975/967 1028/1024/1028\nf 971/979/971 969/977/969 1028/1024/1028\nf 988/999/988 1052/998/1052 991/2912/991\nf 988/999/988 991/2912/991 992/941/992\nf 1187/1090/1187 990/1089/990 991/2913/991\nf 1052/998/1052 1187/1085/1187 991/2912/991\nf 991/2913/991 990/1089/990 989/2914/989\nf 991/2912/991 989/2915/989 992/941/992\nf 604/611/604 608/1000/608 993/620/993\nf 611/1001/611 608/1000/608 996/2816/996\nf 996/2816/996 608/1000/608 609/2813/609\nf 996/2816/996 613/875/613 621/2817/621\nf 997/1005/997 998/2916/998 1000/1003/1000\nf 1000/1003/1000 817/2883/817 816/1004/816\nf 814/811/814 820/812/820 997/1005/997\nf 998/2916/998 999/1017/999 1000/1003/1000\nf 1000/1003/1000 999/1017/999 817/2883/817\nf 999/1017/999 865/1011/865 817/2883/817\nf 1002/2917/1002 844/836/844 1003/1010/1003\nf 1004/2918/1004 1011/2919/1011 1005/2920/1005\nf 1011/2919/1011 1001/2921/1001 1005/2920/1005\nf 1004/2918/1004 1005/2920/1005 1008/2922/1008\nf 1005/2920/1005 1006/2923/1006 1008/2922/1008\nf 1006/2923/1006 1022/1015/1022 1008/2922/1008\nf 1022/1015/1022 1007/1014/1007 1008/2922/1008\nf 1008/2922/1008 1009/1007/1009 1004/2918/1004\nf 1008/2922/1008 1007/1014/1007 1009/1007/1009\nf 1004/2918/1004 1010/1006/1010 1011/2919/1011\nf 1004/2918/1004 1009/1007/1009 1010/1006/1010\nf 1009/1007/1009 1007/1014/1007 822/814/822\nf 1010/1006/1010 832/1009/832 1011/2919/1011\nf 1001/2921/1001 1011/2919/1011 1012/1021/1012\nf 1012/1021/1012 1011/2919/1011 835/1022/835\nf 832/1009/832 835/1022/835 1011/2919/1011\nf 1023/1019/1023 1019/1018/1019 1020/2924/1020\nf 1003/1010/1003 1013/1012/1013 1014/2925/1014\nf 1001/2921/1001 1003/1010/1003 1014/2925/1014\nf 1003/1010/1003 1001/2921/1001 1002/2917/1002\nf 1014/2925/1014 1006/2923/1006 1001/2921/1001\nf 1006/2923/1006 1005/2920/1005 1001/2921/1001\nf 1014/2925/1014 1013/1012/1013 1006/2923/1006\nf 1006/2923/1006 1021/2926/1021 1022/1015/1022\nf 1022/1015/1022 998/2916/998 997/1005/997\nf 1022/1015/1022 997/1005/997 1015/1016/1015\nf 997/1005/997 820/812/820 1015/1016/1015\nf 822/814/822 1007/1014/1007 1016/1013/1016\nf 1016/1013/1016 1017/2927/1017 1018/2928/1018\nf 1016/1013/1016 1015/1016/1015 1017/2927/1017\nf 1015/1016/1015 820/812/820 1017/2927/1017\nf 1017/2927/1017 820/812/820 1018/2928/1018\nf 820/812/820 822/814/822 1018/2928/1018\nf 1018/2928/1018 822/814/822 1016/1013/1016\nf 1019/1018/1019 999/1017/999 998/2916/998\nf 1019/1018/1019 998/2916/998 1021/2926/1021\nf 1021/2926/1021 998/2916/998 1022/1015/1022\nf 1023/1019/1023 1013/1012/1013 865/1011/865\nf 1020/2924/1020 1019/1018/1019 1021/2926/1021\nf 1023/1019/1023 1020/2924/1020 1013/1012/1013\nf 1013/1012/1013 1020/2924/1020 1006/2923/1006\nf 1006/2923/1006 1020/2924/1020 1021/2926/1021\nf 844/836/844 1002/2917/1002 1024/2890/1024\nf 1001/2921/1001 1012/1021/1012 1024/2890/1024\nf 1024/2890/1024 1012/1021/1012 824/1020/824\nf 1024/2890/1024 1002/2917/1002 1001/2921/1001\nf 844/836/844 1024/2890/1024 863/833/863\nf 811/807/811 808/809/808 815/2882/815\nf 926/2894/926 860/864/860 859/824/859\nf 860/864/860 850/825/850 859/824/859\nf 1026/1026/1026 984/993/984 974/992/974\nf 985/994/985 982/989/982 975/988/975\nf 1026/1026/1026 1032/1031/1032 1034/2929/1034\nf 984/993/984 1026/1026/1026 1034/2929/1034\nf 984/993/984 1034/2929/1034 1036/996/1036\nf 1035/997/1035 1033/2930/1033 985/994/985\nf 1033/2930/1033 1029/1028/1029 982/989/982\nf 982/989/982 985/994/985 1033/2930/1033\nf 987/995/987 1036/996/1036 1040/2931/1040\nf 1035/997/1035 987/995/987 1040/2931/1040\nf 1036/1039/1036 1035/1038/1035 1040/2932/1040\nf 1047/1052/1047 1049/1058/1049 1048/1053/1048\nf 1047/1052/1047 1050/1059/1050 1049/1058/1049\nf 1049/1058/1049 1051/1055/1051 1048/1053/1048\nf 1044/1049/1044 1046/1051/1046 1053/1054/1053\nf 1046/1051/1046 1048/1053/1048 1053/1054/1053\nf 1045/1050/1045 1043/1048/1043 1061/1065/1061\nf 1047/1052/1047 1045/1050/1045 1061/1065/1061\nf 1062/1066/1062 1056/1060/1056 1050/1059/1050\nf 1057/1061/1057 1054/1056/1054 1051/1055/1051\nf 1062/1066/1062 1064/1071/1064 1066/2933/1066\nf 1056/1060/1056 1062/1066/1062 1068/2934/1068\nf 1056/1060/1056 1068/2934/1068 1059/1063/1059\nf 1060/1064/1060 1067/2935/1067 1057/1061/1057\nf 1054/1056/1054 1067/2935/1067 1065/2936/1065\nf 1065/2936/1065 1063/1068/1063 1054/1056/1054\nf 1054/1056/1054 1057/1061/1057 1067/2935/1067\nf 1062/1066/1062 1066/2933/1066 1068/2934/1068\nf 1058/1062/1058 1059/1063/1059 1072/2937/1072\nf 1060/1064/1060 1058/1062/1058 1072/2937/1072\nf 1059/1081/1059 1060/1080/1060 1072/2938/1072\nf 989/2914/989 990/1089/990 1074/1088/1074\nf 1085/1099/1085 1087/1107/1087 1086/1100/1086\nf 1085/1099/1085 1088/1108/1088 1087/1107/1087\nf 1087/1107/1087 1089/1104/1089 1086/1100/1086\nf 1080/1094/1080 1082/1096/1082 1091/1101/1091\nf 1082/1096/1082 1084/1098/1084 1091/1101/1091\nf 1081/1095/1081 1079/1093/1079 1100/1114/1100\nf 1083/1097/1083 1081/1095/1081 1100/1114/1100\nf 1102/1116/1102 1095/1109/1095 1088/1108/1088\nf 1096/1110/1096 1093/1105/1093 1089/1104/1089\nf 1102/1116/1102 1107/1121/1107 1109/2939/1109\nf 1095/1109/1095 1102/1116/1102 1109/2939/1109\nf 1095/1109/1095 1109/2939/1109 1098/1112/1098\nf 1099/1113/1099 1108/2940/1108 1096/1110/1096\nf 1108/2940/1108 1104/1118/1104 1093/1105/1093\nf 1093/1105/1093 1096/1110/1096 1108/2940/1108\nf 1097/1111/1097 1098/1112/1098 1113/2941/1113\nf 1099/1113/1099 1097/1111/1097 1113/2941/1113\nf 1098/1129/1098 1099/1128/1099 1113/2942/1113\nf 1090/1102/1090 1112/1045/1112 1027/1027/1027\nf 1122/1142/1122 1124/1150/1124 1123/1143/1123\nf 1122/1142/1122 1125/1151/1125 1124/1150/1124\nf 1124/1150/1124 1126/1147/1126 1123/1143/1123\nf 1117/1137/1117 1119/1139/1119 1128/1144/1128\nf 1119/1139/1119 1121/1141/1121 1128/1144/1128\nf 1134/2943/1134 1131/1149/1131 1132/1152/1132\nf 1133/1153/1133 1131/1149/1131 1134/2943/1134\nf 1118/1138/1118 1116/1136/1116 1135/1154/1135\nf 1120/1140/1120 1118/1138/1118 1135/1154/1135\nf 1137/1156/1137 1132/1152/1132 1125/1151/1125\nf 1133/1153/1133 1130/1148/1130 1126/1147/1126\nf 1144/1167/1144 1143/1166/1143 1134/2944/1134\nf 1137/1156/1137 1142/1161/1142 1144/2945/1144\nf 1132/1152/1132 1137/1156/1137 1144/2945/1144\nf 1132/1152/1132 1144/2945/1144 1134/2943/1134\nf 1134/2943/1134 1143/2946/1143 1133/1153/1133\nf 1143/2946/1143 1139/1158/1139 1130/1148/1130\nf 1130/1148/1130 1133/1153/1133 1143/2946/1143\nf 1127/1145/1127 1148/1134/1148 1103/1117/1103\nf 1186/1217/1186 1150/1175/1150 1074/1178/1074\nf 992/941/992 989/2915/989 1151/938/1151\nf 989/1177/989 1149/1176/1149 1151/2947/1151\nf 880/854/880 892/853/892 1152/965/1152\nf 144/136/144 147/183/147 199/182/199\nf 222/216/222 258/218/258 256/290/256\nf 264/2743/264 248/234/248 237/232/237\nf 229/226/229 341/224/341 170/2749/170\nf 128/127/128 131/143/131 156/2726/156\nf 112/115/112 120/129/120 127/126/127\nf 864/838/864 867/2891/867 818/2884/818\nf 867/2891/867 866/2895/866 818/2884/818\nf 1161/1189/1161 1163/1197/1163 1162/1190/1162\nf 1161/1189/1161 1164/1198/1164 1163/1197/1163\nf 1163/1197/1163 1165/1194/1165 1162/1190/1162\nf 1156/1184/1156 1158/1186/1158 1167/1191/1167\nf 1158/1186/1158 1160/1188/1160 1167/1191/1167\nf 1173/2948/1173 1170/1196/1170 1171/1199/1171\nf 1172/1200/1172 1170/1196/1170 1173/2948/1173\nf 1157/1185/1157 1155/1183/1155 1174/1201/1174\nf 1159/1187/1159 1157/1185/1157 1174/1201/1174\nf 1176/1203/1176 1171/1199/1171 1164/1198/1164\nf 1172/1200/1172 1169/1195/1169 1165/1194/1165\nf 1183/1214/1183 1182/1213/1182 1173/2949/1173\nf 1176/1203/1176 1181/1208/1181 1183/2950/1183\nf 1171/1199/1171 1176/1203/1176 1183/2950/1183\nf 1171/1199/1171 1183/2950/1183 1173/2948/1173\nf 1173/2948/1173 1182/2951/1182 1172/1200/1172\nf 1182/2951/1182 1178/1205/1178 1169/1195/1169\nf 1169/1195/1169 1172/1200/1172 1182/2951/1182\nf 1166/1192/1166 1147/1173/1147 1138/1157/1138\nf 1177/1204/1177 1154/973/1154 964/966/964\nf 1071/2952/1071 1075/1092/1075 1076/1087/1076\nf 1071/2952/1071 1076/1087/1076 1187/1090/1187\nf 1042/983/1042 958/959/958 963/963/963\nf 1189/1221/1189 1188/1231/1188 1197/1222/1197\nf 1195/1223/1195 1192/1226/1192 1191/1232/1191\nf 812/1227/812 1190/1225/1190 1196/1224/1196\nf 562/1228/562 1191/1232/1191 1192/1226/1192\nf 1196/1224/1196 807/808/807 811/807/811\nf 1188/1231/1188 1198/1269/1198 1197/1222/1197\nf 1188/1231/1188 1193/1230/1193 1198/1269/1198\nf 786/799/786 806/802/806 1199/2953/1199\nf 1199/2954/1199 1197/2955/1197 1275/1309/1275\nf 1203/1308/1203 786/2956/786 1199/2954/1199\nf 1199/2954/1199 1275/1309/1275 1203/1308/1203\nf 809/806/809 1197/1222/1197 1199/2953/1199\nf 1199/2953/1199 806/802/806 809/806/809\nf 1202/1237/1202 1201/1240/1201 1205/1243/1205\nf 784/2957/784 802/2958/802 1210/2959/1210\nf 1215/1260/1215 1214/1253/1214 1223/1252/1223\nf 1210/2960/1210 1211/1263/1211 784/1251/784\nf 782/792/782 785/2871/785 803/2870/803\nf 1212/1264/1212 1217/1257/1217 1215/1260/1215\nf 1213/2961/1213 1216/1258/1216 1217/1257/1217\nf 1217/1257/1217 1212/1264/1212 1213/2961/1213\nf 784/1251/784 1211/1263/1211 1223/1252/1223\nf 1201/1240/1201 1320/2962/1320 1225/1265/1225\nf 1224/2963/1224 1220/1262/1220 1225/1265/1225\nf 1225/1265/1225 1220/1262/1220 1221/1261/1221\nf 1225/1265/1225 1221/1261/1221 1222/1259/1222\nf 1225/1265/1225 1222/1259/1222 1226/1266/1226\nf 1226/1266/1226 1222/1259/1222 1219/1256/1219\nf 1226/1266/1226 1219/1256/1219 1218/1255/1218\nf 1209/1245/1209 1208/1244/1208 1227/2964/1227\nf 1213/1249/1213 1209/1245/1209 1227/2964/1227\nf 1216/1258/1216 1213/2961/1213 1227/2964/1227\nf 1218/1255/1218 1216/1258/1216 1227/2964/1227\nf 1208/1244/1208 1218/1255/1218 1227/2964/1227\nf 1331/1234/1331 1200/1233/1200 1220/1370/1220\nf 1229/1280/1229 1237/1279/1237 1231/1273/1231\nf 1229/1280/1229 1231/1273/1231 1249/1289/1249\nf 1231/1273/1231 1248/1272/1248 1249/1289/1249\nf 1233/1270/1233 1247/1290/1247 1250/1271/1250\nf 1232/1276/1232 1251/1288/1251 1252/1277/1252\nf 1247/1290/1247 1245/1317/1245 1243/1316/1243\nf 1237/1279/1237 1233/1270/1233 1231/1273/1231\nf 1254/1291/1254 1240/1392/1240 1241/1285/1241\nf 1242/1284/1242 1234/1287/1234 1257/1322/1257\nf 1243/1316/1243 1234/1287/1234 1247/1290/1247\nf 1234/1287/1234 1243/1316/1243 1257/1322/1257\nf 1269/1301/1269 34/34/34 43/43/43\nf 1201/1240/1201 1204/1239/1204 1320/2962/1320\nf 1320/2962/1320 1224/2963/1224 1225/1265/1225\nf 1304/1313/1304 1249/1289/1249 1236/1275/1236\nf 1273/1305/1273 1272/1304/1272 1277/1312/1277\nf 1257/1322/1257 1244/1315/1244 1285/1327/1285\nf 1243/1316/1243 1244/1315/1244 1257/1322/1257\nf 1262/33/1262 1263/1297/1263 1291/1328/1291\nf 1262/33/1262 1291/1328/1291 1281/2702/1281\nf 1278/1319/1278 1280/53/1280 1281/2702/1281\nf 1285/1327/1285 1284/1321/1284 1257/1322/1257\nf 1259/1296/1259 1282/1295/1282 1290/1325/1290\nf 1264/1298/1264 1259/1296/1259 1286/2965/1286\nf 1263/1297/1263 1264/1298/1264 1286/2965/1286\nf 1279/1326/1279 1286/2965/1286 1289/2966/1289\nf 1279/1326/1279 1263/1297/1263 1286/2965/1286\nf 1284/1321/1284 1285/1327/1285 1287/1323/1287\nf 1289/2966/1289 1286/2965/1286 1288/1324/1288\nf 1288/1324/1288 1287/1323/1287 1289/2966/1289\nf 1289/2966/1289 1287/1323/1287 1285/1327/1285\nf 1289/2966/1289 1285/1327/1285 1279/1326/1279\nf 1288/1324/1288 1286/2965/1286 1290/1325/1290\nf 1290/1325/1290 1286/2965/1286 1259/1296/1259\nf 1291/1328/1291 1278/1319/1278 1281/2702/1281\nf 1292/2967/1292 1306/1330/1306 1325/1329/1325\nf 1276/2968/1276 1275/1401/1275 1436/1335/1436\nf 1292/2969/1292 1276/2968/1276 1293/1334/1293\nf 1438/1337/1438 1298/1339/1298 1299/1342/1299\nf 1293/1334/1293 1303/1346/1303 1306/2970/1306\nf 1295/1333/1295 1297/1338/1297 1305/1345/1305\nf 1292/2969/1292 1293/1334/1293 1306/2970/1306\nf 1204/1352/1204 1330/2971/1330 1311/1353/1311\nf 1324/1365/1324 1314/2972/1314 1323/1364/1323\nf 1314/2972/1314 1324/1365/1324 1318/1366/1318\nf 1319/1360/1319 1321/1363/1321 1322/1361/1322\nf 1321/1363/1321 1320/1362/1320 1204/2973/1204\nf 1204/2973/1204 1309/2974/1309 1321/1363/1321\nf 1322/1361/1322 1321/1363/1321 1309/2974/1309\nf 1309/2974/1309 1312/2975/1312 1322/1361/1322\nf 1322/1361/1322 1318/1366/1318 1317/1358/1317\nf 1312/2975/1312 1318/1366/1318 1322/1361/1322\nf 1323/2976/1323 1314/2972/1314 1318/1366/1318\nf 1318/1366/1318 1312/2975/1312 1323/2976/1323\nf 1328/1368/1328 1333/2977/1333 1336/2978/1336\nf 1320/1362/1320 1326/1359/1326 1327/1378/1327\nf 1224/1371/1224 1320/2979/1320 1327/1373/1327\nf 1329/2980/1329 1333/2977/1333 1328/1368/1328\nf 1328/1368/1328 1325/1367/1325 1329/2980/1329\nf 1292/2967/1292 1325/1329/1325 1330/2981/1330\nf 1330/2971/1330 1325/1367/1325 1311/1353/1311\nf 106/1372/106 1336/2982/1336 1337/2983/1337\nf 1333/1374/1333 1329/1314/1329 1334/1375/1334\nf 1277/1312/1277 1329/1314/1329 1325/1329/1325\nf 1329/1314/1329 1274/1307/1274 1334/1375/1334\nf 1334/1375/1334 109/65/109 1335/1376/1335\nf 106/1372/106 1327/1373/1327 1336/2982/1336\nf 1336/2978/1336 1327/1378/1327 1328/1368/1328\nf 101/111/101 102/2713/102 1341/1385/1341\nf 102/2713/102 1342/1386/1342 1341/1385/1341\nf 1340/1383/1340 105/2714/105 99/1384/99\nf 110/2715/110 105/2714/105 1342/1386/1342\nf 102/2713/102 110/2715/110 1342/1386/1342\nf 1341/1385/1341 1338/1390/1338 1335/1389/1335\nf 105/2714/105 1340/1383/1340 1342/1386/1342\nf 1240/1392/1240 1254/1291/1254 1266/1300/1266\nf 1240/1392/1240 1266/1300/1266 1343/1393/1343\nf 1268/1303/1268 1271/1306/1271 1343/1393/1343\nf 1266/1300/1266 1268/1303/1268 1343/1393/1343\nf 1235/1274/1235 1252/1277/1252 1344/1391/1344\nf 1252/1277/1252 1253/1286/1253 1344/1391/1344\nf 1241/1285/1241 1240/1392/1240 1344/1391/1344\nf 1253/1286/1253 1241/1285/1241 1344/1391/1344\nf 1271/1306/1271 1235/1274/1235 1344/1391/1344\nf 1443/1410/1443 1348/1405/1348 1345/1395/1345\nf 1348/1405/1348 1347/1404/1347 1349/2984/1349\nf 1349/2985/1349 1347/1505/1347 1294/1400/1294\nf 1294/1400/1294 1345/1399/1345 1349/2985/1349\nf 1345/1399/1345 1197/1398/1197 1198/2986/1198\nf 1350/1402/1350 1298/1412/1298 1296/1403/1296\nf 1300/1343/1300 1352/1344/1352 1355/2987/1355\nf 1307/1348/1307 1300/1343/1300 1355/2987/1355\nf 1352/1415/1352 1353/1414/1353 1355/2987/1355\nf 1353/1414/1353 1307/1348/1307 1355/2987/1355\nf 1191/1232/1191 562/1228/562 1356/1417/1356\nf 1193/1230/1193 1194/1229/1194 1358/1420/1358\nf 1358/1420/1358 1228/1267/1228 1193/1230/1193\nf 1358/2988/1358 1230/1278/1230 1228/1281/1228\nf 1358/2988/1358 1238/1282/1238 1230/1278/1230\nf 1359/1421/1359 1238/1282/1238 1361/2989/1361\nf 1237/1279/1237 1362/1283/1362 1233/1270/1233\nf 77/78/77 1372/1428/1372 80/88/80\nf 77/78/77 1365/1426/1365 1372/1428/1372\nf 1363/1423/1363 1362/1283/1362 1360/1422/1360\nf 1360/1422/1360 1366/1425/1366 1363/1423/1363\nf 1366/1425/1366 1360/1422/1360 1370/1432/1370\nf 1371/1429/1371 1370/1432/1370 1360/1422/1360\nf 1371/1429/1371 1360/1422/1360 1359/1421/1359\nf 1370/1432/1370 1367/1427/1367 1366/1425/1366\nf 1375/1435/1375 1378/1447/1378 1373/1433/1373\nf 1372/1428/1372 1367/1427/1367 1374/1434/1374\nf 1247/1290/1247 1233/1270/1233 1245/1317/1245\nf 1376/2990/1376 1371/1429/1371 1359/1421/1359\nf 1359/1421/1359 1361/2989/1361 1376/2990/1376\nf 1368/1430/1368 1371/1429/1371 1376/2990/1376\nf 1375/1435/1375 1374/1434/1374 1377/2991/1377\nf 1376/1436/1376 1375/1441/1375 1377/1443/1377\nf 1374/1434/1374 1369/1431/1369 1377/2991/1377\nf 1378/1447/1378 95/2711/95 96/101/96\nf 810/805/810 800/798/800 819/810/819\nf 781/800/781 786/799/786 802/2872/802\nf 802/2958/802 786/2992/786 1210/2959/1210\nf 809/806/809 778/2867/778 774/803/774\nf 1358/1437/1358 1376/1436/1376 1361/2993/1361\nf 1361/2989/1361 1238/1282/1238 1358/2988/1358\nf 1390/1462/1390 1393/1465/1393 1391/1463/1391\nf 1394/1484/1394 1395/1471/1395 1396/1472/1396\nf 1395/1471/1395 550/1466/550 1397/1468/1397\nf 1398/1467/1398 445/1460/445 1388/1459/1388\nf 1398/1467/1398 1399/2994/1399 1397/1468/1397\nf 1400/2995/1400 1388/1459/1388 1387/1458/1387\nf 1388/1459/1388 1400/2995/1400 1398/1467/1398\nf 1401/1469/1401 1397/1468/1397 1399/2994/1399\nf 1399/2994/1399 1403/2996/1403 1401/1469/1401\nf 1400/2995/1400 1403/2996/1403 1398/1467/1398\nf 1403/2996/1403 1399/2994/1399 1398/1467/1398\nf 1403/2996/1403 1400/2995/1400 1387/1458/1387\nf 1396/1472/1396 1405/1480/1405 1394/1484/1394\nf 1406/2997/1406 1407/2998/1407 1408/2999/1408\nf 1395/1471/1395 1394/1484/1394 550/1466/550\nf 550/1466/550 1394/1484/1394 602/3000/602\nf 602/3000/602 1409/1483/1409 1410/1482/1410\nf 745/1499/745 1411/1476/1411 595/1475/595\nf 1413/1500/1413 1414/3001/1414 1415/1494/1415\nf 1416/1479/1416 1417/1478/1417 1409/1483/1409\nf 1396/1472/1396 1404/1473/1404 1405/1480/1405\nf 1413/1500/1413 1410/1482/1410 1418/1481/1418\nf 1418/1481/1418 1419/1496/1419 1413/1500/1413\nf 602/3000/602 1394/1484/1394 1409/1483/1409\nf 1419/1496/1419 1420/1495/1420 1414/3001/1414\nf 1420/1495/1420 1415/1494/1415 1414/3001/1414\nf 1421/1485/1421 1427/1491/1427 1422/1486/1422\nf 1429/1493/1429 1426/1490/1426 1425/1489/1425\nf 1413/1500/1413 1419/1496/1419 1414/3001/1414\nf 1421/1485/1421 1429/1493/1429 1425/1489/1425\nf 1424/1488/1424 1407/2998/1407 1430/1497/1430\nf 1408/2999/1408 1407/2998/1407 1431/3002/1431\nf 1407/2998/1407 562/3003/562 740/1498/740\nf 1424/1488/1424 1430/1497/1430 1421/1485/1421\nf 1430/1497/1430 1407/2998/1407 740/1498/740\nf 1430/1497/1430 1412/1477/1412 1421/1485/1421\nf 1412/1477/1412 1429/1493/1429 1421/1485/1421\nf 1411/1476/1411 1413/1500/1413 1415/1494/1415\nf 1410/1482/1410 745/1499/745 602/3000/602\nf 1407/2998/1407 1406/2997/1406 562/3003/562\nf 1431/3002/1431 1407/2998/1407 1424/1488/1424\nf 1432/3004/1432 1408/2999/1408 1431/3002/1431\nf 1424/1488/1424 1432/3004/1432 1431/3002/1431\nf 1433/3005/1433 1423/1487/1423 1428/1492/1428\nf 1423/1487/1423 1433/3005/1433 1424/1488/1424\nf 1434/1501/1434 65/66/65 47/47/47\nf 1436/1335/1436 1293/1334/1293 1276/2968/1276\nf 1275/1401/1275 1294/1400/1294 1436/1335/1436\nf 1438/1337/1438 1296/1506/1296 1298/1339/1298\nf 1299/1342/1299 1297/1338/1297 1438/1337/1438\nf 1303/1346/1303 1304/1507/1304 1306/2970/1306\nf 1439/1407/1439 1303/1346/1303 1442/1408/1442\nf 1441/1416/1441 1354/1347/1354 1308/1349/1308\nf 1305/1345/1305 1440/1409/1440 1442/1408/1442\nf 1442/1408/1442 1303/1346/1303 1305/1345/1305\nf 1346/1394/1346 1439/1407/1439 1442/1408/1442\nf 1345/1395/1345 1346/1394/1346 1443/1410/1443\nf 1443/1410/1443 1346/1394/1346 1442/1408/1442\nf 1348/1405/1348 1349/2984/1349 1345/1395/1345\nf 1449/1509/1449 1457/1868/1457 1456/1867/1456\nf 1461/1514/1461 1450/1510/1450 1451/1560/1451\nf 1448/1511/1448 1462/1521/1462 1447/1508/1447\nf 1447/1508/1447 1455/1524/1455 1452/1515/1452\nf 1457/1868/1457 1453/1516/1453 1454/3006/1454\nf 1768/1864/1768 1459/3007/1459 1456/1867/1456\nf 1449/1509/1449 1458/1561/1458 1450/1510/1450\nf 1456/1867/1456 1459/3007/1459 1460/1563/1460\nf 1456/1867/1456 1460/1563/1460 1458/1561/1458\nf 1453/1516/1453 1509/1518/1509 1454/3006/1454\nf 1509/1518/1509 1481/1517/1481 1483/1559/1483\nf 1462/1521/1462 1466/1536/1466 1465/1522/1465\nf 1465/1522/1465 1468/3008/1468 1467/1523/1467\nf 1468/3008/1468 1465/1522/1465 1471/1533/1471\nf 1469/1539/1469 1465/1522/1465 1466/1536/1466\nf 1471/1533/1471 1474/1525/1474 1468/3008/1468\nf 1492/1534/1492 1471/1533/1471 1469/1539/1469\nf 1471/1533/1471 1465/1522/1465 1469/1539/1469\nf 1467/1523/1467 1473/1528/1473 1472/1527/1472\nf 1473/1528/1473 1467/1523/1467 1468/3008/1468\nf 1475/1526/1475 1474/1525/1474 1470/1535/1470\nf 1468/3008/1468 1474/1525/1474 1473/1528/1473\nf 1472/1527/1472 1476/1529/1476 1467/1523/1467\nf 1476/1529/1476 1477/3009/1477 1478/1531/1478\nf 1477/3009/1477 1476/1529/1476 1472/1527/1472\nf 1480/1532/1480 1534/1575/1534 1479/1530/1479\nf 1452/1515/1452 1482/1577/1482 1481/1517/1481\nf 1482/1577/1482 1452/1515/1452 1455/1524/1455\nf 1479/1530/1479 1482/1577/1482 1455/1524/1455\nf 1454/3006/1454 1509/1518/1509 1523/1558/1523\nf 1484/1537/1484 1489/3010/1489 1485/1538/1485\nf 1485/1538/1485 1489/3010/1489 1486/1540/1486\nf 1488/1544/1488 1489/3010/1489 1487/1541/1487\nf 1484/1537/1484 1487/1541/1487 1489/3010/1489\nf 1488/1544/1488 1486/1540/1486 1489/3010/1489\nf 1494/1543/1494 1490/1542/1490 1496/1552/1496\nf 1484/1537/1484 1500/3011/1500 1487/1541/1487\nf 1492/1534/1492 1493/1546/1493 1470/1535/1470\nf 1495/1545/1495 1496/1552/1496 1512/3012/1512\nf 1472/1527/1472 1475/1526/1475 1477/3009/1477\nf 1477/3009/1477 1499/3013/1499 1478/1531/1478\nf 1475/1526/1475 1499/3013/1499 1477/3009/1477\nf 1475/1526/1475 1470/1535/1470 1499/3013/1499\nf 1513/1547/1513 1498/3014/1498 1497/1548/1497\nf 1493/1546/1493 1575/3015/1575 1470/1535/1470\nf 1470/1535/1470 1575/3015/1575 1499/3013/1499\nf 1495/1545/1495 1575/3015/1575 1493/1546/1493\nf 1487/1541/1487 1500/3011/1500 1490/1542/1490\nf 1466/1536/1466 1500/3011/1500 1484/1537/1484\nf 1500/3011/1500 1466/1536/1466 1491/3016/1491\nf 1500/3011/1500 1501/3017/1501 1490/1542/1490\nf 1501/3017/1501 1502/1549/1502 1490/1542/1490\nf 1490/1542/1490 1502/1549/1502 1496/1552/1496\nf 1504/1550/1504 1502/1549/1502 1501/3017/1501\nf 1504/1550/1504 1501/3017/1501 1500/3011/1500\nf 1491/3016/1491 1503/1551/1503 1500/3011/1500\nf 1500/3011/1500 1503/1551/1503 1504/1550/1504\nf 1491/3016/1491 1463/1520/1463 1505/3018/1505\nf 1491/3016/1491 1505/3018/1505 1503/1551/1503\nf 1466/1536/1466 1462/1521/1462 1463/1520/1463\nf 1850/1954/1850 1526/1555/1526 1508/1554/1508\nf 1453/1516/1453 1457/1868/1457 1449/1509/1449\nf 1507/1570/1507 1524/1557/1524 1483/1559/1483\nf 1496/3019/1496 1561/1629/1561 1512/3020/1512\nf 1511/3021/1511 1499/3013/1499 1512/3012/1512\nf 1498/3014/1498 1511/3021/1511 1497/1548/1497\nf 1497/1548/1497 1511/3021/1511 1510/3022/1510\nf 1511/3021/1511 1512/3012/1512 1510/3022/1510\nf 1498/3014/1498 1513/1547/1513 1499/3013/1499\nf 1513/1547/1513 1478/1531/1478 1499/3013/1499\nf 1499/3013/1499 1511/3021/1511 1498/3014/1498\nf 1456/1867/1456 1458/1561/1458 1449/1509/1449\nf 1460/1563/1460 1514/1562/1514 1458/1561/1458\nf 1451/1560/1451 1515/3023/1515 1461/1514/1461\nf 1451/1560/1451 1517/1566/1517 1515/3023/1515\nf 1515/3023/1515 1517/1566/1517 1516/1567/1516\nf 1515/3023/1515 1516/1567/1516 1461/1514/1461\nf 1459/3007/1459 1518/1564/1518 1460/1563/1460\nf 1520/1568/1520 1527/3024/1527 1529/1512/1529\nf 1483/1559/1483 1522/1571/1522 1507/1570/1507\nf 1847/1953/1847 1524/1557/1524 1850/1954/1850\nf 1526/1555/1526 1850/1954/1850 1524/1557/1524\nf 1529/1512/1529 1527/3024/1527 1530/3025/1530\nf 1520/1568/1520 1528/1636/1528 1527/3024/1527\nf 1527/3024/1527 1528/1636/1528 1530/3025/1530\nf 1448/1511/1448 1531/1513/1531 1464/1519/1464\nf 1532/1573/1532 1528/1636/1528 1542/1574/1542\nf 1516/1567/1516 1528/1636/1528 1520/1568/1520\nf 1450/1510/1450 1531/1513/1531 1448/1511/1448\nf 1528/1636/1528 1532/1573/1532 1530/3025/1530\nf 1532/1573/1532 1529/1512/1529 1530/3025/1530\nf 1532/1573/1532 1531/1513/1531 1529/1512/1529\nf 1533/1576/1533 1535/1578/1535 1553/3026/1553\nf 1535/1578/1535 1533/1576/1533 1534/1575/1534\nf 1483/1559/1483 1481/1517/1481 1533/1576/1533\nf 1483/1559/1483 1533/1576/1533 1553/3026/1553\nf 1483/1559/1483 1553/3026/1553 1522/1571/1522\nf 1553/3026/1553 1567/1623/1567 1522/1571/1522\nf 1521/1569/1521 1568/1586/1568 1538/1583/1538\nf 1464/1519/1464 1541/1591/1541 1463/1520/1463\nf 1541/1591/1541 1543/3027/1543 1463/1520/1463\nf 1463/1520/1463 1543/3027/1543 1505/3018/1505\nf 1543/1593/1543 1544/1588/1544 1505/3028/1505\nf 1552/1744/1552 1549/1605/1549 1546/1601/1546\nf 1550/1603/1550 1593/1650/1593 1551/1604/1551\nf 1548/1602/1548 1552/1744/1552 1545/1608/1545\nf 1545/1608/1545 1555/1613/1555 1558/1606/1558\nf 1554/1607/1554 1558/1606/1558 1557/1612/1557\nf 1553/1597/1553 1535/1579/1535 1670/1594/1670\nf 1559/1582/1559 1510/1581/1510 1560/1615/1560\nf 1560/1615/1560 1510/1581/1510 1512/3020/1512\nf 1503/3029/1503 1505/3030/1505 1562/1638/1562\nf 1503/3029/1503 1562/1638/1562 1496/3019/1496\nf 1562/1638/1562 1576/1631/1576 1561/1629/1561\nf 1562/1638/1562 1505/3030/1505 1563/1639/1563\nf 1565/1616/1565 1574/1621/1574 1564/1618/1564\nf 1538/1583/1538 1568/1586/1568 1539/1585/1539\nf 1568/1586/1568 1521/1569/1521 1536/1572/1536\nf 1551/1604/1551 1581/1627/1581 1570/1625/1570\nf 1564/1640/1564 1574/1642/1574 1578/1632/1578\nf 1499/3013/1499 1575/3015/1575 1512/3012/1512\nf 1575/3015/1575 1495/1545/1495 1512/3012/1512\nf 1496/1552/1496 1495/1545/1495 1494/1543/1494\nf 1526/1555/1526 1524/1557/1524 1507/1570/1507\nf 1381/1634/1381 1516/1567/1516 1517/1566/1517\nf 1381/1634/1381 1517/1566/1517 1519/1565/1519\nf 1540/1592/1540 1542/1574/1542 1391/1637/1391\nf 1496/3019/1496 1562/1638/1562 1561/1629/1561\nf 1578/1632/1578 1576/1631/1576 1564/1640/1564\nf 1560/1615/1560 1512/3020/1512 1561/1629/1561\nf 1577/3031/1577 1571/3032/1571 1595/1653/1595\nf 1579/1628/1579 1580/1644/1580 1595/3033/1595\nf 1581/1627/1581 1551/1604/1551 1593/1650/1593\nf 1550/1603/1550 1591/1611/1591 1593/1650/1593\nf 1579/1628/1579 1590/1645/1590 1580/1644/1580\nf 1588/1651/1588 1583/1688/1583 1582/1652/1582\nf 1591/1611/1591 1589/1610/1589 1588/1651/1588\nf 1554/1607/1554 1586/1649/1586 1556/1609/1556\nf 1556/1609/1556 1586/1682/1586 1587/1683/1587\nf 1589/1610/1589 1587/1683/1587 1583/1688/1583\nf 1588/1651/1588 1589/1610/1589 1583/1688/1583\nf 1581/1627/1581 1590/1645/1590 1579/1628/1579\nf 1552/1744/1552 1548/1602/1548 1549/1605/1549\nf 1577/3031/1577 1595/1653/1595 1594/1656/1594\nf 1597/1654/1597 1616/3034/1616 1596/1655/1596\nf 1598/3035/1598 1600/3036/1600 1616/3034/1616\nf 1600/3036/1600 1733/1824/1733 1599/1666/1599\nf 1602/1659/1602 1605/1658/1605 1596/1655/1596\nf 1601/1662/1601 1615/1665/1615 1599/1666/1599\nf 1577/3031/1577 1594/1656/1594 1585/1685/1585\nf 1604/1657/1604 1603/3037/1603 1607/1664/1607\nf 1607/1664/1607 1610/1670/1610 1604/1657/1604\nf 1615/1665/1615 1607/1664/1607 1603/3037/1603\nf 1608/1663/1608 1611/1821/1611 1609/1667/1609\nf 1609/1667/1609 1611/1821/1611 1612/1668/1612\nf 1610/1670/1610 1607/1664/1607 1609/1667/1609\nf 1607/1664/1607 1608/1663/1608 1609/1667/1609\nf 1604/1657/1604 1614/1660/1614 1603/3037/1603\nf 1614/1660/1614 1615/1665/1615 1603/3037/1603\nf 1616/3034/1616 1602/1659/1602 1596/1655/1596\nf 1616/3034/1616 1599/1666/1599 1602/1659/1602\nf 1616/3034/1616 1597/1654/1597 1598/3035/1598\nf 1616/3034/1616 1600/3036/1600 1599/1666/1599\nf 1585/1685/1585 1623/1680/1623 1586/1682/1586\nf 1621/1679/1621 1625/1791/1625 1673/1747/1673\nf 1625/1791/1625 1621/1679/1621 1622/1692/1622\nf 1629/1671/1629 1594/1656/1594 1606/1661/1606\nf 1621/1679/1621 1624/1681/1624 1622/1692/1622\nf 1580/1644/1580 1597/1689/1597 1595/3033/1595\nf 1598/1690/1598 1584/1647/1584 1600/1672/1600\nf 1639/1704/1639 1646/1703/1646 1645/1708/1645\nf 1643/1709/1643 1644/1743/1644 1648/1710/1648\nf 1639/1704/1639 1645/1708/1645 1640/1711/1640\nf 1645/1708/1645 1646/1703/1646 1641/1705/1641\nf 1648/1710/1648 1644/1743/1644 1642/1713/1642\nf 1637/1702/1637 1654/1714/1654 1635/1700/1635\nf 1640/1711/1640 1663/1729/1663 1639/1704/1639\nf 1646/1703/1646 1649/1727/1649 1641/1705/1641\nf 1636/1699/1636 1650/1717/1650 1638/1701/1638\nf 1638/1701/1638 1650/1717/1650 1646/1703/1646\nf 1651/1719/1651 1652/1718/1652 1734/1818/1734\nf 1654/1714/1654 1633/1697/1633 1635/1700/1635\nf 1655/1716/1655 1680/1724/1680 1650/1717/1650\nf 1734/1818/1734 1763/3038/1763 1651/1719/1651\nf 1662/1737/1662 1660/1731/1660 1664/1730/1664\nf 1660/1734/1660 1662/1735/1662 1657/1726/1657\nf 1649/1727/1649 1676/1740/1676 1641/1705/1641\nf 1667/1712/1667 1677/1742/1677 1640/1711/1640\nf 1670/1594/1670 1555/1613/1555 1545/1608/1545\nf 1670/1594/1670 1535/1579/1535 1555/1613/1555\nf 1555/1613/1555 1535/1579/1535 1559/1582/1559\nf 1505/3039/1505 1544/1746/1544 1672/1617/1672\nf 1622/1692/1622 1675/1722/1675 1674/3040/1674\nf 1641/1705/1641 1676/1740/1676 1665/1706/1665\nf 1640/1711/1640 1677/1742/1677 1663/1729/1663\nf 1661/1736/1661 1676/1740/1676 1649/1727/1649\nf 1677/1742/1677 1661/1738/1661 1663/1729/1663\nf 1678/1749/1678 1654/1714/1654 1658/1715/1658\nf 1653/1721/1653 1682/3041/1682 1715/3042/1715\nf 1675/1722/1675 1653/1721/1653 1715/3042/1715\nf 1690/1764/1690 1691/1763/1691 1692/1768/1692\nf 1694/1767/1694 1695/1766/1695 1698/3043/1698\nf 1690/1764/1690 1692/1768/1692 1696/1769/1696\nf 1692/1768/1692 1691/1763/1691 1693/1765/1693\nf 1697/1770/1697 1694/1767/1694 1698/3043/1698\nf 1688/1762/1688 1699/1771/1699 1686/1760/1686\nf 1687/1759/1687 1703/1776/1703 1689/1761/1689\nf 1689/1761/1689 1703/1776/1703 1691/1763/1691\nf 1699/1771/1699 1684/1756/1684 1686/1760/1686\nf 1704/1775/1704 1714/1777/1714 1703/1776/1703\nf 1702/1774/1702 1709/3044/1709 1708/1783/1708\nf 1709/3045/1709 1701/1778/1701 1708/1787/1708\nf 1709/3045/1709 1706/1779/1706 1701/1778/1701\nf 1706/1782/1706 1709/3044/1709 1702/1774/1702\nf 1702/1774/1702 1710/1785/1710 1693/1765/1693\nf 1697/1770/1697 1711/1788/1711 1696/1769/1696\nf 1698/3043/1698 1695/1766/1695 1712/1784/1712\nf 1712/1786/1712 1697/1770/1697 1698/3043/1698\nf 1693/1765/1693 1710/1785/1710 1695/1766/1695\nf 1696/1769/1696 1711/1788/1711 1701/1778/1701\nf 1708/1783/1708 1710/1785/1710 1702/1774/1702\nf 1711/1788/1711 1708/1787/1708 1701/1778/1701\nf 1704/1775/1704 1715/1820/1715 1714/1777/1714\nf 1675/1758/1675 1704/1775/1704 1685/1755/1685\nf 1704/1775/1704 1675/1758/1675 1715/1820/1715\nf 1674/3040/1674 1716/1792/1716 1625/1791/1625\nf 1622/1692/1622 1674/3040/1674 1625/1791/1625\nf 1717/1793/1717 1718/1687/1718 1673/1747/1673\nf 1682/1800/1682 1726/1799/1726 1715/3046/1715\nf 1680/1724/1680 1763/1728/1763 1681/1753/1681\nf 1724/1806/1724 1718/1687/1718 1717/1793/1717\nf 1727/1807/1727 1720/1796/1720 1724/1806/1724\nf 1716/1792/1716 1725/1804/1725 1717/1793/1717\nf 1724/1806/1724 1720/1796/1720 1718/1687/1718\nf 1628/1684/1628 1652/1718/1652 1630/1691/1630\nf 1765/3047/1765 1764/1813/1764 1722/1816/1722\nf 1731/1815/1731 1728/1810/1728 1729/1812/1729\nf 1728/1810/1728 1731/1815/1731 1730/1814/1730\nf 1699/1771/1699 1725/1808/1725 1716/1794/1716\nf 1732/1817/1732 1728/1810/1728 1730/1814/1730\nf 1599/1666/1599 1733/1824/1733 1601/1662/1601\nf 1739/1831/1739 1741/1836/1741 1740/1832/1740\nf 1743/1833/1743 1745/3048/1745 1744/1834/1744\nf 1739/1831/1739 1746/1837/1746 1741/1836/1741\nf 1741/1836/1741 1742/1835/1742 1740/1832/1740\nf 1747/1838/1747 1745/3048/1745 1743/1833/1743\nf 1737/1829/1737 1736/1827/1736 1748/1839/1748\nf 1735/1828/1735 1738/1830/1738 1752/1843/1752\nf 1738/1830/1738 1740/1832/1740 1752/1843/1752\nf 1750/1841/1750 1757/1850/1757 1758/3049/1758\nf 1758/3050/1758 1757/1854/1757 1755/1845/1755\nf 1758/3050/1758 1755/1845/1755 1754/1847/1754\nf 1754/1848/1754 1750/1841/1750 1758/3049/1758\nf 1750/1841/1750 1742/1835/1742 1759/1851/1759\nf 1747/1838/1747 1746/1837/1746 1760/1853/1760\nf 1744/1834/1744 1745/3048/1745 1761/1852/1761\nf 1761/1855/1761 1745/3048/1745 1747/1838/1747\nf 1742/1835/1742 1744/1834/1744 1759/1851/1759\nf 1746/1837/1746 1755/1845/1755 1760/1853/1760\nf 1757/1850/1757 1750/1841/1750 1759/1851/1759\nf 1760/1853/1760 1755/1845/1755 1757/1854/1757\nf 1752/1843/1752 1753/1844/1753 1763/1861/1763\nf 1734/1825/1734 1735/1828/1735 1752/1843/1752\nf 1752/1843/1752 1763/1861/1763 1734/1825/1734\nf 1736/1827/1736 1730/3051/1730 1748/1839/1748\nf 1748/1839/1748 1730/3051/1730 1764/1858/1764\nf 1736/1827/1736 1732/1826/1732 1730/3051/1730\nf 1763/3052/1763 1766/3053/1766 1681/3054/1681\nf 1766/3053/1766 1764/1813/1764 1765/3047/1765\nf 1681/3054/1681 1766/3053/1766 1765/3047/1765\nf 1386/1863/1386 1767/1862/1767 1768/1864/1768\nf 1518/1564/1518 1459/3007/1459 1767/1862/1767\nf 1518/1564/1518 1767/1862/1767 1519/1565/1519\nf 1767/1862/1767 1459/3007/1459 1768/1864/1768\nf 1867/3055/1867 1454/3006/1454 1843/1964/1843\nf 1769/1865/1769 1771/3056/1771 1387/1866/1387\nf 1771/3056/1771 1769/1865/1769 1457/1868/1457\nf 1788/1899/1788 1789/3057/1789 1787/1900/1787\nf 1789/3057/1789 1792/1926/1792 1791/1901/1791\nf 1789/3057/1789 1791/1901/1791 1787/1900/1787\nf 1792/1926/1792 1796/3058/1796 1791/1901/1791\nf 1791/1901/1791 1793/1903/1793 1790/1902/1790\nf 1791/1901/1791 1796/3058/1796 1793/1903/1793\nf 1793/1903/1793 1796/3058/1796 1826/1905/1826\nf 1806/1897/1806 1798/1907/1798 1799/1910/1799\nf 1798/1907/1798 1806/1897/1806 1780/1890/1780\nf 1780/1890/1780 1802/1911/1802 1798/1907/1798\nf 1805/1917/1805 493/1914/493 1804/1915/1804\nf 1506/1553/1506 1525/1556/1525 1393/1584/1393\nf 1786/1898/1786 1806/1897/1806 1807/1919/1807\nf 1806/1897/1806 1808/3059/1808 1809/1927/1809\nf 1807/1919/1807 1809/1927/1809 1811/1920/1811\nf 1786/1898/1786 1813/1921/1813 1788/1899/1788\nf 1788/1899/1788 1813/1921/1813 1789/3057/1789\nf 1789/3057/1789 1813/1921/1813 1792/1926/1792\nf 1792/1926/1792 1813/1921/1813 1812/3060/1812\nf 1792/1926/1792 1812/3060/1812 1810/1925/1810\nf 1812/3060/1812 1813/1921/1813 1811/1920/1811\nf 1812/3060/1812 1820/3061/1820 1814/3062/1814\nf 1812/3060/1812 1814/3062/1814 1810/1925/1810\nf 1814/3062/1814 1815/1922/1815 1810/1925/1810\nf 1814/3062/1814 1818/1931/1818 1815/1922/1815\nf 1818/1931/1818 1814/3062/1814 1820/3061/1820\nf 1815/1922/1815 1818/1931/1818 1817/1923/1817\nf 1792/1926/1792 1826/1905/1826 1796/3058/1796\nf 1811/1920/1811 1819/1930/1819 1812/3060/1812\nf 1812/3060/1812 1819/1930/1819 1820/3061/1820\nf 1818/1931/1818 1820/3061/1820 1819/1930/1819\nf 1821/1929/1821 1833/1928/1833 513/1933/513\nf 1808/3059/1808 1833/1928/1833 1809/1927/1809\nf 1806/1897/1806 1809/1927/1809 1807/1919/1807\nf 1823/3063/1823 1826/1905/1826 1824/3064/1824\nf 1824/3064/1824 1826/1905/1826 1816/1924/1816\nf 1824/3064/1824 1825/3065/1825 1823/3063/1823\nf 1826/1905/1826 1823/3063/1823 1822/1932/1822\nf 1797/1906/1797 1826/1905/1826 1822/1932/1822\nf 1822/1932/1822 1834/1947/1834 1508/1918/1508\nf 1508/1554/1508 1834/3066/1834 1850/1954/1850\nf 1816/1924/1816 1827/1935/1827 1824/3064/1824\nf 1827/1935/1827 1816/1924/1816 1817/1923/1817\nf 1824/3064/1824 1827/1935/1827 1825/3065/1825\nf 1827/1935/1827 1817/1923/1817 1818/1931/1818\nf 1825/3065/1825 1838/1938/1838 1823/3063/1823\nf 1838/1938/1838 1825/3065/1825 1827/1935/1827\nf 526/1942/526 1784/1894/1784 473/1895/473\nf 532/3067/532 1828/3068/1828 523/1940/523\nf 523/1940/523 1828/3068/1828 1781/1892/1781\nf 534/3069/534 1830/3070/1830 1828/3068/1828\nf 1830/3070/1830 1831/1943/1831 1829/1889/1829\nf 1828/3068/1828 1829/1889/1829 1781/1892/1781\nf 1830/3070/1830 1832/1944/1832 1831/1943/1831\nf 530/3071/530 494/1913/494 1803/1912/1803\nf 534/3069/534 1828/3068/1828 532/3067/532\nf 1803/1912/1803 1832/1944/1832 530/3071/530\nf 1832/1944/1832 1830/3070/1830 530/3071/530\nf 1829/1889/1829 1775/1880/1775 1781/1892/1781\nf 1830/3070/1830 534/3069/534 530/3071/530\nf 1780/1890/1780 1831/1943/1831 1802/1911/1802\nf 1831/1943/1831 1780/1890/1780 1829/1889/1829\nf 1829/1889/1829 1828/3068/1828 1830/3070/1830\nf 535/3072/535 1779/1888/1779 467/1887/467\nf 1779/1888/1779 535/3072/535 473/1895/473\nf 1804/1915/1804 493/1914/493 495/1916/495\nf 1806/1897/1806 536/3073/536 1808/3059/1808\nf 1808/3059/1808 536/3073/536 1833/1928/1833\nf 513/1933/513 1833/1928/1833 536/3073/536\nf 495/1916/495 536/3073/536 1806/1897/1806\nf 1823/3063/1823 1837/1945/1837 1822/1932/1822\nf 1837/1945/1837 1823/3063/1823 1838/1938/1838\nf 1837/1945/1837 1838/1938/1838 1839/1948/1839\nf 1839/1948/1839 1840/3074/1840 1836/1949/1836\nf 1839/1948/1839 1841/1951/1841 1840/3074/1840\nf 1838/1938/1838 1841/1951/1841 1839/1948/1839\nf 1387/1866/1387 1771/3056/1771 1403/3075/1403\nf 1844/3076/1844 1523/1558/1523 1772/1952/1772\nf 1843/1964/1843 1454/3006/1454 1770/1961/1770\nf 1454/3006/1454 1868/3077/1868 1770/1961/1770\nf 1454/3006/1454 1523/1558/1523 1868/3077/1868\nf 1842/3078/1842 1523/1558/1523 1844/3076/1844\nf 1842/3078/1842 1866/3079/1866 1846/3080/1846\nf 1844/3076/1844 1845/3081/1845 1866/3079/1866\nf 1845/3081/1845 1844/3076/1844 1772/1952/1772\nf 1866/3079/1866 1842/3078/1842 1844/3076/1844\nf 1848/1957/1848 1852/1955/1852 1850/1954/1850\nf 1847/1953/1847 1851/1956/1851 1849/3082/1849\nf 1849/3082/1849 1851/1956/1851 1864/3083/1864\nf 1851/1956/1851 1852/1955/1852 1862/3084/1862\nf 1852/1955/1852 1848/1957/1848 1862/3084/1862\nf 1855/3085/1855 1854/3086/1854 1858/3087/1858\nf 1850/1954/1850 1853/3088/1853 1848/1957/1848\nf 1858/3087/1858 1854/3086/1854 1835/1946/1835\nf 1835/1946/1835 1854/3086/1854 1834/1947/1834\nf 1854/3086/1854 1855/3085/1855 1834/1947/1834\nf 1855/3089/1855 1856/1958/1856 1853/3088/1853\nf 1856/1958/1856 1848/1957/1848 1853/3088/1853\nf 1834/3066/1834 1855/3089/1855 1853/3088/1853\nf 1853/3088/1853 1850/1954/1850 1834/3066/1834\nf 1855/3085/1855 1858/3087/1858 1861/3090/1861\nf 1865/1959/1865 1859/3091/1859 1860/3092/1860\nf 1857/1960/1857 1865/1959/1865 1860/3092/1860\nf 1855/3085/1855 1861/3090/1861 1859/1996/1859\nf 1859/3091/1859 1856/1958/1856 1855/3089/1855\nf 1848/1957/1848 1857/1960/1857 1863/3093/1863\nf 1857/1960/1857 1849/3082/1849 1863/3093/1863\nf 1848/1957/1848 1863/3093/1863 1862/3084/1862\nf 1862/3084/1862 1864/3083/1864 1851/1956/1851\nf 1849/3082/1849 1864/3083/1864 1863/3093/1863\nf 1864/3083/1864 1862/3084/1862 1863/3093/1863\nf 1859/3091/1859 1865/1959/1865 1856/1958/1856\nf 1849/3082/1849 1772/1952/1772 1847/1953/1847\nf 1772/1952/1772 1874/3094/1874 1845/3081/1845\nf 1845/3081/1845 1874/3094/1874 1866/3079/1866\nf 1874/3094/1874 1772/1952/1772 1849/3082/1849\nf 1874/3094/1874 1849/3082/1849 1857/1960/1857\nf 1866/3079/1866 1869/1962/1869 1846/3080/1846\nf 1846/3080/1846 1869/1962/1869 1770/1961/1770\nf 1454/3006/1454 1867/3055/1867 1457/1868/1457\nf 1770/1961/1770 1868/3077/1868 1846/3080/1846\nf 1868/3077/1868 1842/3078/1842 1846/3080/1846\nf 1868/3077/1868 1523/1558/1523 1842/3078/1842\nf 1457/1868/1457 1867/3055/1867 1771/3056/1771\nf 1843/1964/1843 1870/1963/1870 1867/3055/1867\nf 1771/3056/1771 1867/3055/1867 1403/3075/1403\nf 1874/3094/1874 1869/1962/1869 1866/3079/1866\nf 1874/1978/1874 1871/1966/1871 1869/1970/1869\nf 1871/1966/1871 1874/1978/1874 2221/1977/2221\nf 1872/1967/1872 1876/3095/1876 1873/2003/1873\nf 1871/1966/1871 1875/2341/1875 1872/1967/1872\nf 1857/3096/1857 1877/2000/1877 1874/3097/1874\nf 1877/2000/1877 1857/3096/1857 1860/1997/1860\nf 1877/1979/1877 2223/1983/2223 2222/1980/2222\nf 1876/3095/1876 1880/2218/1880 2125/2217/2125\nf 2224/3098/2224 1878/2342/1878 1888/3099/1888\nf 1878/2342/1878 1881/3100/1881 1888/3099/1888\nf 1876/3095/1876 2224/3098/2224 1880/2218/1880\nf 1876/3095/1876 1872/1967/1872 1875/2341/1875\nf 1897/2343/1897 1886/1984/1886 1902/3101/1902\nf 1886/1984/1886 1887/1985/1887 1883/3102/1883\nf 1880/2218/1880 1888/3099/1888 1882/2215/1882\nf 1888/3099/1888 1889/3103/1889 1882/2215/1882\nf 1881/3100/1881 1889/3103/1889 1888/3099/1888\nf 1881/3100/1881 1878/2342/1878 1897/2343/1897\nf 1886/1984/1886 1897/2343/1897 2223/1983/2223\nf 1883/3104/1883 1898/1987/1898 1900/3105/1900\nf 1902/3101/1902 1900/3106/1900 1897/2343/1897\nf 1884/1999/1884 1901/1986/1901 1885/1989/1885\nf 1887/1988/1887 1898/1987/1898 1883/3104/1883\nf 1893/1994/1893 1892/1991/1892 625/1990/625\nf 1890/1992/1890 1836/1949/1836 1891/1993/1891\nf 1891/1993/1891 1840/3074/1840 1841/1951/1841\nf 1891/1993/1891 1836/1949/1836 1840/3074/1840\nf 1890/1992/1890 1835/1946/1835 1836/1949/1836\nf 1835/1946/1835 1890/1992/1890 1858/3087/1858\nf 1858/3087/1858 1890/1992/1890 1861/3090/1861\nf 1841/1951/1841 1892/1991/1892 1891/1993/1891\nf 1890/1992/1890 1859/1996/1859 1861/3090/1861\nf 1870/1963/1870 1403/3075/1403 1867/3055/1867\nf 2164/2522/2164 1873/2003/1873 1879/3107/1879\nf 1881/3100/1881 1895/3108/1895 1889/3103/1889\nf 1889/3103/1889 1895/3108/1895 1903/3109/1903\nf 1889/3103/1889 1903/3109/1903 1882/2215/1882\nf 1881/3100/1881 1897/2343/1897 1894/3110/1894\nf 1894/3110/1894 1897/2343/1897 1900/3106/1900\nf 1881/3100/1881 1896/3111/1896 1895/3108/1895\nf 1894/3112/1894 1900/3105/1900 1899/2007/1899\nf 1899/2007/1899 1900/3105/1900 1898/1987/1898\nf 623/3113/623 646/2005/646 1898/1987/1898\nf 1898/1987/1898 1901/1986/1901 623/3113/623\nf 625/3114/625 1884/1999/1884 1893/1998/1893\nf 1901/1986/1901 625/3114/625 623/3113/623\nf 1884/1999/1884 625/3114/625 1901/1986/1901\nf 1900/3106/1900 1902/3101/1902 1883/3102/1883\nf 1902/3101/1902 1886/1984/1886 1883/3102/1883\nf 1881/3100/1881 1894/3110/1894 1896/3111/1896\nf 1899/3115/1899 1905/2021/1905 1894/3116/1894\nf 1899/3115/1899 1925/2018/1925 1905/2021/1905\nf 1905/2015/1905 1908/2022/1908 1906/2016/1906\nf 1917/2029/1917 1912/2028/1912 1911/3117/1911\nf 1913/2030/1913 1917/2031/1917 1911/3117/1911\nf 1913/2030/1913 1911/3117/1911 1921/2037/1921\nf 1921/2037/1921 1911/3117/1911 1912/2028/1912\nf 1923/2038/1923 1921/2037/1921 1922/2036/1922\nf 1920/2034/1920 1926/2039/1926 1918/2035/1918\nf 1925/2018/1925 1899/3115/1899 1928/2042/1928\nf 1924/2032/1924 1929/2040/1929 1926/2039/1926\nf 1924/2032/1924 1930/2043/1930 1929/2040/1929\nf 1978/3118/1978 2004/3119/2004 1979/3120/1979\nf 1932/2046/1932 1936/2083/1936 1931/2047/1931\nf 1931/2047/1931 1936/2083/1936 1959/2075/1959\nf 1942/2060/1942 1948/2059/1948 1952/2069/1952\nf 1954/3121/1954 1953/3122/1953 1951/3123/1951\nf 1954/3121/1954 1934/2241/1934 1955/3124/1955\nf 692/3125/692 695/3126/695 1945/3127/1945\nf 1933/2050/1933 1946/2063/1946 1949/2054/1949\nf 1949/2054/1949 1946/2063/1946 1940/2065/1940\nf 1946/2063/1946 692/2123/692 1945/2064/1945\nf 1940/2065/1940 1950/2066/1950 1943/2067/1943\nf 1950/2066/1950 1952/2069/1952 1943/2067/1943\nf 1952/2069/1952 1948/2059/1948 1943/2067/1943\nf 1953/2068/1953 1941/2058/1941 1952/2069/1952\nf 1955/3124/1955 1953/3122/1953 1954/3121/1954\nf 1945/3127/1945 1958/3128/1958 1944/3129/1944\nf 1953/2068/1953 1955/2070/1955 1941/2058/1941\nf 1957/2074/1957 1945/3127/1945 695/3126/695\nf 1944/3129/1944 1958/3128/1958 1986/2072/1986\nf 1945/3127/1945 1957/2074/1957 1985/2073/1985\nf 1941/2058/1941 1960/2057/1960 1942/2060/1942\nf 1969/2086/1969 1963/2079/1963 1965/2078/1965\nf 1967/2088/1967 1961/2077/1961 1962/2076/1962\nf 1942/2060/1942 1952/2069/1952 1941/2058/1941\nf 1967/2085/1967 1973/2093/1973 1969/2086/1969\nf 1973/2093/1973 1977/3130/1977 1974/2094/1974\nf 1974/2094/1974 1977/3130/1977 1975/2095/1975\nf 1975/2095/1975 1977/3130/1977 1976/2091/1976\nf 1976/2091/1976 1977/3130/1977 1973/2092/1973\nf 1979/2120/1979 1929/2119/1929 1930/3131/1930\nf 1928/2102/1928 1980/2101/1980 1930/2107/1930\nf 1979/2108/1979 1981/2104/1981 1978/2103/1978\nf 1982/2110/1982 736/2109/736 735/3132/735\nf 738/2112/738 1983/2111/1983 735/3132/735\nf 1983/2111/1983 1982/2110/1982 735/3132/735\nf 1876/3095/1876 1879/3107/1879 1873/2003/1873\nf 1408/3133/1408 1432/3134/1432 1984/3135/1984\nf 1945/3127/1945 1985/2073/1985 1958/3128/1958\nf 1985/2073/1985 1986/2072/1986 1958/3128/1958\nf 1944/3129/1944 1986/2072/1986 1953/3122/1953\nf 1944/2061/1944 1953/2068/1953 1947/2062/1947\nf 1953/3122/1953 1986/2072/1986 1951/3123/1951\nf 1951/3123/1951 1986/2072/1986 1956/2071/1956\nf 695/3126/695 751/3136/751 1957/2074/1957\nf 751/3136/751 754/2131/754 1988/3137/1988\nf 1988/3137/1988 754/2131/754 1989/3138/1989\nf 2019/3139/2019 2018/2130/2018 2009/2129/2009\nf 751/3136/751 1988/3137/1988 1987/2116/1987\nf 1988/3137/1988 1991/2127/1991 1987/2116/1987\nf 1987/2116/1987 1991/2127/1991 1990/2113/1990\nf 1987/2116/1987 1992/2115/1992 1956/2071/1956\nf 1991/2127/1991 1993/2117/1993 1990/2113/1990\nf 1989/3138/1989 1996/2124/1996 1988/3137/1988\nf 1988/3137/1988 1996/2124/1996 1991/2127/1991\nf 1996/2124/1996 1997/3140/1997 2007/2144/2007\nf 1992/2115/1992 1998/3141/1998 1956/2071/1956\nf 1998/3141/1998 1951/3123/1951 1956/2071/1956\nf 1951/3123/1951 1999/3142/1999 1954/3121/1954\nf 1998/3141/1998 1999/3142/1999 1951/3123/1951\nf 1954/3121/1954 1999/3142/1999 1998/3141/1998\nf 1998/3141/1998 1992/2115/1992 1994/2114/1994\nf 2004/3119/2004 2148/3143/2148 1979/3120/1979\nf 2152/2256/2152 2001/2244/2001 2002/2247/2002\nf 2000/2045/2000 2004/3119/2004 1932/2046/1932\nf 2004/2097/2004 1933/2050/1933 1932/2053/1932\nf 692/2123/692 2005/2096/2005 700/3144/700\nf 2005/2096/2005 1978/2098/1978 700/3144/700\nf 1957/2074/1957 751/3136/751 1956/2071/1956\nf 1956/2071/1956 751/3136/751 1987/2116/1987\nf 1996/2124/1996 2007/2144/2007 2030/2147/2030\nf 2008/2125/2008 1995/2118/1995 2006/2126/2006\nf 1996/2124/1996 2030/2147/2030 2008/2125/2008\nf 2009/2129/2009 777/2128/777 2012/3145/2012\nf 1997/3140/1997 2018/2130/2018 2019/3139/2019\nf 2019/3139/2019 2010/3146/2010 1997/3140/1997\nf 1997/3140/1997 2010/3146/2010 2007/2144/2007\nf 1997/3140/1997 1996/2124/1996 1989/3138/1989\nf 2019/3139/2019 2036/3147/2036 2010/3146/2010\nf 2036/3147/2036 2019/3139/2019 2009/2129/2009\nf 2035/3148/2035 2036/3147/2036 2012/3145/2012\nf 2012/3145/2012 2036/3147/2036 2009/2129/2009\nf 2014/2135/2014 2012/3145/2012 756/2132/756\nf 2012/3145/2012 777/2128/777 756/2132/756\nf 2014/2135/2014 2015/2134/2015 2034/3149/2034\nf 2016/3150/2016 2013/2143/2013 2014/2135/2014\nf 2016/3150/2016 2033/3151/2033 2013/2143/2013\nf 754/2131/754 2018/2130/2018 1989/3138/1989\nf 2018/2130/2018 1997/3140/1997 1989/3138/1989\nf 1994/2114/1994 2020/3152/2020 2026/3153/2026\nf 1995/2118/1995 2021/3154/2021 2020/3152/2020\nf 2008/2125/2008 2029/3155/2029 1995/2118/1995\nf 2021/3154/2021 2022/2136/2022 2020/3152/2020\nf 1994/2114/1994 2023/3156/2023 1998/3141/1998\nf 2020/3152/2020 1994/2114/1994 1995/2118/1995\nf 1994/2114/1994 2026/3153/2026 2023/3156/2023\nf 1995/2118/1995 2029/3155/2029 2021/3154/2021\nf 2029/3155/2029 2008/2125/2008 2030/2147/2030\nf 2021/3154/2021 2029/3155/2029 2024/3157/2024\nf 2021/3154/2021 2024/3157/2024 2022/2136/2022\nf 2026/3153/2026 2020/3152/2020 2027/3158/2027\nf 2026/3153/2026 2027/3158/2027 2023/3156/2023\nf 2027/3158/2027 2025/2139/2025 2023/3156/2023\nf 2027/3158/2027 2028/3159/2028 2025/2139/2025\nf 2028/3159/2028 2027/3158/2027 2020/3152/2020\nf 2025/2139/2025 2028/3159/2028 2022/2136/2022\nf 2028/3159/2028 2020/3152/2020 2022/2136/2022\nf 2023/3156/2023 2055/3160/2055 1998/3141/1998\nf 2029/3155/2029 2030/2147/2030 2024/3157/2024\nf 2033/3151/2033 2016/3150/2016 2034/3149/2034\nf 2034/3149/2034 2015/2134/2015 2033/3151/2033\nf 2035/3148/2035 2037/2141/2037 2036/3147/2036\nf 2012/3145/2012 2013/2143/2013 2011/2142/2011\nf 2035/3148/2035 2012/3145/2012 2011/2142/2011\nf 2012/3145/2012 2014/2135/2014 2013/2143/2013\nf 2011/2142/2011 2037/2141/2037 2035/3148/2035\nf 2037/2141/2037 2010/3146/2010 2036/3147/2036\nf 2031/2137/2031 2022/2136/2022 2024/3157/2024\nf 2030/2147/2030 2041/2146/2041 2024/3157/2024\nf 2024/3157/2024 2041/2146/2041 2031/2137/2031\nf 2040/2145/2040 2010/3146/2010 2037/2141/2037\nf 2042/2148/2042 2424/2567/2424 1406/2568/1406\nf 1408/3133/1408 2044/3161/2044 2042/2148/2042\nf 2039/2150/2039 2044/3161/2044 2043/2152/2043\nf 2044/3161/2044 2045/2346/2045 2043/2152/2043\nf 2044/3161/2044 2046/3162/2046 2045/2346/2045\nf 1984/3135/1984 2044/3161/2044 1408/3133/1408\nf 1984/3135/1984 2047/3163/2047 2044/3161/2044\nf 2044/3161/2044 2047/3163/2047 2046/3162/2046\nf 2047/3163/2047 1984/3135/1984 1432/3134/1432\nf 2049/2153/2049 2050/3164/2050 2048/2151/2048\nf 2050/3164/2050 2031/2137/2031 2048/2151/2048\nf 2031/2137/2031 2050/3164/2050 2032/2138/2032\nf 2051/2156/2051 2050/3164/2050 2049/2153/2049\nf 2050/3164/2050 2051/2156/2051 2032/2138/2032\nf 1998/3141/1998 2055/3160/2055 1954/3121/1954\nf 1954/3121/1954 2055/3160/2055 2052/3165/2052\nf 2053/2361/2053 2057/2243/2057 2052/3165/2052\nf 2057/2243/2057 2053/2361/2053 2054/2175/2054\nf 2062/3166/2062 2065/2362/2065 2052/3165/2052\nf 2054/2175/2054 2142/2214/2142 2057/2243/2057\nf 2052/3165/2052 2057/2243/2057 2056/2242/2056\nf 2056/2242/2056 1954/3121/1954 2052/3165/2052\nf 2055/3160/2055 2058/2155/2058 2059/2154/2059\nf 2058/2155/2058 2025/2139/2025 2032/2138/2032\nf 2023/3156/2023 2058/2155/2058 2055/3160/2055\nf 2058/2155/2058 2023/3156/2023 2025/2139/2025\nf 2059/2154/2059 2060/3167/2060 2055/3160/2055\nf 2059/2154/2059 2066/2349/2066 2060/3167/2060\nf 2060/3167/2060 2066/2349/2066 2062/3166/2062\nf 2066/2349/2066 2063/3168/2063 2062/3166/2062\nf 2061/2350/2061 2064/2363/2064 2063/3168/2063\nf 2064/2363/2064 2065/2362/2065 2063/3168/2063\nf 2052/3165/2052 2065/2362/2065 2053/2361/2053\nf 2065/2362/2065 2062/3166/2062 2063/3168/2063\nf 2063/3168/2063 2066/2349/2066 2061/2350/2061\nf 2060/3167/2060 2062/3166/2062 2055/3160/2055\nf 2062/3166/2062 2052/3165/2052 2055/3160/2055\nf 2053/2361/2053 2092/2174/2092 2054/2175/2054\nf 2070/2159/2070 2072/2177/2072 2067/2160/2067\nf 2053/2361/2053 2252/3169/2252 2092/2174/2092\nf 2094/2353/2094 2093/2178/2093 2073/2176/2073\nf 2091/2179/2091 2074/2169/2074 2071/2163/2071\nf 2075/2267/2075 2091/2179/2091 2095/3170/2095\nf 2091/2179/2091 2075/2267/2075 2074/2169/2074\nf 2080/2167/2080 2081/2168/2081 2101/2173/2101\nf 2078/2164/2078 2081/2168/2081 2080/2167/2080\nf 2087/3171/2087 2102/3172/2102 2084/2183/2084\nf 2086/2180/2086 2101/2173/2101 2085/2184/2085\nf 2088/2166/2088 2154/3173/2154 2090/2211/2090\nf 2088/2166/2088 2090/2211/2090 2077/2162/2077\nf 2067/2160/2067 2072/2177/2072 2071/2163/2071\nf 2072/2177/2072 2091/2179/2091 2071/2163/2071\nf 2095/3170/2095 2091/2179/2091 2093/2178/2093\nf 2155/2212/2155 2069/2158/2069 2068/2157/2068\nf 2069/2158/2069 2155/2212/2155 2141/2213/2141\nf 2093/2178/2093 2094/2353/2094 2047/3163/2047\nf 2094/2353/2094 2046/3162/2046 2047/3163/2047\nf 1432/3134/1432 1433/3174/1433 2047/3163/2047\nf 1424/3175/1424 1433/3174/1433 1432/3134/1432\nf 1433/3174/1433 2160/2260/2160 2095/3170/2095\nf 2084/2183/2084 2111/2182/2111 2087/3171/2087\nf 2087/3171/2087 2111/2182/2111 2110/2196/2110\nf 2101/2173/2101 2097/2186/2097 2100/2289/2100\nf 2100/2289/2100 2511/2185/2511 2085/2184/2085\nf 2085/2184/2085 2101/2173/2101 2100/2289/2100\nf 2101/2173/2101 2086/2180/2086 2080/2167/2080\nf 2084/2183/2084 2102/3172/2102 2079/2165/2079\nf 2102/3172/2102 2089/2207/2089 2079/2165/2079\nf 2174/2197/2174 2103/2210/2103 2096/2189/2096\nf 2174/2197/2174 2177/2298/2177 2103/2210/2103\nf 2105/2190/2105 2096/2189/2096 2103/2210/2103\nf 2110/2196/2110 2113/2202/2113 2087/3171/2087\nf 2113/2202/2113 2110/2196/2110 2109/2188/2109\nf 2174/2197/2174 2112/2181/2112 2511/2185/2511\nf 2087/3171/2087 2113/2202/2113 2115/2198/2115\nf 2102/3172/2102 2115/2198/2115 2114/2201/2114\nf 2115/2198/2115 2102/3172/2102 2087/3171/2087\nf 2089/2207/2089 2116/2206/2116 2154/3173/2154\nf 2124/2204/2124 2089/2207/2089 2102/3172/2102\nf 2124/2204/2124 2102/3172/2102 2114/2201/2114\nf 2125/2217/2125 2129/2219/2129 2127/3176/2127\nf 2126/2224/2126 2131/2223/2131 2128/3177/2128\nf 2128/3177/2128 2131/2223/2131 2147/2227/2147\nf 2130/2222/2130 1882/2221/1882 1903/3178/1903\nf 1903/3178/1903 2134/3179/2134 2130/2222/2130\nf 2130/2222/2130 2134/3179/2134 2135/2228/2135\nf 2134/3179/2134 1903/3178/1903 2132/3180/2132\nf 2132/2230/2132 1903/2012/1903 1904/2011/1904\nf 2134/3179/2134 2139/2235/2139 2135/2228/2135\nf 2139/2236/2139 2134/2233/2134 2137/2232/2137\nf 2147/2227/2147 2140/3181/2140 2128/3177/2128\nf 2155/2212/2155 2144/2237/2144 2141/2213/2141\nf 2143/2258/2143 2140/2248/2140 2001/2244/2001\nf 2056/2242/2056 1934/2241/1934 1954/3121/1954\nf 2143/2238/2143 1934/2241/1934 2142/2214/2142\nf 2002/2247/2002 2146/3182/2146 2003/3183/2003\nf 2003/3183/2003 2151/2250/2151 2149/2122/2149\nf 2146/3182/2146 2151/2250/2151 2003/3183/2003\nf 2000/2257/2000 2150/2121/2150 2148/3184/2148\nf 2148/3143/2148 2004/3119/2004 2000/2045/2000\nf 2149/2122/2149 2150/2121/2150 2153/3185/2153\nf 2150/2121/2150 2000/2257/2000 2153/3185/2153\nf 2151/2253/2151 2146/2246/2146 2145/2245/2145\nf 2150/2121/2150 1979/2120/1979 2148/3184/2148\nf 2003/3183/2003 2153/3185/2153 2002/2247/2002\nf 2153/3185/2153 2152/2256/2152 2002/2247/2002\nf 2153/3185/2153 2000/2257/2000 2152/2256/2152\nf 2149/2122/2149 2153/3185/2153 2003/3183/2003\nf 2128/2240/2128 2156/2274/2156 2129/2275/2129\nf 2156/2274/2156 2144/2237/2144 2155/2212/2155\nf 2156/2274/2156 2128/2240/2128 2144/2237/2144\nf 2127/3176/2127 1879/3107/1879 2125/2217/2125\nf 2127/3176/2127 2157/3186/2157 1879/3107/1879\nf 1879/3107/1879 2157/3186/2157 2164/2522/2164\nf 1876/3095/1876 2125/2217/2125 1879/3107/1879\nf 1427/3187/1427 2158/1976/2158 1428/2261/1428\nf 1426/1973/1426 2158/1976/2158 1427/3187/1427\nf 2160/2260/2160 2159/2259/2159 2095/3170/2095\nf 2095/3170/2095 2159/2259/2159 2075/2267/2075\nf 2160/2260/2160 1433/3174/1433 1428/2261/1428\nf 2042/2148/2042 1406/2568/1406 1408/3133/1408\nf 2083/2171/2083 2162/2263/2162 2181/2264/2181\nf 2165/2266/2165 2075/2267/2075 2159/2259/2159\nf 2082/2170/2082 2165/2266/2165 2163/2262/2163\nf 2164/1975/2164 2157/3188/2157 2165/2266/2165\nf 2161/2265/2161 2181/2264/2181 2183/2293/2183\nf 2116/2206/2116 2167/2272/2167 2154/3173/2154\nf 2154/3173/2154 2167/2272/2167 2090/2211/2090\nf 2161/2265/2161 2098/2187/2098 2099/2172/2099\nf 2117/2203/2117 2171/3189/2171 2168/2276/2168\nf 2119/2199/2119 2168/2276/2168 2118/2200/2118\nf 2117/2203/2117 2168/2276/2168 2119/2199/2119\nf 2122/2209/2122 2171/3189/2171 2117/2203/2117\nf 2121/2208/2121 2170/2278/2170 2122/2209/2122\nf 2122/2209/2122 2170/2278/2170 2171/3189/2171\nf 2174/2197/2174 2511/2185/2511 2510/2697/2510\nf 2510/2697/2510 2177/2298/2177 2174/2197/2174\nf 2173/2283/2173 2168/2294/2168 2171/2284/2171\nf 2180/2288/2180 2179/2291/2179 2173/2283/2173\nf 2172/2281/2172 2180/2288/2180 2173/2283/2173\nf 2183/2293/2183 2184/2292/2184 2161/2265/2161\nf 2184/2292/2184 2098/2187/2098 2161/2265/2161\nf 2163/2262/2163 2157/3188/2157 2127/2296/2127\nf 2157/3188/2157 2163/2262/2163 2165/2266/2165\nf 2163/2262/2163 2127/2296/2127 2162/2263/2162\nf 2103/2210/2103 2185/2300/2185 2108/2194/2108\nf 2185/2300/2185 2190/2305/2190 2189/2302/2189\nf 2343/2311/2343 2381/2314/2381 2188/2303/2188\nf 2306/2309/2306 2342/2310/2342 2189/2302/2189\nf 2193/2313/2193 2305/2308/2305 2190/2305/2190\nf 2201/2323/2201 2205/2322/2205 2204/2334/2204\nf 2201/2323/2201 2204/2334/2204 2202/2333/2202\nf 2204/2334/2204 2205/2322/2205 2203/2330/2203\nf 2196/2316/2196 2209/2327/2209 2198/2318/2198\nf 2198/2318/2198 2209/2327/2209 2200/2320/2200\nf 2197/2319/2197 2256/2365/2256 2195/2317/2195\nf 2199/2321/2199 2256/2365/2256 2197/2319/2197\nf 2216/2339/2216 2219/3190/2219 2280/2340/2280\nf 2216/2339/2216 2220/2280/2220 2219/3190/2219\nf 2415/2429/2415 2219/3191/2219 2218/2430/2218\nf 2280/2340/2280 2219/3190/2219 2415/2426/2415\nf 2219/3191/2219 2217/3192/2217 2218/2430/2218\nf 2219/3190/2219 2220/2280/2220 2217/3193/2217\nf 1871/1966/1871 2221/1977/2221 1875/2341/1875\nf 1878/2342/1878 2224/3098/2224 1875/2341/1875\nf 2224/3098/2224 1876/3095/1876 1875/2341/1875\nf 2224/3098/2224 1888/3099/1888 1880/2218/1880\nf 2225/2345/2225 2228/2344/2228 2226/3194/2226\nf 2228/2344/2228 2045/2346/2045 2046/3162/2046\nf 2043/2152/2043 2225/2345/2225 2049/2153/2049\nf 2226/3194/2226 2228/2344/2228 2227/2360/2227\nf 2228/2344/2228 2046/3162/2046 2227/2360/2227\nf 2227/2360/2227 2046/3162/2046 2094/2353/2094\nf 2230/3195/2230 2231/2351/2231 2073/2176/2073\nf 2232/3196/2232 2233/3197/2233 2239/3198/2239\nf 2239/3198/2239 2233/3197/2233 2229/3199/2229\nf 2232/3196/2232 2236/3200/2236 2233/3197/2233\nf 2233/3197/2233 2236/3200/2236 2234/3201/2234\nf 2234/3201/2234 2236/3200/2236 2250/2356/2250\nf 2250/2356/2250 2236/3200/2236 2235/2357/2235\nf 2236/3200/2236 2232/3196/2232 2237/2347/2237\nf 2236/3200/2236 2237/2347/2237 2235/2357/2235\nf 2232/3196/2232 2239/3198/2239 2238/2348/2238\nf 2232/3196/2232 2238/2348/2238 2237/2347/2237\nf 2237/2347/2237 2051/2156/2051 2235/2357/2235\nf 2238/2348/2238 2239/3198/2239 2061/2350/2061\nf 2229/3199/2229 2240/2364/2240 2239/3198/2239\nf 2240/2364/2240 2064/2363/2064 2239/3198/2239\nf 2061/2350/2061 2239/3198/2239 2064/2363/2064\nf 2251/2358/2251 2248/3202/2248 2247/2359/2247\nf 2231/2351/2231 2242/3203/2242 2241/2352/2241\nf 2229/3199/2229 2242/3203/2242 2231/2351/2231\nf 2231/2351/2231 2230/3195/2230 2229/3199/2229\nf 2242/3203/2242 2229/3199/2229 2234/3201/2234\nf 2234/3201/2234 2229/3199/2229 2233/3197/2233\nf 2242/3203/2242 2234/3201/2234 2241/2352/2241\nf 2234/3201/2234 2250/2356/2250 2249/3204/2249\nf 2250/2356/2250 2225/2345/2225 2226/3194/2226\nf 2250/2356/2250 2243/2355/2243 2225/2345/2225\nf 2225/2345/2225 2243/2355/2243 2049/2153/2049\nf 2051/2156/2051 2244/2354/2244 2235/2357/2235\nf 2244/2354/2244 2246/3205/2246 2245/3206/2245\nf 2244/2354/2244 2245/3206/2245 2243/2355/2243\nf 2243/2355/2243 2245/3206/2245 2049/2153/2049\nf 2245/3206/2245 2246/3205/2246 2049/2153/2049\nf 2049/2153/2049 2246/3205/2246 2051/2156/2051\nf 2246/3205/2246 2244/2354/2244 2051/2156/2051\nf 2247/2359/2247 2226/3194/2226 2227/2360/2227\nf 2247/2359/2247 2249/3204/2249 2226/3194/2226\nf 2249/3204/2249 2250/2356/2250 2226/3194/2226\nf 2251/2358/2251 2094/2353/2094 2241/2352/2241\nf 2248/3202/2248 2249/3204/2249 2247/2359/2247\nf 2251/2358/2251 2241/2352/2241 2248/3202/2248\nf 2241/2352/2241 2234/3201/2234 2248/3202/2248\nf 2234/3201/2234 2249/3204/2249 2248/3202/2248\nf 2073/2176/2073 2252/3169/2252 2230/3195/2230\nf 2229/3199/2229 2252/3169/2252 2240/2364/2240\nf 2252/3169/2252 2053/2361/2053 2240/2364/2240\nf 2252/3169/2252 2229/3199/2229 2230/3195/2230\nf 2073/2176/2073 2092/2174/2092 2252/3169/2252\nf 2042/2148/2042 2044/3161/2044 2039/2150/2039\nf 2154/3173/2154 2088/2166/2088 2089/2207/2089\nf 2089/2207/2089 2088/2166/2088 2079/2165/2079\nf 2254/2367/2254 2202/2333/2202 2212/2332/2212\nf 2213/2335/2213 2203/2330/2203 2210/2329/2210\nf 2254/2367/2254 2262/3207/2262 2260/2372/2260\nf 2212/2332/2212 2262/3207/2262 2254/2367/2254\nf 2212/2332/2212 2264/2337/2264 2262/3207/2262\nf 2263/2338/2263 2213/2335/2213 2261/3208/2261\nf 2261/3208/2261 2210/2329/2210 2257/2369/2257\nf 2210/2329/2210 2261/3208/2261 2213/2335/2213\nf 2215/2336/2215 2268/3209/2268 2264/2337/2264\nf 2263/2338/2263 2268/3209/2268 2215/2336/2215\nf 2264/2380/2264 2268/3210/2268 2263/2379/2263\nf 2275/2394/2275 2276/2393/2276 2277/2401/2277\nf 2275/2394/2275 2277/2401/2277 2278/2400/2278\nf 2277/2401/2277 2276/2393/2276 2279/2397/2279\nf 2272/2389/2272 2281/2395/2281 2274/2391/2274\nf 2274/2391/2274 2281/2395/2281 2276/2393/2276\nf 2273/2392/2273 2289/2406/2289 2271/2390/2271\nf 2275/2394/2275 2289/2406/2289 2273/2392/2273\nf 2290/2407/2290 2278/2400/2278 2284/2399/2284\nf 2285/2402/2285 2279/2397/2279 2282/2396/2282\nf 2290/2407/2290 2294/3211/2294 2292/2412/2292\nf 2284/2399/2284 2296/3212/2296 2290/2407/2290\nf 2284/2399/2284 2287/2404/2287 2296/3212/2296\nf 2288/2405/2288 2285/2402/2285 2295/3213/2295\nf 2282/2396/2282 2293/3214/2293 2295/3213/2295\nf 2293/3214/2293 2282/2396/2282 2291/2409/2291\nf 2282/2396/2282 2295/3213/2295 2285/2402/2285\nf 2290/2407/2290 2296/3212/2296 2294/3211/2294\nf 2286/2403/2286 2300/3215/2300 2287/2404/2287\nf 2288/2405/2288 2300/3215/2300 2286/2403/2286\nf 2287/2422/2287 2300/3216/2300 2288/2421/2288\nf 2217/3192/2217 2302/2431/2302 2218/2430/2218\nf 2313/2441/2313 2314/2440/2314 2315/2450/2315\nf 2313/2441/2313 2315/2450/2315 2316/2449/2316\nf 2315/2450/2315 2314/2440/2314 2317/2446/2317\nf 2308/2434/2308 2319/2443/2319 2310/2436/2310\nf 2310/2436/2310 2319/2443/2319 2312/2438/2312\nf 2309/2437/2309 2328/2455/2328 2307/2435/2307\nf 2311/2439/2311 2328/2455/2328 2309/2437/2309\nf 2330/2457/2330 2316/2449/2316 2323/2448/2323\nf 2324/2451/2324 2317/2446/2317 2321/2445/2321\nf 2330/2457/2330 2337/3217/2337 2335/2462/2335\nf 2323/2448/2323 2337/3217/2337 2330/2457/2330\nf 2323/2448/2323 2326/2453/2326 2337/3217/2337\nf 2327/2454/2327 2324/2451/2324 2336/3218/2336\nf 2336/3218/2336 2321/2445/2321 2332/2460/2332\nf 2321/2445/2321 2336/3218/2336 2324/2451/2324\nf 2325/2452/2325 2341/3219/2341 2326/2453/2326\nf 2327/2454/2327 2341/3219/2341 2325/2452/2325\nf 2326/2470/2326 2341/3220/2341 2327/2469/2327\nf 2318/2442/2318 2255/2368/2255 2340/2386/2340\nf 2350/2484/2350 2351/2483/2351 2352/2493/2352\nf 2350/2484/2350 2352/2493/2352 2353/2492/2353\nf 2352/2493/2352 2351/2483/2351 2354/2489/2354\nf 2345/2477/2345 2356/2486/2356 2347/2479/2347\nf 2347/2479/2347 2356/2486/2356 2349/2481/2349\nf 2362/3221/2362 2360/2491/2360 2359/2490/2359\nf 2361/2494/2361 2362/3221/2362 2359/2490/2359\nf 2346/2480/2346 2363/2495/2363 2344/2478/2344\nf 2348/2482/2348 2363/2495/2363 2346/2480/2346\nf 2365/2497/2365 2353/2492/2353 2360/2491/2360\nf 2361/2494/2361 2354/2489/2354 2358/2488/2358\nf 2372/2508/2372 2362/3222/2362 2371/2507/2371\nf 2365/2497/2365 2372/3223/2372 2370/2502/2370\nf 2360/2491/2360 2372/3223/2372 2365/2497/2365\nf 2360/2491/2360 2362/3221/2362 2372/3223/2372\nf 2362/3221/2362 2361/2494/2361 2371/3224/2371\nf 2371/3224/2371 2358/2488/2358 2367/2499/2367\nf 2358/2488/2358 2371/3224/2371 2361/2494/2361\nf 2355/2485/2355 2331/2458/2331 2376/2475/2376\nf 2414/2558/2414 2302/2517/2302 2378/2516/2378\nf 2220/2280/2220 2379/2279/2379 2217/3193/2217\nf 2217/2518/2217 2379/3225/2379 2377/2519/2377\nf 2108/2194/2108 2380/2306/2380 2120/2195/2120\nf 1479/1530/1479 1534/1575/1534 1482/1577/1482\nf 1556/1609/1556 1587/1683/1587 1589/1610/1589\nf 1595/3033/1595 1571/1626/1571 1579/1628/1579\nf 1563/1619/1563 1505/3039/1505 1672/1617/1672\nf 1463/1520/1463 1491/3016/1491 1466/1536/1466\nf 1447/1508/1447 1462/1521/1462 1455/1524/1455\nf 2093/2178/2093 2047/3163/2047 2095/3170/2095\nf 2095/3170/2095 2047/3163/2047 1433/3174/1433\nf 2389/2531/2389 2390/2530/2390 2391/2540/2391\nf 2389/2531/2389 2391/2540/2391 2392/2539/2392\nf 2391/2540/2391 2390/2530/2390 2393/2536/2393\nf 2384/2524/2384 2395/2533/2395 2386/2526/2386\nf 2386/2526/2386 2395/2533/2395 2388/2528/2388\nf 2401/3226/2401 2399/2538/2399 2398/2537/2398\nf 2400/2541/2400 2401/3226/2401 2398/2537/2398\nf 2385/2527/2385 2402/2542/2402 2383/2525/2383\nf 2387/2529/2387 2402/2542/2402 2385/2527/2385\nf 2404/2544/2404 2392/2539/2392 2399/2538/2399\nf 2400/2541/2400 2393/2536/2393 2397/2535/2397\nf 2411/2555/2411 2401/3227/2401 2410/2554/2410\nf 2404/2544/2404 2411/3228/2411 2409/2549/2409\nf 2399/2538/2399 2411/3228/2411 2404/2544/2404\nf 2399/2538/2399 2401/3226/2401 2411/3228/2411\nf 2401/3226/2401 2400/2541/2400 2410/3229/2410\nf 2410/3229/2410 2397/2535/2397 2406/2546/2406\nf 2397/2535/2397 2410/3229/2410 2400/2541/2400\nf 2394/2532/2394 2366/2498/2366 2375/2514/2375\nf 2405/2545/2405 2192/2307/2192 2382/2315/2382\nf 2299/3230/2299 2304/2428/2304 2303/2433/2303\nf 2299/3230/2299 2415/2429/2415 2304/2428/2304\nf 2270/2325/2270 2191/2304/2191 2186/2299/2186\nf 2417/2563/2417 2425/2562/2425 2416/2572/2416\nf 2423/2564/2423 2419/2571/2419 2420/2565/2420\nf 1406/2568/1406 2424/2567/2424 2418/2566/2418\nf 562/2569/562 2420/2565/2420 2419/2571/2419\nf 2424/2567/2424 2042/2148/2042 2038/2149/2038\nf 2416/2572/2416 2425/2562/2425 2426/2609/2426\nf 2416/2572/2416 2426/2609/2426 2421/2573/2421\nf 2017/2140/2017 2427/3231/2427 2037/2141/2037\nf 2427/3232/2427 2456/2614/2456 2425/3233/2425\nf 2431/2611/2431 2427/3232/2427 2017/3234/2017\nf 2427/3232/2427 2431/2611/2431 2456/2614/2456\nf 2040/2145/2040 2427/3231/2427 2425/2562/2425\nf 2427/3231/2427 2040/2145/2040 2037/2141/2037\nf 2430/2578/2430 2433/2583/2433 2429/2579/2429\nf 2015/3235/2015 2438/3236/2438 2033/3237/2033\nf 2443/2600/2443 2451/2595/2451 2442/2594/2442\nf 2438/3238/2438 2015/2592/2015 2439/2605/2439\nf 2014/2135/2014 2034/3149/2034 2016/3150/2016\nf 2440/2604/2440 2443/2600/2443 2445/2598/2445\nf 2441/3239/2441 2445/2598/2445 2444/2597/2444\nf 2445/2598/2445 2441/3239/2441 2440/2604/2440\nf 2015/2592/2015 2451/2595/2451 2439/2605/2439\nf 2429/2579/2429 2453/2607/2453 2483/3240/2483\nf 2452/3241/2452 2453/2607/2453 2448/2603/2448\nf 2453/2607/2453 2449/2602/2449 2448/2603/2448\nf 2453/2607/2453 2450/2601/2450 2449/2602/2449\nf 2453/2607/2453 2454/2606/2454 2450/2601/2450\nf 2454/2606/2454 2447/2599/2447 2450/2601/2450\nf 2454/2606/2454 2446/2596/2446 2447/2599/2447\nf 2437/2585/2437 2455/3242/2455 2436/2586/2436\nf 2441/2590/2441 2455/3242/2455 2437/2585/2437\nf 2444/2597/2444 2455/3242/2455 2441/3239/2441\nf 2446/2596/2446 2455/3242/2455 2444/2597/2444\nf 2436/2586/2436 2455/3242/2455 2446/2596/2446\nf 1331/2577/1331 2448/2655/2448 2428/2574/2428\nf 2429/2579/2429 2483/3240/2483 2432/2580/2432\nf 2483/3240/2483 2453/2607/2453 2452/3241/2452\nf 2457/3243/2457 2512/2619/2512 2456/3244/2456\nf 63/3245/63 2458/2620/2458 2457/3243/2457\nf 2514/2621/2514 2464/2624/2464 2463/2623/2463\nf 2458/2620/2458 62/3246/62 2468/2629/2468\nf 2460/2617/2460 2469/2630/2469 2462/2622/2462\nf 63/3245/63 62/3246/62 2458/2620/2458\nf 2432/2636/2432 2474/2635/2474 64/3247/64\nf 2487/2649/2487 2486/2648/2486 2477/3248/2477\nf 2477/3248/2477 2481/2650/2481 2487/2649/2487\nf 2482/2644/2482 2485/2645/2485 2484/2646/2484\nf 2484/2646/2484 2432/3249/2432 2483/2647/2483\nf 2432/3249/2432 2484/2646/2484 2472/3250/2472\nf 2485/2645/2485 2472/3250/2472 2484/2646/2484\nf 2472/3250/2472 2485/2645/2485 2475/3251/2475\nf 2485/2645/2485 2480/2642/2480 2481/2650/2481\nf 2475/3251/2475 2485/2645/2485 2481/2650/2481\nf 2486/3252/2486 2481/2650/2481 2477/3248/2477\nf 2481/2650/2481 2486/3252/2486 2475/3251/2475\nf 2490/2652/2490 1435/3253/1435 1434/3254/1434\nf 2483/2647/2483 2489/2658/2489 2488/2643/2488\nf 2452/2654/2452 2489/2657/2489 2483/3255/2483\nf 47/3256/47 2490/2652/2490 1434/3254/1434\nf 2490/2652/2490 47/3256/47 61/2651/61\nf 64/3247/64 2474/2635/2474 61/2651/61\nf 106/2656/106 107/3257/107 1435/3258/1435\nf 106/2656/106 1435/3258/1435 2489/2657/2489\nf 1435/3253/1435 2490/2652/2490 2489/2658/2489\nf 2519/2674/2519 2491/2662/2491 2494/2675/2494\nf 2494/2675/2494 2495/3259/2495 2493/2668/2493\nf 2495/3260/2495 2459/2664/2459 2493/2698/2493\nf 2459/2664/2459 2495/3260/2495 2491/2665/2491\nf 2425/2663/2425 2456/3244/2456 2459/2664/2459\nf 2493/2668/2493 2496/2667/2496 2494/2675/2494\nf 2465/2627/2465 2501/3261/2501 2498/2628/2498\nf 2470/2633/2470 2501/3261/2501 2465/2627/2465\nf 2498/2680/2498 2501/3261/2501 2499/2679/2499\nf 2499/2679/2499 2501/3261/2501 2470/2633/2470\nf 2419/2571/2419 1356/2682/1356 562/2569/562\nf 2421/2573/2421 2502/2685/2502 2422/2570/2422\nf 2502/2685/2502 2421/2573/2421 14/2608/14\nf 2507/2686/2507 2508/2694/2508 2506/2690/2506\nf 2041/2146/2041 2048/2151/2048 2031/2137/2031\nf 2013/2143/2013 2033/3151/2033 2017/2140/2017\nf 2033/3237/2033 2438/3236/2438 2017/3262/2017\nf 2040/2145/2040 2007/2144/2007 2010/3146/2010\nf 2502/2689/2502 2503/3263/2503 2507/2686/2507\nf 2512/2619/2512 2457/3243/2457 2458/2620/2458\nf 2456/3244/2456 2512/2619/2512 2459/2664/2459\nf 2514/2621/2514 2463/2623/2463 2461/2699/2461\nf 2464/2624/2464 2514/2621/2514 2462/2622/2462\nf 2468/2629/2468 62/3246/62 46/2700/46\nf 2515/2671/2515 2518/2673/2518 2468/2629/2468\nf 2517/2681/2517 2471/2632/2471 2500/2631/2500\nf 2469/2630/2469 2518/2673/2518 2516/2676/2516\nf 2518/2673/2518 2469/2630/2469 2468/2629/2468\nf 2492/2659/2492 2518/2673/2518 2515/2671/2515\nf 2491/2662/2491 2519/2674/2519 2492/2659/2492\nf 2519/2674/2519 2518/2673/2518 2492/2659/2492\nf 2494/2675/2494 2491/2662/2491 2495/3259/2495\n# 5022 faces\n\ng\n"
  },
  {
    "path": "graphics/tiny-renderer/meta.json",
    "content": "{\n  \"order\":{\n    \"lesson1.workbook\":\"Lesson 1: Line Drawing Algorithm\",\n    \"lesson2.workbook\":\"Lesson 2: Triangle rasterization\",\n    \"lesson3.workbook\":\"Lesson 3: Hidden faces removal\",\n    \"lesson4.workbook\":\"Lesson 4: Perspective projection\",\n    \"lesson5.workbook\":\"Lesson 5: Moving the camera\",\n    \"lesson6.workbook\":\"Lesson 6: Shaders for the software renderer\",\n    \"lesson6bis.workbook\":\"Lesson 6: tangent space normal mapping\",\n    \"lesson7.workbook\":\"Lesson 7: Shadow mapping\",\n    \"lesson8.workbook\":\"Lesson 8: Ambient occlusion\"\n  }\n}\n"
  },
  {
    "path": "graphics/urhosharp/.gitignore",
    "content": "Urho3D.log\nCoreData.pak\n"
  },
  {
    "path": "graphics/urhosharp/animated-model/animated-model.workbook/Data/License.txt",
    "content": "--------------------------\nnote:\n--------------------------\nThere is no requirement in the Mixamo License to provide any license information with any content.  \nHowever, for the purpose of learning, I have provided some pertinent information below.\n\n--------------------------\ninfo:\n--------------------------\nwebsite: https://www.mixamo.com/\nmodel: Mutant\nlicense: http://www.adobe.com/legal/terms.html\n\n--------------------------\nlicense short explanation (from the forum):\n--------------------------\nJeanette Mathews\nMay 31, 2016 07:24\n\nThanks for the feedback, and glad to hear the tutorial was useful getting you started.  :)\n\nYes, all Fuse and Mixamo content is available for commercial and non commercial use, royalty free.  \nYou can edit them to your hearts content!\n\nThe only requirement we have is that the final product you are creating must have our content in an 'embedded', non-editable format.  \nSo you can't edit the characters and sell them directly, because then other people have access to the character 3d data files.  \nGames, movies, 3d prints, 2D illustrations, or any other file format where the character/animation files are not-editable is fine.  \nSelling characters/animations directly is against the TOS/EULA.\n\nHope that helps clarify!\n\nreference: https://community.mixamo.com/hc/en-us/community/posts/211496987-Mixamo-Store-Characters-Licence\n\n--------------------------\n\n\n"
  },
  {
    "path": "graphics/urhosharp/animated-model/animated-model.workbook/Data/Materials/mutant_M.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/DiffNormal.xml\" />\n\t<texture unit=\"diffuse\" name=\"Textures/Mutant_diffuse.jpg\" />\n\t<texture unit=\"normal\" name=\"Textures/Mutant_normal.jpg\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0.2 0.2 0.2 6.15385\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/animated-model/animated-model.workbook/index.workbook",
    "content": "﻿---\nid: 6b6c224f-07e3-4b6e-b006-c5291041792f\nuti: com.xamarin.workbook\ntitle: \"UrhoSharp: Animated Model\"\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n# Animated Models\n\nUrhoSharp is a powerful 3D game engine for Xamarin and .NET developers. It is similar in spirit to Apple’s SceneKit and SpriteKit and includes physics, navigation, networking, and much more...while still being cross-platform.\n\n```csharp\n#r \"Urho\"\n\nusing Urho;\nusing Urho.Actions;\nusing Urho.Shapes;\nusing Urho.Gui;\nusing Urho.Urho2D;\n\nusing System.IO;\n```\n\n```csharp\nvar app = SimpleApplication.Show (\n\tnew ApplicationOptions (\"Data\") {\n\t\tWidth = 800, \n\t\tHeight = 800 });\n```\n\nWe have created a window containing a `SimpleApplication`.\n\nLoading the Mutant model via AnimatedModel component, and play \"Idle\" looped animation by default.\n\n```csharp\napp.RootNode.RemoveAllChildren();\nvar node = app.RootNode.CreateChild();\nvar mutantModel = node.CreateComponent<AnimatedModel>();\nmutantModel.Model = app.ResourceCache.GetModel(\"Models/Mutant.mdl\");\nmutantModel.SetMaterial(app.ResourceCache.GetMaterial(\"Materials/mutant_M.xml\"));\nnode.SetScale(2.5f);\nvar animation = node.CreateComponent<AnimationController>();\nanimation.Play(\"Animations/Mutant_Idle0.ani\", 0, true, 0.2f);\nnode.Position = new Vector3(0, -2f, 0.2f);\n```\n\nEnumerate all available animations\n\n```csharp\nvar aniFiles = System.IO.Directory.GetFiles(\"Data/Animations\").Select(i => Path.GetFileName(i)).ToArray();\n```\n\n```csharp\nanimation.StopAll(0);\nanimation.Play($\"Animations/{aniFiles[9]}\", 0, true, 0.2f);\n```"
  },
  {
    "path": "graphics/urhosharp/barchart/charts.workbook/index.workbook",
    "content": "---\nid: a98401e1-2efa-4b55-a83b-6d55f2bda733\nuti: com.xamarin.workbook\ntitle: \"UrhoSharp: Charts\"\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n```csharp\n#r \"Urho\"\n```\n\nWe are going to bring the Urho namespaces:\n\n```csharp\nusing Urho;\nusing Urho.Actions;\nusing Urho.Shapes;\n```\n\nWe create our main window to display our data:\n\n```csharp\nvar app = SimpleApplication.Show();\n```\n\nWe are going to add nodes that have a visual component (the bar) and add a plane to it:\n\n```csharp\napp.RootNode.RemoveAllChildren();\n//1\nvar bar1 = app.RootNode.CreateChild();\nbar1.AddComponent(new Bar(\"Cats\", Color.Red));\nbar1.Position = new Vector3(0, 0, 0);\n//2\nvar bar2 = app.RootNode.CreateChild();\nbar2.AddComponent(new Bar(\"Dogs\", Color.Yellow));\nbar2.Position = new Vector3(1.5f, 0, 0);\n//3\nvar bar3 = app.RootNode.CreateChild();\nbar3.AddComponent(new Bar(\"Mice\", Color.Blue));\nbar3.Position = new Vector3(3f, 0, 0);\n//4\nvar bar4 = app.RootNode.CreateChild();\nbar4.AddComponent(new Bar(\"Birds\", Color.Green));\nbar4.Position = new Vector3(4.5f, 0, 0);\n\n//plane\napp.RootNode.RunActions(new Parallel(new RotateTo(1f, -15, -20, 0), new MoveTo(1f, new Vector3(-2, -5, 8))));\nvar planeNode = app.RootNode.CreateChild();\nplaneNode.Position = new Vector3(4, -5, 4);\nplaneNode.Scale = new Vector3(10, 1, 4);\nvar plane = planeNode.CreateComponent<Urho.Shapes.Plane>();\nplane.Color = Color.White;\n```\n\nWe are now going to set their sizes:\n\n```csharp\nRandom rand = new Random();\napp.RootNode.GetChildrenWithComponent<Bar>().ToList().ForEach(i => i.GetComponent<Bar>().Value = (float)rand.NextDouble() * 3 + 1);\n```"
  },
  {
    "path": "graphics/urhosharp/building-polyhedra/BuildingPolyhedra.workbook/CreateModel.csx",
    "content": "using System;\nusing System.Collections.Generic;\nusing Urho;\n\nModel CreateModel(IList<Vector3> positions,\n                  IList<Vector3> normals = null,\n                  IList<Color> colors = null,\n                  IList<Vector2> texcoords = null)\n{\n    // Check that the positions argument isn't null\n    if (positions == null)\n        throw new ArgumentNullException(\"positions\");\n\n    // Make sure it has a property number of elements\n    int vertexCount = positions.Count;\n\n    if (vertexCount == 0 || vertexCount % 3 != 0)\n        throw new ArgumentOutOfRangeException(\"positions count must be non-zero and a multiple of 3\");\n\n    // Check that the normals argument is consistent, or create it\n    if (normals != null)\n    {\n        if (normals.Count != vertexCount)\n            throw new ArgumentOutOfRangeException(\"texcoords must have same count as positions\");\n    }\n    else\n    {\n        normals = new Vector3[vertexCount];\n\n        for (int i = 0; i < vertexCount; i += 3)\n        {\n            normals[i + 0] = Vector3.Cross(positions[i + 1] - positions[i + 0],\n                                            positions[i + 2] - positions[i + 0]);\n\n            normals[i + 1] = Vector3.Cross(positions[i + 2] - positions[i + 1],\n                                            positions[i + 0] - positions[i + 1]);\n\n            normals[i + 2] = Vector3.Cross(positions[i + 0] - positions[i + 2],\n                                            positions[i + 1] - positions[i + 2]);\n        }\n    }\n\n    // Create the VertexBuffer object; set it in one of the blocks below\n    VertexBuffer vertexBuffer = new VertexBuffer(Application.CurrentContext, false)\n    {\n        Shadowed = true\n    };\n\n    // If texcoords is non-null, use a PositionNormalColorTexcoord structure\n    if (texcoords != null)\n    {\n        if (texcoords.Count != vertexCount)\n            throw new ArgumentOutOfRangeException(\"texcoords must have same count as positions\");\n\n        if (colors != null && colors.Count != vertexCount)\n            throw new Exception(\"colors must have same count as positions\");\n\n        var vertices = new VertexBuffer.PositionNormalColorTexcoord[vertexCount];\n\n        for (int i = 0; i < vertexCount; i++)\n        {\n            vertices[i].Position = positions[i];\n            vertices[i].Normal = normals[i];\n            vertices[i].Color = colors == null ? 0 : colors[i].ToUInt();\n            vertices[i].TexCoord = texcoords[i];\n        }\n\n        vertexBuffer.SetSize((uint)vertexCount, ElementMask.Position |\n                                                ElementMask.Normal |\n                                                ElementMask.Color |\n                                                ElementMask.TexCoord1,\n                                                false);\n        vertexBuffer.SetData(vertices);\n    }\n    // If colors is non-null, use a PositionNormalColor structure\n    else if (colors != null)\n    {\n        if (colors.Count != vertexCount)\n            throw new Exception(\"colors must have same count as positions\");\n\n        VertexBuffer.PositionNormalColor[] vertices = new VertexBuffer.PositionNormalColor[vertexCount];\n\n        for (int i = 0; i < vertexCount; i++)\n        {\n            vertices[i].Position = positions[i];\n            vertices[i].Normal = normals[i];\n            vertices[i].Color = colors[i].ToUInt();\n        }\n\n        vertexBuffer.SetSize((uint)vertexCount, ElementMask.Position | \n                                                ElementMask.Normal | \n                                                ElementMask.Color, false);\n        vertexBuffer.SetData(vertices);\n    }\n    // Otherwise use the PositionNormal structure\n    else\n    {\n        VertexBuffer.PositionNormal[] vertices = new VertexBuffer.PositionNormal[vertexCount];\n\n        for (int i = 0; i < vertexCount; i++)\n        {\n            vertices[i].Position = positions[i];\n            vertices[i].Normal = normals[i];\n        }\n\n        vertexBuffer.SetSize((uint)vertexCount, ElementMask.Position | \n                                                ElementMask.Normal, false);\n        vertexBuffer.SetData(vertices);\n    }\n\n    // Create the Geometry object\n    Geometry geometry = new Geometry();\n    geometry.SetVertexBuffer(0, vertexBuffer);\n    geometry.SetDrawRange(PrimitiveType.TriangleList, 0, 0, 0, (uint)vertexCount, true);\n\n    // Create the Model object\n    Model model = new Model();\n    model.NumGeometries = 1;\n    model.SetGeometry(0, 0, geometry);\n    model.BoundingBox = new BoundingBox(new Vector3(-10, -10, -10), new Vector3(10, 10, 10));\n\n    return model;\n}\n"
  },
  {
    "path": "graphics/urhosharp/building-polyhedra/BuildingPolyhedra.workbook/UrhoSettings.csx",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing Urho;\n\nNode lightNode1, lightNode2;\nLight light1, light2;\n\nvoid Initialize(SimpleApplication app)\n{\n    // Move the camera and set it's direction\n    app.CameraNode.Position = new Vector3(0, 0, -5);\n\n    app.CameraNode.SetDirection(new Vector3(0, 0, 1));\n\n    // Set the root node at the origin\n    app.RootNode.Position = new Vector3(0, 0, 0);\n\n    // Remove the point light\n    app.CameraNode.RemoveAllChildren();\n\n    // Remove previous directionalLight nodes before adding new one\n    app.Scene.RemoveChild(app.Scene.GetChild(\"directionalLight1\"));\n    lightNode1 = app.Scene.CreateChild(\"directionalLight1\");\n\n    app.Scene.RemoveChild(app.Scene.GetChild(\"directionalLight2\"));\n    lightNode2 = app.Scene.CreateChild(\"directionalLight2\");\n\n    // Create the light compononents and set color and direction\n    light1 = lightNode1.CreateComponent<Light>();\n    light1.LightType = LightType.Directional;\n    light1.Color = new Color(0.4f, 0.4f, 0.4f);\n    lightNode1.SetDirection(new Vector3(2, -3, 1));\n\n    light2 = lightNode2.CreateComponent<Light>();\n    light2.LightType = LightType.Directional;\n    light2.Color = new Color(0.2f, 0.2f, 0.2f);\n    lightNode2.SetDirection(new Vector3(0, 0, 1));\n\n    // Set the ambient light\n    app.Zone.AmbientColor = new Color(0.4f, 0.4f, 0.4f);\n\n    // Disable the code that moves the camera in response to mouse and touch\n    app.MoveCamera = false;\n\n    // Detach ALL Update handler\n    FieldInfo field = typeof(Application).GetField(\"Update\", BindingFlags.Instance | BindingFlags.NonPublic);\n\n    field.SetValue(app, null);\n\n    // Define an event handler to apply rotation to RootNode with the mouse\n    app.Update += (UpdateEventArgs args) =>\n    {\n        if (app.Input.GetMouseButtonDown(MouseButton.Left))\n        {\n            Vector2 mouseMove = new Vector2(app.Input.MouseMove.X, -app.Input.MouseMove.Y);\n            float angle = mouseMove.Length;         // 1 degree per pixel is simple\n\n            if (angle > 0)\n            {\n                Vector3 axis = new Vector3(mouseMove.Y, -mouseMove.X, 0);\n                app.RootNode.Rotate(Quaternion.FromAxisAngle(axis, angle), TransformSpace.Parent);\n            }\n        }\n    };\n}\n\n"
  },
  {
    "path": "graphics/urhosharp/building-polyhedra/BuildingPolyhedra.workbook/index.workbook",
    "content": "﻿---\nid: 8254f6d9-784a-4a79-bc0b-a5f7fe9705d6\nuti: com.xamarin.workbook\ntitle: \"UrhoSharp: Building Polyhedra\"\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n# Building Polyhedra with UrhoSharp\n\nOne of the best ways to gain a familiarity and skill in working with 3D graphics is by building various sorts of figures, and particularly, polyhedra. A polyhedron is a three-dimensional solid with flat faces. Each face of a polyhedron is a polygon with straight sides. This workbook demonstrates how to use UrhoSharp to construct a regular dodecahedron and three *stellations* of the dodecahedron, which are produced by extending (“stellating”) the pentagons that make up the dodecahedron.\n\nUrhoSharp is a powerful cross-platform 3D graphics engine available to Xamarin and .NET developers for games or visualization. If you’re unfamiliar with UrhoSharp concepts, you’ll want to download and run the following workbooks before tackling this one:\n\n* **Exploring Urho Coordinates**\n\n* **Creating Urho Compound Shapes**\n\n* **Working with Urho Custom Geometries**\n\nIf you’re ready to go, wait until the workbook has completely finished loading before executing the following code cell:\n\n```csharp\n#r \"Urho\"\n```\n\nThis workbook requires only one namespace for UrhoSharp types:\n\n```csharp\nusing Urho;\n```\n\nAs usual when exploring Urho in a workbook, call the static `SimpleApplication.Show` method to create a window for the Urho graphics:\n\n```csharp\nSimpleApplication app = SimpleApplication.Show(\n    new ApplicationOptions()\n    {\n        Width = 1000,\n        Height = 1000   \n    });\n```\n\nYou should see a window appear on the desktop as the `Show` method completes.\n\n## Preliminaries\n\nIn preparation for this workbook, load the following C# script file:\n\n```csharp\n#load \"UrhoSettings.csx\"\n```\n\nAs you know, `SimpleApplication` creates a camera, a point light source, and a root node for visuals. The **UrhoSettings.csx** script file contains a method named `Initialize` that adjusts the position and direction of the camera, replaces the point light source with directional light sources and ambient light, and sets the position of `RootNode` to the origin of the coordinate system. These settings are similar to those shown in the **Working with Urho Custom Geometries** workbook, except that two directional light sources are created: one coming from above the viewer’s left shoulder, and another pointing in the same direction as the camera. This second light gives the objects created here a little more definition.\n\nRun that `Initialize` method:\n\n```csharp\nInitialize(app);\n```\n\nAs in that earlier workbook, the `Initialize` method also disables the code in `SimpleApplication` that moves the camera in response to mouse and touch. Instead, it sets up an event handler that applies a rotation transform to `RootNode` when you move the mouse along the Urho window with the left mouse button depressed. You can use this to rotate graphical objects for observation.\n\nThe **Working with Urho Custom Geometries** workbook also described this C# script file:\n\n```csharp\n#load \"CreateModel.csx\"\n```\n\nThe **CreateModel.csx** script contains a method named `CreateModel` that creates a UrhoSharp `Model` class based on vertex information passed to the method.\n\n## Polyhedra and Platonic Solids\n\nA polyhedron is a 3D solid with flat polygonal faces. Polyhedra can be divided into many different categories, such as convex and concave. A regular polyhedron is one in which all the faces are the same shape.\n\nThere are only five regular convex polyhedra. These are known as the Platonic solids:\n\n* Tetrahedron: Four triangle faces\n\n* Cube: Six square faces\n\n* Octahedron: Eight triangle faces\n\n* Dodecahedron: Twelve pentagonal faces\n\n* Icosahedron: Twenty triangle faces\n\nYou’ve already seen the tetrahedron in **Working with Urho Custom Geometries** workbook, and the cube is easy enough to be left to the student.\n\nThe regular dodecahedron is a nice challenge, and it is also the basis on which to build the stellated dodecahedrons.\n\n## The Regular Dodecahedron\n\nThe regular dodecahedron has twelve faces. Each face is a regular pentagon. To begin rendering the dodecahedron, you must somehow define the 3D coordinates of all the vertices in the object. Fortunately, this information is available. The [Wolfram MathWorld article on the Regular Dodecahedron](http://mathworld.wolfram.com/RegularDodecahedron.html) has plenty of information, but it’s probably somewhat easier to use the [Cartesian Coordinates section of the Wikipedia article on the Regular Dodecahedron](https://en.wikipedia.org/wiki/Regular_dodecahedron#Cartesian_coordinates). This section (and accompanying illustration) provides enough information to create a dodecahedron that is centered around the point (0, 0, 0) and fits inside a circle with the radius √3.\n\nThe coordinates of the dodecahedron involve the Golden Ratio, which is a number often symbolized by the Greek phi (ϕ) that satisfies the following formula:\n\n1 / ϕ = ϕ – 1\n\nIt’s approximately equal to 1.618. Here is a calculation of the Golden Ratio:\n\n```csharp\nfloat G = (1 + (float)Math.Sqrt(5)) / 2;\n```\n\nThe coordinates also involve 1 divided by the Golden Ratio, and because G is the Golden Ratio, 1 / G is equal to G – 1:\n\n```csharp\nfloat H = G - 1;\n```\n\nHere is a two-dimensional array of `Vector3` values. Each row is one of the 12 pentagonal faces of the dodecahedron, and the five values are the five vertices of the pentagon:\n\n```csharp\nVector3[,] dodecahedronFaces =\n{\n  { new Vector3( 1,-1,-1), new Vector3( G,0,-H), new Vector3( G,0, H), new Vector3( 1,-1, 1), new Vector3( H,-G,0) },\n  { new Vector3(-1,-1, 1), new Vector3(-G,0, H), new Vector3(-G,0,-H), new Vector3(-1,-1,-1), new Vector3(-H,-G,0) },\n  { new Vector3(-1, 1,-1), new Vector3(-G,0,-H), new Vector3(-G,0, H), new Vector3(-1, 1, 1), new Vector3(-H, G,0) },\n  { new Vector3( 1, 1, 1), new Vector3( G,0, H), new Vector3( G,0,-H), new Vector3( 1, 1,-1), new Vector3( H, G,0) },\n  { new Vector3(-1, 1,-1), new Vector3(0, H,-G), new Vector3(0,-H,-G), new Vector3(-1,-1,-1), new Vector3(-G,0,-H) },\n  { new Vector3(-1,-1, 1), new Vector3(0,-H, G), new Vector3(0, H, G), new Vector3(-1, 1, 1), new Vector3(-G,0, H) },\n  { new Vector3( 1,-1,-1), new Vector3(0,-H,-G), new Vector3(0, H,-G), new Vector3( 1, 1,-1), new Vector3( G,0,-H) },\n  { new Vector3( 1, 1, 1), new Vector3(0, H, G), new Vector3(0,-H, G), new Vector3( 1,-1, 1), new Vector3( G,0, H) },\n  { new Vector3( 1,-1,-1), new Vector3( H,-G,0), new Vector3(-H,-G,0), new Vector3(-1,-1,-1), new Vector3(0,-H,-G) },\n  { new Vector3(-1, 1,-1), new Vector3(-H, G,0), new Vector3( H, G,0), new Vector3( 1, 1,-1), new Vector3(0, H,-G) },\n  { new Vector3(-1,-1, 1), new Vector3(-H,-G,0), new Vector3( H,-G,0), new Vector3( 1,-1, 1), new Vector3(0,-H, G) },\n  { new Vector3( 1, 1, 1), new Vector3( H, G,0), new Vector3(-H, G,0), new Vector3(-1, 1, 1), new Vector3(0, H, G) }\n};\n```\n\nThese vertices define a dodecahedron where the pentagon faces have sides of length 2 × H.\n\nThe following two values will be convenient in some loops:\n\n```csharp\nint faceCount = dodecahedronFaces.GetLength(0);\nint vertexCount = dodecahedronFaces.GetLength(1);\n```\n\nThe twelve faces of the dodecahedron are pentagons:\n\n![](Images/PentagonPlain.svg)\n\nFor a UrhoSharp model, each pentagon must be divided into triangles. There are a couple ways to do that. If you’re trying to minimize the number of triangles, you can divide a pentagon into three triangles:\n\n![](Images/Pentagon3Triangles.svg)\n\nHowever, the code is somewhat simpler if you triangulate each pentagon more symmetrically based on a center point:\n\n![](Images/Pentagon5Triangles.svg)\n\nThe center point of each face is not directly available, but these centers can be easily calculated by averaging the five vertices of each pentagon. The following code calculates and stores these centers:\n\n```csharp\nVector3[] centers = new Vector3[faceCount];\n\nfor (int face = 0; face < faceCount; face++)\n{\n    centers[face] = new Vector3();\n\n    for (int vertex = 0; vertex < vertexCount; vertex++)\n    {\n        centers[face] += dodecahedronFaces[face, vertex];\n    }\n\n    centers[face] /= vertexCount;        \n}\n```\n\nBecause the UrhoSharp `Vector3` structure is used for both points and vectors, it supports many convenient arithmetic operations, such as addition and division.\n\nA `Vector3` collection can then be defined for storing the actual triangle vertices. When the loop finishes, `dodecahedronMesh` will contain 180 `Vector3` values, three for each triangle, with five triangles per pentagon, and 12 pentagons in the dodecahedron:\n\n```csharp\nList<Vector3> dodecahedronMesh = new List<Vector3>();\n\nfor (int face = 0; face < faceCount; face++)\n{    \n    for (int vertex = 0; vertex < vertexCount; vertex++)\n    {\n        dodecahedronMesh.Add(centers[face]);\n        dodecahedronMesh.Add(dodecahedronFaces[face, vertex]);\n        dodecahedronMesh.Add(dodecahedronFaces[face, (vertex + 1) % vertexCount]);\n    }\n}\n```\n\nThe `CreateModel` function from the **CreateModel.csx** script file loaded earlier calculates a `Model` object:\n\n```csharp\nModel dodecahedronModel = CreateModel(dodecahedronMesh);\n```\n\nThe following is similar to code that you’ve seen before. It first removes the node that might have been created in an earlier execution of this block, and then associates a new node with the `Model` object just created, and give it a color:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"dodecahedronNode\", false));\nNode dodecahedronNode = app.RootNode.CreateChild(\"dodecahedronNode\");\nStaticModel dodecahedron = dodecahedronNode.CreateComponent<StaticModel>();\ndodecahedron.Model = dodecahedronModel;\ndodecahedron.SetMaterial(Material.FromColor(Color.Cyan));\n```\n\nAt this point the dodecahedron should fill the window, and you can use your mouse with the button depressed to rotate it around the X and Y axes.\n\n## The Small Stellated Dodecahedron\n\nThe word *stellate* means to extend in a way that often resembles a star. In the small stellated dodecahedron, each pentagon face becomes the interior area of a five-pointed star (also known as a pentagram). The result is still considered to be a regular dodechadron: It has 12 faces of the same shape, but it is not convex. It is one of only four regular nonconvex polyhedra, known as *star polyhedra*.\n\nThe small stellated dodecahedron is larger than the regular dodecahedron, so move the camera back a bit:\n\n```csharp\napp.CameraNode.Position = new Vector3(0, 0, -8);\n```\n\nIn the regular dodecahedron, each face is a pentagon:\n\n![TK](Images/PentagonPlain.svg)\n\nIn the small stellated dodecahedron, the pentagon is replaced with a pentagram as if the pentagon were the center of the star:\n\n![](Images/FullStar.svg)\n\nAmazingly (as you’ll soon see), each point of each star meets up with five other points to form a solid figure. Although the center pentagon is considered part of the face, those pentagons are not visible, so they will not be drawn in the code below.\n\nThe challenging part is calculating the coordinate at the end of each star point. Draw a line from the center to one of the points:\n\n![](Images/OnePointLine.svg)\n\nThat line bisects the line between the consecutive two vertices of the pentagon. Therefore a vector from the center to that midpoint can be calculated by subtracting the center point from the midpoint. That vector must then be multiplied by the length of the line.\n\nEach edge of the pentagon is 2 × H, where H is the Golden Ratio minus 1. The line from the center to the star point creates two right triangles with a common side equal to H:\n\n![TK](Images/OnePointAngles.svg)\n\nThe angles are easy to calculate if you start by observing that the interior angles of the pentagon are 108 degrees. (For any polygon, the interior angles always total to the number of sides times 90 degrees. For a pentagon, that’s 540 degrees. Then divide by the number of sides, or 5.) Half of that is 54 degrees, and the other angles can be derived from that.\n\nOr, the angle from the center to any pair of consecutive vertices is 360 degrees divided by 5, or 72 degrees. The angle at the center point is half that, or 36 degrees.\n\nThe length of the line from the center to the point of the star can be calculated with trigonometry: It’s the sum of H divided by the tangent of 36 degrees (for the side of the triangle inside the pentagon), and H divided by the tangent of 18 degrees (for the triangle in the point of the star).\n\nThe following code calculates the locations of the five points of each of the stellated stars:\n\n```csharp\nVector3[,] starPoints = new Vector3[faceCount, vertexCount];\n\nfor (int face = 0; face < faceCount; face++)\n{\n    Vector3 center = centers[face];\n\n    for (int vertex = 0; vertex < vertexCount; vertex++)\n    {\n        // Get vector from center to midpoint of two vertices\n        Vector3 vertex1 = dodecahedronFaces[face, vertex];\n        Vector3 vertex2 = dodecahedronFaces[face, (vertex + 1) % vertexCount];\n        Vector3 midPoint = (vertex1 + vertex2) / 2;\n        Vector3 vector = midPoint - center;\n        vector.Normalize();\n\n        // Calculate the length from center to star point\n        float length = (float)(H / Math.Tan(Math.PI / 5) + H / Math.Tan(Math.PI / 10));\n\n        // The star point is the center plus the scaled vector\n        starPoints[face, vertex] = center + length * vector;\n    }\n}\n```\n\nThe ssdMesh (“small stellated dodecahedron mesh”) assembles the triangle meshes for the additional triangles required for the small stellated dodecahedron:\n\n```csharp\nList<Vector3> ssdMesh = new List<Vector3>();\n\nfor (int face = 0; face < faceCount; face++)\n{\n    for (int vertex = 0; vertex < vertexCount; vertex++)\n    {\n        // Add three points to the mesh collection\n        ssdMesh.Add(dodecahedronFaces[face, vertex]);\n        ssdMesh.Add(starPoints[face, vertex]);\n        ssdMesh.Add(dodecahedronFaces[face, (vertex + 1) % vertexCount]);\n    }\n}\n```\n\nAlthough the trigonometry was derived from a two-dimensional rendition of a star, it works just as well in three dimensions because each star is flat.\n\nThe following code creates the node and `StaticModel`, and calls `CreateModel` to obtain a `Model` object from the mesh:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"ssdNode\", false));\nNode ssdNode = app.RootNode.CreateChild(\"ssdNode\");\nStaticModel ssd = ssdNode.CreateComponent<StaticModel>();\nssd.Model = CreateModel(ssdMesh);\nssd.SetMaterial(Material.FromColor(Color.Cyan));\n```\n\nThis is a fascinating figure. You can see how the twelve five-pointed stars meet up to form a solid figure, but it also seems as if the regular dodecahedron has been enhanced by the placement of a five-sided pyramid of each of the original faces. The peaks of each trio of adjacent pyramid forms a triangle, and if these peaks were actually connected by triangles, they would form an icosahedron.\n\n## The Great Dodecahedron\n\nAnother intestesting aspect of the small stellated dodecahedron is that the five points of each star form a pentagon. What would happen if each of the star was replaced by that pentagon?\n\nThe result is called the *great dodecahedron*. It is still a regular polyhedron because each face is the same — a pentagon — but part of each face is hidden by intersecting faces, and the result is not convex.\n\nWith the data already accumulated, the great dodecahedron is easy to construct. Each triangle in the mesh is simply the space between successive points of the five-pointed stars:\n\n```csharp\nList<Vector3> greatDodecahedronMesh = new List<Vector3>();\n\nfor (int face = 0; face < faceCount; face++)\n{    \n    for (int vertex = 0; vertex < vertexCount; vertex++)\n    {\n        greatDodecahedronMesh.Add(dodecahedronFaces[face, vertex]);\n        greatDodecahedronMesh.Add(starPoints[face, (vertex + vertexCount - 1) % vertexCount]);\n        greatDodecahedronMesh.Add(starPoints[face, vertex]);\n    }\n}\n```\n\nOnce again, create the node and model, and give it a color:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"greatDodecahedronNode\", false));\nNode greatDodecahedronNode = app.RootNode.CreateChild(\"greatDodecahedronNode\");\nStaticModel greatDodecahedron = greatDodecahedronNode.CreateComponent<StaticModel>();\ngreatDodecahedron.Model = CreateModel(greatDodecahedronMesh);\ngreatDodecahedron.SetMaterial(Material.FromColor(Color.Cyan));\n```\n\nThe faces are definitely pentagons (which is why this is not considered a stellated figure) but against each pentagon is what appears to be an embossed five-pointed star with a raised center. However, this star is nothing more than the meeting of ten pentagons.\n\nCan this process go one more level?\n\n## The Great Stellated Dodecahedron\n\nThe great dodecahedron can itself be stellated and the result is called the stellated great dodecahedron or, more commonly, the great stellated dodecahedron.\n\nThis workbook began with a regular dodecahedron, which has faces that are pentagons:\n\n![](Images/StellationsStep0.svg)\n\nThese faces were stellated, which added triangles to make the faces into stars:\n\n![](Images/StellationsStep1.svg)\n\nThe result was the small stellated dodecahedron. The points of the stars were then connected to make a pentagon again:\n\n![](Images/StellationsStep2.svg)\n\nThat was the great dodecahedron. And now, this pentagon will be stellated:\n\n![](Images/StellationsStep3.svg)\n\nThat’s going to be the great stellated dodecahedron.\n\nThere are two pentagons in that final composite figure. What is the relationship between the length of the side of the larger pentagon to the smaller pentagon? If you do the trigonometry, the larger pentagon has a side length that is (sin(54) / sin(18)) times the smaller one. It turns out that this ratio is related to the Golden Ratio ϕ. The ratio of the sines of those two angles equals (ϕ + 1).\n\nThe vertices of the original pentagon were defined so that the length of the side is (ϕ – 1), which means that the length of the side of the larger pentagon is (ϕ + 1)·(ϕ – 1), which equals ϕ² – 1. The Golden Ratio squared is actually (ϕ + 1), which means that the length of the side of the larger pentagon is simply ϕ. The calculation of the coordinates of the large star points use G defined earlier in this workbook as the Golden Ratio:\n\n```csharp\nVector3[,] greatStarPoints = new Vector3[faceCount, vertexCount];\n\nfor (int face = 0; face < faceCount; face++)\n{\n    Vector3 center = centers[face];\n\n    for (int vertex = 0; vertex < vertexCount; vertex++)\n    {\n        // Get vector from center to vertex of original pentagon\n        Vector3 vector = dodecahedronFaces[face, vertex] - center;\n        vector.Normalize();\n\n        // Calculate the length from center to star point\n        float length = (float)(G / Math.Tan(Math.PI / 5) + G / Math.Tan(Math.PI / 10));\n\n        // The star point is the center plus the scaled vector\n        greatStarPoints[face, vertex] = center + length * vector;\n    }\n}\n```\n\nJust as earlier, triangles describing the points of these stars can be accumulated in a collection called `gsdMesh` for “great stellated dodecahendron”):\n\n```csharp\nList<Vector3> gsdMesh = new List<Vector3>();\n\nfor (int face = 0; face < faceCount; face++)\n{    \n    for (int vertex = 0; vertex < vertexCount; vertex++)\n    {\n        gsdMesh.Add(greatStarPoints[face, vertex]);\n        gsdMesh.Add(starPoints[face, vertex]);\n        gsdMesh.Add(starPoints[face, (vertex + vertexCount - 1) % vertexCount]);\n    }\n}\n```\n\nMove the camera further back because this is going to grow considerably in size:\n\n```csharp\napp.CameraNode.Position = new Vector3(0, 0, -20);\n```\n\nAnd display the new model:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"gsdNode\", false));\nNode gsdNode = app.RootNode.CreateChild(\"gsdNode\");\nStaticModel gsd = gsdNode.CreateComponent<StaticModel>();\ngsd.Model = CreateModel(gsdMesh);\ngsd.SetMaterial(Material.FromColor(Color.Cyan));\n```\n\nNow as you twist this new figure around and examine it, you’ll discover that the triangular faces are very hard to detect. Instead, this figure seems to be a collection of three-sided pyramids emanating like spikes. It’s possible to view it so that a group of five of these spikes seem to form a three-dimensional star.\n\nBut this is the end of the line. It is not possible to stellate again and create another regular polyhedron.\n\n## Modifying the Vertex Buffer\n\nIf you wanted to remove the additional triangles that created the various stellations of the dodecahedron, you could simply remove the nodes for these additional models. But another approach — an approach that will eventually lead to an animation of these stellations — is to modify the vertex buffer so that the triangles defining the model have no dimension. That will cause them to disappear from view.\n\nHere is the `Model` object for the great stellated dodecahedron, which was the last step in this process:\n\n```csharp\nModel model = gsd.Model;\n```\n\nFrom the model the `Geometry` is available:\n\n```csharp\nGeometry geometry = model.GetGeometry(0, 0);\n```\n\nAnd from the geometry, the `VertexBuffer` can be obtained:\n\n```csharp\nVertexBuffer buffer = geometry.GetVertexBuffer(0);\n```\n\nInformation about this `VertexBuffer` is also available. This is how many vertices it contains:\n\n```csharp\nuint count = buffer.VertexCount;\n```\n\nThe value of 180 encompasses the 12 faces, the 5 triangles per face, and the 3 coordinates per triangle.\n\nThe size of the `VertexBuffer` is also available:\n\n```csharp\nuint size = buffer.VertexSize; \n```\n\nThe value of 24 is the byte size of the `VertexBuffer.PositionNormal` structure used to create the vertex buffer in the **CreateModel.csx** script. The structure contains two fields `Position` and `Normal` of type `Vector3`. The `Vector3`structure contains three fields of type `float`, and each `float`is 4 bytes in size.\n\nYou can also get access to the items stored in the vertex buffer itself. In this example, these are an array of `VertexBuffer.PositionNormal` values. After getting access to this array, you can dynamically modify the values, and the visuals will be updated.\n\nHowever, there’s a catch: To get access to these vertices, you must call the `Lock` method of `VertexBuffer`. This method returns an `IntPtr`, which you can then cast to a pointer of type `VertexBuffer.PositionNormal`. When you’re finished, call `Unlock`. But because you’re now working with pointers in C# code, you must put this code in an `unsafe` block.\n\nThe following code obtains that pointer, and then loops through the vertex buffer of the great stellated dodecahedron. It knows that the first coordinate of each trio of triangle coordinates is the point at the end of the star, so it sets that coordinate instead to the midpoint of the other two triangle coordinates, effectively collapsing the triangle:\n\n```csharp\nunsafe\n{\n    var ptr = (VertexBuffer.PositionNormal*)buffer.Lock(0, count, false);\n\n    for (int index = 0; index < count; index += 3)\n    {\n        Vector3 pos1 = ptr[index + 1].Position;\n        Vector3 pos2 = ptr[index + 2].Position;\n        Vector3 midpoint = (pos1 + pos2) / 2;\n        ptr[index].Position = midpoint;\n    }\n\n    buffer.Unlock();\n}\n```\n\nNow we’re back viewing the great dodecahedron and the camera can be moved forward again:\n\n```csharp\napp.CameraNode.Position = new Vector3(0, 0, -8);\n```\n\nSimilarly you can collapse the triangles that comprise the great dodecahedron. In this case, two coordinates of the additional triangle are set to the first triangle coordinate:\n\n```csharp\nVertexBuffer buffer = greatDodecahedron.Model.GetGeometry(0, 0).GetVertexBuffer(0);\nuint count = buffer.VertexCount;\n\nunsafe\n{\n    var ptr = (VertexBuffer.PositionNormal*)buffer.Lock(0, count, false);\n\n    for (int index = 0; index < count; index += 3)\n    {\n        Vector3 pos0 = ptr[index].Position;\n        ptr[index + 1].Position = pos0;\n        ptr[index + 2].Position = pos0;\n    }\n\n    buffer.Unlock();\n}\n```\n\nWe’re back to the small stellated dodecahedron, the triangles of which can also be collapsed by setting the center coordinate of each triangle to the midpoint of the other two:\n\n```csharp\nVertexBuffer buffer = ssd.Model.GetGeometry(0, 0).GetVertexBuffer(0);\nuint count = buffer.VertexCount;\n\nunsafe\n{\n    var ptr = (VertexBuffer.PositionNormal*)buffer.Lock(0, count, false);\n\n    for (int index = 0; index < count; index += 3)\n    {\n        Vector3 pos0 = ptr[index + 0].Position;\n        Vector3 pos2 = ptr[index + 2].Position;\n        Vector3 midpoint = (pos0 + pos2) / 2;\n        ptr[index + 1].Position = midpoint;\n    }\n\n    buffer.Unlock();\n}\n```\n\nNow all that’s left is the original dodecahedron, and the camera can be moved back in:\n\n```csharp\napp.CameraNode.Position = new Vector3(0, 0, -5);\n```\n\n## Animating the Vertex Buffer\n\nNow let’s do all that in reverse to build the stellations back up again, but this time the process can be animated.\n\nThe following function looks similar to the last code that you saw, but the function has a parameter named `t` that can range from 0 to 1. If `t` is 0, then the center coordinate of each triangle is set to the midpoint of the other two coordinates, just as in the previous code. But if `t` is 1, that cordinate is set to the value stored in `ssdMesh`, the triangle mesh for the small stellated dodecahedron. For values in between 0 and 1, it’s an interpolation:\n\n```csharp\nvoid FormSmallStellatedDodecahedron(float t)\n{\n    VertexBuffer buffer = ssd.Model.GetGeometry(0, 0).GetVertexBuffer(0);\n    uint count = buffer.VertexCount; \n\n    unsafe\n    {\n        var ptr = (VertexBuffer.PositionNormal*)buffer.Lock(0, count, false);\n\n        for (int index = 0; index < count; index += 3)\n        {\n            Vector3 pos0 = ptr[index + 0].Position;\n            Vector3 pos2 = ptr[index + 2].Position;\n            Vector3 midpoint = (pos0 + pos2) / 2;\n            ptr[index + 1].Position = (1 - t) * midpoint + t * ssdMesh[index + 1];\n        }\n\n        buffer.Unlock();\n    }\n}\n```\n\nYou can test various values between 0 and 1 in the following function call:\n\n```csharp\nFormSmallStellatedDodecahedron(0);\n```\n\nSet it back to 0 when you’re finished experimenting.\n\nThe following function is asynchronous and returns a `Task` object. It begins by creating a `TaskCompletionSource` object which returns that `Task` object the the caller at the end of the function body. Then it adds a handler to the `Update` event of `Application`.  This handler is frequently called. The `TimeStep` property of the event arguments provides the time in seconds since the last call. The function uses this to update the value of `t`, which it then uses to call `FormSmallStellatedDodecahedron` and to move the camera back:\n\n```csharp\nTask AnimateSmallStellatedDodecahedronAsync()\n{\n    TaskCompletionSource<object> taskCompletionSource = new TaskCompletionSource<object>();\n    float t = 0;\n    bool finished = false;\n\n    app.Update += (UpdateEventArgs args) =>\n    {\n        if (!finished)\n        {\n            t += args.TimeStep / 5;\n\n            if (t < 1)\n            {\n                FormSmallStellatedDodecahedron(t);\n                app.CameraNode.Position = new Vector3(0, 0, -5 - 3 * t);\n            }\n            else\n            {\n                FormSmallStellatedDodecahedron(1);\n                app.CameraNode.Position = new Vector3(0, 0, -8);\n                taskCompletionSource.SetResult(null);\n                finished = true;\n            }\n        }\n    };\n\n    return taskCompletionSource.Task;\n}\n```\n\nWhen the animation is complete, the function sets `finished` to `true` so the function has no more work to do.\n\nYou can run this asynchronous function like so:\n\n```csharp\nawait AnimateSmallStellatedDodecahedronAsync();\n```\n\nOver the course of 5 seconds, each face of the dodecahedron will seem to grow triangle appendages that eventually meet to form the small stellated dodecahedron. You can use the mouse to rotate this object as it’s growing.\n\nSimilarly, the following function progressively constructs the great dodecahedron:\n\n```csharp\nvoid FormGreatDodecahedron(float t)\n{\n    VertexBuffer buffer = greatDodecahedron.Model.GetGeometry(0, 0).GetVertexBuffer(0);\n    uint count = buffer.VertexCount;\n\n    unsafe\n    {\n        var ptr = (VertexBuffer.PositionNormal*)buffer.Lock(0, count, false);\n\n        for (int index = 0; index < count; index += 3)\n        {\n            Vector3 pos0 = ptr[index].Position;\n            ptr[index + 1].Position = (1 - t) * pos0 + t * greatDodecahedronMesh[index + 1];\n            ptr[index + 2].Position = (1 - t) * pos0 + t * greatDodecahedronMesh[index + 2];\n        }\n\n        buffer.Unlock();\n    }\n}\n```\n\nAnd the following asynchronous method repeatedly calls that function\n\n```csharp\nTask AnimateGreatDodecahedronAsync()\n{\n    TaskCompletionSource<object> taskCompletionSource = new TaskCompletionSource<object>();\n    float t = 0;\n    bool finished = false;\n\n    app.Update += (UpdateEventArgs args) =>\n    {\n        if (!finished)\n        {\n            t += args.TimeStep / 5;\n\n            if (t < 1)\n            {\n                FormGreatDodecahedron(t);\n            }\n            else\n            {\n                FormGreatDodecahedron(1);\n                taskCompletionSource.SetResult(null);\n                finished = true;\n            }\n        }\n    };\n\n    return taskCompletionSource.Task;\n}\n```\n\nNow as you execute that function, areas between the star points fill up with another triangle:\n\n```csharp\nawait AnimateGreatDodecahedronAsync();\n```\n\nFinally, the following function forms the great stellated dodecahedron:\n\n```csharp\nvoid FormGreatStellatedDodecahedron(float t)\n{\n    VertexBuffer buffer = gsd.Model.GetGeometry(0, 0).GetVertexBuffer(0);\n    uint count = buffer.VertexCount;\n\n    unsafe\n    {\n        var ptr = (VertexBuffer.PositionNormal*)buffer.Lock(0, count, false);\n\n        for (int index = 0; index < count; index += 3)\n        {\n            Vector3 pos1 = ptr[index + 1].Position;\n            Vector3 pos2 = ptr[index + 2].Position;\n            Vector3 midpoint = (pos1 + pos2) / 2;\n            ptr[index].Position = (1 - t) * midpoint + t * gsdMesh[index];\n        }\n\n        buffer.Unlock();\n    }\n}\n```\n\nHere’s the function that animates it and pulls the camera back to get a good view:\n\n```csharp\nTask AnimateGreatStellatedDodecahedronAsync()\n{\n    TaskCompletionSource<object> taskCompletionSource = new TaskCompletionSource<object>();\n    float t = 0;\n    bool finished = false;\n\n    app.Update += (UpdateEventArgs args) =>\n    {\n        if (!finished)\n        {\n            t += args.TimeStep / 5;\n\n            if (t < 1)\n            {\n                FormGreatStellatedDodecahedron(t);\n                app.CameraNode.Position = new Vector3(0, 0, -8 - 12 * t);\n            }\n            else\n            {\n                FormGreatStellatedDodecahedron(1);\n                app.CameraNode.Position = new Vector3(0, 0, -20 * t);\n                taskCompletionSource.SetResult(null);\n                finished = true;\n            }\n        }\n    };\n\n    return taskCompletionSource.Task;\n}\n```\n\nAnd you can execute it like so:\n\n```csharp\nawait AnimateGreatStellatedDodecahedronAsync();\n```"
  },
  {
    "path": "graphics/urhosharp/circle-of-life/CircleOfLife.workbook/Data/Materials/phong1.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"Textures/UV.jpg\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 20\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/circle-of-life/CircleOfLife.workbook/index.workbook",
    "content": "﻿---\npackages:\n- id: UrhoSharp\n  version: 1.5.22\nuti: com.xamarin.workbook\nid: 799c372c-6de9-4481-8bf5-a4c36a13262d\ntitle: Circle of Life\nplatforms:\n- Console\n---\n\n# Circle of Life:\n\n# UrhoSharp Actions and Animations\n\nUrhoSharp is a cross-platform 3D graphics framework suitable for gaming or 3D visualization. This workbook focuses on animation, in particular the classes in the `Urho.Actions` namespace that you can use with the `RunActions` and `RunActionsAsync` methods of `Node`.\n\nTowards the end of this workbook you’ll see an animated 3D monkey grow from a newborn to an adult while navigating the uncertainties of life, and then give birth to a new baby monkey before expiring, continuing the circle of life for as long as you care to watch it.\n\nA UrhoSharp workbook begins as a console app. Starting with Workbooks 1.3.1, you no longer need to copy the library files manually. You can invoke the menu item **File > Add Package** (under Windows) or **File > Add NuGet Package** (on the Mac) to search for and add the UrhoSharp NuGet library. That’s already been done for this workbook.\n\nAdd a reference to that library:\n\n```csharp\n#r \"Urho\"\n```\n\nThree UrhoSharp namespaces will be required for this workbook:\n\n```csharp\nusing Urho;\nusing Urho.Actions;\nusing Urho.Shapes;\n```\n\nThe following call creates a window for the UrhoSharp graphics:\n\n```csharp\nSimpleApplication app = SimpleApplication.Show(new ApplicationOptions(\"Data\"));\n```\n\nThe **Data** directory contains the resources used by the workbook, in this case the model, material, and texture (bitmap) used to render the 3D monkey. After the window has been created, you can move and resize it. The size of the 3D visuals are relative to the *height* of the window.\n\nThe `SimpleApplication.Show` method creates a camera and light source. The camera is located at the point (0, 0, 0) and points in the direction of the vector **(0, 0, 1)**, which is the positive Z axis that conceptually goes into the screeen. All visuals will have positive Z coordinates. Also created is a root node at the position (0, –2, 8) accessible by the `RootNode` property of the `SimpleApplication` property.\n\nAll UrhoSharp visuals are organized into a tree of nodes. Often it’s useful to have a node that encompasses all the visuals to be created in a workbook. This new node is called `mainNode` and is a child of `RootNode`:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"mainNode\"));\nNode mainNode = app.RootNode.CreateChild(\"mainNode\");\n```\n\nAs usual, any code block in a workbook that creates a node must first remove the node that might have been created in an earlier execution of the code block.\n\nAll the action in this workbook will take place on a flat desert. The sky is created by coloring the entire window blue:\n\n```csharp\napp.Viewport.SetClearColor(new Color(0.53f, 0.81f, 0.92f));\n```\n\nThe surface of the desert is a `Plane` shape from the UrhoSharp `Shapes` namespace.\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"desertNode\", false));\nNode desertNode = mainNode.CreateChild(\"desertNode\");\nShape desertShape = desertNode.CreateComponent<Urho.Shapes.Plane>();\ndesertShape.SetMaterial(Material.FromColor(Color.FromByteFormat(0xC1, 0x9A, 0x6B, 0xFF)));\n```\n\nThe color here corresponds to the “Desert” color in the Wikipedia article on [Desert Sand (Color)](https://en.wikipedia.org/wiki/Desert_sand_\\(color\\) \"Desert Sand \\(color\\)\").\n\nThe previous code block creates only a small patch of desert sand 1 unit wide by 1 unit deep on the XZ axis. You can then scale that node along the X and Z axes to encompass a wider span and simulate a horizon:\n\n```csharp\ndesertNode.Scale = new Vector3(1000, 1, 1000);\n```\n\n## The Monkey Model\n\nThe 3D monkey was created by Vic Wang at [http://vidavic.weebly.com](http://vidavic.weebly.com \"Vidavic\"). It is described in a binary file named **monkey.mdl** in the **Data** subdirectory of this workbook. The **Materials** subdirectory of **Data** contains a material file **phong1.xml**, which references the **UV.jpg** file in the **Textures** subdirectory.\n\nThe following code loads and displays the model. The surface of the monkey is covered with the material and JPEG file:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"monkeyNode\"));\nNode monkeyNode = mainNode.CreateChild(\"monkeyNode\");\nStaticModel monkey = monkeyNode.CreateComponent<StaticModel>();\nmonkey.Model = app.ResourceCache.GetModel(\"monkey.mdl\");\nmonkey.SetMaterial(app.ResourceCache.GetMaterial(\"Materials/phong1.xml\"));\n```\n\nThe monkey sits a little above the XZ plane. It is roughly centered on the origin of the coordinate system: The positive Y axis goes through the middle of the body and out the center of the top of the head. The monkey is about 6 units tall and 6 units wide (from paw to paw).\n\nThe monkey is a little too close but you can move `mainNode` down and back relative to its parent, `RootNode`:\n\n```csharp\nmainNode.Position = new Vector3(0, -2.5f, 6);\n```\n\n## Experimenting with Actions\n\nThe `Node` class defines two methods that allow you to run animations on the node:\n\n`void RunActions(params FiniteTimeAction[])`\\\n\\\n`Task<ActionsState> RunActions(params FiniteTimeAction[])`\n\nEach animation is a derivative of the `FiniteTimeAction` class. The `params` keyword allows you to specify multiple `FiniteTimeAction` objects as the argument to these methods . The multiple animations run consecutively. (There’s also a way to run animations in parallel that you’ll see later in this workbook.) In addition, `Node` defines `PauseAllActions` and `ResumeAllActions` methods, as well as `RemoveAction` and `RemoveAllActions`.\n\nThe `Urho.Actions` namespace includes over 50 classes that derive from `FiniteTimeAction`. These classes are immutable: You specify everything that the class needs in the class’s constructor. The most basic classes that derive from `FiniteTimeAction` perform standard types of graphical transforms:\n\n* Translation: `MoveTo` and `MoveBy`\n\n* Scaling: `ScaleTo` and `ScaleBy`\n\n* Rotation: `RotateTo` and `RotateBy`\n\nThe difference between the `To` and `By` suffixes is easy to demonstrate. `MoveTo` moves a node from the node’s current position, which for the monkey node is initially (0, 0, 0), to the point specified in the `MoveTo` constructor. The first argument to the constructor is the duration of the animation in seconds, in this case 2 seconds:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new MoveTo(2, new Vector3(2, 0, 0)));\n```\n\nWhen running animations in a workbook, you should use use `RunActionsAsync` with `await` rather than `RunActions`. This prevents the code block from concluding until the animation has completed, and also prevents you from this animation or another one while it’s still executing. (The only exception is for animations that run forever. You’ll see an example towards the end of this workbook.)\n\nIf you execute that previous code block again, it will still require two seconds to complete, but the monkey won’t move. It’s already at the point (2, 0, 0). To move the monkey *by* a certain distance relative to its current position, use `MoveBy`:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new MoveBy(1, new Vector3(-2, 0, 0)));\n```\n\nNow the monkey moves two units to the left every time that code block is executed.\n\nThe `params` keyword on the argument to `RunActionsAsync` indicates that you can specify multiple objects that derive from `FiniteTimeAction`. The multiple animations run in sequence:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new Place(new Vector3(0, 0, 0)),\n                                 new MoveTo(1, new Vector3(0, 0, 100)),\n                                 new DelayTime(1),\n                                 new JumpTo(3, new Vector3(0, 0, 0), 5, 7));\n```\n\nThe `Place` class derives from `ActionInstant`, which derives from `FiniteTimeAction`, and moves the node immediately. (It’s the same as a `MoveTo` with a duration of 0.) The `DelayTime` class does nothing for a particular duration (here 1 second). The `JumpTo` class also moves the node, but with a series of 7 jumps 5 units high.\n\nIf the node is already at the position specified in the `JumpTo` constructor, then the node hops up and down in place. Here are 4 jumps 10 units high over a duration of 3 seconds:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new JumpTo(3, new Vector3(0, 0, 0), 10, 4));\n```\n\n## Scaling and Repetition\n\nScaling changes the size of a visual object by a multiplicative factor. Keep in mind that a default scaling factor is 1 rather than 0.\n\nThe `ScaleBy` class in the following code block increases the size of the monkey by 25%. As usual, the first argument is the duration in seconds:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new ScaleBy(1, 1.25f));\n```\n\nThe `By` suffix indicates that the size increases by 25% every time the code block is executed. (Try it!) You can return the monkey to its normal size using a `ScaleTo` constructor with a duration of 0 and a scaling factor of 1:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new ScaleTo(0, 1));\n```\n\nIt‘s also possible to apply different scaling factors in the X, Y, and Z directions. The following operation increases the width and depth of the monkey (but not the height) by a factor of 3 over 2 seconds. The arguments are named to clarify them:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new ScaleTo(duration: 2, scaleX: 3, scaleY: 1, scaleZ: 3));\n```\n\nYou can make the monkey large and then small again by combining `ScaleTo` objects:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new ScaleTo(0, 1),\n                                 new ScaleTo(2, 3),\n                                 new ScaleTo(2, 1));\n```\n\nThe first `ScaleTo` sets the scaling factor as 1, the second animates it to 3 over 2 seconds, and the third animates it back to 1.\n\nWhat if you wanted to repeat that operation three times? There’s a class for that! The `Repeat` class derives from `FiniteTimeAction`. Its constructor has an argument of type `FiniteTimeAction` as well as a repetition factor:\n\n`public Repeat(FiniteTimeAction action, UInt32 times)`\n\nThe animation object passed to the constructor is repeated *times* times. Unfortunately the first argument is only a single `FiniteTimeAction` object. However, there’s another class that also derives from `FiniteTimeAction` with a constructor that lets you combine multiple `FiniteTimeAction` objects:\n\n`public Sequence(params FiniteTimeAction[] actions)`\n\nYou can combine the `Repeat` and `Sequence` constructors:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new Repeat(new Sequence(new ScaleTo(1, 3),\n                                                         new ScaleTo(1, 1)),\n                                            times: 3));\n```\n\n> ⚠️ The documentation for `Sequence` indicates that the constructor parameter includes the `params` keyword, but as of UrhoSharp 1.5.22, that is not the case. For three or more arguments, you’ll need to create an array for them.\n\n## Easing Functions\n\nSo far, all the animations have been linear. Whether the node is moving or changing size, at the animation’s halfway point, the visual object is midway between the starting and ending values.\n\nThe word *ease* is often used in computer graphics to describe non-linear animations. In the implementation of animations, generally a value of `t` (for *time*) increases linearly from 0 at the beginning of the animation to 1 at the end. An easing function alters this value of `t`. The function maps 0 to 0 and 1 to 1, but returns other values in between based on a mathematical formula.\n\nThe source code for the easing functions is available in the **[Ease](https://github.com/xamarin/urho/tree/master/Bindings/Portable/Actions/Ease \"Ease directory\")**[ directory](https://github.com/xamarin/urho/tree/master/Bindings/Portable/Actions/Ease \"Ease directory\") of the Xamarin **urho** repository. Much of the math can be found in **[EaseMath.cs](https://github.com/xamarin/urho/blob/master/Bindings/Portable/Math/EaseMath.cs \"EaseMath.cs\")**.\n\nThe easing classes have a consistent naming convention:\n\n* `EaseTypeIn`, which applies the easing to the beginning of the animation\n\n* `EaseTypeOut`, which applies the easing to the end of the animation\n\n* `EaseTypeInOut`, which applies the easing to the beginning and end\n\nThe `Type` part of the name is one of the following:\n\n* nothing, which uses the `Math.Pow` function\n\n* `Back`, which overshoots the initial and/or final value\n\n* `Bounce`, which bounces at the beginning and/or end\n\n* `Elastic`, which applies a combination of powers and trigonometry to simulate damped harmonic motion\n\n* `Exponential`, which applies an exponential function\n\n* `Sine`, which applies a trigonometric function\n\nYou can also create custom easing functions using the `EaseCustom` class.\n\nTo use an easing function, pass the animation object to the construction of the easing class. This animation scales the monkey up and down using `EaseBackOut` for the first action, and `EaseBounceOut` for the second:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new EaseBackOut(new ScaleTo(1, 3)),\n                                 new EaseBounceOut(new ScaleTo(1, 1)));\n```\n\nFeel free to experiment!\n\n## Rotation and Parallel Actions\n\nThe `RotateTo`, `RotateBy`, and `RotateAroundBy` actions rotate the node.\n\n> ⚠️ The `RotateTo` class does not work correctly as of UrhoSharp 1.5.22.\n\nThe rotations are based on Euler angles. In the 18th century, Swiss mathematician Leonhard Euler proved that any rotation in 3D space can be described as a combination of simple rotations around the X, Y, and Z axes. Euler angles are common in flight dynamics. One problem, however, is that the order of the simple rotations makes a difference in the final composite rotation, and the order is not standard. The convention in UrhoSharp is Z first, then X, and finally Y. These three rotations are also referred to as *roll*, *pitch*, and *yaw*, respectively.\n\nA rotation based on Euler angles can be defined using the three-parameter constructor of `Quaternion`. It might be advantageous to get accustomed to setting a rotation using Euler angles prior to animating a rotation.\n\nHere’s a rotation of 90 degrees around the Z axis:\n\n```csharp\nmonkeyNode.Rotation = new Quaternion(0, 0, 90);\n```\n\nUrhoSharp uses a left-hand coordinate system, which means that if you point the thumb of your left hand in the direction of the positive rotation axis (into the screen for rotation around the Z axis), then the direction of rotation for positive angles is given by the curl of your fingers.\n\nAfter the rotation around the Z axis, the monkey becomes half buried in the desert sand. Add to that a rotation of 90 degrees around the X axis:\n\n```csharp\nmonkeyNode.Rotation = new Quaternion(90, 0, 90);\n```\n\nFinally, add another rotation around the Y axis:\n\n```csharp\nmonkeyNode.Rotation = new Quaternion(90, 90, 90);\n```\n\nFeel free to experiment, but return the monkey to normal before continuing:\n\n```csharp\nmonkeyNode.Rotation = Quaternion.Identity;\n```\n\nRotation animations are easiest when restricting yourself to just one simple axis. For example, the following operation rotates the monkey 360 degrees 3 times around the Y axis:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new Repeat(new RotateBy(duration: 2, \n                                                         deltaAngleX: 0, \n                                                         deltaAngleY: 360, \n                                                         deltaAngleZ: 0), \n                                            times: 3));\n```\n\nThis one goes twice around the X axis:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new Repeat(new RotateBy(duration: 2, \n                                                         deltaAngleX: 360, \n                                                         deltaAngleY: 0, \n                                                         deltaAngleZ: 0), \n                                            times: 2));\n```\n\nThe following sequence of animations swing the monkey between the left and the right:\n\n```csharp\nawait monkeyNode.RunActionsAsync(\n    new Repeat(\n        new Sequence(\n            new FiniteTimeAction[]\n            {\n                new RotateBy(0.5f, 0, 90, 0),\n                new RotateBy(1f, 0, -180, 0),\n                new RotateBy(0.5f, 0, 90, 0)\n            }),\n        times: 4));\n```\n\nNotice the use of an array of `FiniteTimeAction` objects. In UrhoSharp 1.5.22, the `Sequence` constructor can’t handle more than two arguments.\n\nThe first `RotateBy` rotates the monkey 90 degrees to the left in 0.5 seconds, the second rotates 180 degrees to the right in 1 second, and the third rotates back to the center position in 0.5 seconds. This is repeated 4 times.\n\nThis animation needs an easing function. It should slow down at the left and right before reversing direction. The `EaseSine` classes are ideal for simulating simple harmonic motion:\n\n```csharp\nawait monkeyNode.RunActionsAsync(\n    new Repeat(\n        new Sequence(\n            new FiniteTimeAction[]\n            {\n                new EaseSineOut(new RotateBy(0.5f, 0, 90, 0)),\n                new EaseSineInOut(new RotateBy(1f, 0, -180, 0)),\n                new EaseSineIn(new RotateBy(0.5f, 0, 90, 0))\n            }),\n        times: 4));\n```\n\nTo run two or more animations simultaneously, use the `Parallel` class:\n\n`public Parallel(params FiniteTimeAction[] actions)`\n\nThe following code scales the monkey up and down while rotating it around the Y axis:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new Parallel(new Sequence(new ScaleTo(2, 3),\n                                                           new ScaleTo(2, 1)),\n                                              new RotateBy(4, 0, 360, 0)));\n```\n\n## A Ride Around an Infinity Sign\n\nThe next goal is to give the monkey a ride around an infinity sign. As discussed in the SkiaSharp article [Three Types of Bézier Curves](https://developer.xamarin.com/guides/xamarin-forms/advanced/skiasharp/curves/beziers/ \"Three Types of Bezier Curves\"), an infinity sign can be constructed using eight Bézier curves, and the UrhoSharp `BezierTo` class can animate a node along those curves.\\\n\\\nThe following array defines an infinity sign using the UrhoSharp `BezierConfig` structure. The curve is constructed on the XZ plane  with a Y coordinate of zero. The implicit start position is (0, 0, 0). The `Vector3`constructors imply a radius of 1 unit of the circular part of the infinity sign, but the scaling factor increases that size:\n\n```csharp\nfloat infinityScale = 15;\n\nBezierConfig[] bezierInfinity = \n{\n    new BezierConfig\n    {\n        ControlPoint1 = infinityScale * new Vector3(0.55f, 0, 0),\n        ControlPoint2 = infinityScale * new Vector3(1, 0, 0.45f),\n        EndPosition = infinityScale * new Vector3(1, 0, 1)\n    },\n    new BezierConfig\n    {\n        ControlPoint1 = infinityScale * new Vector3(1, 0, 1.55f),\n        ControlPoint2 = infinityScale * new Vector3(0.5f, 0, 2),\n        EndPosition = infinityScale * new Vector3(0, 0, 2.5f)\n    },\n    new BezierConfig\n    {\n        ControlPoint1 = infinityScale * new Vector3(-0.5f, 0, 3),\n        ControlPoint2 = infinityScale * new Vector3(-1, 0, 3.45f),\n        EndPosition = infinityScale * new Vector3(-1, 0, 4)\n    },\n    new BezierConfig\n    {\n        ControlPoint1 = infinityScale * new Vector3(-1, 0, 4.55f),\n        ControlPoint2 = infinityScale * new Vector3(-0.55f, 0, 5),\n        EndPosition = infinityScale * new Vector3(0, 0, 5)\n    },\n    new BezierConfig\n    {\n        ControlPoint1 = infinityScale * new Vector3(0.55f, 0, 5),\n        ControlPoint2 = infinityScale * new Vector3(1, 0, 4.55f),\n        EndPosition = infinityScale * new Vector3(1, 0, 4)\n    },\n    new BezierConfig\n    {\n        ControlPoint1 = infinityScale * new Vector3(1, 0, 3.45f),\n        ControlPoint2 = infinityScale * new Vector3(0.5f, 0, 3),\n        EndPosition = infinityScale * new Vector3(0, 0, 2.5f)\n    },\n    new BezierConfig\n    {\n        ControlPoint1 = infinityScale * new Vector3(-0.5f, 0, 2),\n        ControlPoint2 = infinityScale * new Vector3(-1, 0, 1.55f),\n        EndPosition = infinityScale * new Vector3(-1, 0, 1)\n    },\n    new BezierConfig\n    {\n        ControlPoint1 = infinityScale * new Vector3(-1, 0, 0.45f),\n        ControlPoint2 = infinityScale * new Vector3(-0.55f, 0, 0),\n        EndPosition = infinityScale * new Vector3(0, 0, 0)\n    }\n};\n```\n\nTo animate the monkey along these eight Bézier curves, an array of `BezierTo` objects must be created. The first argument to the constructor is the animation duration for that part of the curve:\n\n```csharp\nBezierTo[] bezierTos = new BezierTo[8];\nfor (int i = 0; i < 8; i++)\n{\n    bezierTos[i] = new BezierTo(1, bezierInfinity[i]);\n}\n```\n\nThe position of the monkey can then be animated based on the array of `BezierTo` objects:\n\n```csharp\nawait monkeyNode.RunActionsAsync(bezierTos);\n```\n\nThe result is disappointing. The monkey is moving along the infinity sign but always facing forward. It would be more “realistic” if the monkey faced in the direction that it’s moving. The monkey must be dynamically rotated as well as translated.\n\nThere is no class in the `Urho.Actions` namespace that does this. Fortunately, you can implement custom animations using the `ActionTween` class.  (The word “tween” is short for “in-betweening,” which refers to the interpolation performed between the start and end values in an animation.)\n\n## Breaking down the Béziers\n\nThe eight Bézier curves must first be approximated with polylines. Here’s a function that will do that for one Bézier:\n\n```csharp\nvoid BezierToPolyline(Vector3 pt0, Vector3 pt1, Vector3 pt2, Vector3 pt3, int numPoints, IList<Vector3> points)\n{\n    for (int i = 0; i < numPoints; i++)\n    {\n        float t = (float)i / numPoints;\n        Vector3 pt = (1 - t) * (1 - t) * (1 - t) * pt0 +\n                     3 * (1 - t) * (1 - t) * t  * pt1 +\n                     3 * (1 - t) * t * t * pt2 +\n                     t * t * t * pt3;\n        points.Add(pt);                     \n    }\n}\n```\n\nNow all eight Bézier curves can be converted to one big polyline stored in a `List<Vector3>` object:\n\n```csharp\nList<Vector3> bezierPoints = new List<Vector3>();\n\nfor (int i = 0; i < bezierInfinity.Length; i++)\n{\n    int iPrevious = (i - 1 + bezierInfinity.Length) % bezierInfinity.Length;\n\n    BezierToPolyline(bezierInfinity[iPrevious].EndPosition,\n                     bezierInfinity[i].ControlPoint1,\n                     bezierInfinity[i].ControlPoint2,\n                     bezierInfinity[i].EndPosition,\n                     100,\n                     bezierPoints);\n}\n```\n\nThe `ActionTween` class derives from `FiniteTimeAction` and has the following constructor:\n\n`public ActionTween(Single duration, String key, Single from, Single to, Action<float, string> tweenAction)`\n\nThe first parameter is the duration in seconds. You can use the second argument to identify this animation. The `from` and `to` arguments can be anything you want, but often it’s easiest to set them to 0 and 1. Set the last argument to a callback function. That function is called repeatedly with values between `from` and `to`.\n\nHere’s a callback function for `ActionTween`. The `t` parameter ranges from 0 to 1 for each complete cycle. This is used to calculate an `index` value based on the number of points in the `bezierPoints` collection. The two integer indices `i1` and `i2` can then be used for interpolation. The `Position` property of `monkeyNode` is set to this interpolated value:\n\n```csharp\nvoid UpdateMonkey(float t, string key)\n{\n    float index = t * bezierPoints.Count % bezierPoints.Count;\n    int i1 = (int)index;\n    int i2 = (i1 + 1) % bezierPoints.Count;\n\n    monkeyNode.Position = (i2 - index) * bezierPoints[i1] + (index - i1) * bezierPoints[i2];\n\n    Vector3 tangent = bezierPoints[i2] - bezierPoints[i1];\n    float angle = (float)(180 * Math.Atan2(-tangent.X, -tangent.Z) / Math.PI);\n    monkeyNode.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, angle);\n}\n```\n\nThe two points are also used to determine a tangent to the curve. The angle of this vector is obtained from the `Math.Atan2` function, and then used to set the `Rotation` property of the node.\n\nThe `ActionTween` constructor references this  `UpdateMonkey` callback, and the object is passed to the `RunActionsAsync` method:\n\n```csharp\nawait monkeyNode.RunActionsAsync(new ActionTween(8, \"bezier\", 0, 1, UpdateMonkey));\n```\n\nNow the monkey travels along the Bézier curves while facing in the direction that it’s moving.\n\n## Life and Death\n\nThe following code block defines the most extensive `Sequence` object in this workbook. It begins by positioning the monkey at the origin and decreasing it to one-tenth of its normal size. This is the newborn baby monkey. Over the next 40 seconds, the monkey travels around the Bézier curve 4 times, while simultaneously increasing in size as the years pass and it grows up:\n\n```csharp\nconst float cycleTime = 10;\nconst uint numCycles = 4;\n\nSequence monkeySequence = new Sequence(\n    new FiniteTimeAction[]\n    {\n        new Place(new Vector3(0, 0, 0)),\n        new ScaleTo(0, 0.1f),\n        new Parallel(\n            new Repeat(new ActionTween(cycleTime, \"bezier\", 0, 1, UpdateMonkey), numCycles),\n            new ScaleTo(cycleTime * numCycles, 1)),\n        new DelayTime(0.5f),\n        new ScaleTo(0.25f, 1.25f),\n        new ScaleTo(0.25f, 1),\n        new DelayTime(0.5f),\n        new RotateBy(4.5f, 180, 0, 0)\n    }\n)\n```\n\nAfter those 4 trips around the Bézier curve, the monkey stops, swells in size briefly, and then descends into the earth. This final part of the animation lasts a total of 6 seconds.\n\nTo see what it looks like, run that sequence:\n\n```csharp\nawait monkeyNode.RunActionsAsync(monkeySequence);\n```\n\nIn its bleak portrayal of death and disintegration, the animation might seem to be somewhat dreary. To add a little hope for the future, a second monkey is created:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"monkey2Node\"));\nNode monkey2Node = mainNode.CreateChild(\"monkey2Node\");\nStaticModel monkey2 = monkey2Node.CreateComponent<StaticModel>();\nmonkey2.Model = app.ResourceCache.GetModel(\"monkey.mdl\");\nmonkey2.SetMaterial(app.ResourceCache.GetMaterial(\"Materials/phong1.xml\"));\n```\n\nThis new monkey is set to one-tenth its original size and rotated 90 degrees:\n\n```csharp\nmonkey2Node.SetScale(0.1f);\nmonkey2Node.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, -90);\n```\n\nThe animation sequence for the second monkey defined below begins by hiding the monkey for 40 seconds. The monkey is then made visible and jumps into the air:\n\n```csharp\nSequence monkey2Sequence = new Sequence(\n    new FiniteTimeAction[]\n    {\n        new Hide(),\n        new DelayTime(cycleTime * numCycles),\n        new Show(),\n        new JumpTo(6, new Vector3(), 10, 1),\n        new Hide(),\n    }\n)\n```\n\nYou can run that sequence by itself, but it’s more comprehensible when the two sequences are run together. The `RepeatForever` class runs the sequences forever. For this reason, `RunActions` rather than `RunActionsAsync` is called because `RunActionsAsync` would never return:\n\n```csharp\nmonkeyNode.RemoveAllActions();\nmonkey2Node.RemoveAllActions();\n\nmonkeyNode.RunActions(new RepeatForever(monkeySequence));\nmonkey2Node.RunActions(new RepeatForever(monkey2Sequence));\n```\n\nIf the code block is re-executed, then the calls to `RemoveAllActions` stop any animations that might be in progress before restarting the animations at the beginning."
  },
  {
    "path": "graphics/urhosharp/compound-shapes/CreatingUrhoCompoundShapes.workbook/index.workbook",
    "content": "﻿---\nid: 4792faac-5c28-4cef-98bb-89f4af10fee9\nuti: com.xamarin.workbook\ntitle: \"UrhoSharp: Compound Shapes\"\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n# Creating (and Animating) Urho Compound Shapes\n\nThis workbook shows how you can build a quadcopter from UrhoSharp `Shape` objects and fly it around the screen.\n\nUrhoSharp is a powerful cross-platform 3D graphics engine available to Xamarin and .NET developers for games or visualization. If you’re unfamiliar with Urho concepts, you’ll want to download and run the **Exploring Urho Coordinates** workbook first.\n\nWait until the workbook has completely finished loading before executing the following code cell:\n\n```csharp\n#r \"Urho\"\n```\n\nThis workbook requires four of the dozen or so namespaces for UrhoSharp types:\n\n```csharp\nusing Urho;\nusing Urho.Actions;\nusing Urho.Gui;\nusing Urho.Shapes;\n```\n\nAs usual when exploring UrhoSharp in a workbook, call the static `SimpleApplication.Show` method with an `ApplicationOptions` object to create a window for the Urho graphics:\n\n```csharp\nSimpleApplication app = SimpleApplication.Show(\n    new ApplicationOptions()\n    {\n\t\tWidth = 1000,\n\t\tHeight = 1000\n    });\n```\n\nYou should see a window appear on the desktop as the `Show` method completes.\n\n## Camera and Set\n\nTo prepare for creating visual objects, move the camera back along the Z axis, and raise it up a little and to the left. Call `SetDirection` so the origin of the 3D coordinate system remains in the center of the window:\n\n```csharp\napp.CameraNode.Position = new Vector3(-1, 1.5f, -6);\napp.CameraNode.SetDirection(-app.CameraNode.Position);\n```\n\nThe camera will remain fixed for this workbook, and until the quadcopter begins flying around the screen, the quadcopter itself will be positioned at the origin of the 3D coordinate system.\n\nCreate a `Node` object at that coordinate origin for all the visual objects that comprise the quadcopter:\n\n```csharp\napp.Scene.RemoveChild(app.Scene.GetChild(\"mainNode\", false));\nNode mainNode = app.Scene.CreateChild(\"mainNode\");\n```\n\nAs usual, the first statement in the code cell removes the `Node` named “mainNode” if the code cell is being re-executed. This prevents multiple identical nodes from being added to the tree.\n\n## Starting the Quadcopter (some assembly required)\n\nThis workbook uses a tree of `Node` objects for all the parts of the quadcopter. As you’ll see, this tree structure allows various sections of the quadcopter to be transformed, cloned, and animated.\n\nFor purposes of simplicity, any `Node` in this workbook that has children does not itself include a component. Here is the `Node` that will encompass the entire quadcopter:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"copterNode\", false));\nNode copterNode = mainNode.CreateChild(\"copterNode\");\n```\n\nThe `copterNode` is a child of `mainNode`, and is also positioned at the origin of the 3D coordinate system. All the other parts of the quadcopter are subnodes of `copterNode`.\n\nThe first child of `copterNode` is the body of the quadcopter:\n\n```csharp\ncopterNode.RemoveChild(copterNode.GetChild(\"bodyNode\", false));\nNode bodyNode = copterNode.CreateChild(\"bodyNode\");\nShape bodyShape = bodyNode.CreateComponent<Torus>();\nbodyShape.Color = Color.Red;\n```\n\nIn a real quadcopter, this body would contain most of the quadcopter electronics, so it probably wouldn’t be a torus, but a torus looks cool, so that’s what it is. The final statement of that code block sets the `Color` property of the shape to a `Color` value.\n\n## Natural Lighting\n\nThe lighting source that `SimpleApplication` creates is a spot light, which might be suitable for indoors, but you really should be flying your quadcopter outside. The spot light is a child of the camera node, and it is the only child of the camera node, so you can remove it like this:\n\n```csharp\napp.CameraNode.RemoveAllChildren();\n```\n\nThe torus is still illuminated by ambiant light, which is set in a component called the `Zone`, an object responsible for other global characteristics of the scene. The ambient light can be reduced somewhat by accessing the `Zone` property of the `SimpleApplication` object:\n\n```csharp\napp.Zone.AmbientColor = new Color(0.35f, 0.35f, 0.35f);\n```\n\nThe color of this ambient light is a 35% gray. You don’t want to make it white (100% gray) because that would cause everything to be maximally illuminated.\n\nNow a new mode and component can be created for directional light. Make this node a child of the `Scene`:\n\n```csharp\napp.Scene.RemoveChild(app.Scene.GetChild(\"directionalLight\"));\nNode lightNode = app.Scene.CreateChild(\"directionalLight\");\nLight light = lightNode.CreateComponent<Light>();\nlight.LightType = LightType.Directional;\n```\n\nSet the direction of the light so it seems to come from above the user’s left shoulder, a convention for computer graphics. This direction is a property of the `Node`:\n\n```csharp\nlightNode.SetDirection(new Vector3(2, -3, 1));\n```\n\nYou probably don’t want the sum of the ambient light and the directional light to exceed 1 because it would tend to wash out the definition of the visual objects, so reduce the directional light to 65% gray. This is a property of the `Light` component:\n\n```csharp\nlight.Color = new Color(0.65f, 0.65f, 0.65f);\n```\n\nNow the only areas of the torus that are maximally illuminated are those that are perpendicular to the direction of the directional light.\n\n## One Quadcopter Arm\n\nThe quadcopter has four arms that extend from the body, each of which has two blades that turn on a little axle. These four arm assemblies are identical, which suggests that it might be possible to build one arm and then clone it by using the `Clone` method of `Node`. (In a conventional UrhoSharp program, you probably wouldn’t use cloning but instead create the multiple similar parts in `for` loops.)\n\nThis is easiest if you begin with a parent node for the assembly that you want to clone. This parent node has no component so it is invisible:\n\n```csharp\ncopterNode.RemoveChild(copterNode.GetChild(\"armAssemblyNode1\", false));\nNode armAssemblyNode1 = copterNode.CreateChild(\"armAssemblyNode1\");\n```\n\nAll the pieces of the arm assembly are children of that node. The first piece is the arm itself, which is a cylinder. Perhaps it is made from blue plastic:\n\n```csharp\narmAssemblyNode1.RemoveChild(armAssemblyNode1.GetChild(\"armNode\", false));\nNode armNode = armAssemblyNode1.CreateChild(\"armNode\");\nShape armShape = armNode.CreateComponent<Cylinder>();\narmShape.Color = Color.Blue;\n```\n\nThe `armAssemblyNode1` node has no transforms applied, and the `armNode` has no transforms applied, so the cylinder sits at the coordinate origin, half above and half below the XZ plane. It’s necessary to apply a few transforms to give it a proper shape and oriention. This `Scale` setting makes it longer and much thinner:\n\n```csharp\narmNode.Scale = new Vector3(0.1f, 1.5f, 0.1f);\n```\n\nNow it can be rotated around the Z axis to be parallel with the X axis:\n\n```csharp\narmNode.Rotation = Quaternion.FromAxisAngle(Vector3.UnitZ, 90);\n```\n\nThe rotation is around the center of the cylinder, which is the same as the origin of the coordinate system. This `Position` setting shifts the arm towards the right:\n\n```csharp\narmNode.Position = new Vector3(0.75f, 0, 0);\n```\n\nThe left end of the cylinder is now at the coordinate origin, and it seems to go through the torus.\n\nThe next piece of the arm assembly is a tiny axle. Again, begin with a cylinder. Color it black:\n\n```csharp\narmAssemblyNode1.RemoveChild(armAssemblyNode1.GetChild(\"axleNode\", false));\nNode axleNode = armAssemblyNode1.CreateChild(\"axleNode\");\nShape axleShape = axleNode.CreateComponent<Cylinder>();\naxleShape.Color = Color.Black;\n```\n\nNow make it very thin and tiny and shift it to the right so it seems to stick through the arm:\n\n```csharp\naxleNode.Scale = new Vector3(0.05f, 0.3f, 0.05f);\naxleNode.Position = new Vector3(1.4f, 0.05f, 0);\n```\n\n## One Blade + One Clone = Two Blades\n\nThe next step is to construct the blades. Since there is more than one blade on each arm assembly, this suggests that it might be convenient to make one blade and then clone it. For that purpose, first create a node with no component to serve as a parent to the blade nodes:\n\n```csharp\narmAssemblyNode1.RemoveChild(armAssemblyNode1.GetChild(\"bladeAssemblyNode\", false));\nNode bladeAssemblyNode = armAssemblyNode1.CreateChild(\"bladeAssemblyNode\");\n```\n\nYou can’t see it because there’s no visual component associated with it. Nevertheless, now move this node so the center of the node coincides with the top of the axle:\n\n```csharp\nbladeAssemblyNode.Position = new Vector3(1.4f, 0.2f, 0);\n```\n\nEvery child node of the `bladeAssemblyNode` will be positioned relative to this node. Each blade is constructed from a sphere. Here’s the first one, colored silver:\n\n```csharp\nbladeAssemblyNode.RemoveChild(bladeAssemblyNode.GetChild(\"bladeNode1\", false));\nNode bladeNode1 = bladeAssemblyNode.CreateChild(\"bladeNode1\");\nShape bladeShape1 = bladeNode1.CreateComponent<Sphere>();\nbladeShape1.Color = new Color(0.75f, 0.75f, 0.75f);\n```\n\nAlthough it might be hard to tell, the center of the sphere coincides with the top of the axle. Now flatten the sphere so it’s only 0.05 units in height but 0.1 units wide:\n\n```csharp\nbladeNode1.Scale = new Vector3(1, 0.05f, 0.1f);\n```\n\nSuch a shape for a rotor blade would not work in real life, but visually it gives a pretty good illusion.\n\nNow the blade can be cloned. Two of the three statements in the following code are specifically for the purpose of preventing superfluous nodes when workbook cells are re-executed. The crucial statement is the second one, which clones `bladeNode1` to create `bladeNode2`. The parent of `bladeNode2` becomes the same as the parent of `bladeNode1`, which is the `bladeAssemblyNode`. The argument to `Clone` indicates that the new node is only local and won’t be replicated over a network in network-based Urho games:\n\n```csharp\nbladeAssemblyNode.RemoveChild(bladeAssemblyNode.GetChild(\"bladeNode2\", false));\nNode bladeNode2 = bladeNode1.Clone(CreateMode.Local);\nbladeNode2.Name = \"bladeNode2\";\n```\n\nYou can’t see the cloned node yet because it’s occupying the same space as the node that it’s been cloned from, but all that’s necessary is to rotate the new node around its center by 90 degrees:\n\n```csharp\nbladeNode2.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, 90);\n```\n\nIf you’d like to add another blade or two, now is the time!\n\nThe following list of `mainNode` and all its subnodes created in the workbook so far shows their hierarchical relationship:\n\nmainNode\\\n  copterNode\\\n    bodyNode\\\n    armAssemblyNode1\\\n      armNode\\\n      axleNode\\\n      bladeAssemblyNode\\\n        bladeNode1\\\n        bladeNode2\n\n## Laying down Grass\n\nIt appears that the unfinished quadcopter is just floating in space. It’s more likely sitting on the lawn in your backyard. You can mimic a surface of grass with a `Shape` derivative called the `Plane`, which is simply a thin flat surface:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"grassNode\", false));\nNode grassNode = mainNode.CreateChild(\"grassNode\");\nShape grassShape = grassNode.CreateComponent<Urho.Shapes.Plane>();\ngrassShape.SetMaterial(Material.FromColor(Color.Green));\n```\n\nNotice the somewhat different way of setting the color. In 3D programming, visual objects are often said to have an appearance based on a *material*. You can set a material on a `Shape` object by calling the `SetMaterial` method. If you just need a uniformly colored material, create one by calling the static `Material.FromColor` method.\n\nIn a somewhat more sophisticated program, you might have a bitmap that resembles grass, and you would call `SetMaterial` with a `Material` object that you obtain from the static `Material.FromImage` method.  But for now, it’s simply green.\n\n(Be aware, however, that when you clone a node, the component is cloned but not the material on the component. This is why the cloned nodes in this workbook use colors rather than materials.)\n\nThe default `Plane` is flat and 1 unit by 1 unit square. Look closely and you’ll see that it is bisecting the torus, which is 0.25 units in height. The first step is to move the `Plane` down by half that height:\n\n```csharp\ngrassNode.Position = new Vector3(0, -0.125f, 0);\n```\n\nThe plane node must also be made very large so it stretches to the horizon:\n\n```csharp\ngrassNode.Scale = new Vector3(2000, 1, 2000);\n```\n\nThe horizon seems a little crooked because of the way the camera is positioned and directed towards the origin.\n\nYou can set the sky to a sky-blue color by accessing the `Viewport` object that `SimpleApplication` creates:\n\n```csharp\napp.Viewport.SetClearColor(new Color(0.53f, 0.81f, 0.92f));\n```\n\nNow for some shadows. These are properties of the directional light. The first setting is obvious; the others were copied from some other UrhoSharp sample code:\n\n```csharp\nlight.CastShadows = true;\nlight.ShadowBias = new BiasParameters(0.00025f, 0.5f);\nlight.ShadowCascade = new CascadeParameters(10.0f, 50.0f, 200.0f, 0.0f, 0.8f);\n```\n\n## Animating the Blades\n\nQuadcopter blades must rotate. That’s how the quadcopter can fly. The `Node` class defines a `RunActions` method that accepts any number of `FiniteTimeAction` objects. These are animations that apply to the node.\n\n`Node` also defines a `RemoveAllActions` method. In a workbook, you’ll want to call `RemoveAllActions` before `RunActions` to avoid multiple identical `FiniteTimeAction` objects that apply to the node.\n\nThe classes that derive from `FiniteTimeAction` are in the `Urho.Actions` namespace. Among others classes, you’ll find `RotateBy` and `RotateTo`. These are similar except that `RotateBy` changes a rotation angle *by* a specific number of degrees, while `RotateTo` changes the rotation angle *to* the specified value. `RotateBy` adds to the current rotation angle while `RotateTo` does not.\n\nThe `RotateBy` and `RotateTo` constructors have four arguments that indicate the duration of the animation in seconds, and the total rotation around the X, Y, and Z axes. In the following code cell, the arguments are identified by name to avoid confusion. Also notice that the animation applies to the `bladeAssemblyNode`, which is the parent node to the two blade nodes:\n\n```csharp\nbladeAssemblyNode.RemoveAllActions();\nbladeAssemblyNode.RunActions(new RotateBy(duration: 1,\n                                          deltaAngleX: 0,\n                                          deltaAngleY: 360,\n                                          deltaAngleZ: 0));\n```\n\nIt definitely works. The pair of blades spin around in one second. But it stops after it goes around once. You could try increasing the `deltaAngleX` argument (and also the `duration` argument) but the real solution is to define an animation that runs forever.\n\nThat turns out to be very easy: Just pass the `RotateBy` object to the constructor of `RepeatForever`, a class that also derives from `FiniteTimeAction`. Here’s the object defined by itself:\n\n```csharp\nFiniteTimeAction bladeAction = \n    new RepeatForever(\n        new RotateBy(duration: 1,\n                     deltaAngleX: 0,\n                     deltaAngleY: 360,\n                     deltaAngleZ: 0\n        )\n    );\n```\n\nNow this `bladeAction` object can be applied to the `bladeAssemblyNode`:\n\n```csharp\nbladeAssemblyNode.RemoveAllActions();\nbladeAssemblyNode.RunActions(bladeAction);\n```\n\nYou could make it go faster, of course, just by lowering the `duration` value in the `RotateBy` constructor. It is not necessary to specify any center of rotation. By default, the blade assembly rotates around its center.\n\n## Cloning the Arm Assembly\n\nYou’ve already seen cloning with the blades. Here’s the code to clone the entire arm assembly. As was the case earlier, the first and third statements are necessary only in workbooks to avoid duplicate nodes:\n\n```csharp\ncopterNode.RemoveChild(copterNode.GetChild(\"armAssemblyNode2\", false));\nNode armAssemblyNode2 = armAssemblyNode1.Clone(CreateMode.Local);\narmAssemblyNode2.Name = \"armAssemblyNode2\";\n```\n\nThe two arm assemblies are now in the same location. The animations are not cloned along with the nodes and components, so you can see one pair of animated blades and another pair of stationary blades.\\\n\\\nThe following code rotates the cloned arm assembly around its origin to move it on the other side of the body:\n\n```csharp\narmAssemblyNode2.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, 180);\n```\n\nKeep in mind that `armAssemblyNode1` had no transforms applied. The only transforms were applied to the children of `armAssemblyNode1`. When the clone of `armAssemblyNode2` is rotated, it rotates around its origin, which is the same as the 3D coordinate origin.\n\nIt’s now necessary to apply the animation to the blade assembly in this cloned arm assembly. But where is that cloned blade assembly? Because the whole arm assembly node was cloned, it a child of the cloned object. Names are cloned along with everything else, so you need to get the child named “bladeAssemblyNode” from the cloned `armAssemblyNode2`:\n\n```csharp\nbladeAssemblyNode = armAssemblyNode2.GetChild(\"bladeAssemblyNode\", true);\n```\n\nThe second argument of `GetChild` is set to `true` in this case to search through the entire tree of subnodes.\n\nThe animation can now be applied:\n\n```csharp\nbladeAssemblyNode.RemoveAllActions();\nbladeAssemblyNode.RunActions(bladeAction);\n```\n\nNow you can make another clone and rotate it 90 degrees so it’s on the side of the viewer:\n\n```csharp\ncopterNode.RemoveChild(copterNode.GetChild(\"armAssemblyNode3\", false));\nNode armAssemblyNode3 = armAssemblyNode1.Clone(CreateMode.Local);\narmAssemblyNode3.Name = \"armAssemblyNode3\";\narmAssemblyNode3.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, 90);\n```\n\nThe animation can now be applied as before.\n\nBut wait:\n\nIn quadcopters, the blades in the arms opposite each other spin in the same direction, but the blades on the other two arms spin in the opposite direction. Is it necessary to define another `FiniteTimeAction` object for the opposite rotation?\n\nNot at all: `FiniteTimeAction` defines a `Reverse` method that returns an object of type `FiniteTimeAction` that is the same animation but in reverse:\n\n```csharp\nbladeAssemblyNode = armAssemblyNode3.GetChild(\"bladeAssemblyNode\", true);\nbladeAssemblyNode.RemoveAllActions();\nbladeAssemblyNode.RunActions(bladeAction.Reverse());\n```\n\nFinally, another clone creates the fourth arm:\n\n```csharp\ncopterNode.RemoveChild(copterNode.GetChild(\"armAssemblyNode4\", false));\nNode armAssemblyNode4 = armAssemblyNode1.Clone(CreateMode.Local);\narmAssemblyNode4.Name = \"armAssemblyNode4\";\narmAssemblyNode4.Rotation = Quaternion.FromAxisAngle(Vector3.UnitY, 270);\n```\n\nAnd the following code applies the animation in the same direction as its opposite:\n\n```csharp\nbladeAssemblyNode = armAssemblyNode4.GetChild(\"bladeAssemblyNode\", true);\nbladeAssemblyNode.RemoveAllActions();\nbladeAssemblyNode.RunActions(bladeAction.Reverse());\n```\n\nThe quadcopter is complete, but can it be made to fly?\n\n## A Preprogrammed Flight Plan\n\nOne of the many animations in the `Orho.Actions` namespace is `BezierTo`, which can animate the `Position` property of a `Node` based on a Bezier curve. The `BezierTo` constructor requires a time in seconds and a `BezierConfig` value that defines a Bezier curve based on two control points (the `ControlPoint1` and `ControlPoint2` properties) and an end point (the `EndPosition` property).\n\nNormally a Bezier curve is defined by a start point as well. With `BezierTo`, the start point is the current position, which in this example is the current position of the quadcopter, or (0, 0, 0).\n\n`BezierTo` actions are customarily strung together into a composite animation, so at the end of the `BezierTo` action, the current position is the `EndPosition` property of the `BezierConfig` value, and that becomes the starting point for the next `BezierTo`.\n\nHere are four `BezierTo` animations whose coordinates were derived from experimentation. (You are free to experiment further!) Notice that these Bezier curves are in three dimensions, so all the points are `Vector3` values:\n\n```csharp\nBezierTo bezier1 = new BezierTo(3, new BezierConfig\n{\n   ControlPoint1 = new Vector3(1, 2, -4),\n   ControlPoint2 = new Vector3(-1, 6, -2),\n   EndPosition = new Vector3(0, 4, 0) \n});\n\nBezierTo bezier2 = new BezierTo(2, new BezierConfig\n{\n    ControlPoint1 = new Vector3(2, 4, 5),\n    ControlPoint2 = new Vector3(15, 10, 10),\n    EndPosition = new Vector3(10, 8, 15)\n});\n\nBezierTo bezier3 = new BezierTo(3, new BezierConfig\n{\n    ControlPoint1 = new Vector3(5, 6, 20),\n    ControlPoint2 = new Vector3(-5, 8, 20),\n    EndPosition = new Vector3(-5, 6, 14)\n});\n\nBezierTo bezier4 = new BezierTo(4, new BezierConfig\n{\n    ControlPoint1 = new Vector3(-5, 4, 7),\n    ControlPoint2 = new Vector3(-2, 0, 0),\n    EndPosition = new Vector3(-0.5f, 2, -8),\n});\n```\n\nBefore running these animations, expand the camera field of view so you can see more:\n\n```csharp\napp.Camera.Fov = 90;\n```\n\nThe following code sets the `Position` of the quadcopter node to the origin (in case the code-cell is re-executed) and then runs the `BezierTo` animations in sequence using `RunActionsAsync`:\n\n```csharp\ncopterNode.RemoveAllActions();\ncopterNode.Position = new Vector3(0, 0, 0);\nawait copterNode.RunActionsAsync(bezier1, bezier2, bezier3, bezier4);\n```\n\nBoth `RunActions` and `RunActionsAsync` return soon after the animation has begun. However, you can use `await` with `RunActionsAsync` to avoid continuing code execution until the animation has completed. Otherwise, the following code cell (which restores the `Position` to the origin) might be executed in the middle of the animation, and not at the end of the animation where it actually does some good:\n\n```csharp\ncopterNode.Position = new Vector3(0, 0, 0);\n```\n\nNow you can run the animation again.\n\n## Manual Controls\n\nObviously you want to fly the quadcopter yourself. There are several ways to let a user interact with a Urho application: mouse, touch, joystick, and even a simulated joystick. However, perhaps the easiest involves the keyboard. Over the years, the following keys have become common in controlling objects in two dimensions on the screen:\n\nW = Up\\\nS = Down\\\nA = Left\\\nD = Right\n\nThese keys are in an inverted T position on the keyboard. If you’ve looked at the source code for `SimpleApplication`, you might have noticed some code that makes use of the WASD keys, but that’s for moving the camera and are enabled with the `MoveCamera` property. The `MoveCamera` property is set to `true` by default, so the first step is to disable it:\n\n```csharp\napp.MoveCamera = false;\n```\n\nIf the W, S, A, and D keys will move the quadcopter up, down, left, and right, what about the third dimension? Perhaps you can use the F and R keys for movement along the Z axis:\n\nF = Forward\\\nR = Reverse\n\nWill you remember what these keys do? Some text displayed on the screen can help out. The `Urho.Gui` namespace has a collection of user-interface elements, including `Text`. These user-interface elements can be organized in a tree of `UIElement` objects, starting at the `Root` property of the `UI` object available from the `UI` property of `Application`.\n\nLike `Node` objects, `UIElement` objects have names. In workbooks you can remove them from the tree to avoid duplicate elements when code cells re-execute. That’s what the first statement below does. The `HorizontalAlignment` and `VerticalAlignment` properties center the `Text` element horizontally and put it at the bottom of the screen:\n\n```csharp\napp.UI.Root.RemoveChild(app.UI.Root.GetChild(\"helpText\", false), 0);\nText helpText = new Text()\n{\n    Name = \"helpText\",\n    Value = \"W=Up S=Down, A=Left, D=Right, F=Forward, R=Reverse\",\n\tHorizontalAlignment = HorizontalAlignment.Center,\n\tVerticalAlignment = VerticalAlignment.Bottom\n};\napp.UI.Root.AddChild(helpText);\n```\n\nBut where is it? The `Text` element happens not to have a default font, and one must be assigned explicitly. Fortunately, a font is available from the embedded `Fonts` class in the  `CoreAssets` class in the `Urho` namespace. You also set a height for the font in this call:\n\n```csharp\nhelpText.SetFont(CoreAssets.Fonts.AnonymousPro, 24);\n```\n\nBy default, the text is white. In this particular case, you’ll probably want to make it black:\n\n```csharp\nhelpText.SetColor(Color.Black);\n```\n\nIt will be interesting also to have a real-time display of the quadcopter’s position, so here’s another `Text` element that sits in the upper-right corner of the screen:\n\n```csharp\napp.UI.Root.RemoveChild(app.UI.Root.GetChild(\"positionText\", false), 0);\nText positionText = new Text()\n{\n    Name = \"positionText\",\n\tHorizontalAlignment = HorizontalAlignment.Right,\n\tVerticalAlignment = VerticalAlignment.Top\n};\npositionText.SetColor(Color.Black);\npositionText.SetFont(CoreAssets.Fonts.AnonymousPro, 24);\napp.UI.Root.AddChild(positionText);\n```\n\nThere is no `Value` property set for that `Text` element, so no text is displayed yet.\n\nGraphics systems often have a facility sometimes referred to as a *game loop*. This is a block of code that executes quickly, repeatedly, and continuously. The game loop is where the program can alter the visuals in real time, often based on user input.\n\nIn a conventional Urho application, you derive a class from `Application`. The game loop is an override of the `OnUpdate` method. In a workbook, you can instead attach a handler to the `Update` event. Regardless which approach you use, the function is called with a time-step value, which is the time in seconds since the last call. Depending on the environment and whatever other animations might be going on, expect the function to be called anywhere from 20 times a second to 200 times a second.\n\nHere is a handler for the `Update` event that uses the `Input` subsystem of the `Application` class to check if any of six keys is currently pressed. If so, the `Translate` method is called, which changes the `Position` property by the specified vector. A series of `if` statements are used rather than an `if-else` construction to allow multiple keys to be pressed simultaneously.\n\n```csharp\nvoid ProcessKey(UpdateEventArgs args)\n{\n    float distancePerSecond = 1.0f;\n    float distance = distancePerSecond * args.TimeStep;\n\n    if (app.Input.GetKeyDown(Key.W))    \n    {\n        copterNode.Translate(Vector3.UnitY * distance);\n    }\n    if (app.Input.GetKeyDown(Key.S))    \n    {\n        copterNode.Translate(-Vector3.UnitY * distance);\n    }\n    if (app.Input.GetKeyDown(Key.A))    \n    {\n        copterNode.Translate(-Vector3.UnitX * distance);\n    }\n    if (app.Input.GetKeyDown(Key.D))\n    {\n        copterNode.Translate(Vector3.UnitX * distance);\n    }\n    if (app.Input.GetKeyDown(Key.F))\n    {\n        copterNode.Translate(Vector3.UnitZ * distance);\n    }\n    if (app.Input.GetKeyDown(Key.R))\n    {\n        copterNode.Translate(-Vector3.UnitZ * distance);\n    }\n    // Clamp to positive Y values\n    Vector3 position = copterNode.Position;\n    position.Y = Math.Max(0, position.Y);\n    copterNode.Position = position;\n\n    positionText.Value = String.Format(\"({0:F2}, {1:F2}, {2:F2})\", \n                                       position.X, position.Y, position.Z);\n}\n```\n\nNotice towards the end of the event handler three lines of code that ensures that the Y value of the `Position` property of `copterNode` remains positive. You don’t want the quadcopter to go underground! The final statement updates the `Text` element with the current position.\n\nBelow is the final code cell in this workbook. It attaches the `ProcessKey` handler to the `Update` event so you can use the keyboard to fly the quadcopter. But what you definitely don’t want is more than one `ProcessKey` handler attached to that event: When multiple identical game-loop code blocks are executed, the animations go uncontrollably faster.\n\nFor that reason, any code in a workbook that attaches an `Update` handler should detach the previous one first. Normally you would use an `app.Update -= ProcessKey` statement. However, in a workbook, that doesn’t work well: Every time the code cell containing the `ProcessKey` function is re-executed, a new instance of the function is created, and hence it’s difficult detaching the previous handler from the `Update` event using conventional means.\n\nFor that reason, this code block begins with some .NET reflection code that removes all handlers from the `Update` event. But be aware this code is not generalized for all types of events.\n\n```csharp\n// Detach ALL Update handlers\nusing System.Reflection;\nFieldInfo field = typeof(Application).GetField(\"Update\", \n                      BindingFlags.Instance | BindingFlags.NonPublic);\nfield.SetValue(app, null);\n\napp.Update += ProcessKey;\n```\n\nNow you’re ready to fly the quadcopter. But be sure to click on the Urho window to give it input focus before you press the keys!"
  },
  {
    "path": "graphics/urhosharp/coordinates/ExploringUrhoCoordinates.workbook/index.workbook",
    "content": "﻿---\nid: cb4208bd-7759-4878-9e28-72c87a06da15\nuti: com.xamarin.workbook\ntitle: \"UrhoSharp: Exploring Coordinates\"\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n# Exploring Urho Coordinates\n\nUrhoSharp is a powerful cross-platform 3D graphics engine that Xamarin and .NET developers can use for games or visualization. This workbook is intended as a basic introduction to UrhoSharp and 3D concepts, focusing on the 3D coordinate system.\n\n```csharp\n#r \"Urho\"\n```\n\nThis workbook requires only two of the dozen or so namespaces for UrhoSharp types:\n\n```csharp\nusing Urho;\nusing Urho.Shapes;\n```\n\nIf you’re writing a standalone UrhoSharp program using Visual Studio, generally you derive a class from `Application`, and override several methods for all your code, animations, and interaction. The program then instantiates that derived class and calls the `Run` method on it. The `Run` method is blocking: It doesn’t return until the UrhoSharp application has been terminated.\n\nThat architecture would not work very well in an interactive workbook, so a class named `SimpleApplication` is available instead. `SimpleApplication` derives from `Application` and defines a static `Show` method that instantiates the `SimpleApplication` object, performs some initialization, and returns the object, which you can then use for constructing a 3D scene. This `SimpleApplication` class is described in the UrhoSharp API documentation [here](https://developer.xamarin.com/api/type/Urho.SimpleApplication/) but you might also want to look at the [source code](https://github.com/xamarin/urho/blob/master/Bindings/Portable/SimpleApplication.cs) for the class, and particularly the [`Start` method](https://github.com/xamarin/urho/blob/master/Bindings/Portable/SimpleApplication.cs#L145), which performs initialization.\n\nTo create a UrhoSharp window in a workbook, call the static `SimpleApplication.Show` method, passing to it an argument of `ApplicationOptions`. The easiest options consist of simply a width and height of a window:\n\n```csharp\nApplicationOptions appOptions = new ApplicationOptions\n{\n    Width = 1000,\n    Height = 1000\n};\nSimpleApplication app = SimpleApplication.Show(appOptions);\n```\n\nYou should see a window appear on the desktop as the `Show` method completes.\n\n## Inside SimpleApplication\n\nThe `SimpleApplication` class creates two objects that are essential in a 3D scene: a camera and a light source.\n\nThe camera defines how you see 3D objects in the window. The Urho window is similar to the screen of a digital camera or the camera on your phone. As you know, what you see on a camera screen depends on:\n\n* where the camera is positioned in 3D space,\n\n* the direction that the camera lens is pointed,\n\n* the orientation of the camera (portrait or landscape or something in between), and\n\n* the degree of zoom that you’ve selected\n\nAll these characteristics (and more) are part of the Urho3D camera.\n\nThe use of a camera metaphor is perhaps the biggest difference between 3D graphics and 2D graphics. When working with 2D graphics, generally you specify coordinates of graphics objects relative to a screen or canvas. The coordinate values might be pixels or units that convert to pixels.\n\nWith 3D graphics, what you see on the screen depends on the relative locations of the camera and the 3D objects. Coordinate values are all relative. You can increase or decrease all the coordinates and sizes in a 3D scene by a factor of 10 (for example) and everything will look the same.\n\nWhen you use a camera in real life, you know that you can’t take a picture of something behind the camera or otherwise out of its range. Similarly, in working with 3D scenes, you might not see anything in the UrhoSharp window if the 3D objects are not in the range of the camera. Helping you get a feel for this relationship is one of the goals of this workbook.\n\nThe other essential object that `SimpleApplication` creates is a light source. This serves to illuminate 3D objects and provide an illusion of three-dimensional space and curvature.\n\n## A Tree of Nodes\n\nUrho organizes 3D objects in a tree of nodes. Every node except the top-level node has a parent, and every node potentially has multiple children. This organization allows you to group related 3D objects and treat them together. For example, you can move a whole group of objects by moving the parent node. Here’s the documentation of the [`Node` class](https://developer.xamarin.com/api/type/Urho.Node/).\n\n`SimpleApplication` creates a top-level node, which is a special node of type `Scene`, and which is accessible through the `Scene` property of `SimpleApplication`. Both the camera and light are subnodes of the `Scene` node. (You’ll see shortly how you can access the camera and light source from a workbook.)\n\nThe `Start` method in `SimpleApplication` also creates a node called `RootNode`. That particular node is not used in this workbook, and it’s not used for anything within the `SimpleApplication` class. Instead, this workbook creates creates something quite similar — a child node of `Scene` that will be used throughout this workbook as a parent to other nodes.\n\nTo create a new child node of an existing node (for example, the node referenced by the `Scene` property of the `SimpleApplication` object), call `CreateNode` on the node you want to create a child of.\n\nWhen you experiment with code in a workbook, however, the code cells can be executed multiple times. Generally you’ll want to avoid creating nodes that duplicate existing nodes. For that reason, any code in a workbook that creates a new node should be prefaced with code that removes the node that might have been created in a previous execution of the code cell. That’s why this `CreateChild` call is preferenced with calls to `GetChild` and `RemoveChild`:\n\n```csharp\n// Remove node named \"mainNode\" so there are no duplicates\napp.Scene.RemoveChild(app.Scene.GetChild(\"mainNode\", false));\n\n// Create node named \"mainNode\" as child of Scene\nNode mainNode = app.Scene.CreateChild(\"mainNode\");\n```\n\nThe node is given a name in the `CreateChild` call that is referenced in the `GetChild` call. But that first statement might seem risky to you when this code block is executed the first time: If a node with the name “mainNode” does not exist, `GetChild` returns `null`. Fortunately, if the argument to `RemoveChild` is `null`, it simply does nothing. The second argument to `GetChild` inhibits searching for the node recursively through levels of node.\n\nSimilarly, the following code creates a child node of `mainNode` named `boxNode` after first removing a subnode with that name:\n\n```csharp\n// Remove node named \"boxNode\" so there are no duplicates\nmainNode.RemoveChild(mainNode.GetChild(\"boxNode\", false));\n\n// Create a node for a Box component\nNode boxNode = mainNode.CreateChild(\"boxNode\");\nBox box = boxNode.CreateComponent<Box>();\n```\n\nThe last two statements demonstrate the simplest way to create a 3D object in the scene: first by creating a child node, and then to associate that child node with a component. (The camera and light created in the `Start` method of `SimpleApplication` are components as well.) Notice the generic argument to the `CreateComponent` call. The `Box` component is one of seven classes for basic shapes that derive from the abstract `Shape` class and which can be found in the [`Urho.Shapes` namespace](https://developer.xamarin.com/api/namespace/Urho.Shapes/). The `CreateComponent` method returns an object of type `Box`.\n\nBut where is it?\n\n## 3D Space\n\nThat `Box` object that you’ve just created is not yet visible. Understanding why requires some background in 3D coordinate systems.\n\nA 3D graphics system like Urho allows objects to be positioned in a three-dimensional coordinate space. Two of the dimensions are just like a classic two-dimensional Cartesian coordinate system:\n![Two-dimensional coordinate system](Figure1.png)\n\nBy default the origin is in the center of the Urho window.\n\nA 3D coordinate system has a third axis labeled Z that is at right angles to both the X and Y axis. In Urho, the positive Z axis goes into the screen (conceptually speaking), and the negative Z axis comes out of the screen. Here’s the whole coordinate system viewed from an angle:\n\n![Three-dimensional coordinate system](Figure2.png)\nUrho’s coordinate system is known as a *left-hand* system. If you point the forefinger of your left hand in the direction of positive X coordinates (to the right) and your third finger in the direction of position Y coordinates (up), your thumb points in the direction of positive Z coordinates (into the screen). The only alternative is a right-hand system.\n\nIt’s sometimes convenient to speak of the coordinate system as defining *planes*. the X and Y axes define the XY plane, while the X and Z axes define the XZ plane, and the Y and Z axes define the YZ plane.\n\nA 3D coordinate point is notated as (x, y, z). The origin of the coordinate system is the point (0, 0, 0).\n\nThere’s a good reason why you can’t see the box you created in the Urho window: By default, the camera is positioned at the origin of the 3D coordinate system, and so is the box. The camera is inside the box! The camera and box must be moved apart before the camera can see the box.\n\nThe camera has a direction as well as a position. Directions are indicated by 3D vectors, which are notated just like points but usually displayed in boldface: **(x, y, z)**. In UrhoSharp, both points and vectors are values of type `Vector3`.\n\nBy default, the camera is positioned at the origin and pointing into the screen in the direction of the positive Z axis.\n\nOr rather, it should be. To override some settings in `SimpleApplication` used to create the libraries used with this workbook, set the camera to what should be the default settings:\n\n```csharp\napp.CameraNode.Position = new Vector3(0, 0, 0);\napp.CameraNode.SetDirection(new Vector3(0, 0, 1));\n```\n\nAlthough the `Position` property is readable and writeable, the `Direction` property is read-only so `SetDirection` must be used to set it.\n\nThe following code moves the box so that it has a Z coordinate of 7 and sits in front of the camera. Notice that `Position` is a property of the `Node` object and not the `Box` object:\n\n```csharp\nboxNode.Position = new Vector3(0, 0, 7);\n```\n\nAnd there it is.\n\nIt doesn’t look much like a box, however. It looks like a square. The problem now is that the camera is pointed straight at the box, so only one side of the box is visible. You can shift the box to the right by increasing the X coordinate of the `Position` property, and to the left by decreasing the X coordinate. You can move the box up by increasing the Y coordinate, and down by decreasing the Y coordinate. Here’s one possibility:\n\n```csharp\nboxNode.Position = new Vector3(2, -1.5f, 7);\n```\n\nNotice the parameters to the `Vector3` structure are defined as `float` so an `f` suffix is required for floating point values.\n\nAnd now it looks a little more like a box. The camera is still pointing straight down the Z axis, but the box has been moved to the right and down, and you can see the top and left side.\n\nYou can probably also tell that the rear of the box is a little smaller than the front. By default, the camera employs a perspective projection which results in objects further from the camera being smaller than those closer to the camera. Urho also supports an orthographic camera, which does not employ projection and makes 3D objects look more like those in an engineering drawing.\n\n## Adjusting the Light\n\nThe illusion of three dimensions is also influenced by different shading on the three visible sides of the box. However, it appears that the left and front of the box are the same shade, which does not help the 3D effect.\n\nUrhoSharp supports three basic types of light:\n\n* *Directional*: Light streaming in a particular direction from a seemingly infinite distance, much like the sun.\n\n* *Point*: Light streaming in all directions from a particular point, much like a lightbulb hanging from a wire.\n\n* *Spot*: Light coming from a particular point, but only streaming in a particular direction, much like a flashlight.\n\nThese are the three members of the `LightType` enumeration. Directional light has a direction; point light has a position; and spot light has both a position and direction. In addition, these different types of light sources can be customized by different properties of the `Light` class.\n\n`SimpleApplication` creates a point light source with a particular position that you can query like so:\n\n```csharp\nVector3 lightPosition = app.LightNode.Position;\n```\n\nBecause the light node is a subnode of the camera node (as you can verify by examining the `Start` method in `SimpleApplication`), the position of the light is relative to the position of the camera.\n\nYou can see a difference if you shift the light to the center of the coordinate system and raise it a bit:\n\n```csharp\napp.LightNode.Position = new Vector3(0, 15, 0);\n```\n\nNow you’ll see all three sides of the box illuminated with different degrees of light. There is also some ambient light defined in the scene.\n\n## The Camera Field of View\n\nBy changing the `Position` property of the `boxNode` object, you can move the box nearer to the camera or further away, and you can move it anywhere around the window. If the box is very close to the camera, you don’t have much leeway in the X and Y coordinates. Try this:\n\n```csharp\nboxNode.Position = new Vector3(-1, 0.75f, 3);\n```\n\nThe box is large because it’s close to the camera, but it’s partially out of the window. Now try this:\n\n```csharp\nboxNode.Position = new Vector3(10, 15, 50);\n```\n\nThe box seems very far away but it’s safely within the window. You can experiment with other values (and you definitely should) to get a feel for this, but you might also have a need to quantify this relationship.\n\nOne of the crucial properties of the [`Camera` class](https://developer.xamarin.com/api/type/Urho.Camera/) is named `Fov`, which stands for *field of view*. It’s an angle in degrees, but in practice it’s roughly equivalent to a zoom factor. By default the value is 45 degrees. You can access the `Camera` object that is created by `SimpleApplication` through the `Camera` property. Try changing the `Fov` property to 90:\n\n```csharp\napp.Camera.Fov = 90;\n```\n\nThe box seems to move away. We’ve zoomed out. Try changing it to a value less than 45 degrees to zoom in. When you’re finished experimenting, change it back to the default value of 45 because the rest of this discussion is based on that value:\n\n```csharp\napp.Camera.Fov = 45;\n```\n\nThe camera is located at the origin of the 3D coordinate system and pointing in the direction of the positive Z axis. Viewed from the side (from the vantage point of the positive X axis), the camera’s field of view looks like this:\n\n![Camera Point of View](Figure3.png)\n\nThe camera is shown as a little box on the origin, and the field of view is shown as two slanted blue lines. Almost everything between those two blue lines is within the range of the camera and visible within the window. (But not quite: The range of a perspective camera is actually described by a square frustum. which is a four-sided pyramid with the top shaved off. The `Camera` class defines two properties named `NearClip` and `FarClip` that define a range of distance that is visible to the camera. By default these properties have values of 0.1 and 1000. In most normal cases, you don’t have to worry about these values, but they’re necessary for the internal camera math to work.)\n\nThe diagram above shows the default `Fov` property value of 45 degrees. If you increase the field of view, a larger range becomes visible to the camera. It’s similar to zooming out. You can zoom into a scene by decreasing the field of view.\n\nGraphics objects in the window are rendered so that the height of the window corresponds to the field of view. The width of the window might be the same as the height, less than the height, or greater than the height, which might correspond to the same field of view, or a a lower field of view, or a greater field of view. The ratio of the window’s width to its height is available as the `AspectRatio` property of the camera.\n\nTo quantify the relationship between the distance of an object from the camera and its visual size within the window, draw a line that bisects the Z axis, and label it H for *height*. The distance from that line to the camera is labeled D for *distance*:\n\n![Camera Distance and Width](Figure4.png)\n\nNow you’ve defined two similar triangles, and it becomes a problem in trigonometry:\n\ntan(FOV / 2) = (H / 2) / D\n\nor:\n\nH = 2D tan (FOV / 2)\n\nFor example, suppose a 3D object is 5 units from the camera. How tall would the object need to be to occupy the full height of the window? If FOV is 45 degrees, the tanget of 22.5 degrees is 0.414, and H equals 4.14 units.\n\nThe dimension of the `Box` object is a unit square: 1 unit by 1 unit by 1 unit. The value of the `Position` property corresponds to the center of the `Box`. To position the front of the `Box` five units from the camera, the Z coordinate of the `Position` property must be set to 5.5.\n\nTo position the box precisely in the upper-right corner of the window, the X and Y coordinates of the `Position` property must be set to 0.5 units less than half the width and half the height of the window. The following code cell performs this calculation. Notice the Urho `MathHelper.DegreesToRadians` call for converting the angle in degrees to radians for the `Math.Tan` function:\n\n```csharp\nfloat D = 5.0f;\nfloat FOV = app.Camera.Fov;\nfloat y = 2 * D * (float)Math.Tan(MathHelper.DegreesToRadians(FOV / 2)) / 2;\nfloat x = app.Camera.AspectRatio * y;\n\nboxNode.Position = new Vector3(x - 0.5f, y - 0.5f, D + 0.5f);\n```\n\nRegardless of the window size (set in the `ApplicationOptions` argument to the `SimpleApplication.Show` method) and the camera field of view, the box should be positioned in the upper-right corner of the window.\n\n## Exploring Shapes\n\nThe following code creates another `Node` with a component for a donut-like shape known as a *torus*. The code is similar to the creation of `boxNode`:\n\n```csharp\n// Remove node named \"shapeNode\" so there are no duplicates\nmainNode.RemoveChild(mainNode.GetChild(\"shapeNode\", false));\n\n// Create a node for a Torus component\nNode shapeNode = mainNode.CreateChild(\"shapeNode\");\nShape shape = shapeNode.CreateComponent<Torus>();\n```\n\nNow that’s interesting! The camera is sitting in the middle of the torus (where the hole of the donut is) and part of the torus is visible from that perspective.\n\nTo see the whole torus, you can change its position (as with the box) but another solution is to change the position of the camera. This statement moves the camera back along the negative Z axis, as well as moving it to the left and up:\n\n```csharp\napp.CameraNode.Position = new Vector3(-1, 1.5f, -6);\n```\n\nAfter running that code, you might have expected the torus to remain in the center of the screen. But keep in mind that the camera is still pointed in the positive Z direction. To position the torus in the center of the screen, the camera must be pointed at the torus, which is at the origin of the coordinate system.\n\nPointing the camera at the origin is actually easier than it might seem. The vector that points from one position to another position is the difference between the coordinates. You can calculate the vector that points from the camera to the origin by subtracting the camera position from the origin. This is equivalent to the negative of the camera position:\n\n```csharp\napp.CameraNode.SetDirection(-app.CameraNode.Position);\n```\n\nThat code will always point the camera to the 3D origin. And now the torus is in the center of the screen.\n\nYou can also move and zoom the camera using the keyboard. Make sure the Urho3D window has the input focus, and press W and S to zoom the camera in and out, and A and D to move the camera left and right. These four keys form an inverted T on the keyboard. As you move the camera left or right, notice that 3D objects seem to move opposititely.\n\nYou can also move the camera up, down, left, and right with the mouse. Move the mouse pointer inside the window, press the mouse button, and drag. This moves the camera, and 3D objects seem to move in the opposite direction.\n\nTry the other shapes in the code cell above that creates the `shape` object using the `CreateComponent` generic function. They are: `Cone`, `Cylinder`, `Plane`, `Pyramid`, and `Sphere`. For `Plane` you’ll need to fully qualify the class name: `Urho.Shapes.Plane`.\n\nOf course, you can change the color of this object. The color is not something common to all nodes, so it’s not a `Node` property. Instead, set the `Color` property of the `Shape` object. Several static fields are availble for common colors:\n\n```csharp\nshape.Color = Color.Cyan;\n```\n\nOr, you can use a constructor of the `Color` structure:\n\n```csharp\nshape.Color = new Color(0.5f, 1.0f, 0.25f, 1);\n```\n\nThe arguments range from 0 to 1 and are in the order red, green, blue, and alpha, which governs transparency.\n\nBefore proceeding to the next section, move whatever shape you’re now looking at away from the origin:\n\n```csharp\nshapeNode.Position = new Vector3(-2, 2, 10);\n```\n\n## Translation, Scaling, and Rotation\n\nThe following code positions a cylinder on the origin:\n\n```csharp\n// Remove node named \"shapeNode\" so there are no duplicates\nmainNode.RemoveChild(mainNode.GetChild(\"cylinderNode\", false));\n\n// Create a node for a Cylinder component\nNode cylinderNode = mainNode.CreateChild(\"cylinderNode\");\nCylinder cylinder = cylinderNode.CreateComponent<Cylinder>();\n```\n\nThe cylinder is one unit tall and has a one unit diameter. But what if you want a cylinder of a different size or proportions? Or perhaps you need to tip it over so that the ends are parallel to the YZ plane rather than the XZ plane.\n\nThese are jobs for graphics *transforms*, of which there are three basic types:\n\n* Translation: change the location of an object\n\n* Scaling: change the size of an object\n\n* Rotation: change the orientation of an object\n\nVery often you’ll combine these transforms.\n\nThe transforms are applied to the `Node` object, and they affect all the node’s children as well. This feature allows you to create a composite object and move, scale, or rotate it as a whole.\n\nThe three properties that you set to realize these transforms are:\n\n* `Position` of type `Vector3`, which you’ve already seen\n\n* `Scale` of type `Vector3`\n\n* `Rotation` of type `Quaternion`\n\nThere are also some methods that you can use for transforms. For example, the `Translate` method changes the `Position` property, but the effect is accumulative: Every time you call `Translate`,  the `Position` property is changed by that amount.\n\nSimilarly, the `ScaleNode` method is accumulative but the `SetScale` method is not. The `Pitch`, `Yaw`, and `Roll` methods are named after terms used in aerodynamics and perform accumulative rotations around the X, Y, and Z axes, respectively.\n\nTransforms can often be difficult to understand, and rotations in particular can be very complex. This discussion is intended as a brief introduction.\n\nThe default `Scale` property is the `Vector3` value (1, 1, 1). You can control the scaling factors on all three dimensions independently. Set them to values greater than 1 to increase the size. For example, a value of 2 doubles the size in that dimension. Set them to values less than 1 to decrease the size.\n\nFor example, suppose you want to make the cylinder skinnier but with double the length:\n\n```csharp\ncylinderNode.Scale = new Vector3(0.5f, 2, 0.5f);\n```\n\nIt’s necessary to set the X and Z scaling factors to the same values if you want to keep the cylinder round, but nothing prevents you from setting them to different values for an elliptical cylindar.\n\nWatch out: The default `Scale` property is (1, 1, 1) and not (0, 0, 0). If you set `Scale` to (0, 0, 0), the object will disappear.\n\nThree-dimensional rotation is an exceptionally complex topic, which you might have discerned from the type of the `Rotation` property being the `Quaternion` structure. A quaternion is a mathematical descripton of a 3D rotation and can be difficult to grasp intuitively, mostly because it involves three different types of imaginary numbers. The big advantage of quaternions in 3D computer graphics is that they interpolate well, which results in smooth animations.\n\nFortunately, there are simpler ways to describe 3D rotation. Perhaps easiest to visualize is the axis-angle rotation. You specify an axis, for instance, the X axis, and a rotational angle around that axis. A simple static method converts that rotation into a `Quaternion` value.\n\nOften you’ll want to rotate something around the X, Y, or Z axis. The `Vector3` structure defines three static readonly fields named `UnitX`, `UnitY`, and `UnitZ` which are vectors that equal **(1, 0, 0)**, **(0, 1, 0)**, and **(0, 0, 1)**, respectively. Here’s how to rotate the cylinder 45 degrees around the Z axis:\n\n```csharp\ncylinderNode.Rotation = Quaternion.FromAxisAngle(Vector3.UnitZ, 45);\n```\n\nYou can predict the direction of rotation from another left hand rule: Point the thumb of your left hand in the direction of the axis of rotation, in this case the postive Z axis going into the screen. The other fingers of your left hand curl in the direction of positive rotation angles.  You can change the direction by changing the sign of the rotation angle, or the direction of the axis.\n\nYou can now set the `Position` property to shift the cylinder so the bottom end is at the origin:\n\n```csharp\ncylinderNode.Position = new Vector3(-0.707f, 0.707f, 0);\n```\n\nBefore continuing, move the cylinder to the background:\n\n```csharp\ncylinderNode.Position = new Vector3(-0.707f, 0.707f, 12);\n```\n\n## Displaying the Axes\n\nVery thin cylinders can be used to draw some rudimentary straight lines in 3D space. Here’s a function that accepts a `Node` argument and creates 60 subnodes to  draw the axes of the 3D coordinate system. Each cylinder is scaled to a size of (0.025, 0.90, 0.25) and 10 each are stacked in the positive and negative X, Y, and Z directions:\n\n```csharp\nvoid CreateAxes(Node axesNode)\n{\n    Vector3[] unitVectors = { Vector3.UnitX, Vector3.UnitY, Vector3.UnitZ };\n\n    foreach (Vector3 unitVector in unitVectors)\n    {\n        for (int i = -10; i < 10; i++)\n        {\n            Node node = axesNode.CreateChild();\n            Cylinder cylinder = node.CreateComponent<Cylinder>();\n            cylinder.Color = Color.Black;\n            cylinder.CastShadows = false;\n            node.Scale = new Vector3(0.025f, 0.90f, 0.025f);\n\n            if (unitVector == Vector3.UnitX)\n            {\n                node.Rotation = Quaternion.FromAxisAngle(Vector3.UnitZ, 90);\n            }\n            else if (unitVector == Vector3.UnitZ)\n            {\n                node.Rotation = Quaternion.FromAxisAngle(Vector3.UnitX, 90);\n            }\n            node.Position = (i + 0.5f) * unitVector;\n        }\n    }\n}\n```\n\nVery little in this function should be new. The `CastShadows` property of the `Cylinder` is set to `false`; this prevents the axes from casting shadows on other objects. Also, notice how the `Position` property of each `Node` is set: The `Vector3` structure supports multiplication of a vector by a number, often called a *scalar* in this context.  The number is multiplied by all three components of the vector, but in this case two of them are zero.\n\nTo render these axes, create a child node and pass it to the `CreateAxes` function:\n\n```csharp\n// Remove node named \"axesNode\" so there are no duplicates\nmainNode.RemoveChild(mainNode.GetChild(\"axesNode\", false));\n\n// Create node for axes\nNode axesNode = mainNode.CreateChild(\"axesNode\");\nCreateAxes(axesNode);\n```\n\nNow move the `Box` object so that the front left bottom corner is aligned with the origin:\n\n```csharp\nboxNode.Position = new Vector3(0.5f, 0.5f, 0.5f);\n```\n\nThere’s nothing that prevents multiple 3D objects from occupying the same space. Only unobscured surfaces are rendered, so if part of one 3D object is inside another, the hidden surfaces are simply not drawn. The box hides a quarter sliver of each of the three cylinders that it abuts.\n\nThis workbook has introduced you to the Urho 3D coordinate system, but the best way to get more familiar with it is by experimentation with these shapes and by creating others. Have fun!"
  },
  {
    "path": "graphics/urhosharp/custom-geometries/CustomGeometries.workbook/CreateModel.csx",
    "content": "using System;\nusing System.Collections.Generic;\nusing Urho;\n\nModel CreateModel(IList<Vector3> positions,\n                  IList<Vector3> normals = null,\n                  IList<Color> colors = null,\n                  IList<Vector2> texcoords = null)\n{\n    // Check that the positions argument isn't null\n    if (positions == null)\n        throw new ArgumentNullException(\"positions\");\n\n    // Make sure it has a property number of elements\n    int vertexCount = positions.Count;\n\n    if (vertexCount == 0 || vertexCount % 3 != 0)\n        throw new ArgumentOutOfRangeException(\"positions count must be non-zero and a multiple of 3\");\n\n    // Check that the normals argument is consistent, or create it\n    if (normals != null)\n    {\n        if (normals.Count != vertexCount)\n            throw new ArgumentOutOfRangeException(\"texcoords must have same count as positions\");\n    }\n    else\n    {\n        normals = new Vector3[vertexCount];\n\n        for (int i = 0; i < vertexCount; i += 3)\n        {\n            normals[i + 0] = Vector3.Cross(positions[i + 1] - positions[i + 0],\n                                            positions[i + 2] - positions[i + 0]);\n\n            normals[i + 1] = Vector3.Cross(positions[i + 2] - positions[i + 1],\n                                            positions[i + 0] - positions[i + 1]);\n\n            normals[i + 2] = Vector3.Cross(positions[i + 0] - positions[i + 2],\n                                            positions[i + 1] - positions[i + 2]);\n        }\n    }\n\n    // Create the VertexBuffer object; set it in one of the blocks below\n    VertexBuffer vertexBuffer = new VertexBuffer(Application.CurrentContext, false)\n    {\n        Shadowed = true\n    };\n\n    // If texcoords is non-null, use a PositionNormalColorTexcoord structure\n    if (texcoords != null)\n    {\n        if (texcoords.Count != vertexCount)\n            throw new ArgumentOutOfRangeException(\"texcoords must have same count as positions\");\n\n        if (colors != null && colors.Count != vertexCount)\n            throw new Exception(\"colors must have same count as positions\");\n\n        var vertices = new VertexBuffer.PositionNormalColorTexcoord[vertexCount];\n\n        for (int i = 0; i < vertexCount; i++)\n        {\n            vertices[i].Position = positions[i];\n            vertices[i].Normal = normals[i];\n            vertices[i].Color = colors == null ? 0 : colors[i].ToUInt();\n            vertices[i].TexCoord = texcoords[i];\n        }\n\n        vertexBuffer.SetSize((uint)vertexCount, ElementMask.Position |\n                                                ElementMask.Normal |\n                                                ElementMask.Color |\n                                                ElementMask.TexCoord1,\n                                                false);\n        vertexBuffer.SetData(vertices);\n    }\n    // If colors is non-null, use a PositionNormalColor structure\n    else if (colors != null)\n    {\n        if (colors.Count != vertexCount)\n            throw new Exception(\"colors must have same count as positions\");\n\n        VertexBuffer.PositionNormalColor[] vertices = new VertexBuffer.PositionNormalColor[vertexCount];\n\n        for (int i = 0; i < vertexCount; i++)\n        {\n            vertices[i].Position = positions[i];\n            vertices[i].Normal = normals[i];\n            vertices[i].Color = colors[i].ToUInt();\n        }\n\n        vertexBuffer.SetSize((uint)vertexCount, ElementMask.Position | \n                                                ElementMask.Normal | \n                                                ElementMask.Color, false);\n        vertexBuffer.SetData(vertices);\n    }\n    // Otherwise use the PositionNormal structure\n    else\n    {\n        VertexBuffer.PositionNormal[] vertices = new VertexBuffer.PositionNormal[vertexCount];\n\n        for (int i = 0; i < vertexCount; i++)\n        {\n            vertices[i].Position = positions[i];\n            vertices[i].Normal = normals[i];\n        }\n\n        vertexBuffer.SetSize((uint)vertexCount, ElementMask.Position | \n                                                ElementMask.Normal, false);\n        vertexBuffer.SetData(vertices);\n    }\n\n    // Create the Geometry object\n    Geometry geometry = new Geometry();\n    geometry.SetVertexBuffer(0, vertexBuffer);\n    geometry.SetDrawRange(PrimitiveType.TriangleList, 0, 0, 0, (uint)vertexCount, true);\n\n    // Create the Model object\n    Model model = new Model();\n    model.NumGeometries = 1;\n    model.SetGeometry(0, 0, geometry);\n    model.BoundingBox = new BoundingBox(new Vector3(-10, -10, -10), new Vector3(10, 10, 10));\n\n    return model;\n}\n"
  },
  {
    "path": "graphics/urhosharp/custom-geometries/CustomGeometries.workbook/index.workbook",
    "content": "﻿---\nid: cb210751-0da5-43e6-bcfb-74a14f1861b1\nuti: com.xamarin.workbook\ntitle: \"UrhoSharp: Custom Geometries\"\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n# Working with Urho Custom Geometries\n\nThis workbook is an introduction to custom geometries in UrhoSharp. The techniques shown here allow you to define your own 3D shapes algorithmically.\n\nUrhoSharp is a powerful cross-platform 3D graphics engine available to Xamarin and .NET developers for games or visualization. If you’re unfamiliar with Urho concepts, you’ll want to download and run the **Exploring Urho Coordinates** and **Creating Urho Compound Shapes** workbooks first.\n\nWait until the workbook has completely finished loading before executing the following code cell:\n\n```csharp\n#r \"Urho\"\n```\n\nThis workbook requires only one namespace for UrhoSharp types:\n\n```csharp\nusing Urho;\n```\n\nAs usual when exploring Urho in a workbook, call the static `SimpleApplication.Show` method to create a window for the Urho graphics. The argument to the `ApplicationOptions` constructor is a folder from which resources can be loaded:\n\n```csharp\nSimpleApplication app = SimpleApplication.Show(\n    new ApplicationOptions(\"Data\")\n    {\n        Width = 1000,\n        Height = 1000   \n    });\n```\n\nYou should see a window appear on the desktop as the `Show` method completes.\n\n## Preliminaries\n\n`SimpleApplication` creates a camera, a point light source, and a root node for visuals. In preparation for this workbook, first move the camera back a little from the origin and make sure that it is pointing in the direction of the positive Z axis (that is, into the screen):\n\n```csharp\napp.CameraNode.Position = new Vector3(0, 0, -5);\napp.CameraNode.SetDirection(new Vector3(0, 0, 1));\n```\n\nSet the position of the root node at the origin. This is where the 3D graphics will be positioned throughout this workbook:\n\n```csharp\napp.RootNode.Position = new Vector3(0, 0, 0);\n```\n\nRemove the point light (which is a subnode of the camera) and add a directional light coming from above and behind the viewer’s left shoulder. The following is identical to code in the **Creating Urho Compound Shapes** workbook:\n\n```csharp\n// Remove the point light\napp.CameraNode.RemoveAllChildren();\n\n// Remove previous directionalLight node before adding new one\napp.Scene.RemoveChild(app.Scene.GetChild(\"directionalLight\"));\nNode lightNode = app.Scene.CreateChild(\"directionalLight\");\n\n// Create the light compononent\nLight light = lightNode.CreateComponent<Light>();\nlight.LightType = LightType.Directional;\nlight.Color = new Color(0.65f, 0.65f, 0.65f);\n\n// Set the direction of the directional light\nlightNode.SetDirection(new Vector3(2, -3, 1));\n\n// Set the ambient light\napp.Zone.AmbientColor = new Color(0.35f, 0.35f, 0.35f);\n```\n\nDisable the code in `SimpleApplication` that moves the camera in response to mouse and touch:\n\n```csharp\napp.MoveCamera = false;\n```\n\nInstead, define an event handler that uses mouse movement to apply a rotate transform to `RootNode`. This will allow you to rotate the 3D graphics created in this workbook by sweeping the mouse along the Urho window with the left mouse button depressed:\n\n```csharp\nvoid ProcessMouseMovement(UpdateEventArgs args)\n{\n    if (app.Input.GetMouseButtonDown(MouseButton.Left))\n    {\n        Vector2 mouseMove = new Vector2(app.Input.MouseMove.X, -app.Input.MouseMove.Y);\n        float angle = mouseMove.Length;         // 1 degree per pixel is simple\n\n        if (angle > 0)\n        {\n            Vector3 axis = new Vector3(mouseMove.Y, -mouseMove.X, 0);\n            app.RootNode.Rotate(Quaternion.FromAxisAngle(axis, angle), TransformSpace.Parent);\n        }\n    }\n}\n```\n\nThe following code is described towards the bottom of the **Creating Urho Compound Shapes** workbook. It removes all previous handlers on the `Update` event and attaches the event handler shown above:\n\n```csharp\n// Detach ALL Update handlers\nusing System.Reflection;\nFieldInfo field = typeof(Application).GetField(\"Update\", BindingFlags.Instance | BindingFlags.NonPublic);\nfield.SetValue(app, null);\n\napp.Update += ProcessMouseMovement;\n```\n\nThat completes the preliminaries.\n\n## Terminology and Classes\n\nIn 3D graphics, the word *model* generally refers to a description of a three-dimensional object. The model generally combines a *geometry*, which is a collection of connected 3D coordinate points, and a *material*, which describes how the geometric surfaces are colored. How the model is actually rendered depends on other factors, such as the camera, lights, and transforms.\n\nThe names of the Urho classes do not exactly coincide with these definitions. Urho defines a `Geometry` class that describes a 3D surface based on *vertices*, which are 3D coordinate points connected to form surfaces. The `Model` class combines multiple `Geometry` objects. The `StaticModel` class essentially combines a `Model` object and `Material` objects, which describes how the geometries are rendered with colors or bitmaps.\n\n`StaticModel` derives from `Component`, which means that a `StaticModel` object can be associated with a node and be assigned a position and subjected to transforms. The `Shape` class derives from `StaticModel`, and from `Shape` derives `Box`, `Cylinder`, `Sphere`, and other basic shapes described in previous workbooks. Also deriving from `StaticModel` is `AnimatedModel`, which allows a program to dynamically change the vertices that make up the geometries.\n\nGenerally developers create complex 3D models in interactive applications designed specifically for that purpose. However, geometries can also be created algorithmically, and that is the focus of this workbook.\n\n## Triangles, Vertices, and the VertexBuffer\n\nA 3D geometry is most often a *triangle mesh*, which is a collection of triangles that fit together to define a surface in three-dimensional space. Triangles are used for this purpose because they are the simplest two-dimensional objects, and they are always flat in three-dimensaional space. Any other polygon (such as a pentagon) can be decomposed into triangles.\n\nA triangle has three vertices. When you use triangles to define a 3D surface, each vertex of each triangle has several characteristics associated with it. These are the most common:\n\n* The most obvious is the *position* of the vertex in 3D space. This is specified with a `Vector3` value.\n\n* Also often associated with each vertex is a *normal*, which is a vector that is parallel to the surface of the triangle at the vertex. It might seem as if this value could be calculated automatically (and it sometimes is), but it is possible to manipulate normals to give triangles the appearance of being curved. The normal is specified with a `Vector3` value.\n\n* A vertex can have a particular *color*, in which case the colors at three vertices are interpolated over the surface of the triangle. Generally you specify a color as an unsigned integer, which can be obtained directly from a `Color` value.\n\n* Sometimes a bitmap (called as *texture*) is used to cover the surface of a 3D object. In this case, the 3D system needs to know how to map the two-dimensional coordinates of the texture to each triangle. This information is provided with texture coordinates for each vertex, which are relative to the two-dimensional texture and therefore `Vector2` values rather than `Vector3` values.\n\n* A *tangent* of type `Vector4` is sometimes provided for each vertex, but this is for somewhat more advanced techniques, which won’t be demonstrated in this workbook.\n\nTo help consolidate this information, the `VertexBuffer` class defines four embedded public structures:\n\n* `PositionNormal` with `Position` and `Normal` fields\n\n* `PositionNormalColor` with `Position`, `Normal`, and `Color` fields\n\n* `PositionNormalColorTexcoord` with `Position`, `Normal`, `Color`, and `TexCoord` fields\n\n* `PositionNormalColorTexcoordTangent` with `Position`, `Normal`, `Color`, `TexCoord`, and `Tangent` fields\n\nHow these various fields are actually used is specified by the `Material` object set on the `StaticModel` object.\n\n## The Simplest Geometry\n\nThe simplest type of 3D object is a triangle. The following code defines an array of three `VertexBuffer.PositionNormalColor` values whose `Position` fields define the three coordinates of a triangle in the XY plane centered around the origin. When the triangle is displayed, it should appear to be directly in front of the camera:\n\n```csharp\nVertexBuffer.PositionNormalColor[] vertices = \n{\n    new VertexBuffer.PositionNormalColor\n    { \n        Position = new Vector3(0, 1, 0), \n        Normal = new Vector3(0, 0, -1),\n        Color = Color.Red.ToUInt() \n    },\n    new VertexBuffer.PositionNormalColor\n    { \n        Position = new Vector3(0.86f, -0.5f, 0), \n        Normal = new Vector3(0, 0, -1),\n        Color = Color.Green.ToUInt() \n    },\n    new VertexBuffer.PositionNormalColor\n    { \n        Position = new Vector3(-0.86f, -0.5f, 0), \n        Normal = new Vector3(0, 0, -1),\n        Color = Color.Blue.ToUInt() \n    }\n};\n```\n\nThe three `Normal` fields are all set to the same vector, which points in the direction of the negative Z axis. This vector is perpendicular to the triangle and points towards the camera. The three `Color` fields are red, green, and blue.\n\nThe array of `PositionNormalColor` values must be stored in a `VertexBuffer` object:\n\n```csharp\nVertexBuffer vertexBuffer = new VertexBuffer(Application.CurrentContext, false)\n{\n   Shadowed = true\n};\nvertexBuffer.SetSize((uint)vertices.Length, ElementMask.Position | ElementMask.Normal | ElementMask.Color, false);\nvertexBuffer.SetData(vertices);\n```\n\nThe `SetSize` call must include `ElementMask` enumeration flags corresponding to the particular structure that you have selected for storing the vertex information. Internally, the C++ code obtains the vertex data as a simple void pointer, so it needs to use the flags set in `SetSize` to interpret that data.\n\nAlthough this particular `vertices` array clearly defines the three coordinates of a triangle, often vertex information is more complex, and the entire network of triangles often share vertices. For this reason, another array is required to indicate how the various vertices form triangles. This is an array of `short` values that are indices into the `vertices` array.\n\nThe number of elements in this array must be a multiple of three. Each group of three indices specifies one triangle. In this particular case, the array is very simple:\n\n```csharp\nshort[] indices = \n{\n    0, 1, 2\n};\n```\n\nThe order of these vertex indices matters. The three vertices of a triangle can be specified in either a clockwise or a counter-clockwise direction. If the vertices are specified in a clockwise direction, then for the same triangle viewed from behind, the vertices are counter-clockwise. The surface of a triangle will only be visible from the perspective of clockwise vertices.\n\nThe three vertices of the triangle defined in the `vertices` array are in this order when viewed from the perspective of the camera: top, lower-right, lower-left. This means that the indices need only be sequential for the triangle to be visible. The sequence 1, 2, 0 or 2, 0, 1 would be just as good.\n\nThe array of indices must be stored in an `IndexBuffer`, which is similar in syntax to the `VertexBuffer`:\n\n```csharp\nIndexBuffer indexBuffer = new IndexBuffer(Application.CurrentContext, false)\n{\n   Shadowed = true\n};\nindexBuffer.SetSize((uint)indices.Length, false, false);\nindexBuffer.SetData(indices);\n```\n\nThe `VertexBuffer` and the `IndexBuffer` objects are brought together in a `Geometry` object. The `SetDrawRange` call must follow the setting of the `VertexBuffer` and the `IndexBuffer`:\n\n```csharp\nGeometry geometry = new Geometry();\ngeometry.SetVertexBuffer(0, vertexBuffer);\ngeometry.IndexBuffer = indexBuffer;\ngeometry.SetDrawRange(PrimitiveType.TriangleList, 0, (uint)indices.Length, true);\n```\n\nThe `PrimitiveType.TriangleList` enumeration member specifies the basic relationship between the vertices and indices. There are other formats that this geometry data can take, but this is by far the most common.\n\nYou can simplify this process somewhat by dispensing with the `IndexBuffer`. In that case, the number of vertices referenced by the `VertexBuffer` must be a multiple of 3, and if triangles share vertices, the vertices must appear separately for each triangle. An overload of the `SetDrawRange` method accomodates the case where there are no indices.\n\nThe `Model` object can consolidate multiple geometries. This particular `Model` contains only the one geometry:\n\n```csharp\nModel model = new Model();\nmodel.NumGeometries = 1;\nmodel.SetGeometry(0, 0, geometry);\nmodel.BoundingBox = new BoundingBox(new Vector3(-1, -1, -1), new Vector3(1, 1, 1));\n```\n\nNow you are ready to create a node for displaying the triangle. As usual in a workbook, the code to create a node begins with a statement to delete the node in the event that this code cell is re-executed:\n\n```csharp\n// Remove possible previous node before creating new node\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"triangleNode\", false));\n\n// Create the node and a StaticModel\nNode triangleNode = app.RootNode.CreateChild(\"triangleNode\");\nStaticModel triangle = triangleNode.CreateComponent<StaticModel>();\n```\n\nAfter the `Node` object has been created, a call to `CreateComponent` creates a `StaticModel` component associated with the node.\n\nSet the `Model` created earlier to the `Model` property of the `StaticModel` component:\n\n```csharp\ntriangle.Model = model;\n```\n\nYou should at long last see a triangle in the Urho window. It is colored gray because there is not yet a `Material` object associated with the component. Use a simple `Material` object to give the triangle a blue color:\n\n```csharp\ntriangle.SetMaterial(Material.FromColor(Color.Blue));\n```\n\nThere is no `Color` property of `StaticModel`. The `Color` property used in previous workbooks is defined by the `Shape` class.\n\n## Variations on the Triangle\n\nThe triangle appears dark blue because it is not directly facing the light. Move the mouse inside the Urho window and press the left button to give the window input focus. Now press the left button again and when you move the mouse, you should be able to rotate the triangle so it faces more towards the light source coming from above and behind the viewer’s left shoulder. The triangle is fully illuminated when the direction of the light is exactly opposite the normals at the vertices of the triangle.\n\nYou can use the mouse to rotate the triangle so that the back of the triangle faces the camera. In that case, the triangle disappears. However, if you go back to the definition of the `indices` array, and change the order to 0, 2, 1, and re-execute that cell, then the triangle will appear again because now the vertices are specified in a clockwise direction from the perspective of the back of the triangle. However, the normals still indicate the same direction relative to the triangle, so the triangle becomes fully illuminated when the visible part is facing away from the light!\n\nGo back and change the indices back to the original order: 0, 1, 2.\n\nThe original `vertices` array also includes settings of a `Color` field, but those fields are apparently being ignored. To use those `Color` settings in the rendering of the triangle, you must specify a different `Material` object. This `Material` object must use a particular *technique*, which is generally a read-only property from the `CoreAssets.Techniques` static class. The technique used here is called `NoTextureVCol`. The `NoTexture` part of the technique name indicates that the material does not involve a bitmap; the `VCol` part means that it uses the vertex color setting:\n\n```csharp\nMaterial material = new Material();\nmaterial.SetTechnique(0, CoreAssets.Techniques.NoTextureVCol, 1, 1);\ntriangle.SetMaterial(material);\n```\n\nNow you’ll see the top vertex colored red, the bottom left vertex colored blue, and the bottom right vertex colored green. The rest of the triangle is colored with an interpolated value. These colors are still affected by directional light: The colors become brighter if you rotate the triangle so it’s more directly illuminated by the directional light.\n\nThe ability of a 3D graphics system to color a triangle with interpolated values is an important part of the shading algorithms that enables the appearance of curved surfaces.\n\nBefore continuing, remove the triangle from the root note to make room for other visual objects:\n\n```csharp\napp.RootNode.RemoveChild(triangleNode);\n```\n\n## Rendering a Tetrahedron\n\nTo reduce code bulk in the remainder of this workbook, all the code required to create a `Model` object has been consolidated in an external C# script file:\n\n```csharp\n#load \"CreateModel.csx\"\n```\n\nYou can look it over at your leisure. The file has a single method named `CreateModel` with the following syntax:\n\n`Model CreateModel(IList<Vector3> positions, IList<Vector3> normals = null, IList<Color> colors = null, IList<Vector2> texCoords = null);`\n\nThe only argument that’s required is an array or a `List` of `Vector3` values for the `positions`. The number of `positions` elements must be a multiple of three. Each group of three values defines a triangle. The code uses the `SetDrawRange` overload that does not require indices. Consequently, there is no way with this method for a vertex be be shared among two or more triangles.\n\nIf normals are not provided, they are calculated. You’ll see below how you can use this feature for different types of shading.\n\nHere is the `CreateModel` method in action to create a `Model` object for a tetrahedron, which is the simplest regular polyhedron. The tetrahedron consists of four sides, each of which is a triangle. The coordinates of these vertices correspond to four corners of a unit cube:\n\n```csharp\nModel tetrahedronModel = CreateModel(new Vector3[]\n{\n    new Vector3(-1,  1, -1), new Vector3(-1, -1,  1), new Vector3( 1,  1,  1),\n    new Vector3( 1, -1, -1), new Vector3( 1,  1,  1), new Vector3(-1, -1,  1),\n    new Vector3( 1,  1,  1), new Vector3( 1, -1, -1), new Vector3(-1,  1, -1),\n    new Vector3(-1, -1,  1), new Vector3(-1,  1, -1), new Vector3( 1, -1, -1)\n});\n```\n\nThe following code is all that’s necessary to display it:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"tetrahedronNode\", false));\nNode tetrahedronNode = app.RootNode.CreateChild(\"tetrahedronNode\");\nStaticModel tetrahedron = tetrahedronNode.CreateComponent<StaticModel>();\ntetrahedron.Model = tetrahedronModel;\ntetrahedron.SetMaterial(Material.FromColor(Color.Red));\n```\n\nWhen you are finished twirling it around with the mouse, you can remove it from the root node in preparation for the next object:\n\n```csharp\napp.RootNode.RemoveChild(tetrahedronNode);\n```\n\n## From Disk to Cone\n\nMany algorithmically generated models have curved surfaces. To create these surfaces, it is necessary to use trigonometry. Many common figures can be created knowing only the formulas for a circle:\n\nx = cos(α)\n\ny = sin(α)\n\nFor α ranging from 0 to 360 degrees (or from 0 to 2π radians), the *x* and *y* values define a circle with a radius of 1 centered on the two dimensional point (0, 0). In a 3D coordinate system where values of *x* increase to the right and values of *y* increase going up, the angle is counter-clockwise from the positive X axis.\n\nPerhaps the easiest way to begin using these formulas is by creating a two-dimensional disk. A disk can be constructed of triangles that share a common point in the center of the disk.\n\nThe number of triangles is up to you. Generally you set the value in a variable or constant called something like `slices` or `stacks` (and sometimes you need both):\n\n```csharp\nint slices = 24;\n```\n\nThat’s the number of triangles. There will be a total of 24 × 3 (or 72) vertices, but defining a `List<Vector3>` to store the vertices is usually easier than a `Vector3` array:\n\n```csharp\nList<Vector3> diskVertices = new List<Vector3>();\n```\n\nAs you loop through all the triangles to calculate their vertices, the following value will be useful:\n\n```csharp\nfloat angleIncrement = 360 / slices;\n```\n\nFor 24 triangles, `angleIncrement` is 15 degrees.\n\nThe `for` loop to set the positions is preceded by a statement that clears `diskVertices` in case the cell is run again. Within the loop, four values are first calculated for each triangle. These comprise two (*x*, *y*) coordinates along the circumference of the circle:\n\n```csharp\ndiskVertices.Clear();\n\nfor (float angle = 0; angle < 360; angle += angleIncrement)\n{\n    float xThis = (float)Math.Cos(MathHelper.DegreesToRadians(angle));\n    float yThis = (float)Math.Sin(MathHelper.DegreesToRadians(angle));\n\n    float xNext = (float)Math.Cos(MathHelper.DegreesToRadians(angle + angleIncrement));\n    float yNext = (float)Math.Sin(MathHelper.DegreesToRadians(angle + angleIncrement));\n\n    diskVertices.Add(new Vector3(0, 0, 0));\n    diskVertices.Add(new Vector3(xNext, yNext, 0));\n    diskVertices.Add(new Vector3(xThis, yThis, 0));\n}\n```\n\nIn this code and in code in the rest of this workbook, variables containing the word `This` are calculated from the `angle` value in the `for` loop. Variables with the word `Next` refer to the next angle in the loop.\n\nThe code at the bottom of the `for` loop adds three values to the `diskVertices` collection for each triangle: The first `Vector3` is the center of the circle, and the next two are points on the circumference of the circle. Keep in mind that increasing angles define points along the circle’s circumference in a counter-clockwise direction, so the (`xNext`, `yNext`, 0) point is added to the colleciton first, followed by (`xThis`, `yThis`, 0) to define the vertices of the triangle in a clockwise direction.\n\nDisplay the disk like so:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"diskNode\", false));\nNode diskNode = app.RootNode.CreateChild(\"diskNode\");\nStaticModel disk = diskNode.CreateComponent<StaticModel>();\ndisk.Model = CreateModel(diskVertices);\ndisk.SetMaterial(Material.FromColor(Color.Yellow));\n```\n\nIt might be necessary to use the mouse to rotate it into full view.\n\nIn reality, this is not a disk but a 24-sided polygon, sometimes called a icositetragon, and you can clearly see the edges. However, if you change the `slices` value above to 360 and re-run that cell, it should look much rounded.\n\nHere’s another little variation: Instead of setting the first `Vector3` to the point (0, 0, 0), set it to (0, 0, -2) and rerun the cell. Now you’ve created a cone.\n\nIf you rotate the cone so that you’re looking at the inside, it seems to disappear. Triangles are only visible from one side. If you want to have an interior of the cone, define another `List<Vector3>` and fill it with triangles defined counter-clockwise rather than clockwise:\n\n```csharp\nList<Vector3> insideVertices = new List<Vector3>();\n\nfor (float angle = 0; angle < 360; angle += angleIncrement)\n{\n    float xThis = (float)Math.Cos(MathHelper.DegreesToRadians(angle));\n    float yThis = (float)Math.Sin(MathHelper.DegreesToRadians(angle));\n\n    float xNext = (float)Math.Cos(MathHelper.DegreesToRadians(angle + angleIncrement));\n    float yNext = (float)Math.Sin(MathHelper.DegreesToRadians(angle + angleIncrement));\n\n    insideVertices.Add(new Vector3(0, 0, -2));\n    insideVertices.Add(new Vector3(xThis, yThis, 0));\n    insideVertices.Add(new Vector3(xNext, yNext, 0));\n}\n```\n\nNotice that the `Vector3` value using `xThis` and `yThis` is added to the collection before the one using `xNext` and `yNext`. Assuming that you’re now displaying a cone rather than the earlier disk, you can add another cone that is inside of the first one:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"insideNode\", false));\nNode insideNode = app.RootNode.CreateChild(\"insideNode\");\nStaticModel inside = insideNode.CreateComponent<StaticModel>();\ninside.Model = CreateModel(insideVertices);\ninside.SetMaterial(Material.FromColor(Color.Cyan));\n```\n\nNow the outside of the cone is yellow and the inside is cyan.\n\nBefore moving on, remove both nodes:\n\n```csharp\napp.RootNode.RemoveChild(diskNode);\napp.RootNode.RemoveChild(insideNode);\n```\n\n## Cylinder or Dodecagonal Prism?\n\nCreating a cylinder is a step up from the disk and the cone. There are two disks at the two ends of the cylinder. Although these disks are not part of this particular cylinder model, the angles around the disks are calculated in the same way as the disk. The difference is that for each pair of angles, two triangles must be defined that extend from one disk to the other, or four triangles if you want a visible interior as well:\n\n```csharp\nList<Vector3> cylinderVertices = new List<Vector3>();\nint slices = 12;\nfloat angleIncrement = 360 / slices;\n\nfor (float angle = 0; angle < 360; angle += angleIncrement)\n{\n    float cosThis = (float)Math.Cos(MathHelper.DegreesToRadians(angle));\n    float sinThis = (float)Math.Sin(MathHelper.DegreesToRadians(angle));\n\n    float cosNext = (float)Math.Cos(MathHelper.DegreesToRadians(angle + angleIncrement));\n    float sinNext = (float)Math.Sin(MathHelper.DegreesToRadians(angle + angleIncrement));\n\n    // Outside\n    cylinderVertices.Add(new Vector3(cosThis, sinThis, -1));\n    cylinderVertices.Add(new Vector3(cosNext, sinNext, -1));\n    cylinderVertices.Add(new Vector3(cosNext, sinNext, 1));\n\n    cylinderVertices.Add(new Vector3(cosThis, sinThis, -1));\n    cylinderVertices.Add(new Vector3(cosNext, sinNext, 1));\n    cylinderVertices.Add(new Vector3(cosThis, sinThis, 1));\n\n    // Inside\n    cylinderVertices.Add(new Vector3(cosThis, sinThis, -1));\n    cylinderVertices.Add(new Vector3(cosNext, sinNext, 1));\n    cylinderVertices.Add(new Vector3(cosNext, sinNext, -1));\n\n    cylinderVertices.Add(new Vector3(cosThis, sinThis, -1));\n    cylinderVertices.Add(new Vector3(cosThis, sinThis, 1));\n    cylinderVertices.Add(new Vector3(cosNext, sinNext, 1));\n}\n```\n\nFor each angle, four triangles are added to the collection: two on the outside and two more with swapped coordinates for the inside.\n\nAnd here it is displayed:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"cylinderNode\", false));\nNode cylinderNode = app.RootNode.CreateChild(\"cylinderNode\");\nStaticModel cylinder = cylinderNode.CreateComponent<StaticModel>();\ncylinder.Model = CreateModel(cylinderVertices);\ncylinder.SetMaterial(Material.FromColor(Color.Cyan));\n```\n\nNow as you rotate the cylinder around you can see both the outside and the inside.\n\nBut it doesn’t look much linke a cylinder. Instead, it’s more like a figure called a dodecagonal prism. One solution is to simply increase the `slices` value to make the triangles smaller and more numerous.\n\nAnother solution is to calculate a better set of surface normals and use that to set the `normals` argument to `CreateModel`. The normals calculated in the code below are the same as the `positions` values except that the Z coordinate is set to 0:\n\n```csharp\nVector3[] cylinderNormals = new Vector3[cylinderVertices.Count];\n\nfor (int i = 0; i < cylinderVertices.Count; i++)\n{\n    cylinderNormals[i] = new Vector3(cylinderVertices[i].X, cylinderVertices[i].Y, 0);\n}\n\ncylinder.Model = CreateModel(cylinderVertices, cylinderNormals);\n```\n\nRun that code to reset the `Model` property of the `cylinder` component, and you see an illusion of curvature even though it’s obviously still a 12-sided prism.\n\nThe normals are vectors that point out from the surface. For each vertex of the triangle, the illumination of that vertex is calculated by how the directional light and the normal lines up. If they are exactly opposite, that vertex is maximally illuminated. Otherwise, the illumination is decreased based on the angle between the directional light and the normal.\n\nIf the `normals` argument to `CreateModel` is `null`, then the normals are calculated to be perpendicular to the triangle. This means that the normals at all three vertices are the same, and the triangle appears to be flat. However, if the normals are different, and they are perpendicular to the triangle *as if the triangle were curved*, then the illumination is different over the triangle and appears to resemble a curved surface.\n\nThe function above calculates normals to be perpendicular to the surface of a curved cylinder. However, you’ll notice that the simple code doesn’t quite adjust for the inside of the cylinders, and the normals are opposite what they should be.\n\nBefore moving on, remove the cylinder:\n\n```csharp\napp.RootNode.RemoveChild(cylinderNode);\n```\n\n## Sphere and Globe\n\nDefining a sphere is somewhat more difficult than a cylinder because it’s rounded in two dimensions. The most straightfoward approach is to use the common geographic coordinate system consisting of lines of longitude (which extend from the north pole to the south pole) and lines of latitude (which are horizontal to the equator). When triangulating the globe, the intersection of lines of longitude and latitude form a rectangle that is a pair of triangles. (This isn’t quite the case for the area around the north and south pole, but you can ignore that anomaly and the code will be rather simpler.)\n\nThe following code begins with a `List<Vector3>` for the vertices and a `List<Vector2>` for texture coordinates. Texture coordinates are required when displaying a two-dimensional bitmap on a three-dimensional surface. To do this, each vertex of each triangle must correspond to a particular 2D point within the bitmap. These 2D points are relative to the size of the bitmap. The point (0, 0) references the upper-left corner of the bitmap, (1, 0) is the upper-right corner, and (1, 1) is the lower-right corner. Notice that three-dimensional Y coordinates increase going up but texture Y coordinates increase going down.\n\nThere are two loops, one for the latitude and another for the longitude. The comments provide some guidance for reading the code:\n\n```csharp\nList<Vector3> sphereVertices = new List<Vector3>();\nList<Vector2> sphereTextures = new List<Vector2>();\n\nint stacks = 18;    // X and Z axis, latitude\nint slices = 36;    // Y axis, longitude\n\nfloat latitudeIncr = 180 / stacks;\nfloat longitudeIncr = 360 / slices;\n\n// From the north pole to the south pole\nfor (float latitude = 90; latitude > -90; latitude -= latitudeIncr)\n{\n    // Calculate Y coordinate for this angle and next angle\n    float yThis = (float)Math.Sin(MathHelper.DegreesToRadians(latitude));\n    float yNext = (float)Math.Sin(MathHelper.DegreesToRadians(latitude - latitudeIncr));\n\n    // Calculate relative Y coordinates for texture coordinates\n    float yRelativeThis = (90 - latitude) / 180;\n    float yRelativeNext = (90 - latitude + latitudeIncr) / 180; \n\n    // Calculate scaling factors to apply to lines of latitude\n    float scaleThis = (float)Math.Cos(MathHelper.DegreesToRadians(latitude));\n    float scaleNext = (float)Math.Cos(MathHelper.DegreesToRadians(latitude - latitudeIncr));\n\n    // From the International Date Line westward around the world\n    for (float longitude = 0; longitude < 360; longitude += longitudeIncr)\n    {\n        // Calculate unscaled X coordinates, starts at zero, then positive\n        float xThis = (float)Math.Sin(MathHelper.DegreesToRadians(longitude));\n        float xNext = (float)Math.Sin(MathHelper.DegreesToRadians(longitude + longitudeIncr));\n\n        // Calculate unscaled Z coordinates, starts at 1 (furthest from camera)\n        float zThis = (float)Math.Cos(MathHelper.DegreesToRadians(longitude));\n        float zNext = (float)Math.Cos(MathHelper.DegreesToRadians(longitude + longitudeIncr));\n\n        // Calculate relative X coordinates for texture coordinates\n        float xRelativeThis = (360 - longitude) / 360;\n        float xRelativeNext = (360 - longitude - longitudeIncr) / 360;\n\n        // Add two triangles to vertices collection\n        sphereVertices.Add(new Vector3(scaleThis * xThis, yThis, scaleThis * zThis));\n        sphereVertices.Add(new Vector3(scaleNext * xThis, yNext, scaleNext * zThis));\n        sphereVertices.Add(new Vector3(scaleThis * xNext, yThis, scaleThis * zNext));\n\n        sphereVertices.Add(new Vector3(scaleThis * xNext, yThis, scaleThis * zNext));\n        sphereVertices.Add(new Vector3(scaleNext * xThis, yNext, scaleNext * zThis));\n        sphereVertices.Add(new Vector3(scaleNext * xNext, yNext, scaleNext * zNext));\n\n        // Add corresponding points to texture coordinates collection\n        sphereTextures.Add(new Vector2(xRelativeThis, yRelativeThis));\n        sphereTextures.Add(new Vector2(xRelativeThis, yRelativeNext));\n        sphereTextures.Add(new Vector2(xRelativeNext, yRelativeThis));\n\n        sphereTextures.Add(new Vector2(xRelativeNext, yRelativeThis));\n        sphereTextures.Add(new Vector2(xRelativeThis, yRelativeNext));\n        sphereTextures.Add(new Vector2(xRelativeNext, yRelativeNext));\n    }\n}\n```\n\nThe following code displays the sphere. Notice that the `CreateModel` call uses only the `sphereVertices` collection for the vertex positions, and hence the rectangles that make up the sphere are clearly discernable:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"sphereNode\", false));\nNode sphereNode = app.RootNode.CreateChild(\"sphereNode\");\nStaticModel sphere = sphereNode.CreateComponent<StaticModel>();\nsphere.Model = CreateModel(sphereVertices);\nsphere.SetMaterial(Material.FromColor(Color.Cyan));\n```\n\nTo make this look smooth, you need a collection of normal vectors that point from the center of the sphere through each vertex. But these already exist! They are exactly the same as the vertex positions. Because UrhoSharp uses the same `Vector3` type for points and vectors, the same `sphereVertices` collection can be passed as the second argument to `CreateModel` as well:\n\n```csharp\nsphere.Model = CreateModel(sphereVertices, sphereVertices);\n```\n\nNow the sphere is rounded.\n\nThe next step is to cover this sphere with a map of the whole Earth. The first step is to create a new model using the texture coordinates as well.\n\n```csharp\nsphere.Model = CreateModel(sphereVertices, sphereVertices, null, sphereTextures);\n```\n\nThe easy way to use a bitmap as a `Material` object is to call the static `Material.FromImage` method. The following bitmap of the entire Earth is stored in the **Data** directory relative to this workbook. It was obtained from <http://maps.jpl.nasa.gov/earth.html>, and is used courtesy of NASA/JPL-Caltech:\n\n```csharp\nsphere.SetMaterial(Material.FromImage(\"ear0xuu2.jpg\"));\n```\n\nHowever, this material is still using the normals to calculate the light intensity around the globe. This might be desireable if you were showing half the Earth in darkness during the day, but in that case you’d want to increase the intensity of the directional light and reduce the intensity of the ambient light considerably.\n\nFor a simple image of the world, it make more sense to use a technique that keeps the bitmap fully illuminated regardless of the light. This is a technique called `DiffUnlit`:\n\n```csharp\nMaterial earthMaterial = new Material();\nearthMaterial.SetTexture(TextureUnit.Diffuse, app.ResourceCache.GetTexture2D(\"ear0xuu2.jpg\"));\nearthMaterial.SetTechnique(0, CoreAssets.Techniques.DiffUnlit, 0, 0);\n\nsphere.SetMaterial(earthMaterial);\n```\n\nAnd there is a fully illuminated globe that you can turn with the mouse."
  },
  {
    "path": "graphics/urhosharp/meta.json",
    "content": "﻿{\n  \"order\":{\n    \"coordinates/ExploringUrhoCoordinates.workbook\":\"Exploring Urho Coordinates\",\n    \"compound-shapes/CreatingUrhoCompoundShapes.workbook\":\"Creating Compound Shapes (Quadcopter)\",\n    \"custom-geometries/CustomGeometries.workbook\":\"Working with Urho Custom Geometries\",\n    \"building-polyhedra/BuildingPolyhedra.workbook\":\"Building Polyhedra with UrhoSharp (Stellations of the Dodecahedron)\",\n    \"animated-model/animated-model.workbook\":\"Animated Model\",\n    \"barchart/charts.workbook\":\"Charts\",\n    \"physics/physics.workbook\":\"Physics\",\n    \"planetearth/planetearth.workbook\":\"Planet Earth\",\n    \"mobius-strip-speedway/MobiusStripSpeedway.workbook\": \"Möbius Strip Speedway\",\n    \"circle-of-life/CircleOfLife.workbook\": \"Circle of Life: Actions and Animations\"\n  }\n}\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/Material1.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/NoTexture.xml\" />\n\t<parameter name=\"MatDiffColor\" value=\"0.05098 0.196078 0.698039 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/21.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_0.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/27.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_1.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/6.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_10.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/3.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_11.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/20.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_12.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/11.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_13.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/26.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_14.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/18.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_15.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/15.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_16.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/33.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_17.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/28.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_18.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/31.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_19.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/36.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_2.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/14.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_20.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/25.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_21.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/34.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_22.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/35.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_3.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/8.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_4.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/13.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_5.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/9.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_6.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/38.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_7.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/23.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_8.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/30.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/Materials/White_9.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"BlueRacer/Textures/16.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/BlueRacer/node.xml",
    "content": "<?xml version=\"1.0\"?>\n<node id=\"2\">\n\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t<attribute name=\"Name\" value=\"Untitled.obj\" />\n\t<attribute name=\"Tags\" />\n\t<attribute name=\"Position\" value=\"0 0 0\" />\n\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t<attribute name=\"Variables\" />\n\t<node id=\"3\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.1\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"1\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.1.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"4\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.2\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"2\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.2.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"5\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.3\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"3\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.3.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/Material1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"6\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.4\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"4\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.4.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"7\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.5\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"5\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.5.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/Material1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"8\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.6\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"6\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.6.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"9\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.7\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"7\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.7.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_2.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"10\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.8\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"8\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.8.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_2.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"11\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.9\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"9\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.9.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_2.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"12\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.10\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"10\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.10.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_2.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"13\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.11\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"11\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.11.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/Material1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"14\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.12\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"12\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.12.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_3.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"15\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.13\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"13\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.13.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_4.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"16\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.14\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"14\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.14.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_3.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"17\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.15\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"15\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.15.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_4.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"18\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.16\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"16\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.16.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_5.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"19\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.17\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"17\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.17.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_6.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"20\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.18\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"18\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.18.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_7.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"21\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.19\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"19\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.19.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"22\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.20\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"20\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.20.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_7.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"23\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.21\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"21\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.21.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_8.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"24\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.22\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"22\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.22.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_9.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"25\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.23\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"23\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.23.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_10.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"26\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.24\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"24\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.24.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_11.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"27\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.25\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"25\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.25.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_12.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"28\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.26\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"26\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.26.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_9.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"29\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.27\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"27\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.27.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_10.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"30\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.28\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"28\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.28.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_11.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"31\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.29\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"29\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.29.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_12.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"32\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.30\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"30\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.30.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_9.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"33\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.31\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"31\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.31.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_10.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"34\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.32\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"32\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.32.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_11.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"35\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.33\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"33\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.33.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_12.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"36\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.34\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"34\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.34.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_9.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"37\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.35\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"35\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.35.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_10.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"38\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.36\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"36\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.36.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_11.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"39\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.37\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"37\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.37.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_12.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"40\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.38\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"38\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.38.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_7.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"41\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.39\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"39\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.39.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_2.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"42\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.40\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"40\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.40.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/Material1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"43\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.41\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"41\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.41.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"44\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.42\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"42\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.42.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/Material1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"45\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.43\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"43\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.43.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"46\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.44\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"44\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.44.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_13.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"47\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.45\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"45\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.45.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"48\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.46\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"46\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.46.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_14.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"49\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.47\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"47\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.47.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_15.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"50\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.48\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"48\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.48.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_7.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"51\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.49\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"49\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.49.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_16.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"52\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.50\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"50\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.50.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_3.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"53\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.51\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"51\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.51.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_17.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"54\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.52\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"52\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.52.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_18.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"55\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.53\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"53\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.53.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/Material1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"56\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.54\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"54\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.54.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_19.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"57\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.55\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"55\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.55.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_20.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"58\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.56\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"56\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.56.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_21.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"59\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.57\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"57\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.57.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_22.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"60\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.58\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"58\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.58.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_17.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"61\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.59\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"59\">\n\t\t\t<attribute name=\"Model\" value=\"Model;BlueRacer/Models/Object.59.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;BlueRacer/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n</node>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/3.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_0.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/9.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_1.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/19.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_10.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/15.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_11.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/25.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_12.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/21.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_13.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/26.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_14.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/27.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_15.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/28.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_16.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/29.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_17.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/11.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_2.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/31.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_3.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/17.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_4.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/14.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_5.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/5.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_6.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/7.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_7.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/13.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_8.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/23.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/Materials/White_9.xml",
    "content": "<?xml version=\"1.0\"?>\n<material>\n\t<technique name=\"Techniques/Diff.xml\" />\n\t<texture unit=\"diffuse\" name=\"RedRolls/Textures/30.png\" />\n\t<parameter name=\"MatDiffColor\" value=\"1 1 1 1\" />\n\t<parameter name=\"MatSpecColor\" value=\"0 0 0 0\" />\n\t<parameter name=\"MatEmissiveColor\" value=\"0 0 0 1\" />\n</material>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/Data/RedRolls/node.xml",
    "content": "<?xml version=\"1.0\"?>\n<node id=\"2\">\n\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t<attribute name=\"Name\" value=\"Untitled.obj\" />\n\t<attribute name=\"Tags\" />\n\t<attribute name=\"Position\" value=\"0 0 0\" />\n\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t<attribute name=\"Variables\" />\n\t<node id=\"3\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.1\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"1\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.1.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"4\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.2\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"2\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.2.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"5\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.3\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"3\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.3.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"6\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.4\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"4\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.4.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"7\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.5\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"5\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.5.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"8\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.6\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"6\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.6.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"9\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.7\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"7\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.7.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"10\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.8\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"8\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.8.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"11\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.9\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"9\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.9.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"12\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.10\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"10\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.10.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_1.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"13\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.11\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"11\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.11.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"14\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.12\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"12\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.12.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_2.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"15\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.13\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"13\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.13.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"16\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.14\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"14\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.14.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"17\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.15\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"15\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.15.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"18\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.16\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"16\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.16.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_3.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"19\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.17\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"17\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.17.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"20\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.18\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"18\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.18.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_4.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"21\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.19\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"19\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.19.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_5.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"22\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.20\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"20\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.20.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_6.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"23\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.21\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"21\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.21.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_7.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"24\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.22\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"22\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.22.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_4.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"25\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.23\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"23\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.23.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_5.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"26\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.24\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"24\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.24.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_6.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"27\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.25\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"25\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.25.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_7.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"28\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.26\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"26\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.26.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_4.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"29\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.27\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"27\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.27.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_5.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"30\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.28\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"28\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.28.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_6.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"31\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.29\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"29\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.29.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_7.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"32\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.30\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"30\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.30.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_4.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"33\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.31\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"31\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.31.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_5.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"34\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.32\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"32\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.32.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_6.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"35\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.33\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"33\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.33.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_7.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"36\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.34\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"34\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.34.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"37\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.35\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"35\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.35.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"38\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.36\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"36\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.36.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"39\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.37\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"37\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.37.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"40\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.38\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"38\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.38.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"41\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.39\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"39\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.39.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"42\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.40\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"40\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.40.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"43\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.41\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"41\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.41.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"44\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.42\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"42\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.42.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"45\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.43\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"43\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.43.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"46\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.44\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"44\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.44.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"47\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.45\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"45\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.45.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_8.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"48\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.46\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"46\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.46.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"49\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.47\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"47\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.47.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"50\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.48\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"48\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.48.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_9.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"51\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.49\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"49\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.49.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_10.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"52\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.50\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"50\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.50.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_11.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"53\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.51\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"51\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.51.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_12.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"54\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.52\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"52\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.52.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"55\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.53\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"53\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.53.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_13.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"56\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.54\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"54\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.54.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_14.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"57\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.55\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"55\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.55.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_15.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"58\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.56\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"56\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.56.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_16.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"59\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.57\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"57\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.57.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_16.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"60\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.58\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"58\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.58.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_17.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"61\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.59\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"59\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.59.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White.xml\" />\n\t\t</component>\n\t</node>\n\t<node id=\"62\">\n\t\t<attribute name=\"Is Enabled\" value=\"true\" />\n\t\t<attribute name=\"Name\" value=\"Object.60\" />\n\t\t<attribute name=\"Tags\" />\n\t\t<attribute name=\"Position\" value=\"0 0 -0\" />\n\t\t<attribute name=\"Rotation\" value=\"1 0 0 0\" />\n\t\t<attribute name=\"Scale\" value=\"1 1 1\" />\n\t\t<attribute name=\"Variables\" />\n\t\t<component type=\"StaticModel\" id=\"60\">\n\t\t\t<attribute name=\"Model\" value=\"Model;RedRolls/Models/Object.60.mdl\" />\n\t\t\t<attribute name=\"Material\" value=\"Material;RedRolls/Materials/White_0.xml\" />\n\t\t</component>\n\t</node>\n</node>\n"
  },
  {
    "path": "graphics/urhosharp/mobius-strip-speedway/MobiusStripSpeedway.workbook/index.workbook",
    "content": "---\nid: 4839602e-a48d-41fa-b4ab-ffbab6cc39b7\nuti: com.xamarin.workbook\ntitle: MobiusStripSpeedway\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n# Möbius Strip Speedway\n\nThis Workbook creates a circular road in the form of a Möbius strip, and then animates two cars to drive around that road.\n\n![Speedway Preview](Images/SpeedwayPreview.png \"Speedway Preview\")\n\nA variation of this Workbook was described in the webinar [“Exploring UrhoSharp 3D with Xamarin Workbooks”](https://channel9.msdn.com/Events/Xamarin/Recent-Webinars/Exploring-UrhoSharp-3D-with-Xamarin-Workbooks \"Webinar\") broadcast on September 21, 2017.\n\nThis Workbook uses UrhoSharp, Xamarin’s cross-platform C# and .NET wrapper on the open-source Urho3D graphics system. It demonstrates creating 3D objects algorithmically and loading predefined 3D models available on the new Microsoft-curated **Remix 3D** web site.\n\nThe Workbook discusses in detail the technique of rotating the cars so that they properly tilt along the surface of the curved Möbius strip as they drive around it. Also explored is the ability of UrhoSharp to draw lines in 3D space. This is often useful for experimentation and to erect a type of “scaffolding” that is helpful to visualize 3D surfaces.\n\nThe first step in any UrhoSharp Workbook is to add the UrhoSharp NuGet package from the **File > Add Package** or **File > Add NuGet Package** menu item. Within the workbook, reference the UrhoSharp libraries:\n\n```csharp\n#r \"Urho\"\n```\n\nMost of this Workbook requies only one `using` directive:\n\n```csharp\nusing Urho;\n```\n\nTwo more `using` directives are specified towards the end of this Workbook in connection with animation.\n\nA special `SimpleApplication` class exists for using UrhoSharp in a Workbook. The `ApplicationOptions` object allows specifying a directory for loadable resources as well as other options:\n\n```csharp\nSimpleApplication app = SimpleApplication.Show(new ApplicationOptions(\"Data\"));\n```\n\nExecuting this code block creates a window that you can then move and resize.\n\n`SimpleApplication` also creates a default camera and lights, which this Workbook does not change. The origin of the 3D coordinate system is in the center of the window. X coordinates increase to the right, Y coordinates increase going up, and Z coordinates increase going into the screen.\n\n## Drawing a Circle\n\nThis project begins by creating a type of scaffolding to visualize the shape of the road before the road is “paved” with surfaces. This scaffolding consists of straight lines in 3D space. These lines do not constitute a wireframe (which is an alternative way to visualize 3D surfaces) but they are similar.\n\nHowever, because UrhoSharp is a 3D graphics framework, drawing lines is not nearly as simple or straightforward as in a 2D graphics environment. Substantial overhead is required, but this overhead is very similar to that for drawing 3D surfaces.\n\nThe first part of this scaffolding is a circle that will eventually become the dividing line between the two lines of the road. The first step is to accumulate a collection of `Vector3` values that define a circle.\n\nThe `Vector3` structure has three fields of type `float` named `X`, `Y`, and `Z`. This is the structure used to represent a point in 3D space as well as a vector, which encapsulates a direction and a magnitude. Points and vectors are related: A point is the same value as a vector from the origin to that point, but vectors do not have any specific position in 3D space.\n\nThe following code defines a series of points that approximate a circle. This circle has Y coordinates of zero, so it sits on the plane defined by the X and Z axis, called the XZ plane. The `DIVISIONS` constant determines how many points approximate this circle. These points define a 100-sided regular polygon (called a *hectagon*) but you’ll see that it is visually indistinguishable from a circle.\n\n```csharp\nconst int DIVISIONS = 100;\n\nList<Vector3> radii = new List<Vector3>();\n\nfor (int i = 0; i <= DIVISIONS; i++)\n{\n    double angle = i * 2 * Math.PI / DIVISIONS;\n    float x = (float)Math.Cos(angle);\n    float y = 0;\n    float z = (float)Math.Sin(angle);\n    radii.Add(new Vector3(x, y, z));\n}\n```\n\nThese *radii* values are both points and vectors. They are points on the circumference of a circle with a radius of 1, and they are also vectors from the origin to those points. As vectors, they have a length (or magnitude) of 1, which means that the vectors are said to be *normalized*.\n\nNotice that the loop increments `i` from 0 to less than *or equal to*  `DIVISIONS`, so the collection contains 101 values rather than 100. Because the points define a circle, the last element of the collection is the same as the first. As you’ll see, sometimes this is helpful when later indexing the array.\\\n\\\nThe next code block uses the `radii` vectors to calculate points on the circumference of a circle with a radius of 2 units. Notice that a `Vector3` value can be multiplied by a number, called a *scalar*, such as the `RADIUS` constant:\n\n```csharp\nconst float RADIUS = 2;\n\nList<Vector3> circlePts = new List<Vector3>();\n\nfor (int i = 0; i <= DIVISIONS; i++)\n{\n    circlePts.Add(RADIUS * radii[i]);\n}\n```\n\nIf you’re accustomed to 2D graphics, that might seem like a very small circle, but 3D units are relative. They are based on the relationship of the camera to the graphical objects, and to the height of the window. With the camera created by `SimpleApplication`, one unit is about 15% of the height of the window.\n\nTo actually get this circle on the screen requires several more steps. The first of these steps is creating a vertex collection. A vertex is a position in 3D space, but accompanied with other information associated with that position. The simplest type of a vertex collection is a collection of `PositionNormal` structures. This structure is defined within the `VertexBuffer` class, so the full name is `VertexBuffer.PositionNormal`. The structure has two fields named `Position` and `Normal`, but for drawing lines, you only need to set the `Position` field:\n\n```csharp\nvar circleVertices = new List<VertexBuffer.PositionNormal>();\n\nfor (int i = 0; i <= DIVISIONS; i++)\n{\n    circleVertices.Add(new VertexBuffer.PositionNormal\n    { \n        Position = circlePts[i]\n    });\n}\n```\n\nNotice that the loop also goes to less than or equal to `DIVISIONS`, so again the last point is the same as the first. This will be necessary for drawing a complete closed circle.\n\nThis collection of vertices must be stored in an object of type `VertexBuffer`. For performance purposes, these vertices might also be stored in the memory of the graphics processing unit (GPU) of the video display. Because UrhoSharp is a C# wrapper on C++ code, the internal code can’t determine the size and type of the collection of vertices. You must explicitly specify the size of the vertex collection, and the fact that each vertex consists of a position and a normal, even though the normal is not used here:\n\n```csharp\nVertexBuffer circleBuffer = new VertexBuffer(Application.CurrentContext, false);\ncircleBuffer.SetSize((uint)circleVertices.Count, ElementMask.Position | ElementMask.Normal, false);\ncircleBuffer.SetData(circleVertices.ToArray());\n```\n\nThe next step is to construct a `Geometry` object. This is a collection of one or more vertex buffers, in this case just the one vertex buffer:\n\n```csharp\nGeometry circleGeometry = new Geometry();\ncircleGeometry.SetVertexBuffer(0, circleBuffer);\ncircleGeometry.SetDrawRange(PrimitiveType.LineStrip, 0, 0, 0, (uint)circleVertices.Count, true);\n```\n\nAn important piece of information specified in this `Geometry` object is the enumeration member `PrimitiveType.LineStrip`. This indicates how the vertices should be interpreted. The `LineStrip` member means that each successive vertex is connected to the next vertex with a line. This creates a series of connected lines often called a *polyline*. You’ll see two other members of the `PrimitiveType` enumeration later in this Workbook.\n\nA `Model` object is one or more geometries, in this case just one geometry:\n\n```csharp\nModel circleModel = new Model();\ncircleModel.NumGeometries = 1;\ncircleModel.SetGeometry(0, 0, circleGeometry);\ncircleModel.BoundingBox = new BoundingBox(new Vector3(-10, -10, -10), new Vector3(10, 10, 10));\n```\n\nThe `BoundingBox` is required. It should encompass the coordinates in the geometry but otherwise the values are not critical.\n\nMost of the objects in a 3D scene are organized in a tree structure of nodes and subnodes. The camera is a node, light sources are nodes, and visual objects are nodes. The big advantage of the tree structure is that a graphics transform can be applied to a node, and it affects all the child nodes as well.\n\nThe `SimpleApplication` object creates a root node that is accessible through the `RootNode` property. The following code adds a child node to that node named `mainNode`. This will be the parent node to all the other nodes created in this Workbook. Since code blocks in a Workbook can be re-executed, any code that creates a node must be preceded in the same code block by code that removes the node:\n\n```csharp\napp.RootNode.RemoveChild(app.RootNode.GetChild(\"mainNode\"));\nNode mainNode = app.RootNode.CreateChild(\"mainNode\");\n```\n\nThis code also works if the code block is being executed for the first time. If the node does not exist, `GetChild` returns `null` and `RemoveNode` ignores a `null` argument.\n\nHere’s the node for the circle. It is a child of `mainNode`. A `StaticModel` component is created for the node, and that is used to reference the model created earlier:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"circleNode\"));\nNode circleNode = mainNode.CreateChild(\"circleNode\");\nStaticModel circle = circleNode.CreateComponent<StaticModel>();\ncircle.Model = circleModel;\n```\n\nThe final step is to associate a `Material` object with the `StaticModel` object. The material indicates the visual appearance of the model. The specification here indicates the color, the fact that it should not be affected by light, and that it should be antialiased:\n\n```csharp\nMaterial blackLineMaterial = Material.FromColor(Color.Black);\nblackLineMaterial.SetTechnique(0, CoreAssets.Techniques.NoTextureUnlit, 1, 1);\nblackLineMaterial.LineAntiAlias = true;\ncircle.SetMaterial(blackLineMaterial);\n```\n\nAt long last, a circle appears on the screen. On the PC, the circle will be very faint, but it is darker on the Mac.\n\nThe center of the circle is aligned with the center of the window. The camera is positioned above the XZ plane but pointing down somewhat, so the circle is seen from above.\n\nWithin the UrhoSharp window, you can pan the camera horizontally and vertically using touch or the mouse with the button depressed, and you can zoom in and out using a mousewheel or the two-finger scroll gesture on the touchpad. \\\n\\\nYou can experiment with changing `DIVISIONS` to smaller values to see how that affects the appearance of the circle. When you re-execute a code block in a Workbook, all the subsequent previously executed code blocks are also re-executed.\n\nYou might also experiement with the loop that adds vertices to the `circleVertices` collection. Change `DIVISIONS` to `DIVISIONS / 2` and `DIVISIONS / 4`. This will convince you that the circle begins at the far right, and the lines go counter-clockwise from the viewer’s perspective. This information is important when later animating the cars.\n\n## The Looping Road\n\nThe next step is to construct a series of lines that span the width of the road. These lines will be at right angles to the circumference of the circle.\n\nThe following code block computes tangents to the circle. For every point on the circle, a vector is calculated. This is the difference between the two points on either side of that point. The modulo operations avoid invalid array indices:\n\n```csharp\nList<Vector3> tangents = new List<Vector3>();\n\nfor (int i = 0; i <= DIVISIONS; i++)\n{\n    Vector3 tangent = circlePts[(i + 1) % DIVISIONS] - circlePts[(i + DIVISIONS - 1) % DIVISIONS];\n    tangents.Add(tangent);\n}\n```\n\nThe following collection called `parallels` are vectors that span the width of the road at every point. These vectors are parallel to the surface of the road like the `radii` vectors but rotated around an axis from the `tangents` collection:\n\n```csharp\nList<Vector3> parallels = new List<Vector3>();\n\nfor (int i = 0; i <= DIVISIONS; i++)\n{\n    float tilt = i * (float)Math.PI / DIVISIONS;\n    Matrix4 matrix = Matrix4.CreateFromAxisAngle(tangents[i], tilt);\n    Vector3 parallel = Vector3.TransformVector(radii[i], matrix);\n    parallels.Add(parallel);\n}\n```\n\nThere are several ways to tilt these `parallels` vectors around the `tangents` axes, but this particular code twists the `parallels` to create a Möbius strip.\n\nThe `tilt` value goes from 0 to 180 degrees (π radians) as `i` goes around the circle. The `CreateFromAxisAngle` method creates a `Matrix4` value, which is a 4×4 transform matrix that represents a rotation of `tilt` angles around the tangent. This is then used to transform a vector from the `radii` collection to create a vector for the `parallels` collection.\n\nBecause the `radii` vectors are normalized (that is, have a length of 1) and are only subjected here to a rotation transform, the `parallels` vectors are also normalized.\n\nVectors that are normalized are very useful for performing arithmetic operations on points and vectors, such as in the following code. The width of the road is set to half the radius, or 1. Two collections are accumulated: `innerPts` defines a circle on the inside of the road, and `outerPts` defines a circle on the outside of the road. These are calculated by multiplying half the width by a `parallels` vector, and either adding that to, or subtracting it from, a `circlePts` value:\n\n```csharp\nconst float WIDTH = RADIUS / 2;\n\nList<Vector3> innerPts = new List<Vector3>();\nList<Vector3> outerPts = new List<Vector3>();\n\nfor (int i = 0; i <= DIVISIONS; i++)\n{\n    innerPts.Add(circlePts[i] - WIDTH / 2 * parallels[i]);\n    outerPts.Add(circlePts[i] + WIDTH / 2 * parallels[i]);\n}\n```\n\nIt will be useful to see what these lines look like, but they need to be drawn a little differently from the circle. Instead of drawing a polyline, it will be useful to see the lines connecting each point in `innerPts` to the corresponding point in `outerPts`. That is possible. The first step is to construct a collection of `VertexBuffer.PositionNormal` values with these pairs of points:\n\n```csharp\nvar widthVertices = new List<VertexBuffer.PositionNormal>();\n\nfor (int i = 0; i < DIVISIONS; i++)\n{\n    widthVertices.Add(new VertexBuffer.PositionNormal \n    {\n        Position = innerPts[i]\n    });\n    widthVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = outerPts[i]\n    });\n}\n```\n\nNext, create a `VertexBuffer` the same way as the previous one:\n\n```csharp\nVertexBuffer widthBuffer = new VertexBuffer(Application.CurrentContext, false);\nwidthBuffer.SetSize((uint)widthVertices.Count, ElementMask.Position | ElementMask.Normal, false);\nwidthBuffer.SetData(widthVertices.ToArray());\n```\n\nThen the `Geometry`:\n\n```csharp\nGeometry widthGeometry = new Geometry();\nwidthGeometry.SetVertexBuffer(0, widthBuffer);\nwidthGeometry.SetDrawRange(PrimitiveType.LineList, 0, 0, 0, (uint)widthVertices.Count, true);\n```\n\nNotice that the first argument to `SetDrawRange` is the enumeration value `PrimitiveType.LineList`. The code that rendered the circle used an enumeration value of `LineStrip`, which causes the vertices to be connected with a series of lines forming a polyline. The `LineList` member causes the points to be interpreted in pairs, and a line is drawn between each pair of points.\n\nThe `Model` is constructed just like the earlier one:\n\n```csharp\nModel widthModel = new Model();\nwidthModel.NumGeometries = 1;\nwidthModel.SetGeometry(0, 0, widthGeometry);\nwidthModel.BoundingBox = new BoundingBox(new Vector3(-10, -10, -10), new Vector3(10, 10, 10));\n```\n\nAnd finally the `Node` can re-use the `blackLineMaterial` created earlier:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"widthNode\"));\nNode widthNode = mainNode.CreateChild(\"widthNode\");\nStaticModel width = widthNode.CreateComponent<StaticModel>();\nwidth.Model = widthModel;\nwidth.SetMaterial(blackLineMaterial);\n```\n\nThis renders a series of lines that clearly display the surface of a road in the form of a Möbius strip. If you want to see a flat road, simpy set `tilt` to 0 in the earlier code block and re-execute it.\n\n## The Road Depth\n\nBesides the width, the road will also be given a depth. To compute the coordinates for this depth, it is necessary to compute vectors that are perpendicular to the `parallels` vectors. However, in 3D, there are an infinite number of vectors that are perpendicular to another vector. More specifically, the `perpendiculars` vectors must be perpendicular to both the corresponding `parallels` vector and the `tangents` vector.\n\nThere is a standard way to obtain a vector that is perpendicular to two other vectors, and that is the vector *cross product*, accessible through the static `Vector3.Cross` method:\n\n```csharp\nList<Vector3> perpendiculars = new List<Vector3>();\n\nfor (int i = 0; i <= DIVISIONS; i++)\n{\n    Vector3 perpendicular = Vector3.Cross(tangents[i], parallels[i]);\n    perpendicular.Normalize();\n    perpendiculars.Add(perpendicular);\n}\n```\n\nNotice that the perpendiculars vectors are normalized. This makes them suitable for arithmetic operations such as those in the next code block.\n\nThis code block assembles four more collections. These are based on `innerPts` and `outerPts` but offset by half the depth times a vector from the `perpendiculars` collection:\n\n```csharp\nconst float DEPTH = RADIUS / 10;\n\nList<Vector3> innerUpperPts = new List<Vector3>();\nList<Vector3> outerUpperPts = new List<Vector3>();\nList<Vector3> innerLowerPts = new List<Vector3>();\nList<Vector3> outerLowerPts = new List<Vector3>();\n\nfor (int i = 0; i <= DIVISIONS; i++)\n{\n    innerUpperPts.Add(innerPts[i] + DEPTH / 2 * perpendiculars[i]);\n    outerUpperPts.Add(outerPts[i] + DEPTH / 2 * perpendiculars[i]);\n    innerLowerPts.Add(innerPts[i] - DEPTH / 2 * perpendiculars[i]);\n    outerLowerPts.Add(outerPts[i] - DEPTH / 2 * perpendiculars[i]);\n}\n```\n\nIt will be useful to see these new points. The following code assembles a collection of `VertexBuffer.PositionNormal` values with two pairs of points for each index: from a point in the `outerUpperPts` collection to the corresponding point in `outerLowerPts`, and from points in `innerUpperPts` to points in `innerLowerPts`:\n\n```csharp\nvar depthVertices = new List<VertexBuffer.PositionNormal>();\n\nfor (int i = 0; i < DIVISIONS; i++)\n{\n    depthVertices.Add(new VertexBuffer.PositionNormal \n    { \n        Position = outerUpperPts[i]\n    });\n    depthVertices.Add(new VertexBuffer.PositionNormal \n    { \n        Position = outerLowerPts[i]\n    });\n    depthVertices.Add(new VertexBuffer.PositionNormal \n    { \n        Position = innerUpperPts[i]\n    });\n    depthVertices.Add(new VertexBuffer.PositionNormal \n    { \n        Position = innerLowerPts[i]\n    });\n}\n```\n\nThese vertices could have been integrated with the previous collection, but it’s rather messy to do that after the previous nodes have been created. For that reason, this new collection of vertices is given a new `VertexBuffer`:\n\n```csharp\nVertexBuffer depthBuffer = new VertexBuffer(Application.CurrentContext, false);\ndepthBuffer.SetSize((uint)depthVertices.Count, ElementMask.Position | ElementMask.Normal, false);\ndepthBuffer.SetData(depthVertices.ToArray());\n```\n\nThat becomes part of a `Geometry`:\n\n```csharp\nGeometry depthGeometry = new Geometry();\ndepthGeometry.SetVertexBuffer(0, depthBuffer);\ndepthGeometry.SetDrawRange(PrimitiveType.LineList, 0, 0, 0, (uint)depthVertices.Count, true);\n```\n\nAnd that becomes part of a `Model`:\n\n```csharp\nModel depthModel = new Model();\ndepthModel.NumGeometries = 1;\ndepthModel.SetGeometry(0, 0, depthGeometry);\ndepthModel.BoundingBox = new BoundingBox(new Vector3(-10, -10, -10), new Vector3(10, 10, 10));\n```\n\nFinally, a new `Node` is created:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"depthNode\"));\nNode depthNode = mainNode.CreateChild(\"depthNode\");\nStaticModel depth = depthNode.CreateComponent<StaticModel>();\ndepth.Model = depthModel;\ndepth.SetMaterial(blackLineMaterial);\n```\n\nNow the solidity of the road should be apparent. The goal now is to connect the ends of these little perpendicular lines with a surface.\n\n## The Edge of the Track\n\nIn 3D graphics, surfaces are defined by a mesh of triangles. Triangles are used because they are the simplest two-dimensional objects and are always flat. The illusion of three dimensions is accomplished by making the triangles rather small, and by shading the surfaces: Each of the three vertices of the triangle can reflect light a little differently, and the 3D system interpolates that shading over the triangle’s surface.\n\nThis shading requires specifying the `Normal` field of the `VertexBuffer.PositionNormal` structure. The normal is a vector that is perpendicular to the surface at that vertex.\n\nThe following code assembles a collection of `VertexBuffer.PositionNormal` values for the outer and inner edge of the road. Each group of four ends of the little perpendicular lines are connected with two triangles, and each triangle requires three vertices. The normal is a member of the `parallels` collection because those vectors are perpendicular to the edges.\n\nThe vertices of each triangle must be defined in a clockwise order from the viewpoint of where they are visible.\n\n```csharp\nvar edgeVertices = new List<VertexBuffer.PositionNormal>();\n\nfor (int i = 0; i < DIVISIONS; i++)\n{\n    // Outer edge\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = outerLowerPts[i],\n        Normal = parallels[i]\n    });\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = outerUpperPts[i],\n        Normal = parallels[i]\n    });\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = outerUpperPts[i + 1],\n        Normal = parallels[i + 1]\n    });\n\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = outerLowerPts[i],\n        Normal = parallels[i]\n    });\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = outerUpperPts[i + 1],\n        Normal = parallels[i + 1]\n    });\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = outerLowerPts[i + 1],\n        Normal = parallels[i + 1]\n    });\n\n    // Inner edge\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = innerLowerPts[i],\n        Normal = -parallels[i]\n    });\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = innerUpperPts[i + 1],\n        Normal = -parallels[i + 1]\n    });\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = innerUpperPts[i],\n        Normal = -parallels[i]\n    });\n\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = innerLowerPts[i],\n        Normal = -parallels[i]\n    });\n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = innerLowerPts[i + 1],\n        Normal = -parallels[i + 1]\n    });    \n    edgeVertices.Add(new VertexBuffer.PositionNormal\n    {\n        Position = innerUpperPts[i + 1],\n        Normal = -parallels[i + 1]\n    });\n}\n```\n\nThe six vertices for the inner edge were simply copied and pasted from those for the outer edge, and modified in three ways:\n\n* The word `inner` was changed to `outer`.\n\n* The `Normal` was made a negative of the value because a perpendicular to the surface is in the opposite direction.\n\n* Two vertices in each triangle were swapped so the vertices would be clockwise when viewed from the other direction.\n\nThe following `VertexBuffer` is defined the same as the ones you’ve already seen except that the `Shadowed` property is set. This relates to how the vertices are stored in computer memory:\n\n```csharp\nVertexBuffer edgeBuffer = new VertexBuffer(Application.CurrentContext, false)\n{\n    Shadowed = true\n};\nedgeBuffer.SetSize((uint)edgeVertices.Count, ElementMask.Position | ElementMask.Normal, false);\nedgeBuffer.SetData(edgeVertices.ToArray());\n```\n\nThe `Geometry` object is calculated similarly to those you’ve already seen but now the first argument to `SetDrawRange` is `PrimitiveType.TriangleList`. This means that every group of three consecutive vertices defines a triangle:\n\n```csharp\nGeometry edgeGeometry = new Geometry();\nedgeGeometry.SetVertexBuffer(0, edgeBuffer);\nedgeGeometry.SetDrawRange(PrimitiveType.TriangleList, 0, 0, 0, (uint)edgeVertices.Count, true);\n```\n\nThe `Model` is then calculated as you’ve already seen:\n\n```csharp\nModel edgeModel = new Model();\nedgeModel.NumGeometries = 1;\nedgeModel.SetGeometry(0, 0, edgeGeometry);\nedgeModel.BoundingBox = new BoundingBox(new Vector3(-10, -10, -10), new Vector3(10, 10, 10));\n```\n\nFinally, a new `Node` is added that references the model and sets a material:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"edgeNode\"));\nNode edgeNode = mainNode.CreateChild(\"edgeNode\");\nStaticModel edge = edgeNode.CreateComponent<StaticModel>();\nedge.Model = edgeModel;\nedge.SetMaterial(Material.FromColor(Color.Gray));\n```\n\nThis is a simpler material than the one used for the lines, and is simply the color gray.\n\nNevertheless, when you execute this code block, you’ll see different shades of gray in various areas of the inner and outer edges. This is the effect of the normals. Even with a relatively small value for `DIVISIONS`, the surface still looks curved as a result of the interpolation of the shading over the surface of each triangle.\n\nThe edges are only visible from one direction. This is the result of the clockwise ordering of the vertices.\n\n## The Track Surface\n\nThe top and bottom of the triangles defining the surface of track can be calculated similarly to the edges, but to make it look realistic, the `Material` object can be based on a bitmap that resembles a little stretch of road:\n\n![](Data/Textures/RoadSurface.png)\n\nThis is a file named **RoadSurface.png**. It is stored in the **Textures** subdirectory of **Data**, which was the directory specified in the `ApplicationOptions` constructor when the `SimpleApplication` object was first created at the beginning of this Workbook.\n\nUsing a different `Material` for the top and bottom surfaces of the road requires a separate `Node` object from that used for the inner and outer edges.\n\nAlso, the `VertexBuffer.PositionNormal` structure is no longer adequate for storing the vertices. Each vertex must also be associated with a *texture coordinate* of type `Vector2`.  The texture coordinate indicates what part of the bitmap corresponds with that vertex. A triangular area of the bitmap defined by the texture coordinates is then interpolated over the surface of each triangle.\n\nTexture coordinates are relative to the bitmap image itself:\n\n![Texture Coordinates](Images/TextureCoordinates.svg \"Texture Coordinates\")\n\nHowever, this particular bitmap is wider than it needs to be. All the pixel columns in this image are identical. For purposes of covering the top and bottom of the road, the bitmap really only needs to be one pixel wide. This implies that a texture coordinate of (0, 0) can correspond to vertices at the outer edge, while a texture coordinate of (0, 1) can be specified for the inner edge.\n\nTo accomodate texture coordinates, the following code uses the `VertexBuffer.PositionNormalColorTexcoord` structure. This structure defines additional fields named `Color` (which is not used here) and `TexCoord` of type `Vector2`. The normals are vectors perpendicular to the surface, which are values from the `perpendiculars` collection:\n\n```csharp\nvar surfaceVertices = new List<VertexBuffer.PositionNormalColorTexcoord>();\n\nfor (int i = 0; i < DIVISIONS; i++)\n{\n    // Upper surface\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = outerUpperPts[i],\n        Normal = perpendiculars[i],\n        TexCoord = new Vector2(0, 0)\n    });\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = innerUpperPts[i],\n        Normal = perpendiculars[i],\n        TexCoord = new Vector2(0, 1)\n    });\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = innerUpperPts[i + 1],\n        Normal = perpendiculars[i + 1],\n        TexCoord = new Vector2(0, 1)\n    });\n\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = outerUpperPts[i],\n        Normal = perpendiculars[i],\n        TexCoord = new Vector2(0, 0)\n    });\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = innerUpperPts[i + 1],\n        Normal = perpendiculars[i + 1],\n        TexCoord = new Vector2(0, 1)\n    });\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = outerUpperPts[i + 1],\n        Normal = perpendiculars[i + 1],\n        TexCoord = new Vector2(0, 0)\n    });\n\n    // Lower surface\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = outerLowerPts[i],\n        Normal = -perpendiculars[i],\n        TexCoord = new Vector2(0, 0)\n    });\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = innerLowerPts[i + 1],\n        Normal = -perpendiculars[i + 1],\n        TexCoord = new Vector2(0, 1)\n    });\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = innerLowerPts[i],\n        Normal = -perpendiculars[i],\n        TexCoord = new Vector2(0, 1)\n    });\n\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = outerLowerPts[i],\n        Normal = -perpendiculars[i],\n        TexCoord = new Vector2(0, 0)\n    });\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = outerLowerPts[i + 1],\n        Normal = -perpendiculars[i + 1],\n        TexCoord = new Vector2(0, 0)\n    });\n    surfaceVertices.Add(new VertexBuffer.PositionNormalColorTexcoord\n    {\n        Position = innerLowerPts[i + 1],\n        Normal = -perpendiculars[i + 1],\n        TexCoord = new Vector2(0, 1)\n    });\n}\n```\n\nThe six vertices for the two triangles of the upper surface were simply copied and pasted for the lower surface. In the collection names, `Upper` was changed to `Lower`, the normals were made negative, and two vertices in each triangle were swapped.\n\nThe size of the `VertexBuffer` object now needs to indicate that the vertices also contain specifications for color (even though it’s not used) and a texture coordinate:\n\n```csharp\nVertexBuffer surfaceBuffer = new VertexBuffer(Application.CurrentContext, false)\n{\n    Shadowed = true\n};\nsurfaceBuffer.SetSize((uint)surfaceVertices.Count, \n                      ElementMask.Position | ElementMask.Normal | ElementMask.Color | ElementMask.TexCoord1, \n                      false);\nsurfaceBuffer.SetData(surfaceVertices.ToArray());\n```\n\nThe `Geometry` object is specified the same as for the edges:\n\n```csharp\nGeometry surfaceGeometry = new Geometry();\nsurfaceGeometry.SetVertexBuffer(0, surfaceBuffer);\nsurfaceGeometry.SetDrawRange(PrimitiveType.TriangleList, 0, 0, 0, (uint)surfaceVertices.Count, true);\n```\n\nThe `Model` is also specified in the same way:\n\n```csharp\nModel surfaceModel = new Model();\nsurfaceModel.NumGeometries = 1;\nsurfaceModel.SetGeometry(0, 0, surfaceGeometry);\nsurfaceModel.BoundingBox = new BoundingBox(new Vector3(-10, -10, -10), new Vector3(10, 10, 10));\n```\n\nThe `Node` object, however, needs a different type of material. This is simply loaded from the external bitmap using the static `Material.FromImage` method:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"surfaceNode\"));\nNode surfaceNode = mainNode.CreateChild(\"surfaceNode\");\nStaticModel surface = surfaceNode.CreateComponent<StaticModel>();\nsurface.Model = surfaceModel;\nsurface.SetMaterial(Material.FromImage(\"Textures/RoadSurface.png\"));\n```\n\nAfter this code block is executed, the entire road is complete.\n\n## Remove the Scaffolding\n\nLook closely, and you can see little lines bleeding through the edges. At his point, the scaffolding that helped visualize the surfaces can be removed:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"circleNode\"));\nmainNode.RemoveChild(mainNode.GetChild(\"widthNode\"));\nmainNode.RemoveChild(mainNode.GetChild(\"depthNode\"));\n```\n\nA close look also reveals that the yellow dividing line is a little erratic. This results from some distortion in the interpolation of the bitmap over the curved surface of the road. It could probably be fixed by doubling the number of triangles, and having triangle sides coorespond to the dividing line.\n\n## Model Cars\n\nAs you’ve seen, you can algorithmically create entire 3D objects within a UrhoSharp program. But for more complex objects such as cars, it makes much more sense to create a model using a 3D design tool, and then import the model into your scene. Or, you can download a model that someone else has already created.\n\nThere are a number of file formats for 3D interchange developed throughout the years, and a number of web sites exist with downloadable 3D models of various formats. Although UrhoSharp can’t directly import them, a command-line tool exists called **[Asset Importer](https://urho3d.github.io/documentation/1.4/_tools.html \"Asset Importer\")** that can convert many popular 3D formats into a UrhoSharp’s native .MDL (“model”) format.\n\nOne way to get **Asset Importer** is to first clone the Xamarin GitHub repository for UrhoSharp, which is simply named **[urho](https://github.com/xamarin/urho \"UrhoSharp repo\")**. If you don’t have the [CMake](https://cmake.org/ \"CMake\") utility, install it. In the **Urho3D/Source** directory of the **urho** repository that you’ve cloned are a number of .BAT (Windows batch) and .SH (Bash shell script) files. These files build an entire directory structure for Urho3D development. For example, if you’re running Windows and you use Visual Studio 2015, run the **cmake\\_vs2015.bat** file and specify a destination directory, for example:\n\n**cmake\\_vs2015 c:/MyUrho3D**\n\nWhen it completes, you’ll find a **Urho3D.sln** file in the directory you specified. Load that into Visual Studio 2015. One of the projects is named **AssetImporter**. After you build that project, **AssetImporter.exe** will be in the **bin/tool** subdirectory.\n\nThe models used in this Workbook are from the Microsoft website [Remix 3D](https://www.remix3d.com/ \"Remix 3D\"). This website is a curated collection of 3D models that are intended to be used in conjunction with the **Paint 3D** and **3D Builder** applications included in the Windows 10 Creators Update. You can freely download, use, and modify these files. The contents of the **3D Objects** folder on the Windows 10 hard drive also contains a collection of models with filename extensions .3MF, which is the 3D Manufacturing Format. These are actually ZIP package files. If you rename the .3MF extension to .ZIP, you can examine the contents, which consists of a large XML file describing 3D geometries and .PNG files for textures.\n\nFor this workbook, **Paint 3D** was used to download a model identified as [Shift Race Blue Car](https://www.remix3d.com/details/G009SX0M5G9T \"Shift Race Blue Car\") and export it in the .3MF format. **3D Builder** was then used to load this model and save it to the .OBJ (Wavefront  Object) format with the name **BlueRacer.obj**. **AssetImporter** was then run with the following arguments:\n\n**AssetImporter node BlueRacer.obj node.xml**\n\nThe **node** command is one of several **AssetImporter** commands that specify what files **AssetImporter** exports. The **node** command causes the utility to output an XML file along with three folders: **Materials**, **Models**, and **Textures**.\n\nThe **node.xml** file is a description of a tree of nodes that references files in the **Materials** and **Models** folders. The **Materials** folder contains XML descriptions of materials that reference bitmap files in the **Textures** folder. The **Models** folder contains binary .MDL files in the Urho3D format.\n\nThe **node.xml** file and these folders were then copied into a **BlueRacer** subdirectory of the **Data** directory for this Workbook. The **node.xml** file and all the XML files in the **Materials** folder were edited and modified so that references to filenames in the **Models**, **Materials**, and **Textures** folders were changed to **BlueRacer/Models**, **BlueRacer/Materials**, and **BlueRacer/Textures**.\n\nWith that preliminary work, it then becomes fairly easy to use the `LoadXml` method defined by `Node` to load in the **node.xml** file, and in the process bring in all the models, materials, and textures associated with that node.\n\nThe following code creates three nodes: The first is a child of `mainNode` named `car1Node`, the second is a child of `car1Node` named `car1ChildNode`, and the third is a child of `car1ChildNode` named `car1DefinitionNode`, which is the node loaded from the XML file:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"car1Node\"));\nNode car1Node = mainNode.CreateChild(\"car1Node\");\nNode car1ChildNode = car1Node.CreateChild();\nNode car1DefinitionNode = car1ChildNode.CreateChild();\ncar1DefinitionNode.LoadXml(\"BlueRacer/node.xml\");\n```\n\nCreating three nodes rather than just one eases the application of different transforms to these nodes. If the transforms are applied to each node separately, the transforms are independent of each other, but they are compounded when the car is rendered.\n\nThe car will not be visible when that code block is executed. The models use coordinates that are very much larger than the coordinates implied by the road. The following position, scaling, and rotation factors were empirically determined to align the car so that the bottom of the tires sit on the XY plane, and the (0, 0, 0) point of the car is approximately in the center between the bottom of those four tires:\n\n```csharp\ncar1DefinitionNode.Position = new Vector3(0.8f, 4.112f, -1.344f);\ncar1DefinitionNode.SetScale(0.004f);\ncar1DefinitionNode.Rotation = Quaternion.FromAxisAngle(Vector3.UnitZ, -11.5f);\n```\n\nThose are the only adjustments applied to `car1DefinitionNode`. (These adjustments were not shown in the webinar. Instead, the parent node in the **node.xml** file was modified.)\n\nThe car is now visible but it is still ten times too large. It can be reduced in size commensurate with the racetrack by applying a scaling factor to `car1ChildNode`:\n\n```csharp\ncar1ChildNode.SetScale(0.1f);\n```\n\nThis is the only adjustment made to `car1ChildNode`. All other transforms to position the car on the road will be applied to `car1Node`.\n\nThe second car is described in the Remix 3D web site as [Rolls Royce Phantom Car](https://www.remix3d.com/details/G009SX0LG9PZ \"Rolls Royce Phantom Car\"). The model was downloaded and converted as described earlier and stored in the **RedRolls** subdirectory of **Data**. The following code loads in the node:\n\n```csharp\nmainNode.RemoveChild(mainNode.GetChild(\"car2Node\"));\nNode car2Node = mainNode.CreateChild(\"car2Node\");\nNode car2ChildNode = car2Node.CreateChild();\nNode car2DefinitionNode = car2ChildNode.CreateChild();\ncar2DefinitionNode.LoadXml(\"RedRolls/node.xml\");\n```\n\nThese position, scaling, and rotation adjustments align the model as described earlier:\n\n```csharp\ncar2DefinitionNode.Position = new Vector3(0.4f, 3.04f, -1.16f);\ncar2DefinitionNode.SetScale(0.004f);\ncar2DefinitionNode.Rotation = Quaternion.FromAxisAngle(Vector3.UnitZ, -10.5f);\n```\n\nThe Blue Racer faced towards the right; this one faces toward the left.\n\nFinally, the node is additionally scaled to make it a proper size for driving on the track:\n\n```csharp\ncar2ChildNode.SetScale(0.1f);\n```\n\nNow that the two cars are the proper size, they must be animated, and in the process tilted and rotated to follow the course of the Möbius strip.\n\n## Drivers, Start Your Engines\n\nThe `GetCarPosition` method shown below calculates the position of a car on the road and the orientation of the road at that point.\n\nThe parameter `t` can range from 0 to 1, and the two Boolean parameters specify whether the car is on the top or bottom of the road, and the outer or inner lane. On a Möbius strip, a car that is on the top and outer lane during one revolution around the track will move to the bottom and inner lane during the next.\n\nThe method returns a 3D coordinate on the surface of the road corresponding to the position of the car. In addition, three `out` parameters supply three vectors that indicate the `forward` direction of the road (based on increasing index numbers), a vector at right angles to `forward` that points to the `outer` part of the road,  and a vector that is `perpendicular` to the road. These three vectors are orthogonal (at right angles to each other), so it is only necessary to calculate two of them, and the third can be derived from the cross product.\n\nAt the beginning of the method, the `t` parameter is converted to a floating point `index`, which is then used to derive integer values of `i1` and `i2`, which are the integer indices immediately below and above `index`. The `Vector3` values are calculated by interpolating between various points and vectors:\n\n```csharp\nVector3 GetCarPosition(float t, bool isUpper, bool isOuter,\n                       out Vector3 forward, out Vector3 outer, out Vector3 perpendicular)\n{\n    float index = t * DIVISIONS;\n    int i1 = (int)index;\n    int i2 = i1 + 1;\n\n    IList<Vector3> outerPts = isUpper ? outerUpperPts : outerLowerPts;\n    IList<Vector3> innerPts = isUpper ? innerUpperPts : innerLowerPts;\n\n    Vector3 outerPt = (i2 - index) * outerPts[i1] + (index - i1) * outerPts[i2];\n    Vector3 innerPt = (i2 - index) * innerPts[i1] + (index - i1) * innerPts[i2];\n\n    outer = outerPt - innerPt;\n    outer.Normalize();\n\n    perpendicular = (i2 - index) * perpendiculars[i1] + (index - i1) * perpendiculars[i2];\n    perpendicular.Normalize();\n\n    forward = Vector3.Cross(outer, perpendicular);\n\n    return (isOuter ? 0.75f : 0.25f) * outerPt + (isOuter ? 0.25f : 0.75f) * innerPt;\n}\n```\n\nThese four `Vector3` values describe a position and orientation of a car on the road.\n\n## Matrix Transforms\n\nFor jobs such as positioning and rotating a car based on `Vector3` values, the `Node` class defines a `SetTransform` method. The `Matrix3x4` argument has the capability to translate, scale, rotate, and even skew the node and all its children. (However, no perspective or taper transforms are possible.) The `Matrix3x4` structure defines 12 fields named `m` followed by the numeric zero-based row and column number. You can visualize these fields as the cells of the 3×4 matrix.\n\n![Matrix 3x4](Images/Matrix3x4.svg \"Matrix 3x4\")\n\nInternal to UrhoSharp, this matrix is used to transform 3D coordinates of (x, y, z) to coordinates of (x’, y’, z’) using standard matrix multiplication. The (x, y, z) coordinate is first represented as a 4×1 column vector with a 1 in the fourth position:\n\n![Matrix 4x1](Images/Matrix4x1.svg \"Matrix 4x1\")\n\nConceptually, this is a position in 4D space with the fourth coordinate fixed at 1. The use of 4D coordinates in 3D graphics is analogous to the use of 3D coordinates in 2D graphics. The extra dimension allows matrix transforms to encapsulate translation and (in the more general case) perspective.\n\nThe 3×4 matrix is multiplied by that 4×1 column vector:\n\n![Matrix Multiplicaton General](Images/MatrixMultiplicationGeneral.svg \"Matrix Multiplication General\")\n\nThe result is a 3×1 column vector that represents the transformed point (x’, y’, z’). The transform formulas are:\n\nx’ = m00·x + m01·y + m02·z + m03\n\ny’ = m10·x + m11·y + m12·z + m13\n\nz’ = m20·x + m21·y + m22·z + m23\n\n> ⚠️ You might be accustomed to matrix transforms in which the coordinate is represented as a row vector rather than a column vector, which is then positioned to the left of the transform matrix for the multiplication. The convention of column vectors used within UrhoSharp is conceptually the same, except that the rows and columns of the transform matrix are transposed.\n>\n> One advantage of the UrhoSharp notation is that it’s easier to show the full result of the multiplication as a 3×1 column vector rather than a row vector:\n>\n> ![Matrix Multiplicaton General Full](Images/MatrixMultiplicationGeneralFull.svg \"Matrix Multiplication General Full\")\n\nThe four columns of the matrix perform different tasks. The fourth column functions as translation factors that indicate where the (0, 0, 0) point is transformed. This is evident when the matrix is multiplied by the column vector represeting the point (0, 0, 0):\n\n![Matrix Multiplication Translation](Images/MatrixMultiplicationTranslation.svg \"Matrix Multiplication Translation\")\n\nThe first three columns of the matrix perform scaling, rotation, and skewing, and can be analyzed independently as a 3×3 matrix:\n\n![Matrix 3x3](Images/Matrix3x3.svg \"Matrix 3x3\")\n\nBecause no translation is involved, the matrix multiplication simply involves a 3×1 column vector, and the result is also a 3×1 column vector:\n\n![Matrix 3x3 Multiplication General](Images/Matrix3x3MultiplicationGeneral.svg \"Matrix 3x3 Multiplication General\")\n\n## The Rotation Matrix\n\nIt is convenient to think of the three columns of the 3×3 transform matrix as vectors. If these three column vectors are\n\n* mutually orthogonal (that is, at right angles to each other); and\n\n* normalized (that is, have a length of 1)\n\nthen the three vectors are called *orthonormal*, and the 3×3 matrix is known as a *rotation matrix*. It performs rotation only, and not scaling or skewing. Moreover, this rotation is performed in a very predicatable way that is ideal for orienting the cars along the road.\n\nTo see this, apply the matrix transform to the vector (1, 0, 0), which is the vector that points in the direction of the positive X axis:\n\n![Matrix Multiplication Rotation X](Images/MatrixMultiplicationRotationX.svg \"Matrix Multiplication Rotation X\")\n\nThe result is the first column of the matrix. Similarly, apply the transform to the (0, 1, 0) vector pointing in the direction of the positive Y axis:\n\n![Matrix Multiplication Rotation Y](Images/MatrixMultiplicationRotationY.svg \"Matrix Multiplication Rotation X\")\n\nAnd for the sake of completion, apply it to the positive Z axis (0, 0, 1):\n\n![Matrix Multiplication Rotation Z](Images/MatrixMultiplicationRotationZ.svg \"Matrix Multiplication Rotation Z\")\n\nKeep in mind that to restrict the matrix to rotation, the three columns must be mutually orthogonal and normalized. If they are not normalized, then scaling will result as well as rotation. If they are not mutually orthogonal, then skewing will result, and right angles won’t be preserved.\n\nHere is the original 3×4 transform matrix of type  `Matrix3x4` that is used with the `SetTransform` method of `Node`:\n\n![Matrix 3x4](Images/Matrix3x4.svg \"Matrix 3x4\")\n\nThis matrix can be assembled to perform rotation and translation using the following rules:\n\n* Set the first column to the vector to which (1, 0, 0) is transformed;\n\n* Set the second column to the vector to which (0, 1, 0) is transformed;\n\n* Set the third column is the vector to which (0, 0, 1) is transformed; and\n\n* Set the fourth column to the point to which (0, 0, 0) is translated.\n\nConstructing that `Matrix3x4` value from four `Vector3` values is the job of the following method:\n\n```csharp\nMatrix3x4 MakeMatrix(Vector3 xRotate, Vector3 yRotate, Vector3 zRotate, Vector3 translate)\n{\n    return new Matrix3x4(xRotate.X, yRotate.X, zRotate.X, translate.X,\n                         xRotate.Y, yRotate.Y, zRotate.Y, translate.Y,\n                         xRotate.Z, yRotate.Z, zRotate.Z, translate.Z);\n}\n```\n\n## Applying the Matrix\n\nThe event handler named `UpdateCarPosition` show below will be attached to the `Update` event of the `SimpleApplication` object created at the begining of this Workbook to animate the cars on the road. The `Update` handler is called frequently as the application runs.\n\nThe event argument has a property named `TimeStep` that is the time in seconds since the last time the handler was called. For this reason, generally a variable external to the method is maintained. It is traditionally named `t` for “time.” Also defined is a constant indicating that a complete revolution around the track will be 5 seconds long:\n\n```csharp\nfloat t = 0;\nconst float RevolutionsPerSecond = 0.20f;\n```\n\nWithin the method, `t` is increased by the product of `TimeStep` and `RevolutionsPerSecond`. Normally the modulo operator would strip the integer part so that `t` ranges from 0 to 1. But for the Möbius strip, the car needs to go around the track twice during one complete cycle, so `t` is made to range from 0 to 2. In the body of the method, this `t` is adjusted in various ways for the call to `GetCarPosition`, so `t` only ranges from 0 to 1 within that method.\n\nFor the first car, when `t` is less than 1, the car is on the outside lane on the upper side, so both Boolean arguments to `GetCarPosition` are set to `true`. On return from `GetCarPosition`,\n\n* the `forward` vector is parallel to the road pointing in the direction of increasing indices;\n\n* the `outer` vector points to the outside of the road; and\n\n* the `perpendicular` vector is perpendicular to the road.\n\nIn its unrotated state, the X axis of the Blue Racer points right towards the front of the car. That must be rotated to point in the direction of the `forward` vector, so `forward` is the first argument to `MakeMatrix`.\n\nThe Y axis of the Blue Racer points up through the driver’s side door. That must be rotated to point to the inside of the track, so the second argument to `MakeMatrix` is `–outer`.\n\nThe Z axis of the Blue Racer points through the bottom of the car. That must be rotated to point downwards from the road, so the third argument to `MakeMatrix` is `–perpendicular`.\n\nThe last argument to `MakeMatrix` is the `position` value. This indicates the point to which the (0, 0, 0) point of the car is translated.\n\n```csharp\nvoid UpdateCarPosition(UpdateEventArgs args)\n{\n    t += args.TimeStep * RevolutionsPerSecond;\n    t %= 2;\n\n    Vector3 forward;\n    Vector3 outer;\n    Vector3 perpendicular;\n\n    if (t < 1)\n    {\n        Vector3 position = GetCarPosition(t, true, true, out forward, out outer, out perpendicular);\n        Matrix3x4 matx = MakeMatrix(forward, -outer, -perpendicular, position);\n        car1Node.SetTransform(matx);\n\n        position = GetCarPosition(1 - t, false, true, out forward, out outer, out perpendicular);\n        matx = MakeMatrix(forward, outer, perpendicular, position);\n        car2Node.SetTransform(matx);\n    }\n    else\n    {\n        Vector3 position = GetCarPosition(t - 1, false, false, out forward, out outer, out perpendicular);\n        Matrix3x4 matx = MakeMatrix(forward, outer, perpendicular, position);\n        car1Node.SetTransform(matx);  \n\n        position = GetCarPosition(2 - t, true, false, out forward, out outer, out perpendicular);\n        matx = MakeMatrix(forward, -outer, -perpendicular, position);\n        car2Node.SetTransform(matx);       \n    }\n\n}\n```\n\nWhen `t` ranges from 1 to 2, the `else` clause is executed. The first car is now on the inside bottom of the track, so the two Boolean arguments become `false`, and the signs of the `outer` and `perpendicular` arguments to `MakeMatrix` are positive rather than negative.\n\nThe second car is similar, except that its original orientation is a little different (it faces left rather than right), and it travels in the opposite direction as the first car, beginning on the bottom of the track.\n\n## Two Animations\n\nNow all that’s necessary is to attach the `UpdateCarPosition` handler to the `Update` event of the `SimpleApplication` object.\n\nHowever, code blocks in Workbooks can be re-executed, and it’s undesirable that the handler be attached multiple times. Also, the handler can’t be detached using normal C# syntax because the handler itself might be recreated. For this reason, .NET reflection code is used to detach all handlers from the `Update` event:\n\n```csharp\nusing System.Reflection;\nFieldInfo field = typeof(Application).GetField(\"Update\", BindingFlags.Instance | BindingFlags.NonPublic);\nfield.SetValue(app, null);\n\napp.Update += UpdateCarPosition;\n```\n\nFinally, `mainNode` itself is animated. The `RemoveAllActions` method first clears all animations from the node, and then `RunActions` attaches an animation that runs forever and rotates the node around the Y axis by 15 degrees every second:\n\n```csharp\nusing Urho.Actions;\nmainNode.RemoveAllActions();\nmainNode.RunActions(new RepeatForever(new RotateBy (1f, 0, 15, 0)));\n```\n\nThis animation affects all the subnodes of `mainNode` as well, which encompasses all the visual objects created in the Workbook. As the Möbius strip rotates, it seems to morph in shape. The cars drive by each other twice in each double cycle, and pass each other on opposite sides of the road as well."
  },
  {
    "path": "graphics/urhosharp/physics/physics.workbook/index.workbook",
    "content": "﻿---\nid: 0cee522c-9c60-4860-9681-50124c220680\nuti: com.xamarin.workbook\ntitle: \"UrhoSharp: Physics\"\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n# Physics\n\nUrhoSharp is a powerful 3D game engine for Xamarin and .NET developers. It is similar in spirit to Apple’s SceneKit and SpriteKit and includes physics, navigation, networking, and much more...while still being cross-platform.\n\n```csharp\n#r \"Urho\"\n\nusing Urho;\nusing Urho.Actions;\nusing Urho.Shapes;\nusing Urho.Physics;\n```\n\n```csharp\nvar app = SimpleApplication.Show (\n\tnew ApplicationOptions (\"Data\") {\n\t\tWidth = 700, \n\t\tHeight = 700 });\nvar rootNode = app.Scene.CreateChild();\n```\n\nWe have created a window containing a `SimpleApplication`. Let’s add the Trash Can model (located in Data directory and was created in Blender):\n\n```csharp\nrootNode.RemoveAllChildren();\nvar trashcanNode = rootNode.CreateChild();\nvar trashcan = trashcanNode.CreateComponent<StaticModel>();\ntrashcan.Model = app.ResourceCache.GetModel(\"bucket.mdl\");\ntrashcan.SetMaterial(Material.FromColor(\n\tnew Color(0.4f, 0.6f, 0.2f)));\ntrashcanNode.Position = new Vector3(0, -2, 7);\ntrashcanNode.SetScale(0.4f);\n```\n\nApply RigidBody and CollisionShape to handle physics.\n\n```csharp\ntrashcanNode.CreateComponent<RigidBody>();\nvar shape = trashcanNode.CreateComponent<CollisionShape>();\nshape.SetTriangleMesh(trashcan.Model, 0, Vector3.One, \n\tVector3.Zero, Quaternion.Identity);\n```\n\nDefine ThrowBall method\n\n```csharp\nstatic void ThrowBall(Node container, Vector3 linearVelocity)\n{\n\tvar ballNode = container.CreateChild();\n\tballNode.SetScale(0.5f);\n\tvar ball = ballNode.CreateComponent<Sphere>();\n\tball.Color = new Color(Randoms.Next(), Randoms.Next(), Randoms.Next());\n\tvar rigidBody = ballNode.CreateComponent<RigidBody>();\n\trigidBody.Mass = 1f;\n\trigidBody.RollingFriction = 0.1f;\n\trigidBody.Friction = 0.1f;\n\tvar ballShape = ballNode.CreateComponent<CollisionShape>();\n\tballShape.SetSphere(1, Vector3.Zero, Quaternion.Identity);\n\trigidBody.SetLinearVelocity(linearVelocity);\n}\n```\n\nThrow a ball in a random direction with a random velocity\n\n```csharp\nThrowBall(rootNode, linearVelocity: new Vector3(0, 0.3f, 1f) * 8f);\n```\n\nDefine a plane with RigidBody and CollisionShape so balls won't fall into abyss\n\n```csharp\nvar planeNode = rootNode.CreateChild();\nplaneNode.Scale = new Vector3(100, 1, 100);\nvar plane = planeNode.CreateComponent<StaticModel>();\nplane.Model = CoreAssets.Models.Plane;\nplane.SetMaterial(Material.FromColor(\n\tnew Color(0.95f, 0.95f, 0.95f), true));\nplaneNode.Position = new Vector3(0, -2, 0);\nvar planeRb = planeNode.CreateComponent<RigidBody>();\nplaneRb.RollingFriction = 0.2f;\nvar planeShape = planeNode.CreateComponent<CollisionShape>();\nplaneShape.SetStaticPlane(\n\tnew Vector3(0, 0, 0), Quaternion.Identity);\n```\n\n```csharp\nThrowBall(rootNode, linearVelocity: \n\tnew Vector3(0, 0.3f, 1f) * 8f);\n```\n\n```csharp\n/*for (int i = 0; i < 10; i++)\n{\n\tThrowBall(rootNode, linearVelocity: new Vector3(\n\t\tRandoms.Next(-0.05f, 0.05f), \n\t\tRandoms.Next(0.2f, 0.4f), \n\t\tRandoms.Next(0.8f, 1.2f)) * Randoms.Next(8, 10));\n\tawait app.RootNode.RunActionsAsync(new DelayTime(0.5f));\n}*/\n```"
  },
  {
    "path": "graphics/urhosharp/planetearth/planetearth.workbook/Data/Materials/SatNoTexture.xml",
    "content": "<material>\n  <technique name=\"Techniques/NoTextureOutline.xml\" />\n  <parameter name=\"MatDiffColor\" value=\"0.9 0.9 0.9 1\" />\n  <parameter name=\"MatSpecColor\" value=\"1 1 1 300\" />\n  <parameter name=\"OutlineColor\" value=\"1 0 0 0\" />\n</material>"
  },
  {
    "path": "graphics/urhosharp/planetearth/planetearth.workbook/Data/RenderPaths/Outline.xml",
    "content": "<renderpath>\n  <rendertarget name=\"outlineMask\" sizedivisor=\"1 1\" format=\"rgba\" filter=\"true\" />\n  <rendertarget name=\"outlineBlurredMaskH\" sizedivisor=\"2 2\" format=\"rgba\" filter=\"true\" />\n  <rendertarget name=\"outlineBlurredMaskV\" sizedivisor=\"2 2\" format=\"rgba\" filter=\"true\" />\n  <command type=\"clear\" color=\"fog\" depth=\"1.0\" stencil=\"0\" />\n  <command type=\"clear\" color=\"0 0 0 0\" output=\"outlineMask\" />\n  <command type=\"scenepass\" pass=\"base\" vertexlights=\"true\" metadata=\"base\" />\n  <command type=\"forwardlights\" pass=\"light\" />\n  <command type=\"scenepass\" pass=\"postopaque\" />\n  <command type=\"scenepass\" pass=\"refract\">\n    <texture unit=\"environment\" name=\"viewport\" />\n  </command>\n  <command type=\"scenepass\" pass=\"alpha\" vertexlights=\"true\" sort=\"backtofront\" metadata=\"alpha\" />\n  <command type=\"scenepass\" pass=\"postalpha\" sort=\"backtofront\" />\n  <command type=\"scenepass\" pass=\"outline\" output=\"outlineMask\" sort=\"backtofront\" />\n  <command type=\"quad\" vs=\"Outline\" ps=\"Outline\" psdefines=\"BLURH\" output=\"outlineBlurredMaskH\">\n    <texture unit=\"diffuse\" name=\"outlineMask\" />\n  </command>\n  <command type=\"quad\" vs=\"Outline\" ps=\"Outline\" psdefines=\"BLURV\" output=\"outlineBlurredMaskV\">\n    <texture unit=\"diffuse\" name=\"outlineBlurredMaskH\" />\n  </command>\n  <command type=\"quad\" vs=\"Outline\" ps=\"Outline\" psdefines=\"OUTPUT\" output=\"viewport\">\n    <texture unit=\"diffuse\" name=\"outlineBlurredMaskV\" />\n    <texture unit=\"normal\" name=\"outlineMask\" />\n    <texture unit=\"specular\" name=\"viewport\" />\n  </command>\n</renderpath>"
  },
  {
    "path": "graphics/urhosharp/planetearth/planetearth.workbook/Data/Shaders/GLSL/Outline.glsl",
    "content": "#include \"Uniforms.glsl\"\n#include \"Samplers.glsl\"\n#include \"Transform.glsl\"\n#include \"ScreenPos.glsl\"\n\nvarying vec2 vTexCoord;\nvarying vec2 vScreenPos;\n\n#ifdef COMPILEPS\n    uniform vec4 cOutlineColor;\n    uniform vec2 cOutlineBlurredMaskHInvSize;\n#endif\n\nvoid VS()\n{\n    mat4 modelMatrix = iModelMatrix;\n    vec3 worldPos = GetWorldPos(modelMatrix);\n    gl_Position = GetClipPos(worldPos);\n    vTexCoord = GetQuadTexCoord(gl_Position);\n    vScreenPos = GetScreenPosPreDiv(gl_Position);\n}\n\nvoid PS()\n{\n    #ifdef MASK\n        gl_FragColor = vec4(cOutlineColor.rgb, 1.0);\n    #endif\n\n    #ifdef BLURH\n        vec4 rgba = texture2D(sDiffMap, vTexCoord + vec2(0.0, 0.0) * cOutlineBlurredMaskHInvSize)\n                  + texture2D(sDiffMap, vTexCoord + vec2(-1.0, 0.0) * cOutlineBlurredMaskHInvSize)\n                  + texture2D(sDiffMap, vTexCoord + vec2(1.0, 0.0) * cOutlineBlurredMaskHInvSize)\n                  + texture2D(sDiffMap, vTexCoord + vec2(-2.0, 0.0) * cOutlineBlurredMaskHInvSize)\n                  + texture2D(sDiffMap, vTexCoord + vec2(2.0, 0.0) * cOutlineBlurredMaskHInvSize);\n        gl_FragColor = rgba * 0.2;\n    #endif\n\n    #ifdef BLURV\n        vec4 rgba = texture2D(sDiffMap, vTexCoord + vec2(0.0, 0.0) * cOutlineBlurredMaskHInvSize)\n                  + texture2D(sDiffMap, vTexCoord + vec2(0.0, -1.0) * cOutlineBlurredMaskHInvSize)\n                  + texture2D(sDiffMap, vTexCoord + vec2(0.0, 1.0) * cOutlineBlurredMaskHInvSize)\n                  + texture2D(sDiffMap, vTexCoord + vec2(0.0, -2.0) * cOutlineBlurredMaskHInvSize)\n                  + texture2D(sDiffMap, vTexCoord + vec2(0.0, 2.0) * cOutlineBlurredMaskHInvSize);\n        gl_FragColor = rgba * 0.2;\n    #endif\n\n    #ifdef OUTPUT\n        vec4 blurredMask = texture2D(sDiffMap, vTexCoord);\n        vec4 mask = texture2D(sNormalMap, vTexCoord);\n        vec4 viewport = texture2D(sSpecMap, vTexCoord);\n        blurredMask = clamp(blurredMask - mask.a, 0.0, 1.0);\n        blurredMask *= 3.0;\n        gl_FragColor = viewport * (1.0 - blurredMask.a) + blurredMask;\n    #endif\n}"
  },
  {
    "path": "graphics/urhosharp/planetearth/planetearth.workbook/Data/Techniques/NoTextureOutline.xml",
    "content": "<technique vs=\"LitSolid\" ps=\"LitSolid\" vsdefines=\"NOUV\" >\n  <pass name=\"base\" />\n  <pass name=\"litbase\" psdefines=\"AMBIENT\" />\n  <pass name=\"light\" depthtest=\"equal\" depthwrite=\"false\" blend=\"add\" />\n  <pass name=\"prepass\" psdefines=\"PREPASS\" />\n  <pass name=\"material\" psdefines=\"MATERIAL\" depthtest=\"equal\" depthwrite=\"false\" />\n  <pass name=\"deferred\" psdefines=\"DEFERRED\" />\n  <pass name=\"depth\" vs=\"Depth\" ps=\"Depth\" />\n  <pass name=\"shadow\" vs=\"Shadow\" ps=\"Shadow\" />\n  <pass name=\"outline\" vs=\"Outline\" ps=\"Outline\" psdefines=\"MASK\"  depthwrite=\"false\" />\n</technique>"
  },
  {
    "path": "graphics/urhosharp/planetearth/planetearth.workbook/Data/Techniques/TextureOutline.xml",
    "content": "<technique vs=\"LitSolid\" ps=\"LitSolid\" psdefines=\"DIFFMAP\">\n  <pass name=\"base\" />\n  <pass name=\"litbase\" psdefines=\"AMBIENT\" />\n  <pass name=\"light\" depthtest=\"equal\" depthwrite=\"false\" blend=\"add\" />\n  <pass name=\"prepass\" psdefines=\"PREPASS\" />\n  <pass name=\"material\" psdefines=\"MATERIAL\" depthtest=\"equal\" depthwrite=\"false\" />\n  <pass name=\"deferred\" psdefines=\"DEFERRED\" />\n  <pass name=\"depth\" vs=\"Depth\" ps=\"Depth\" />\n  <pass name=\"shadow\" vs=\"Shadow\" ps=\"Shadow\" />\n  <pass name=\"outline\" vs=\"Outline\" ps=\"Outline\" psdefines=\"MASK\" depthtest=\"always\" depthwrite=\"false\" />\n</technique>"
  },
  {
    "path": "graphics/urhosharp/planetearth/planetearth.workbook/Data/Textures/License.txt",
    "content": "--------------------------\nAssets under CC 4.0 License\n--------------------------\nEarth_Clouds.jpg\nMoon.jpg\nEarth_SpecularMap.png\nEarth_Clouds.jpg\n\nwebsite: http://www.solarsystemscope.com/textures/\nlicense: https://creativecommons.org/licenses/by/4.0/"
  },
  {
    "path": "graphics/urhosharp/planetearth/planetearth.workbook/index.workbook",
    "content": "﻿---\nid: 72272456-553a-465a-be48-20b922321c19\nuti: com.xamarin.workbook\ntitle: \"UrhoSharp: Planet Earth in C#\"\nplatforms:\n- Console\npackages:\n- id: UrhoSharp\n  version: 1.5.22\n---\n\n# UrhoSharp: Planet Earth in C#\n\n[UrhoSharp](https://developer.xamarin.com/guides/cross-platform/urho/) is a powerful 3D game engine for Xamarin and .NET developers. Start by loading URho into the workbook and import some namespaces that we’ll want to consume.\n\n```csharp\n#r \"Urho\"\n\nusing Urho;\nusing Urho.Actions;\nusing Urho.Shapes;\n```\n\n```csharp\nvar app = SimpleApplication.Show (\n\tnew ApplicationOptions (\"Data\") {\n\t\tWidth = 600,\n\t\tHeight = 600,\n\t\tTouchEmulation = true });\n```\n\nWe have created a window containing a `ApplicationOptions`. Let’s add a new `Node` to the scene, representing the Earth.\n\n`Node`s contain `Component`s that dictate what is rendered. We’ll cheat a bit\nand use a `Sphere` for the Earth.\n\n```csharp\nvar earthNode = app.RootNode.CreateChild (name: \"Earth\");\nvar earth = earthNode.CreateComponent<Sphere> ();\n```\n\n```csharp\nearth.Color = Color.Blue;\n```\n\n```csharp\nearthNode.SetScale (4f);\n```\n\n```csharp\nearth.SetMaterial (Material.FromImage (\"Textures/earth.jpg\"));\n```\n\nA scene can have multiple nodes. Let’s add some satellites, starting with the Moon.\n\n```csharp\nNode moonNode = app.RootNode.CreateChild (name: \"Moon\");\nmoonNode.Position = new Vector3 (x: -3.0f, y: 0, z: 0);\nmoonNode.SetScale (1f);\nvar moon = moonNode.CreateComponent<Sphere> ();\nmoon.CastShadows = false;\nmoon.SetMaterial (Material.FromImage (\"Textures/moon.jpg\", normals: \"Textures/Moon_NormalsMap.png\"));\n```\n\n```csharp\napp.RootNode.RunActions (new RepeatForever (\n\tnew RotateBy (\n\t\tduration: 1f,\n\t\tdeltaAngleX: 0,\n\t\tdeltaAngleY: -15,\n\t\tdeltaAngleZ: 0)));\napp.MoveCamera = true;\n```\n\nOverride the render path to show custom Outline shader\n\n```csharp\nstatic var random = new Random ();\nvar effectRenderPath = app.Viewport.RenderPath.Clone ();\neffectRenderPath.Append (app.ResourceCache.GetXmlFile (\"RenderPaths/Outline.xml\"));\napp.Viewport.RenderPath = effectRenderPath;\nearthNode.Rotate (new Quaternion (x: 0, y: -73, z: 0), TransformSpace.Local);\nvar satellitesNode = app.RootNode.CreateChild ();\n```\n\nWe want to spawn thousands of satellites in Low Earth Orbit. Here’s a method to randomly distribute satellites as they are added.\n\n```csharp\nNode AddSatellite (Node parent, float lat, float lon,\n\tModel model, float scale, bool outline = true)\n{\n\t//let's do some math:\n\t//convert lat and lon to XYZ:\n\tvar height = 2.2 + random.NextDouble () / 3;\n\tvar latrad = lat * Math.PI / 180;\n\tvar lonrad = lon * Math.PI / 180;\n\tvar x = -height * Math.Cos (latrad) * Math.Cos (lonrad);\n\tvar y = height * Math.Sin (latrad);\n\tvar z = height * Math.Cos (latrad) * Math.Sin (lonrad);\n\n\tvar satNode = parent.CreateChild (\"SatRoot\");\n\tvar satModelNode = satNode.CreateChild (\"SatModel\");\n\tvar sat = satModelNode.CreateComponent<StaticModel> ();\n\tsat.Model = model;\n\n\tif (outline) {\n\t\t//apply a custom outline shader\n\t\tvar material = CoreAssets.Cache.GetMaterial (\n\t\t\t\"Materials/SatNoTexture.xml\").Clone (\"\");\n\t\tmaterial.SetShaderParameter (\"OutlineColor\",\n\t\t\tnew Color ((float)random.NextDouble (),\n\t\t\t\t\t  (float)random.NextDouble (),\n\t\t\t\t\t  (float)random.NextDouble (), 0));\n\t\tsat.SetMaterial (material);\n\t}\n\n\tsatModelNode.SetScale (scale);\n\tsatNode.Position = new Vector3 ((float)x, (float)y, (float)z);\n\tsatNode.LookAt (new Vector3 (0, 0, 0), new Vector3 (0, 1, 0),\n\t\t\t\t   TransformSpace.Parent);\n\tsatNode.Rotate (new Quaternion (90, 0, 0), TransformSpace.Local);\n\tsatNode.RunActions (new RepeatForever (new RotateBy (1f, 0f, 10f, 0f)));\n\n\treturn satNode;\n}\n```\n\nAccording to NASA, there are ~3600 satellites in Low Earth Orbit.\n\n```csharp\nsatellitesNode.RemoveAllChildren();\n\nfor (int i = 0; i < 3600; i++) {\n\tAddSatellite(satellitesNode,\n\t\tlat: Randoms.NextNormal (-90, 90),\n\t\tlon: Randoms.Next (0, 360),\n\t\tmodel: CoreAssets.Models.Box,\n\t\tscale: 0.02f,\n\t\toutline: false);\n}\n```\n\nSpawn a big satellite over Orlando.\n\n```csharp\nvar orlandoLat = 28.538336f;\nvar orlandoLon = -81.379234f;\n\nAddSatellite (satellitesNode,\n\tlat: orlandoLat,\n\tlon: orlandoLon,\n\tmodel: app.ResourceCache.GetModel (\"Models/BigSatellite.mdl\"),\n\tscale: 0.0005f);\n```\n\nTa da!\n\n### Event Handlers\n\nSpawn a few more big satellites.\n\n```csharp\nfor (int i = 0; i < 20; i++) {\n\tAddSatellite (satellitesNode,\n\t\tlat: Randoms.NextNormal (-90, 90),\n\t\tlon: Randoms.Next (0, 360),\n\t\tmodel: app.ResourceCache.GetModel (\"Models/BigSatellite.mdl\"),\n\t\tscale: 0.0005f);\n}\n```\n\nUser interaction: click to increase satellite node size.\n\n```csharp\nNode currentNode;\napp.Input.SetMouseVisible (true, false);\napp.Input.TouchEnd += e => {\n\tif (currentNode != null) {\n\t\tcurrentNode.RemoveAllActions ();\n\t\tcurrentNode.RunActions (new ScaleTo (0.7f, 0.0005f));\n\t\tcurrentNode = null;\n\t}\n\n\tvar cameraRay = app.Camera.GetScreenRay (\n\t\t(float)e.X / app.Graphics.Width,\n\t\t(float)e.Y / app.Graphics.Height);\n\n\tvar result = app.Octree.RaycastSingle (cameraRay,\n\t\tRayQueryLevel.Triangle, 100, DrawableFlags.Geometry);\n\n\tif (result != null) {\n\t\tvar node = result.Value.Node;\n\t\tif (node.Name.StartsWith(\"Sat\")) {\n\t\t\tcurrentNode = node;\n\t\t\tcurrentNode.RunActions (new EaseElasticOut (\n\t\t\t\tnew ScaleTo (0.7f, 0.0015f)));\n\t\t\tcurrentNode.RunActions (new RepeatForever (\n\t\t\t\tnew RotateBy (1f, 90f, 0f, 0f)));\n\t\t}\n\t}\n};\n```\n\nA more complicated example of how to create complex Materials in code and set shaders’ parameters.\n\n```csharp\nvar advancedEarthMaterial = new Material();\nadvancedEarthMaterial.SetTechnique(0, CoreAssets.Techniques.DiffNormal, 0, 0);\nadvancedEarthMaterial.SetTexture(TextureUnit.Diffuse, app.ResourceCache.GetTexture2D(\"Textures/Earth_Diff.jpg\"));\nadvancedEarthMaterial.SetTexture(TextureUnit.Normal, app.ResourceCache.GetTexture2D(\"Textures/Earth_NormalsMap.png\"));\nearth.SetMaterial(advancedEarthMaterial);\nadvancedEarthMaterial.SetShaderParameter(CoreAssets.ShaderParameters.MatDiffColor, new Color(0.8f, 0.9f, 1f, 1f));\n```\n\n```csharp\nearthNode.RemoveAllChildren();\nvar cloudsNode = earthNode.CreateChild();\ncloudsNode.SetScale(1.03f);\nvar clouds = cloudsNode.CreateComponent<StaticModel>();\nclouds.Model = CoreAssets.Models.Sphere;\nvar cloudsMaterial = new Material();\ncloudsMaterial.SetTechnique(0, CoreAssets.Techniques.DiffAddAlpha, 0, 0);\ncloudsMaterial.SetTexture(TextureUnit.Diffuse, app.ResourceCache.GetTexture2D(\"Textures/Earth_Clouds.jpg\"));\ncloudsMaterial.SetShaderParameter(CoreAssets.ShaderParameters.MatDiffColor, new Color(1,1,1,0.6f));\nclouds.SetMaterial(cloudsMaterial);\ncloudsNode.RunActions(new RepeatForever(new RotateBy(1f, 0, 7, 0)));\n```"
  },
  {
    "path": "ios/README.md",
    "content": "iOS Workbooks\n============\n\n* Getting Started\n* User Interface\n* Advanced\n"
  },
  {
    "path": "ios/getting-started/Learning-iOS.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# Understanding your iOS Application\n\n❗️To use this workbook follow through each section in sequence to learn how to build up a view heirarchy. Make sure to do the *Try it now* sections to reinforce your learning! ❗️\n\nWhen you open an iOS application on your device, what you see is a number of components working together to give you the perception of one single View. In this guide we will interactively explore the make up of an iOS application, allowing you to get a deeper understanding of its functionality.\n\n### The Window\n\nThe most fundamental object of an iOS app and first thing your user will see is a window. You can think of this window as a shop front. There is one Window, or screen, that allows your user to view the app. You can add whatever you want to the window, but in most cases only one Main Window is used.\n\nTo create a new Window, first declare a new instance of `UIWindow` and then make that window visible:\n\n```csharp\nvar window = new UIWindow(UIScreen.MainScreen.Bounds);\nwindow.MakeKeyAndVisible()\n```\n\nIf you inspect the simulator now, you’ll notice a blank white screen. This is because there isn’t actually anything visible on the screen – you’ll have to add it.\n\nAn iOS application uses a View Controller to manage all the views within it – it loads and disposes the views, it handles user interactions with the views, and it co-ordinates with other objects. There can be many View Controllers, of many types (eg. `TableViewController`), within one application, all of which work together.\n\nStart building your *View Heirarchy* by creating a single UIViewController:\n\n```csharp\nvar controller = new UIViewController()\n```\n\nAs mentioned earlier that most applications have a single Window. Every Window has a single **Root View Controller**, and this is the first View Controller that your user will see and interact with.\n\nSet the recently created View Controller, to be window’s RootViewController:\n\n```csharp\nwindow.RootViewController = controller\n```\n\nThe RootViewController has been set, but if you look at the simulator it won’t look any different. Change the background color using the code below:\n\n```csharp\ncontroller.View.BackgroundColor = UIColor.Magenta\n```\n\nYou can’t set the color of the actual View Controller itself, it’s just an UI-less object that manages views.\n\n###### Try it now!\n\n* See if you can change the color of the background to something different\n\n* Can you change it to an RGB value? *(Hint: Create a new instance of UIColor, assign Red, Blue, Green, and alpha nfloat values, and set the background to the new instance)*\n\nYou should be starting to see how the View Heirarchy of iOS apps work. Having something to look at on the screen is nice, but usually users want to interact with their apps by navigating through them. To do this you can use a Navigation Controller. As suggested by the name, it manages the navigation of your application. A navigation controller is a UI-less controller that will manage a stack of however many View Controllers that you add to it.\n\nAdd one to your app:\n\n```csharp\nvar navigationController = new UINavigationController();\n```\n\nYou should notice that nothing happens. This is because the RootViewController still thinks that controller is the first thing it should be showing us. Amend this to set the `navigationController`as the `RootViewController`:\n\n```csharp\nwindow.RootViewController = navigationController\n```\n\nNext, use the existing View Controller (named *controller*) as the first View Controller in the navigationController’s stack.\n\n###### Try it now\n\n* Pass the View Controller (controller) into the newly created instance of our navigation controller. You can pass this as an argument in the code above and press cmd \\+ Enter to run the code. \n\n* ⚠️This step is important. If you don’t do this step, the rest of the code may not work correctly\n\nThe View Controller’s properties can be changed to allow the app to be more user friendly. You can set the Navigation Item’s title to be anything you want. Update the string below to give the title a name that you think is suitable:\n\n```csharp\ncontroller.NavigationItem.Title = \"iOS is Cool\"\n```\n\n### Building the View Heirarchy\n\nNow, we have a ViewContoller which is the first ViewController in our Navigation Stack and we’ve set this as our RootViewController (this first thing that the user will see). Now, let’s allow our user to interact with our application by adding UI *controls* to our View.\n\nIn any app that you create, user interaction is essential. To allow for this, user interface controls can be added to any View.\n\nCreate a text box with the following code snippet. A `UITextField` can be used to gather text based input from the user:\n\n```csharp\nvar name =  new UITextField{ Placeholder = \"Enter Name\",\n                             BorderStyle = UITextBorderStyle.RoundedRect,\n                    Frame = new CGRect(10, 80, controller.View.Bounds.Width -20, 31.0f)}\n```\n\nNotice that when creating a control in code, such as a `UITextField`, a `Frame`property is declared.  This property defines the the location and size of the control. In iOS the 0,0 coordinate is in the upper left with \\+ x to the right and \\+ y down.\n\nThis control then needs to be added to the ViewController’s view as a **subview**, so that it will display in your app:\n\n```csharp\ncontroller.View.AddSubview(name)\n```\n\nLet’s add another few Text Fields and a button:\n\n```csharp\nvar email =  new UITextField{ Placeholder = \"Enter Email\",\n                              BorderStyle = UITextBorderStyle.RoundedRect,\n                Frame = new CGRect(10, 120, controller.View.Bounds.Width -20, 31.0f)};\n\nvar password = new UITextField{ Placeholder = \"Enter Password\",\n                                BorderStyle = UITextBorderStyle.RoundedRect,            \n                                SecureTextEntry = true,\n                Frame = new CGRect(10, 160, controller.View.Bounds.Width - 20, 31.0f)};\n\nvar enterButton = UIButton.FromType(UIButtonType.System);\nenterButton.Frame = new CGRect(10, 200, controller.View.Bounds.Width - 20, 31.0f);\nenterButton.SetTitle (\"Submit\", UIControlState.Normal);\n```\n\n#### Try it now:\n\n* Set the `KeyboardType`property of the email TextField to `EmailAddress`\n\n* Adjust the appearance of the Button. For example, you could try to change the background color of the button, or you could adjust the corner radius of its layer to make the corners rounded.\n\nOnce they have been created, we have to add these controls to the view. We can add multiple subviews to the view hierarchy by using `AddSubviews` and passing in an array of UIViews that includes all our views:\n\n```csharp\ncontroller.View.AddSubviews(new UIView[]{email, password, enterButton})\n```\n\nAt this point, the app has a simple (though passive) user interface that is displayed in a single ViewController. The next step is to add code to handle user input. This is covered in the UIButton workbook.\n"
  },
  {
    "path": "ios/getting-started/hello-ios-workbook.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\n---\n\n# iOS\n\n```csharp\nvar label = new UIKit.UILabel(new CGRect(10,10,300,50)) {\n  Text = \"Hello, Workbooks\",\n  Font = UIFont.SystemFontOfSize(36)\n};\nRootViewController.Add(label);\n```\n"
  },
  {
    "path": "ios/getting-started/meta.json",
    "content": "{\n  \"order\":{\n    \"hello-ios-workbook.workbook\":\"Hello, iOS\",\n    \"Learning-iOS.workbook\":\"Learning iOS\"\n  }\n}\n"
  },
  {
    "path": "ios/meta.json",
    "content": "{\n  \"order\":{\n    \"getting-started\":\"Getting Started\",\n    \"platform-features\":\"Platform Features\",\n    \"user-interface\":\"User Interface\"\n  }\n}\n"
  },
  {
    "path": "ios/platform-features/auto-layout/programmatical-constraints.workbook",
    "content": "---\nid: eb2f1f80-c574-4b2b-af0d-29fc97c1c5ef\ntitle: programmatical-constraints\nuti: com.xamarin.workbook\nplatforms:\n- iOS\n---\n\n## Programmatically Creating Constraints\n\nThe goal of this workbook is to explain **advanced auto layout** concepts by showing how to create constraints **programmatically**.\n\n> ⚠️ Whenever possible, we recommend you use the iOS designer to create your constraints because you can easily visualize, edit, manage and debug them.\n\n```csharp\nvar orangeLabel = new UILabel () {\n        Text = \"Orange\",\n        TextColor = UIColor.White,\n        TextAlignment = UITextAlignment.Center,\n        BackgroundColor = UIColor.Orange\n};\n\n// This could be any parent view you add UI elements to.\nvar rootView = RootViewController.View;\nrootView.AddSubview (orangeLabel);\n```\n\n### Absolute coordinates\n\nLet’s position the `orangeLabel` at the top left corner manually first so we can see it.\n\n```csharp\norangeLabel.Frame = new CGRect (20, 20, 120, 50);\n```\n\nIf we wanted to center this label in the middle of the screen we could, *technically*, do it using **absolute** x,y coordinates but this is **not** the most optimal, responsive and simple (will imply quite a bit of math) way to do it.\n\n### Begin with Constaints\n\n`TranslatesAutoresizingMaskIntoConstraints` is **key** to using manual constraints.\n\nBy default this is set to `true` which lets the system create a set of constraints for you.\n\nHowever, using `TranslatesAutoresizingMaskIntoConstraints = true` prevents you from adding **additional constraints**, as described in [API doc](https://developer.apple.com/reference/uikit/uiview/1622572-translatesautoresizingmaskintoco):\n\n> ℹ️ Note that the autoresizing mask constraints fully specify the view’s size and position; therefore, you cannot add additional constraints to modify this size or position without introducing conflicts. If you want to use Auto Layout to dynamically calculate the size and position of your view, you must set this property to false, and then provide a non ambiguous, nonconflicting set of constraints for the view.\n\n```csharp\norangeLabel.TranslatesAutoresizingMaskIntoConstraints = false;\n```\n\nSetting `TranslatesAutoresizingMaskIntoConstraints` to `false` should result in the label disappearing because we did not, *yet*, add our manual constraints.\n\n> ℹ️ At this point the `Frame` we set before for `orangeLabel` is obsolete, it’s not used by the system anymore. You can try to comment the line where we set it, it won’t affect the constraints we’ll define next.\n\nSo let’s add some constraints.\n\nWe can use **anchors** to align UI elements. You can use these constraints to programatically define your layout using Auto Layout.\n\n```csharp\n// This translates to: orangeLabel's CenterYAnchor (vertical alignment) = rootView's CenterYAnchor\norangeLabel.CenterYAnchor.ConstraintEqualTo (rootView.CenterYAnchor).Active = true;\n```\n\nWe can also use some **guides** to help us with the alignment.\n\n`UIView` provides a `LayoutMarginsGuide` property to represent the margins.\n\n```csharp\nvar marginGuide = RootViewController.View.LayoutMarginsGuide;\norangeLabel.LeadingAnchor.ConstraintEqualTo (marginGuide.LeadingAnchor).Active = true;\n```\n\nFinally we can restore the label’s **width** and **height**.\n\n```csharp\norangeLabel.WidthAnchor.ConstraintEqualTo (120).Active = true;\norangeLabel.HeightAnchor.ConstraintEqualTo (50).Active = true;\n```\n\nFeel free to play around with the constraints above to try to center the label vertically **and** horizontally.\n\n### Purple label constrained to orange label\n\nLet’s start by adding a new purple label.\n\n```csharp\nvar purpleLabel = new UILabel () {\n        Text = \"Purple\",\n        TextColor = UIColor.White,\n        TextAlignment = UITextAlignment.Center,\n        BackgroundColor = UIColor.Purple,\n        TranslatesAutoresizingMaskIntoConstraints = false\n};\nrootView.AddSubview (purpleLabel);\n\n// Same width and height constraints as orangeLabel.\npurpleLabel.WidthAnchor.ConstraintEqualTo (120).Active = true;\npurpleLabel.HeightAnchor.ConstraintEqualTo (50).Active = true;\n```\n\nA typical Layout Constraint can be expressed simply as a **linear expression**. Take the following example:\n\nPurple.Leading = 1.0 x Orange.Trailing + 10.0\n\nor\n\n\\[Item1].\\[Attribute1]\\[Relationship]\\[Multiplier]\\[Item2]\\[Attribute2]\\[Constant]\n\n```csharp\npurpleLabel.LeadingAnchor.ConstraintEqualTo (orangeLabel.TrailingAnchor, 10).Active = true;purpleLabel.CenterYAnchor.ConstraintEqualTo (orangeLabel.CenterYAnchor).Active = true;\n```\n\nNow you could, for instance, constrain the trailing anchor of the purple label to the trailing anchor of the marin guide to fill all the horizontal space.\n\n> ℹ️ Note that this will adapat to **any device form factor**.\n\n```csharp\npurpleLabel.TrailingAnchor.ConstraintEqualTo (marginGuide.TrailingAnchor).Active = true;\n```\n\n###### Try it now\n\nA good exercise now would be to try positioning the labels vertically instead of horizontally."
  },
  {
    "path": "ios/platform-features/meta.json",
    "content": "{\n  \"order\":{\n    \"auto-layout/programmatical-constraints.workbook\":\"Programmatically Creating Constraints (Auto Layout)\",\n    \"scenekit/exploring-scenekit.workbook\":\"Exploring SceneKit\",\n    \"scenekit/scngeometrysource.workbook\":\"SceneKit Geometry Source\",\n    \"texttospeech/TextToSpeech.workbook\":\"Text to Speech\",\n    \"touchid/TouchID.workbook\":\"TouchID\",\n    \"widecolor/widecolor.workbook\":\"Wide Color\"\n  }\n}\n"
  },
  {
    "path": "ios/platform-features/scenekit/README.md",
    "content": "iOS SceneKit Workbooks\n============\n\n* Exploring SceneKit\n* SCNGeometrySource\n\n![](Screenshots/ExploringSceneKit.png)"
  },
  {
    "path": "ios/platform-features/scenekit/exploring-scenekit.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\n---\n\n# Exploring SceneKit\n\n## Introduction\n\nThe SceneKit namespace is the native iOS framework for providing 3D graphics for applications. Developers interested in cross-platform 3D graphics for games might want to investigate [UrhoSharp](https://developer.xamarin.com/guides/cross-platform/urho/introduction/). SceneKit uses an easy-to-program “scene graph” model. A scene graph is a branching structure that defines geometries, lights, textures, etc. relative to their parent nodes.\n\nThis workbook explores the `SceneKit` and `CoreAnimation` namespaces, so reference them. Bring in the `Foundation` namespace as well, for convenience:\n\n```csharp\nusing SceneKit;\nusing CoreAnimation;\nusing Foundation;\n```\n\nThe scene graph exists within an `SCNScene`:\n\n```csharp\nvar scene = new SCNScene();\n```\n\nAn `SCNView` is a subclass of `UIView` that displays a portion of an `SCNScene`. Create an `SCNView` that takes up the whole screen:\n\n```csharp\nUIScreen.MainScreen.Bounds\n```\n\n```csharp\nvar scnView = new SCNView(UIScreen.MainScreen.Bounds);\ntrue;\n```\n\nSet the `SCNView.Scene` property to the previously created scene and show some debugging statistics:\n\n```csharp\nscnView.Scene = scene;\nscnView.AllowsCameraControl = true;\nscnView.ShowsStatistics = true;\n```\n\nAs always with iOS, control of the user experience begins with the root `UIViewController`. Xamarin notebooks provides the `RootViewController` global variable (execute `help` in a code block to see the complete list of variables provided by Workbooks).\n\n```csharp\nRootViewController;\n```\n\nBy setting the `View` property of the root `UIViewController` to the `SCNView` that you just created, you will have a full-screen (in the Simulator) view of the `SCNScene`:\n\n```csharp\nRootViewController.View = scnView;\ntrue\n```\n\nIt may not be apparent that anything has changed, although you should notice the status bar at the bottom of the simulator showing FPS. But you can see that we are, indeed, displaying `scnView` by changing its background color:\n\n```csharp\nscnView.BackgroundColor = UIColor.Black;\n```\n\nOur scene graph is empty, so let’s set the stage:\n\n### Lights!\n\nThere are a variety of [SCNLightType values](https://developer.xamarin.com/api/type/SceneKit.SCNLightType/). We need at least one to see anything! In this case, we’ll create an “omni” light that emits light in all directions (like a naked light bulb) and an “ambient” light that illuminates all objects in the scene from all directions with the same intensity:\n\n```csharp\nvar lightNode = new SCNNode();\nlightNode.Light = new SCNLight ();\nlightNode.Light.LightType = SCNLightType.Omni;\nlightNode.Position = new SCNVector3 (0.0F, 10.0F, 10.0F);\nscene.RootNode.AddChildNode (lightNode);\n\nvar ambientLightNode = new SCNNode ();\nambientLightNode.Light = new SCNLight ();\nambientLightNode.Light.LightType = SCNLightType.Ambient;\nambientLightNode.Light.Color = UIColor.DarkGray;\nscene.RootNode.AddChildNode (ambientLightNode);\n```\n\nThe above code shows a typical pattern for working with SceneKit. First, you create an `SCNNode`. Second, you set properties of that node such as it's `Light` and `LightType` properties. The `Position` property locates the `SCNNode` in 3D space *relative to its parent node's* `Position`, `Rotation`, and `Scale` properties. Finally, you add the newly-created `SCNNode` as a child of an existing `SCNNode`.\n\n### Camera!\n\nNow place a camera within the scene, using a similar pattern of creating an `SCNNode`, settings relevant properties, and locating it relative to its parent node:\n\n```csharp\nvar cameraNode = new SCNNode ();\ncameraNode.Camera = new SCNCamera ();\ncameraNode.Position = new SCNVector3 (0.0F, 0.0F, 3.0F);\nscene.RootNode.AddChildNode (cameraNode);\n```\n\n### Actors on the set!\n\nAt this point, you *still* don’t see anything, because you've not added any geometry to the scene graph.\n\nThe [SCNGeometry ](https://developer.xamarin.com/api/type/SceneKit.SCNGeometry/) class has a number of sub-classes representing primitive shapes (box, capsule, pyramid, etc.). Or you can programmatically create custom geometry or load it from a DAE file. (See the [Exploring SCNGeometrySource](tk) workbook.)\n\nIn this case, create an `SCNBox` and add it to the scene:\n\n```csharp\nvar boxNode = new SCNNode ();\nvar box = new SCNBox();\nbox.ChamferRadius = 0.02f;\nboxNode.Geometry = box;\nscene.RootNode.AddChildNode (boxNode);\n```\n\nFinally! Something visible in the Simulator! In the Simulator, you can click and drag to rotate the viewpoint.\n\n\\(Note that the `Position` property of the `boxNode` was not set, but `SCNVector3` is a value type and defaults to `[0, 0, 0]`, which happens to be what we desire for this step.)\n\nNow, texture the box. First, load a simple texture from the file system:\n\n```csharp\nvar img = UIImage.FromFile(\"textureX.png\");\n```\n\nSceneKit’s built-in primitive types have reasonable default values for UV (texture) coordinates, so no more work is needed to apply the texture to the box faces:\n\n```csharp\nvar material = new SCNMaterial ();\nmaterial.Diffuse.Contents = img;\nmaterial.Specular.Contents = UIColor.Gray;\nmaterial.LocksAmbientWithDiffuse = true;\nboxNode.Geometry.FirstMaterial = material;\n```\n\n### Action!\n\nThe `SCNNode.AddAnimation(CAAnimation)` method allows you to add an animation to a node:\n\n```csharp\nvar animation = new CABasicAnimation();\nanimation.KeyPath = \"rotation\";\nvar t = new SCNVector4 (1.0F, 1.0F, 0.0F, (float) (Math.PI * 2.0));\nanimation.To = NSValue.FromVector (t);\nanimation.Duration = 5.0f; //seconds\nanimation.RepeatCount = float.MaxValue; //repeat forever\nboxNode.AddAnimation(animation,new NSString(\"rotation\"));\n```\n\nAnd that’s all there is to creating an animated SceneKit scene!\n\nTo finish up, let’s remove what we’ve done:\n\n```csharp\nboxNode.RemoveFromParentNode();\n```\n\nAnd add a whole bunch of nodes to the scene:\n\n```csharp\nvoid TimesRepeat(int repeatCount, Action action)\n{\n    for (int i = 0; i < repeatCount; i++)\n        action();\n}\n\nvar rand = new Random();\n\nFunc<float> NextFractional = () => 1.5f - 3.5f * (float) rand.NextDouble();\n\nTimesRepeat(15, () => {\n    var boxNode = new SCNNode ();\n\tboxNode.Position = new SCNVector3(NextFractional(), NextFractional(), NextFractional());\n\t\n    var box = new SCNBox();\n\tbox.Length = 0.2f;\n\tbox.Width = 0.2f;\n\tbox.Height = 0.2f;\n    box.ChamferRadius = 0.02f;\n\tbox.FirstMaterial = material;\n    boxNode.Geometry = box;\n\t\n\tvar animation = new CABasicAnimation();\n\tanimation.KeyPath = \"rotation\";\n\tvar t = new SCNVector4 (NextFractional(), NextFractional(), NextFractional(), (float) (Math.PI * 2.0));\n\tanimation.To = NSValue.FromVector (t);\n\tanimation.Duration = 5.0f;\n\tanimation.RepeatCount = float.MaxValue; //repeat forever\n\tboxNode.AddAnimation(animation,new NSString(\"rotation\"));\n\n    scene.RootNode.AddChildNode (boxNode);\n});\n```"
  },
  {
    "path": "ios/platform-features/scenekit/scngeometrysource.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\n---\n\n# Exploring SCNGeometrySource\n\n## Creating custom geometry\n\nSceneKit’s [SCNGeometry ](https://developer.xamarin.com/api/type/SceneKit.SCNGeometry/)class has several subclasses that represent various primitive shapes (boxes, pyramids, capsules, etc.). Additionally, you can load custom geometry from .DAE files.\n\nOr you can create the geometry programmatically. This is the most complex way to create geometry, but ultimately is the most flexible. This workbook will go through the process of creating and animating a textured right-pyramid (a four-sided pyramid).\n\n## SceneKit basics...\n\nFirst, create a basic SceneKit scene with a camera:\n\n```csharp\nusing SceneKit;\n\nvar vc = KeyWindow.RootViewController;\n\nvar scene = new SCNScene();\n\nvar scnView = new SCNView(UIScreen.MainScreen.Bounds);\nscnView.Scene = scene;\nscnView.AllowsCameraControl = true;\nscnView.ShowsStatistics = true;\nscnView.BackgroundColor = UIColor.Black;\n\nvc.View = scnView;\n\nvar lightNode = new SCNNode();\nlightNode.Light = new SCNLight ();\nlightNode.Light.LightType = SCNLightType.Omni;\nlightNode.Position = new SCNVector3 (0.0F, 10.0F, 10.0F);\nscene.RootNode.AddChildNode (lightNode);\n\nvar ambientLightNode = new SCNNode ();\nambientLightNode.Light = new SCNLight ();\nambientLightNode.Light.LightType = SCNLightType.Ambient;\nambientLightNode.Light.Color = UIColor.DarkGray;\nscene.RootNode.AddChildNode (ambientLightNode);\n\nvar cameraNode = new SCNNode ();\ncameraNode.Camera = new SCNCamera ();\nscene.RootNode.AddChildNode (cameraNode);\ncameraNode.Position = new SCNVector3 (0.0F, 0.0F, 3.0F);\n```\n\n### Important classes\n\nThere are two critical classes for creating custom geometry: the `SCNGeometrySource` class and the `SCNGeometryElement` class. `SCNGeometrySource` objects are responsible for specifying vertex data. `SCNGeometryElement` objects specify *how* the vertices in the `SCNGeometrySource` object(s) are connected and rendered. In this case, for instance, we'll specify the vertices as separate triangles, but other valid `SCNGeometryPrimitiveType` values are lines, points, and trianglestrips.\n\nIn addition to basic structure, vertex normals are needed for proper lighting calculations and UV (texture) coordinates are needed to specify how the texture is applied to the geometry. Factory methods turn arrays of this per-vertex data into `SCNGeometrySource` objects.\n\n### Basic geometry\n\nOur goal is to create a \"tent\" (or right-pyramid) that stretches from \\[-1, -1, 0\\] to \\[1, 1, 0\\]. The \"peak\" of the \"tent\" will be in its center:\n\n```csharp\nvar a = new SCNVector3(-1, -1, 0);\nvar c = new SCNVector3(1, 1, 0);\n\nvar halfX = (c.X + a.X) / 2;\nvar halfY = (c.Y + a.Y) / 2;\nvar halfZ = (c.Z + a.Z) / 2;\n\nvar b = new SCNVector3(a.X, c.Y, halfZ);\nvar d = new SCNVector3(c.X, a.Y, halfZ);\n//Modify third argument to visualize tent peak immediately\nvar midPoint = new SCNVector3(halfX, halfY, halfZ);\n```\n\nNow, we can convert these 3D points into vertex geometry data -- our first `SCNGeometrySource`:\n\n```csharp\nvar locs = new [] {\n\ta, b, c, d, midPoint\n};\nvar locSource = SCNGeometrySource.FromVertices(locs);\n```\n\nTo properly calculate light reflections, we have to specify the surface normals. Since the rectangle defined by `a` and `c` above is lying flat on the ground, that's easy enough:\n\n```csharp\n//Normals are relative to geometry (i.e., not to global scene-graph coords)\nvar normals = new [] {\n\tnew SCNVector3(0, 0, 1),\n\tnew SCNVector3(0, 0, 1),\n\tnew SCNVector3(0, 0, 1),\n\tnew SCNVector3(0, 0, 1),\n\tnew SCNVector3(0, 0, 1),\n};;\nvar normSource = SCNGeometrySource.FromNormals(normals);\n```\n\nSince we want a textured object, we also have to create an `SCNGeometrySource` for UV coordinates. Texture coordinates with values outside the range \\[0,1\\] trigger texture wrapping. In this case, we just want to pin the corners of the texture to the corners of the tent and to pin the \"peak\" of the tent to the center vertex:\n\n```csharp\nvar txCoords = new [] {\n\tnew CGPoint(0, 0),\n\tnew CGPoint(0, 1),\n\tnew CGPoint(1, 1),\n\tnew CGPoint(1, 0),\n\tnew CGPoint(0.5, 0.5)\n};\n\nvar txCoordsSource = SCNGeometrySource.FromTextureCoordinates(txCoords);\n```\n\nSo now we have the necessary `SCNGeometrySource` objects for our per-vertex data:\n\n```csharp\nvar sources = new [] { locSource, normSource, txCoordsSource };\n```\n\nNow it's time to create our `SCNGeometryElement` object to specify how the vertices are connected. This is tightly coupled to the shape and ordering of the vertex data we specified in `locs` above! In the case of `SCNGeometryPrimitiveType.Triangles`, we need to index into the vertex data and define the faces of our geometry by winding in a counter-clockwise direction:\n\n```csharp\n//Note that this relies on the shape and ordering of locs above!\nvar indices = new [] {\n\t//Counter-clockwise!\n\t4, 1, 0,\n\t1, 4, 2,\n\t2, 4, 3,\n\t3, 4, 0\n};\n```\n\nYou should be able to follow how the triangles defined in `indices` above map into the location of the various index values within `locs`. The first three values in `indices`, for instance, `4, 1, 0`, define the left side of the geometry. The next values,`1, 4, 2,` define the top, and so on.\n\n\\[TODO: If you cannot see the below image, it is the file `indices.jpg` in the workbook directory\\]\n![](indices.jpg)\n\nNow, to create the `SCNGeometryElement`, we transform the above into `NSData` and call the `SCNGeometryElement.FromData` method with the appropriate arguments:\n\n* The `idxData` holding the bytes of our `indices` array;\n\n* Our data specifies complete triangles;\n\n* The number of triangles we've specified is 4 (`indices.Length / 3`); and\n\n* The `NSData` should be read in as a series of `int`s.\n\n```csharp\nvar idxArray = new byte[indices.Length][];\nfor(int i = 0; i < idxArray.Length; i++)\n{\n\tidxArray[i] = BitConverter.GetBytes(indices[i]);\n}\nvar idxData = NSData.FromArray(idxArray.SelectMany(id => id).ToArray());\n//Note that this relies on indices defining triangles\nvar element = SCNGeometryElement.FromData(idxData, SCNGeometryPrimitiveType.Triangles, indices.Length / 3, sizeof(int));\nvar elements = new [] { element };\n```\n\nNow that we have both our `SCNGeometrySource` objects and our `SCNGeometryElement` object, we can create the custom geometry:\n\n```csharp\nvar geometry = SCNGeometry.Create(sources, elements);\n```\n\nAs always, we add the geometry to the `SCNScene` by creating a new `SCNNode` and adding it to the `SCNScene`:\n\n```csharp\nvar tentNode = SCNNode.FromGeometry(geometry);\nscene.RootNode.AddChildNode(tentNode);\n```\n\nNow to texture the geometry. First, create an `SCNMaterial`:\n\n```csharp\nvar material = new SCNMaterial ();\nmaterial.Diffuse.Contents = UIImage.FromFile (\"textureX.png\");\nmaterial.Specular.Contents = UIColor.Gray;\nmaterial.LocksAmbientWithDiffuse = true;\nmaterial.Diffuse.WrapS = SCNWrapMode.Repeat;\nmaterial.Diffuse.WrapT = SCNWrapMode.Repeat;\n```\n\n`SCNGeometry` objects can have multiple materials, but in this case, we only need the one:\n\n```csharp\ngeometry.FirstMaterial = material;\n```\n\nAnd there's our textured custom geometry!\n\nBefore moving on, let's clear the scene:\n\n```csharp\ntentNode.RemoveFromParentNode();\n```\n\n## Modifying geometry\n\n`SCNMorpher` objects are used to smoothly animate between geometries in SceneKit. In this case, we want to animate the location of the \"peak\" of the tent. Before we get to the animation, let’s write some convenience code that allows us to rapidly create new geometry without redoing all our work.\n\nFirst, define a `struct` that holds both the custom geometry and a reference to its vertex locations:\n\n```csharp\npublic struct Tent {\n\tpublic SCNNode Node { get; }\n\tpublic SCNVector3[] Locations { get; }\n\n\tpublic Tent(SCNNode node, SCNVector3[] locations)\n\t{\n\t\tNode = node;\n\t\tLocations = locations;\n\t}\n}\n```\n\nWe'll create a `Tent` object in a function. Notice that the `CreateTent` function is virtually identical to the code you've already executed in this notebook!\n\n```csharp\nTent CreateTent(SCNVector3 a, SCNVector3 c)\n{\n\tvar halfX = (c.X + a.X) / 2;\n\tvar halfY = (c.Y + a.Y) / 2;\n\tvar halfZ = (c.Z + a.Z) / 2;\n\n\tvar b = new SCNVector3(a.X, c.Y, halfZ);\n\tvar d = new SCNVector3(c.X, a.Y, halfZ);\n\tvar midPoint = new SCNVector3(halfX, halfY, halfZ);\n\n\tvar locs = new [] {\n\t\ta, b, c, d, midPoint\n\t};\n\tvar locSource = SCNGeometrySource.FromVertices(locs);\n\n\t//Normals are relative to geometry\n\tvar normals = new [] {\n\t\tnew SCNVector3(0, 0, 1),\n\t\tnew SCNVector3(0, 0, 1),\n\t\tnew SCNVector3(0, 0, 1),\n\t\tnew SCNVector3(0, 0, 1),\n\t\tnew SCNVector3(0, 0, 1),\n\t};;\n\tvar normSource = SCNGeometrySource.FromNormals(normals);\n\n\tvar txCoords = new [] {\n\t\tnew CGPoint(0, 0),\n\t\tnew CGPoint(0, 1),\n\t\tnew CGPoint(1, 1),\n\t\tnew CGPoint(1, 0),\n\t\tnew CGPoint(0.5, 0.5)\n\t};\n\n\tvar txCoordsSource = SCNGeometrySource.FromTextureCoordinates(txCoords);\n\n\t//Note that this relies on the ordering of locs above\n\tvar indices = new [] {\n\t\t//Counter-clockwise!\n\t\t4, 1, 0,\n\t\t1, 4, 2,\n\t\t2, 4, 3,\n\t\t3, 4, 0\n\t};\n\n\tvar idxArray = new byte[indices.Length][];\n\tfor(int i = 0; i < idxArray.Length; i++)\n\t{\n\t\tidxArray[i] = BitConverter.GetBytes(indices[i]);\n\t}\n\tvar idxData = NSData.FromArray(idxArray.SelectMany(id => id).ToArray());\n\t//Note that this relies on indices defining triangles\n\tvar element = SCNGeometryElement.FromData(idxData, SCNGeometryPrimitiveType.Triangles, indices.Length / 3, sizeof(int));\n\n\tvar geometry = SCNGeometry.Create(new [] { locSource, normSource, txCoordsSource }, new [] { element });\n\tvar newNode = SCNNode.FromGeometry(geometry);\n\n\tvar tent = new Tent(newNode, locs);\n\treturn tent;\n}\n```\n\n```csharp\nvar a = new SCNVector3(-1, -1, 0);\nvar c = new SCNVector3(1, 1, 0);\nvar tent = CreateTent(a, c);\nvar newNode = tent.Node;\nnewNode.Geometry.FirstMaterial = material;\nscene.RootNode.AddChildNode(newNode)\n```\n\nNow that we're back to square one, we want to create a function that allows us to create a new `Tent`, based on the locations of another `Tent` plus a `List` of delta positions:\n\n```csharp\nTent Add(Tent original, List<KeyValuePair<int, SCNVector3>> deltas) {\n\t//Copy the source vertex locations\n\tvar locs = original.Locations.Clone() as SCNVector3[];\n\n\t//Modify the vertices in the cloned location list\n\tforeach(var delta in deltas) {\n\t\tvar index = delta.Key;\n\t\tlocs[index] += delta.Value;\n\t}\n\n\t//Replace the original vertex source with the changed source\n\tvar srcs = original.Node.Geometry.GeometrySources.Clone() as SCNGeometrySource[];\n\n\t//Find the SCNGeometrySource that supplies vertex data\n\tvar vertexSourceIndex = -1;\n\tfor (int i = 0; i < srcs.Length; i++) {\n\t\tvar s = srcs[i];\n\t\tif(s.Semantic == SCNGeometrySourceSemantic.Vertex.ToString()) \t{\n\t\t\tvertexSourceIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\t//ASSERT vertexSourceIndex > -1\n\n\t//Create a new geometry source, whose SCNGeometrySource for vertices is for the modified locations\n\tvar src = SCNGeometrySource.FromVertices(locs);\n\tsrcs[vertexSourceIndex] = src;\n\n\t//Create new geometry\n\tvar newGeo = SCNGeometry.Create(srcs, original.Node.Geometry.GeometryElements);\n\tnewGeo.Materials = original.Node.Geometry.Materials;\n\n\t//Create new node\n\tvar node = SCNNode.FromGeometry(newGeo);\n\n\t//Return new node and new locations\n\treturn new Tent(node, locs);\n}\n```\n\nNow, let's define the geometry which we want to be our end state. In this case, we simply want to modify in Z the position of the \"peak,\" which is at index 4:\n\n```csharp\nvar deltas = new List<KeyValuePair<int, SCNVector3>>();\ndeltas.Add(new KeyValuePair<int, SCNVector3>(4, new SCNVector3(0, 0, 0.5f)));\n\nvar t2 = Add(tent, deltas);\n\nt2.Node.Position += new SCNVector3(2, 0, 0);\nscene.RootNode.AddChildNode(t2.Node);\n```\n\nIf you look at the Simulator, you can now see the two geometries side-by-side.\n\nAfter you’re done, remove the new node from the scene:\n\n```csharp\nt2.Node.RemoveFromParentNode();\n```\n\n## Creating the animation\n\nNow it’s time to create the animation, using the `SCNMorpher`class. The SCNMorpher has 1 or more “target” geometries. In this case, we only have the one target geometry, that of  our modified “tent”:\n\n```csharp\nusing CoreAnimation;\n\nvar oldNode = tent.Node;\nvar newTent = t2.Node.Geometry;\n\nvar morpher = new SCNMorpher();\nmorpher.Targets = new [] { newTent };\n```\n\nThe `SCNMorpher` sets the (compatible) geometry of the current node into the geometry of its `Targets` based on the percentage value of  `morpher.weights` at the index of the target. In other words, if there’s only one `SCNGeometry`in `Targets`, a `morpher.weights\\[0\\]` of `0` is a geometry whose values are taken entirely from the initial node geometry, while a `morpher.weights\\[0\\]` of `1.0` takes its values entirely from the geometry at `Targets\\[0\\]`.\n\nA keypath animation of the morpher.weights values cycles smoothly between geometries:\n\n```csharp\nvar animation = CABasicAnimation.FromKeyPath(\"morpher.weights[0]\");\nanimation.From = new NSNumber(0.0);\nanimation.To = new NSNumber(1.0);\nanimation.AutoReverses = true;\nanimation.RepeatCount = float.PositiveInfinity;\nanimation.Duration = 3;\n\noldNode.Morpher = morpher;\noldNode.AddAnimation(animation, \"morpher.weights\");\n```"
  },
  {
    "path": "ios/platform-features/texttospeech/TextToSpeech.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\n---\n\n# Text to Speech on iOS\n\nHave you ever wanted to add text to speech capability in an iOS application? Speech synthesis is built into the platform. What’s more, adding speech synthesis only requires a few lines of code.\n\nThe class that synthesizes text to speech is the `AVSpeechSynthesizer`.  This class works with an `AVSpeechUtterance`instance that encapsulates the text to synthesize. You simply pass an `AVSpeechUtterance`instance to the synthesizer’s `SpeakUtterance`method and the text is “spoken” by the iOS device.\n\nThe following example is all you need to have text to speech:\n\n```csharp\nusing AVFoundation;\n\nvar synth = new AVSpeechSynthesizer();\nvar su0 = new AVSpeechUtterance(\"Would you like to play a game?\");\nsynth.SpeakUtterance(su0);\n```\n\nThe `AVSpeechUtterance`also includes several properties that allow you to control the audio output of the synthesized text. These include:\n\n* `Rate`– The speed at which the speech plays back. This appears to be device specific!\n\n* `Voice`– An AVSpeechSynthesisVoice instance used to speak the text.\n\n* `Volume`– The volume level of the audio used to speak the text.\n\n* `PitchMultiplier`– A value between 0.5 and 2.0 to control the pitch of the spoken text.\n\nIn particular, the default rate is somewhat fast on modern iOS devices. Adjusting the rate to 1/4 the maximum rate, available via the `AVSpeechUtterance.MaximumSpeechRate` property (there’s also an `AVSpeechUtterance.MinimumSpeechRate`) produces a better sounding result.\n\nHere is some code you can play with to explore the available properties:\n\n```csharp\nvar su1 = new AVSpeechUtterance(\"This sentence is being spoken in a customized manner.\") {\n    Rate = AVSpeechUtterance.MaximumSpeechRate / 2 ,\n    Voice = AVSpeechSynthesisVoice.FromLanguage (\"en-AU\"),\n    Volume = 0.5f,\n    PitchMultiplier = 0.7f\n};\nsynth.SpeakUtterance(su1);\n```\n\nIt’s possible to use voices from locales with non-English default languages. The words are translated, but the sentence is not translated grammatically:\n\n```csharp\nAVSpeechSynthesisVoice.GetSpeechVoices().Skip(7).Take(5).Where( voice => {\n    var su2 = new AVSpeechUtterance(\"These words will be spoken in the language for the locale, but the sentence is not really translated.\");\n    su2.Voice = voice;\n    synth.SpeakUtterance(su2);\n    return true;\n});\n```\n\nTo better understand the difference a locale-specific voice makes, compare this *Spanish* phrase spoken in Spanish and English:\n\n```csharp\nvar su1 = new AVSpeechUtterance(\"Buenos días señor\") {\n    Rate = AVSpeechUtterance.MaximumSpeechRate / 2 ,\n    Voice = AVSpeechSynthesisVoice.FromLanguage (\"es-ES\"),\n    Volume = 0.5f,\n    PitchMultiplier = 0.7f\n};\nsynth.SpeakUtterance(su1);\n```\n\n```csharp\nvar su1 = new AVSpeechUtterance(\"Buenos días señor\") {\n    Rate = AVSpeechUtterance.MaximumSpeechRate / 2 ,\n    Voice = AVSpeechSynthesisVoice.FromLanguage (\"en-US\"),\n    Volume = 0.5f,\n    PitchMultiplier = 0.7f\n};\nsynth.SpeakUtterance(su1);\n```\n\nThe way it is spoken really does make a difference!"
  },
  {
    "path": "ios/platform-features/touchid/TouchID.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\n---\n\n## ❗️Note❗️\n\nTo determine Touch ID in the simulator, you must select **Touch ID Enrolled** in the simulator’s **Hardware **menu. You can then simulate finger touches by browsing to **Hardware > Simulate Finger Touch** and selecting either **Matching **or **Non-matching**.\n\n# Adding Touch ID to your Xamarin.iOS app\n\niOS 8 introduced the functionality for developers to use Apple’s biometric fingerprint authentication technology to add an additional layer of security to their apps.\n\nAll authentication data held on an iOS device, is stored within the Secure Enclave, a co-processor  within the chip that is responsible for determining successful matches for authentication. When Touch ID is enabled on a users device, the Secure Enclave will check if there is a suitable match, and if there is will decrypt the requested keychain item.\n\nThis example explores how to add Touch ID to a Xamarin iOS app.\n\nFirst, add the required using statements to import the APIs that we will be using.\n\n```csharp\nusing UIKit;\nusing CoreGraphics;\nusing LocalAuthentication;\n```\n\nWe have set the background of the View Controller’s view to yellow.\n\n```csharp\nRootViewController.View.BackgroundColor = UIColor.Yellow\n```\n\nLet’s create a button. When the user clicks this button, they will be asked to provide their fingerprint to authenticate themselves:\n\n```csharp\nvar button = UIButton.FromType (UIButtonType.System);\nbutton.Frame = new CGRect(20, 200, 280, 40);\nbutton.SetTitle(\"Locally Authenticate Me!\", UIControlState.Normal)\n```\n\nAdd this button to the view hierarchy:\n\n```csharp\nRootViewController.View.AddSubview(button)\n```\n\nWhen the user authenticates successfully, we want to **do** something. For the sake of this example, we will simply just send them to a new View Controller, with a label that tells them they have been successfully authenticated. Let’s create this View Controller now:\n\n```csharp\nvar vcAuthenticated = new UIViewController();\nvar label = new UILabel(new CGRect(40, 200, 280, 40));\nlabel.Text = \"You are now Authenticated\";\nvcAuthenticated.View.AddSubview(label);\nvcAuthenticated.View.BackgroundColor = UIColor.Magenta\n```\n\nNow we can start using Local Authentication to present the Touch ID user interface to our users. First we will create a new context, this is what will be used to evaluate the authentication policy. We’ll also create a new `NSError` and provide a reason, in the form of a String, to explain to the user why we want them to authenticate:\n\n```csharp\nvar context = new LAContext();\nNSError AuthError;\nvar myReason = new NSString(\"To gain secret access\");\n```\n\nFinally, add the code to handle TouchID inside the button’s event handler. First we’ll use `CanEvaluatePolicy`  with the policy `DeviceOwnerAuthenticationWithBiometrics`to determine if the device has TouchID enabled. If it does then we can display the Touch ID UI by using `EvaluatePolicy`. There are three pieces of information we have to pass into `EvaluatePolicy` – the policy itself, a string explaining why authentication is necessary, and a reply handler. The reply handler tells the application what it should do in the case of a successful, or unsuccessful, authentication.\n\nOne of the caveats of Local Authentication is that it must be run on the foreground, so make sure to use `InvokeOnMainThread`:\n\n```csharp\nbutton.TouchUpInside += (sender, e) => {\n                if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out AuthError)){\n\t\t\t\t\tvar replyHandler = new LAContextReplyHandler((success, error) => {\n\t\t\t\t\t\tRootViewController.InvokeOnMainThread(()=>{\n\t\t\t\t\t\t\tif(success){\n\t\t\t\t\t\t\t\tRootViewController.PresentViewController(vcAuthenticated, true, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t//Show fallback mechanism here\n\t\t\t\t\t\t\t\tbutton.SetTitle(\"You shall not pass\", UIControlState.Disabled);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t });\n\t\t\t\t\tcontext.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, myReason, replyHandler);\n\t\t\t\t}\n                else\n                {\n                    var noTouchID = UIAlertController.Create (\"OK Alert\", \"TouchID is not enabled. See note at top of workbook.\", UIAlertControllerStyle.Alert);\n                    noTouchID.AddAction (UIAlertAction.Create (\"Ok\", UIAlertActionStyle.Default, null));\n                   RootViewController.PresentViewController (noTouchID, true, null);\n                }\n            };\n```"
  },
  {
    "path": "ios/platform-features/widecolor/widecolor.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# Introduction to Wide Color\n\niOS 10 and macOS Sierra enhances the support for extended-range pixel formats and wide-gamut color spaces throughout the system including frameworks such as Core Graphics, Core Image, Metal and AVFoundation. Support for devices with wide color displays is further eased by providing this behavior throughout the entire graphics stack.\n\nThe following topics will be covered in detail:\n\n* [About Wide Color](#About-Wide-Color)\n\n* [Core Color Concepts](#Core-Color-Concepts)\n\n  * [Color Space](#Color-Space)\n\n  * [Color Channels](#Color-Channels)\n\n  * [Color Primaries](#Color-Primaries)\n\n  * [Color Gamut](#Color-Gamut)\n\n* [What is Wide Color](#What-is-Wide-Color)\n\n  * [The Display P3 Color Space](#The-Display-P3-Color-Space)\n\n  * [The Extended Range sRGB Color Space](#The-Extended-Range-sRGB-Color-Space)\n\n  * [Extended Range sRGB in Action](#Extended-Range-sRGB-in-Action)\n\n  * [Device Pixel Formats](#Device-Pixel-Formats)\n\n* [System-Wide Wide Color Support](#System-Wide-Wide-Color-Support)\n\n* [Solving the Color Problem](#Solving-the-Color-Problem)\n\n  * [Designing for Wide Gamut](#Designing-for-Wide-Gamut)\n\n  * [Upgrading Existing Content to Wide Color](#Upgrading-Existing-Content-to-Wide-Color)\n\n  * [File Formats and Color Profiles](#File-Formats-and-Color-Profiles)\n\n  * [Supporting Wide Color with Asset Catalogs](#Supporting-Wide-Color-with-Asset-Catalogs)\n\n  * [Asset Catalog Deployment](#Asset-Catalog-Deployment)\n\n  * [Asset Catalog Storage](#Asset-Catalog-Storage)\n\n* [Colors in User Interfaces](#Colors-in-User-Interfaces)\n\n* [Colors on the Web](#Colors-on-the-Web)\n\n* [Rendering Off-Screen Images in App](#Rendering-Off-Screen-Images-in-App)\n\n  * [Drawing Wide Color in iOS](#Drawing-Wide-Color-in-iOS)\n\n* [Rendering On-Screen Images in App](#Rendering-On-Screen-Images-in-App)\n\n  * [Rendering On-Screen in iOS](#Rendering-On-Screen-in-iOS)\n\n  * [Rendering On-Screen in macOS](#Rendering-On-Screen-in-macOS)\n\n# About Wide Color\n\nAs stated above, iOS 10 and macOS Sierra enhances the support for extended-range pixel formats and wide-gamut color spaces throughout the system including frameworks such as Core Graphics, Core Image, Metal and AVFoundation. Support for devices with wide color displays is further eased by providing this behavior throughout the entire graphics stack.\n\nIn the 90's Apple created ColorSync to handle color processing on the Mac. They also helped found the International Color Consortium (ICC) to create and promote a set of standards for handling color on computer hardware. Apple's work with the ICC was included in ColorSync and it was built into the core of OS X (now called macOS).\n\nApple has also been at the forefront of display technology with hardware such as the Retina Display, the new P3 Display and Display P3 Color Space (released in the iMac in 2015) and the TrueTone displays in the iPad Pros.\n\nWith Wide Color in macOS Sierra and iOS 10, Apple is changing the way that both macOS and iOS handle color to take full advantage of these new display technologies.\n\n# Core Color Concepts\n\nThe following core color concepts need to be covered before taking a deeper look at color in macOS and iOS:\n\n## Color Space\n\nA Color Space is an environment in which colors can be represented and compared. It can be a one to four dimensional space that is defined by the intensity of its color components.\n\n[ ![](Images/Color00.png)](Images/Color00.png)\n\n## Color Channels\n\nThe color components can also be referred to as Color Channels. Some familiar representations would be the RGB Spaces, Gray Spaces, CMYK Spaces or Device Independent Spaces.\n\n[ ![](Images/Color02.png)](Images/Color02.png)\n\n## Color Primaries\n\nColor Primaries provide the coordinate system that is used to compare and compute colors. Color Primaries usually fall at the most intense version of the give color that can be generated within the Color Channel.\n\n[ ![](Images/Color01.png)](Images/Color01.png)\n\nIn the case of the RGB Color Space represented above, the Color Primaries are where the `1.0` coordinates are anchored (such as `[1.0, 0.0, 0.0]` for red).\n\n## Color Gamut\n\nColor Gamut refers to all of the colors that can be defined as a combination of the individual Color Channels within a give Color Space.\n\n[ ![](Images/Color03.png)](Images/Color03.png)\n\n# What is Wide Color\n\nBefore covering the topic of Wide Color, a discussion should be had about the current industry standard for color, the Standard RGB Color Space (sRGB). It Is the most widely used Color Space in computing today and is the default color space for iOS and macOS.\n\nThe sRGB Color Space has the following properties:\n\n* It's based on the ITU-R BT.709 standard.\n\n* It has an approximate Gamma of 2.2.\n\n* It represents typical lighting conditions (D65).\n\nSince sRGB is so widely used in the industry, a developer can make some assumptions that the color specified will be faithfully represented on any device it is displayed on. However, this might not always be the case. Additionally, there are several colors that do not fit into the sRGB Color Space and therefor, cannot be represented in it.\n\nFor example, many textiles are designed with threads using many inks and dyes falling outside of sRGB. Also many products that a person encounters in their daily life are created with bright, vivid colors that fall outside of the sRGB Color Space. Some of the most compelling examples of colors that cannot be represented in sRGB are things in nature like sunsets, autumn leaves, exotic flowers and tropical waters.\n\nUsers who have been capturing digital images in the RAW format may have images on their devices that contain all of this color data, even though it cannot be properly represented in the sRGB Color Space and therefor cannot be properly displayed on screen.\n\n## The Display P3 Color Space\n\nIn 2015, Apple released new products (iMac and iPad Pro 9.7\") that provide the new Display P3 Color Space to handle the issues created by the sRGB Color Space.\n\n[ ![](Images/Color04.png)](Images/Color04.png)\n\nThe Display P3 Color Space has the following properties:\n\n* Supports a wide color space for modern hardware platforms.\n\n* Based on the SMPTE DCI-P3 standard. DCI-P3 was designed for digital projectors but was modified by Apple to support monitors.\n\n* It has an approximate Gamma of 2.2.\n\n* It represents typical lighting conditions (D65).\n\nAccording to Apple, users are moving their workflows to their mobile platforms. Solving the color presentation issues presented by sRGB in the professional mobile devices (iPad Pros), required more than just including a wide color display. One of the solutions was to upgrade the factory calibration, so each individual device has been calibrated at the factory ensuring that from device to device, color display is accurate and consistent.\n\nAnother solution, is the inclusion of full, system-wide color management that Apple has built into iOS 10 and macOS Sierra.\n\n## The Extended Range sRGB Color Space\n\nThe new iOS 10 system-wide color management has to account for all of the existing iOS apps that are built and fine-tuned for sRGB. It was designed to ensure that it didn't impact either color representation or app performance of these existing apps.\n\nTo handle this situation, Apple has included the Extended Range sRGB Color Space in iOS 10 (and macOS Sierra as well).\n\nThe Extended Range sRGB Color Space has the following properties:\n\n* Has all of the same sRGB Primaries.\n\n* It has an approximate Gamma of 2.2.\n\n* It represents typical lighting conditions (D65).\n\n* It supports negative values and values greater than one (1).\n\nBy allowing for values less than zero and greater than one, the Extended Range sRGB Color Space not only allows for existing apps to present colors in sRGB without performance hits or distortion, but it allows the color space to represent any color inside of the visible spectrum. All of this is accomplished while still keeping the same anchor points as the sRGB Color Space.\n\n## Extended Range sRGB in Action\n\nTo see how values outside of zero and one work in the Extended Range sRGB Color Space, take the following example of the of the most saturated red available in the Display P3 Color Space:\n\n[ ![](Images/Color05.png)](Images/Color05.png)\n\nIn Display P3, this color would be represented as `[1.0, 0.0, 0.0]` and in Extended Range sRGB it would be `[1.358, -0.074, -0.012]`. Because sRGB values are full contained inside of Display P3 and the Display P3 values lay \"outside\" of the sRGB ranges.\n\nFor physical hardware that allows pixel values to go from extreme positive to extreme negative values, it can display any color available in the visible spectrum and these values can be represented in the Extended Range sRGB Color Space.\n\n## Device Pixel Formats\n\nThe sRGB Color Space has been largely standardize on using a 8-bit Pixel Format, since 8-bits per color channel is mostly enough to describe colors in sRGB. This is not perfect but good enough, and it gives a good tradeoff between memory and processor usage to display images.\n\nBecause Display P3 can represent color coordinates outside of the sRGB color space, it requires 16-bits per color channel to correctly represent colors with the Extended Range sRGB Color Space.\n\n# System-Wide Wide Color Support\n\nTo fully support wide color and wide gamut inside of iOS 10 and macOS Sierra, Apple has extended the following frameworks to take full advantage of the Extended Range sRGB Color Space and Display P3:\n\n* UIKit (for iOS only)\n\n* SceneKit\n\n* Core Graphics\n\n* ImageIO\n\n* Core Image\n\n* WebKit\n\n* SpriteKit\n\n* Core Animation\n\n* AppKit (for macOS only)\n\nAdditionally, Retina Display support has been enhanced for Extended Range sRGB Color Space and Display P3 displays.\n\nWide color is supported and can be used in the following application content types:\n\n* Static image resources included in the app bundle.\n\n* Document and network based image resources.\n\n* Advanced Media such as Live Photos or images in the RAW format.\n\n* 3D Graphics shader texture images.\n\n# Solving the Color Problem\n\nThe content that can be displayed in an app can come from a wide range of color-rich sources. Additionally, this content can be displayed on a broad range of devices, each with their own range of color display capabilities.\n\nAn iOS 10 app bridges the difference between these two issues by using the new built-in, system-wide Color Manage System. This system ensures that an image looks the same on any iOS device, no matter which Color Space the image was encoded in.\n\nColor Management starts with every image having an associated Color Space (or Color Profile). This information is used in the *Color Matching Process* where colors in the source image are matched to colors in the output device. Since every pixel in the image needs to be Color Matched, it can be time consuming and place a strain upon the device's CPU.\n\nDue to the nature of the *Color Matching Process*, this conversion can be potentially \"lossy\" if the output device has a smaller gamut than the source image.\n\nFortunately, the computations that go into the *Color Matching Process* can easily be hardware accelerated (either on the CPU or GPU) and Apple ensures that it works automatically by building support into base systems such as Quartz 2D, ColorSync and Core Animation. For correctly tagged content, no coding is required to take advantage of these features.\n\nColor Management has been supported on each platform as follows:\n\n* **macOS** - macOS has been color managed since inception.\n\n* **iOS** - iOS has supported automatic color management since iOS 9.3 (and later).\n\n## Designing for Wide Gamut\n\nApple has the following suggestion for designing and using wide color, wide gamut image content in iOS and macOS apps:\n\n* Only use wide gamut content where in make sense in the app, they should not automatically be used everywhere.\n\n* Only use wide gamut content where vivid colors will enhance the user experience.\n\n* In is not necessary to change all content to P3 for existing apps.\n\nApple's toolchain makes support for wide gamut image content a gradual opt-in, so supporting wide color in an app is not an all-or-nothing situation.\n\n## Upgrading Existing Content to Wide Color\n\nApple has the following suggestions for upgrading existing image content to wide color:\n\n* Don't just \"assign\" a P3 profile to the content in the image editing app. Doing so will simply remap the existing color content to the new Color Space with unexpected results, such as stretching the colors to fit into the new space thus altering the image.\n\n* The image content will need to be \"converted\" to the Display P3 profile using an image editing app.\n\n## File Formats and Color Profiles\n\nApple has the following suggestions for the file formats and color profiles used in the app's wide color image contents:\n\n* Use the \"Display P3\" color profile for RGB working spaces.\n\n* Use a 16-bit per color channel mode.\n\n* Use a Late 2015 iMac (or later) to accurately preview image content.\n\n* Export image assets as 16-bit PNG files with an embedded \"Display P3\" ICC profile.\n\n**Note**: Using the **Save for Web** or **Export Assets** features found in most popular image editing software *will not* work for wide color images since these features have not been updated to support the required file format specifications yet.\n\n## Supporting Wide Color with Asset Catalogs\n\nIn iOS 10 and macOS Sierra, Apple has expanded the Asset Catalogs used to include and categorize static image content in the app's bundle to support wide color.\n\nUsing Asset Catalogs provide the following benefits to an app:\n\n* They provide the best deployment option for static image assets.\n\n* They support automatic color correction.\n\n* They support automatic pixel format optimization.\n\n* They support App Slicing and App Thinning which ensures that only the content that is relevant get's delivered to the end user's device.\n\nApple has made the following enhancements to Asset Catalogs for wide color support:\n\n* They support 16-bit (per color channel) source content.\n\n* They support cataloging content by display gamut. Content can be tagged for either the sRGB or Display P3 gamuts.\n\nThe developer has three options for supporting wide color content in their apps:\n\n1. **Do Nothing** - Since wide color content should only be used in situations where the app needs to display vivid colors (where they will enhance the user's experience), content outside of this requirement should be left as-is. It will continue to be rendered correctly in all hardware situations.\n\n2. **Upgrade Existing Content to Display P3** - This requires the developer to replace the existing image content in their Asset Catalog with a new, upgraded file in the P3 format and tag it as such in the Asset Editor. At build time, a sRGB derivative image will be generated from these assets.\n\n3. **Provide Optimized Asset Content** - In this situation, the developer will provide both an 8-bit sRGB and a 16-bit Display P3 vision of each image in the Asset Catalog (properly tagged in the asset editor).\n\n## Asset Catalog Deployment\n\nThe following will occur when the developer submits an app to the App Store with Asset Catalogs that include wide color image content:\n\n* When the app is deployed to the end user, App Slicing will ensure that only the appropriate content variant is delivered to the user's device.\n\n* On device that don't support wide color, there is no payload cost for including wide color content, as it is never shipped to the device.\n\n* `NSImage` on macOS Sierra (and later) will automatically select the best content representation for the hardware's display.\n\n* The displayed content will be refreshed automatically when or if the devices hardware display characteristics change.\n\n## Asset Catalog Storage\n\nAsset Catalog storage has the following properties and implications for an app:\n\n* At build time, Apple attempts to optimize the storage of the image content via high quality image conversions.\n\n* 16-bits are used per color channel for wide color content.\n\n* Content dependent image compression is used to lower deliverable content sizes. New \"lossy\" compressions have been added to further optimize content sizes.\n\n# Colors in User Interfaces\n\nWhen working with the colors in a User Interface, most of the pixels on screen are in a solid color. Additionally, most of these pixels don't come from images assets but are drawn directly by the app (or by the OS on behalf of the app).\n\nWide gamut color can present several challenges when working at the UI level:\n\n* **Communicating Colors** - When talking about color between designers and developers there is usually an *assumed* sRGB Color Space involved. So a color might be communicated as `rgb(128, 45, 56)` or `#FF0456`. In a wide gamut design, these representations don't provide enough information to accurately represent the specified color, the working Color Space must also be included. Apple suggests using `P3(128, 45, 56)` and `P3#FF0456` instead.\n\n* **Picking Colors** - Most of the popular image editing and design software suffer from the same limitations as the sRGB Color Space when using their built-in color pickers. The designer should ensure that they are in the \"Display P3\" Color Space in the Color Picker when working with wide color designs.\n\n* **Coding Colors** - Both `NSColor` (macOS) and `UIColor` (iOS & tvOS) have new convenience methods for generating P3 colors directly and both have been extended to support colors in the Extended Range sRGB Color Space as well.\n\n* **Storing Colors** - Care should be taken when storing wide gamut colors in an app's document. Where 8-bit per color channel worked fine for the sRGB color space, 16-bit per color channel should be used for wide colors. The developer also needs to watch for instances of assumed Color Space (since everything was traditionally sRGB only).\n\n# Colors on the Web\n\nCare should be taken when working with wide color in web pages and on devices that support wide color display. If all of the image content that has been included in the website has been appropriately tagged, iOS and macOS will automatically color match and display them correctly.\n\nMedia queries are also available to help resolve assets between P3 and sRGB capable devices:\n\n<picture>\n\t<source srcset=\"monkey-p3.jpg\" media=\"(color-gamut: p3)\">\n\t<source srcset=\"monkey-rpg.jpg\">\n</picture>\n\nApple also has a WebKit proposal that will allow CSS to be specified in other Color Spaces besides the assumed sRGB space.\n\n# Rendering Off-Screen Images in App\n\nBased on the type of app being created, it might allow the user to include image content they have collected from the internet or create image content directly inside of the app (like a vector drawing app for example).\n\nIn both of these cases, the app can render the required imagery off-screen in wide color using enhanced features added to both iOS and macOS.\n\n## Drawing Wide Color in iOS\n\nBefore discussing how to correctly draw a wide color image in iOS 10, take a look at the following common iOS drawing code:\n\n```none\npublic UIImage DrawWideColorImage ()\n{\n\tvar size = new CGSize (250, 250);\n\tUIGraphics.BeginImageContext (size);\n\n\t//... etc ...\n\t\n\tUIGraphics.EndImageContext ();\n\treturn UIGraphics.GetImageFromCurrentImageContext ();\n}\n```\n\nThere are issues with the standard code that will need to be addressed *before* it can be used to draw a wide color image. The `UIGraphics.BeginImageContext (size)` method used to start iOS image drawing has the following limitations:\n\n* It cannot create image contexts with more than 8 bits per color channel.\n\n* It cannot represent colors in the Extended Range sRGB Color Space.\n\n* It does not have the ability to provide an interface to create contexts in a non-sRGB Color Space because of the low-level C routines being called in the background.\n\nTo handle these limitations and draw a wide color image in iOS 10, use the following code instead:\n\n```csharp\nusing UIKit;\n\nvar size = new CGSize (250, 250);\nvar render = new UIGraphicsImageRenderer (size);\n\nvar image = render.CreateImage ((UIGraphicsImageRendererContext context) => {\n\tvar bounds = context.Format.Bounds;\n\tCGRect slice;\n\tCGRect remainder;\n\tbounds.Divide (bounds.Width / 2, CGRectEdge.MinXEdge, out slice, out remainder);\n\n\tvar redP3 = UIColor.FromDisplayP3 (1.0f, 0.0f, 0.0f, 1.0f);\n\tredP3.SetColor ();\n\tcontext.FillRect (slice);\n\n\tvar redRGB = UIColor.Red;\n\tredRGB.SetColor ();\n\tcontext.FillRect (remainder);\n});\n```\n\nThe new `UIGraphicsImageRenderer` class creates a new image context that is capable of handling the Extended Range sRGB Color Space and it has the following features:\n\n* It is fully color managed by default.\n\n* It supports the Extended Range sRGB Color Space by default.\n\n* It intelligently decides if it should render in the sRGB or Extended Range sRGB Color Space based on the capabilities of the iOS device that the app is running on.\n\n* It fully and automatically manages the image context (`CGContext`) lifetime so the developer doesn't have to worry about calling begin and end context commands.\n\n* It is compatible with the `UIGraphics.GetCurrentContext()` method.\n\nThe `CreateImage` method of the `UIGraphicsImageRenderer` class is called to create a wide color image and passed a completion handler with the image context to draw into. All of the drawing is done inside of this completion handler as follows:\n\n* The `UIColor.FromDisplayP3` method creates a new fully saturated red color in the wide gamut Display P3 Color Space and it is used to draw the first half of the rectangle.\n\n* The second half of the rectangle is drawn in the normal sRGB fully saturated red color for comparison.\n\n# Rendering On-Screen Images in App\n\nTo render wide color images on-screen, the process works similar to drawing an off-screen wide color image for macOS and iOS presented above.\n\n## Rendering On-Screen in iOS\n\nWhen the app needs to render an image in wide color on-screen in iOS, override the `Draw` method of the `UIView` in question as usual. For example:\n\n```using System;\nusing UIKit;\nusing CoreGraphics;\n\npublic class MonkeyView : UIView\n{\n\tpublic MonkeyView ()\n\t{\n\t}\n\n\tpublic override void Draw (CGRect rect)\n\t{\n\t\tbase.Draw (rect);\n\n\t\t// Draw the image to screen\n\t\t//...\n\t}\n}\n```\n\nAs iOS 10 does with the `UIGraphicsImageRenderer` class shown above, it intelligently decides if it should render in the sRGB or Extended Range sRGB Color Space based on the capabilities of the iOS device that the app is running on when the `Draw` method is called. Additionally, the `UIImageView` has been color managed since iOS 9.3 as well.\n\nIf the app needs to know how rendering is being done on a `UIView` or `UIViewController`, it can check the new `DisplayGamut` property of the `UITraitCollection` class. This value will be a `UIDisplayGamut` enum of the following:\n\n* P3\n\n* Srgb\n\n* Unspecified\n\nIf the app wants to control which Color Space is used to draw an image, it can use a new `ContentsFormat` property of the `CALayer` to specify the desired Color Space. This value can be a `CAContentsFormat` enum of the following:\n\n* Gray8Uint\n\n* Rgba16Float\n\n* Rgba8Uint\n\n"
  },
  {
    "path": "ios/user-interface/UIButton/uibutton.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# UIButton\n\n## Example 1 : Adding a button and handling a touch event\n\nThe `UIButton` is among the most commonly-used components in iOS. It's basic use is straightforward:\n\n```csharp\n// Number of times the button has been pressed\nvar count = 0;\n\nvar simple = new UIButton(new CGRect(10, 10, 140, 50));\nsimple.SetTitle(\"Press me!\", UIControlState.Normal);\nsimple.SetTitleColor(UIColor.Black, UIControlState.Normal);\nsimple.TouchUpInside += (sender, eventArgs) => simple.SetTitle($\"Pressed {++count} times.\", UIControlState.Normal);\n```\n\nThe `simple` button is instantiated with a hard-coded `Frame` rectangle (more complex sizing and layouts will be discussed later). The next line set's the `Title` property for the normal `UIControlState`. Since the `Title` may vary depending on the `State` propery of the button, this cannot be a simple setter, but instead requires a call to `SetTitle(string, UIControlState)`.\n\nThe default color for the title text is white, which happens to be the same as the initial `BackgroundColor` for the workbook, so to make the text visible, the next line changes the color to black. Again you have to pass the `UIControlState` for which you're setting the font color.\n\nThe `UIButton` class does not have a \"Pressed\" event. Commonly, `TouchUpInside` is the appropriate equivalent. All of the events available to `UIButton` are actually defined in the parent class `UIControl` and include `TouchDownInside`, `TouchDragEnter`/`TouchDrawExit`, `TouchDragInside`/`TouchDragOutside`, and `TouchCancel`. \n\nThe event-handler again calls the `UIButton` object's `SetTitle(string, UIControlState)` method, incrementing `count` as it goes.\n\nThe next step is to add the `simple` button to the user interface:\n\n```csharp\nRootViewController.View.AddSubview(simple);\n```\n\nIn iOS, the User Experience is controlled by instances of `UIViewController` and the User Interface by instances of `UIView`. Every `UIWindow` has a `RootViewController` instance of some `UIViewController` subclass. Xamarin Workbooks exposes a global variable `RootViewController` variable for the application running in the simulator.\n\nThe `UIButton` is a subclass of `UIControl`, which in turn is a subclass of `UIView`, so the `simple` `UIButton` can be added with the `AddSubview(UIView)` method as in the example above.\n\nYou should run the above sections and click the button at least 10 times before continuing.\n\n## Example 2 : Laying out a button\n\nAfter 10 clicks using the above code, the `Frame` of the `simple` button should have become too small to display the complete text and placed an ellipse in the middle of the title.\n\n![The UIButton will show a truncated version of the Title if necessary](truncated_title.png)\n\nThe size required to display the entire `Title` is held in the `IntrinsicContentSize` property:\n\n```csharp\nsimple.IntrinsicContentSize\n```\n\nThis `CGSize` should have a `Width` greater than that of the `Frame` of the `simple` button. (If not, adjust the `Frame` of `simple` and rerun the workbook until you see the truncation behavior.)\n\nTo get a good sense of how the `Frame` and `IntrinsicContentSize` interact, you can set the `BackgroundColor` of `simple` to something other than white:\n\n```csharp\nsimple.BackgroundColor = UIColor.Yellow;\n```\n\nYou could do that on each new button individually, but if you want to affect the default appearance of *all new* `UIButton` objects, you can use the \"Appearance Proxy\" for the class:\n\n```csharp\nUIButton.Appearance.SetTitleColor(UIColor.Black, UIControlState.Normal);\nUIButton.Appearance.BackgroundColor = UIColor.Yellow;\n```\n\nHard-coding `Frame` rectangles is not a maintainable strategy. The preferred method for laying out components in iOS is to use the system's \"Auto Layout\" facility, which describes the layout of a component in terms of `NSLayoutConstraint` objects. Create a new `UIButton` and add it to the `View`:\n\n```csharp\nvar button2 = new UIButton();\nRootViewController.View.AddSubview(button2);\n```\n\nNote that `button2` uses a no-arg constructor, while your `simple` button passed in the desired `Frame` rectangle. As you can see, `button2` has a `Frame` of zero size:\n\n```csharp\nbutton2.Frame\n```\n\nThere are several ways to specify constraints in code, but the easiest is to use \"anchor guides\":\n\n```csharp\nbutton2.TranslatesAutoresizingMaskIntoConstraints = false;\nbutton2.LeadingAnchor.ConstraintEqualTo(RootViewController.View.LayoutMarginsGuide.LeadingAnchor).Active = true;\nbutton2.TopAnchor.ConstraintEqualTo(simple.BottomAnchor, 10).Active = true;\n```\n\nThe first line turns off the legacy “Autoresizing mask” behavior (unfortunately, you cannot use the `UIButton.Appearance` proxy to default `TranslatesAutoresizingMaskIntoConstraints` to `false`!).\n\nThe second line says that the leading anchor (the anchor for the left edge, in left-to-right cultures) should be constrained to be equal to the left margin of the containing `UIView`. Then, it sets this new constraint to be active.\n\nThe third line says that the top anchor should be equal to the *bottom* anchor of the `simple` button, plus 10 logical pixels.\n\nConstraints can be based on any variable. Run the following to set the height and width of `button2` to be sufficient to hold the `IntrinsicContentSize`:\n\n```csharp\nbutton2.HeightAnchor.ConstraintGreaterThanOrEqualTo(button2.IntrinsicContentSize.Height).Active = true;\nbutton2.WidthAnchor.ConstraintGreaterThanOrEqualTo(button2.IntrinsicContentSize.Width).Active = true;\n\nbutton2.SetTitle(\"Explore constraints\", UIControlState.Normal);\n```\n\nNow, add the following code so that every time `button2` is pressed, it's `Title` and therefore it's `IntrinsicContentSize` changes:\n\n```csharp\nvar rnd = new Random();\n\n// Returns a string of the specified length of random capital letters \nstring RandomString(int length) \n{\n    var s = \"\";\n    for(var i = 0; i < length; i++)\n    {\n    \t// 0x41 = UTF-16 'A'\n        s += (char) (0x41 + rnd.Next(26));\n    }\n    return s;\n}\n\nbutton2.TouchUpInside += (s,e) => \n{\n\tvar charCount = 5 + rnd.Next(11);\n\tbutton2.SetTitle(RandomString(charCount), UIControlState.Normal);\t\t\n};\n```\n\nThe above code defines a function that creates a random string of capital letters and sets the `TouchUpInside` event handler for `button2` to change the title to a random string of 5 to 15 letters.\n\nWhen you run the above and click `button2` several times, you'll see the `Frame` of `button2` changing to tightly encapsulate the `IntrinsicContentSize`. While this might be a desired behavior in certain circumstances, more generally you probably want to create a layout that, while capable of resizing for different displays and rotations, doesn't resize components in the normal course of interaction.\n\nYou can add a new constraint that anchors `button2`'s right edge to the margins of the containing `UIView`:\n\n```csharp\nbutton2.TrailingAnchor.ConstraintEqualTo(RootViewController.View.LayoutMarginsGuide.TrailingAnchor).Active = true;\n```\n\n## Example 3: Using Images\n\n`UIButton` instances may show an image in combination with, or in lieu of, their `Title`.\n\n```csharp\nvar btn3 = new UIButton();\nbtn3.SetImage(UIImage.FromFile(\"textureX_sm.png\"), UIControlState.Normal);\nbtn3.SetTitle(\"Image Button\", UIControlState.Normal);\n```\n\nFor convenience, define an extension method for `UIButton` that adds it to the `RootViewController.View` underneath another button and uses the previously-discussed auto layout constraint techniques to size it:\n\n```csharp\nstatic void AddToViewBelow(this UIButton newBtn, UIButton above){\n    RootViewController.View.Add(newBtn);\n    newBtn.TranslatesAutoresizingMaskIntoConstraints = false;\n    newBtn.LeadingAnchor.ConstraintEqualTo(RootViewController.View.LayoutMarginsGuide.LeadingAnchor).Active = true;\nnewBtn.TopAnchor.ConstraintEqualTo(above.BottomAnchor, 10).Active = true;\n    newBtn.HeightAnchor.ConstraintEqualTo(newBtn.IntrinsicContentSize.Height).Active = true;\nnewBtn.TrailingAnchor.ConstraintEqualTo(RootViewController.View.LayoutMarginsGuide.TrailingAnchor).Active = true;\n}\n\nbtn3.AddToViewBelow(button2);\n```\n\nButtons additionally may set their `BackgroundImage` property:\n\n```csharp\nvar wood = UIImage.FromFile(\"wood-texture-pattern.jpg\");\nbtn3.SetBackgroundImage(wood, UIControlState.Normal);\n```\n\n\\(Wood texture image donated to the [public domain by Yinan Chen](http://www.publicdomainpictures.net/view-image.php?image=26664&))\n\nAs you can see, the `BackgroundImage` does _not_ affect the `IntrinsicContentSize` , while the `ImageView` _does_. \n\nTo add some spacing between the `ImageView` and the `Title`, set the `TitleEdgeInsets` to add 5 logical pixels on its left side:\n\n```csharp\nbtn3.TitleEdgeInsets = new UIEdgeInsets(0, 5, 0, 0);\n```\n\nPerhaps the layout would look better if the `Title` and `ImageView` were left-aligned and some padding added around the `ImageView`:\n\n```csharp\nbtn3.HorizontalAlignment = UIControlContentHorizontalAlignment.Left;\nbtn3.ContentEdgeInsets = new UIEdgeInsets(5, 5, 5, 0);\n```\n\n## Example 4: Button states\n\nThe `UIControlState` enumeration is a little misleading, because it's actually a flagging enumeration. While `UIControlState.Normal`, `UIControlState.Disabled`, and `UIControlState.Highlighted` are mutually exclusive, the `UIControlState.Selected` and `UIControlState.Focused' states can be applied to any `UIControl` that is not in the `UIControl.Disabled` state.\n\n`UIControlState.Normal` is the most common state; the button is enabled and the user is not interacting with it. `UIControlState.Disabled` is also frequently used:\n\n```csharp\nvar button4 = new UIButton();\nbutton4.AddToViewBelow(btn3);\n\nbutton4.SetTitle(\"Normal\", UIControlState.Normal);\nbutton4.Enabled = true;\n```\n\nAnd conversely:\n\n```csharp\nbutton4.SetTitle(\"Disabled\", UIControlState.Disabled);\nbutton4.Enabled = false;\n```\n\nThe `UIControlState.Highlighted` state is activated when the user is interacting with the button (that is, _during_ the touch):\n\n```csharp\nbutton4.Enabled = true;\nbutton4.SetTitle(\"Highlighted\", UIControlState.Highlighted);\n```\n\nPress and hold the `button4` button to see the Highlighted state.\n\nAdditional API documentation on `UIButton` can be found at [UIButton](https://developer.xamarin.com/api/type/UIKit.UIButton/).\n\n"
  },
  {
    "path": "ios/user-interface/UIImage/uiimage.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# UIImage\n\nUIImage allows for image representation in UIKit, which provides support for loading, saving, and manipulating images. iOS uses images for a variety of different purposes – Icon sets, within a UIKit control, etc. They are also used with various frameworks provided by iOS such as UIKit, Core Graphics, Image IO, Core Animation. Each framework provides ways to manipulate and interact with images.\n\nWorking with Images can be an exhaustive topic. TThis guide will, therefore,focus only on using UIImage within UIKit, and in particular using it with a UIImageView – a UIView that can render a single image, or animate a series of images.\n\nFor more information on using images in iOS refer to the [Working with Images](https://developer.xamarin.com/guides/ios/application_fundamentals/working_with_images/) guide.\n\n## Creating and displaying a UIImage\n\nAdd the following Using Directives\n\n```csharp\nusing System;\nusing System.Drawing;\nusing UIKit;\n```\n\nAn image object needs to be created. This is achieved by using the code below:\n\n```csharp\nvar image = UIImage.FromFile(\"Xamarin_logo.png\");\n```\n\n#### Guidance on Using FromBundle vs. FromFile\n\nThe `UIImage` class includes two static methods for loading images, `FromBundle` and `FromFile.`\n\nThe `FromBundle` method call is a synchronous (blocking) call that has some image loading and management features built-in, such as caching support and automatic handling of image files for various resolutions.\n\n`UIImage` also contains the `FromFile` method, which is a lighter-weight alternative to `FromBundle`. It doesn’t use caching and so there is no need to worry about the positive or negative memory implications of caching. Additionally, `FromFile` is asynchronous, so it won’t block the main thread; it lazy-loads images as needed for each to be displayed.\n\nThe following list summarizes the differences between `FromBundle` and `FromFile`:\n\n* `FromFile` is asynchronous; whereas `FromBundle` is synchronous.\n\n* `FromFile` lazy-loads images.\n\n* `FromFile` can load images from an external location; whereas `FromBundle` can only load images that you include with your application.\n\n* `FromFile` provides no built-in caching; whereas `FromBundle` automatically caches an image after it is loaded.\n\nTo display the image created above in a user interface the image, pass it to a UIImageView:\n\n```csharp\nvar imageView = new UIImageView(image);\n```\n\nThen, add the imageView as a subview on your RootViewController to display it.\n\n```csharp\nRootViewController.View.AddSubviews(imageView)\n```\n\nNotice that the size of the imageView’s frame is set to the same size as the image (1452 x 609), and is display in the simulator like so:\n\n![](image1.png)\n\nSome options can be used to allow the user to view the image, including using a scroll view and manually setting the the `Frame` property.\n\nTo add a scroll view that contains an image view first instantiate a new `UIScrollView `setting the `Frame `size to the `Width `and `Height`, and the `ContentSize `equal to the `imageViews`’s Image size. The code to do this, is shown below:\n\n```csharp\nvar scrollView = new UIScrollView (new CGRect (0, 0, RootViewController.View.Frame.Width, RootViewController.View.Frame.Height)){ContentSize = imageView.Image.Size};\nRootViewController.View.AddSubview(scrollView);\nscrollView.AddSubview(imageView)\n```\n\nAlternatively, the frame can be set, allowing the image to be constrained to a particular size:\n\n```csharp\nimageView.Frame = new CGRect(0,50,UIScreen.MainScreen.Bounds.Width, 122)\n```\n\n## Scaling the Image\n\nImage views use the `ContentMode` property and the image object to best determine how the image should be displayed, allowing the image to be scaled, sized to fit or positioned as necessary. \n\nFirst, create the Image and ImageView with which you wish to work:\n\n```csharp\nvar image2 = UIImage.FromFile(\"Xamarin_logo.png\");\nvar imageView2 = new UIImageView(new CGRect(25, 200, 275, 100)){BackgroundColor = UIColor.Yellow}\n```\n\nThe contentMode property takes an enum of UIViewContentMode. The view can be scaled by using any of the following:\n\n* `ScaleAspectFit `– Stretches the image to fit the available space. Maintains the aspect ratio.\n\n* \n\n* `ScaleAspectFill` – Scales the image to fill the available space, while still maintaining the aspect ratio.\n\n\n* `ScaleToFill `–  Stretches the image to fill the available space. Does not maintain the aspect ratio.\n\nThe View can also be positioned or redrawn by using values such as top, bottom, left, right, center\n\n```csharp\nimageView2.ContentMode = UIViewContentMode.ScaleToFill;\nimageView2.Image = image2;\nRootViewController.View.AddSubview(imageView2)\n```\n\n#### 👍Try it now!\n\n* Change the UIViewContentMode property. Notice how the image changes in comparison to the frame.\n\n## Animating an ImageView\n\nAn ImageView can be used to provide simple animations in an iOS app via the provided animation methods.\n\nStart by creating an image view as shown earlier in this document\n\n```csharp\nvar imageXamView = new UIImageView (new CGRect (120, 330, 75, 75));\n```\n\nPass in an array of images to the `AnimationImages `property on the Image View. Each image in this array is equivalent to a frame in the animation.\n\n```csharp\nimageXamView.AnimationImages = new UIImage[]{\n                                UIImage.FromFile(\"Xamagon.png\"), \n                                UIImage.FromFile(\"Xamagon_dark.png\")\n                            };\n```\n\nThe `AnimationDuration` property sets the frame rate. This property specifies the amount of time it takes to go through one cycle of the image. In this animation the duration is 1 second, this means that each image will appear for 0.5s each cycle.\n\n```csharp\nimageXamView.AnimationDuration = 1\n```\n\nSet the value of `AnimationRepeatCount `to 0, which will allow the animation to animate indefiniately:\n\n```csharp\nimageXamView.AnimationRepeatCount = 0\n```\n\nFinally, add the Image View to the `RootViewController`, and start the animation by calling the `StartAnimation `property\n\n```csharp\nRootViewController.View.AddSubview(imageXamView);\nimageXamView.StartAnimating()\n```\n\n#### Try it now!\n\n* Try adding a new image into the rotation of images (Note that you’ll have to add the image to the root folder)\n\nTo stop the animation, call the `StopAnimating()` method.\n\n## Important Image Considerations\n\nThere are a few more points you should be aware of regarding images and iOS:\n\n* By default OS X uses a case-insensitive file system, which means that the iOS Simulator is also case-insensitive. An iOS device, however, uses a **case-sensitive** file system. So code that runs on the simulator may fail to run correctly on the device.\n\n* You cannot name a developer created folder `Resources`, as it is reserved in iOS and the application will crash.\n\n* Set the build action to **BundleResource** if you want an image to be included in the application bundle. Xamarin Studio will set this automatically for you, but if you get a runtime error that says the image cannot be found, double-check this."
  },
  {
    "path": "ios/user-interface/UILabel/uilabel.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# UILabel\n\nUILabel is contained within the `UIKit`namespace, so make sure to add this using directive:\n\n```csharp\nusing UIKit;\n```\n\nYou can create a new label by instantiating it and passing in a frame. The frame is where the control will be placed on the screen:\n\n```csharp\nvar firstLabel = new UILabel(new CGRect(100, 100, 300, 100))\n```\n\nCurrently, this is just an empty label with a Frame. To add some text, and make it look nice, assign the label’s Text and TextColor properties:\n\n```csharp\nfirstLabel.Text = \"This is a label\";\nfirstLabel.TextColor = UIColor.Purple\n```\n\nTo add the label to your view, use the following code:\n\n```csharp\nRootViewController.View.AddSubview(firstLabel)\n```\n\n![](label1.png)\n\nIn iOS, the User Experience is controlled by instances of `UIViewController`and the User Interface by instances of `UIView`. Every `UIWindow` has a `RootViewController` instance of some `UIViewController` subclass. Xamarin Workbooks exposes a global variable `RootViewController` variable for the application running in the simulator. The \\`UILabel\\` is a subclass of `UIView`, so the `UIButton` can be added with the `AddSubview(UIView)` method as in the example above.\n\n### 👍Try it now\n\n* Change the values of the Frame, and notice how this affects the size and position of the label\n\n* Change the Text and TextColor of the label.\n\n* What other properties can you change that may be useful?\n\n## Appearance\n\nMany properties can be added to a label to adjust its appearance.\n\nThe `ShadowColor`property can be used to add a shadow effect to any label. The `ShadowOffset`can be used to offset the shadow, in points, from the label where the label is at (0,0). Positive numbers will offset the shadow to the right and down respectively. Negative numbers will offset it to the left and up.\n\nThe code below creates a new label, aligns it to the left-hand side of the Frame, and creates a shadow effect.\n\n```csharp\nvar secondLabel = new UILabel(new CGRect(100,150, 300, 100)){Text = \"Another Label\"};\nsecondLabel.TextAlignment = UITextAlignment.Left;\nsecondLabel.ShadowColor = UIColor.Magenta;\nsecondLabel.ShadowOffset = new CGSize(2.0, -2.0);\nRootViewController.View.AddSubview(secondLabel)\n```\n\n![](label2.png)\n\n### 👍Try it now\n\n* Adjust the properties above to see how TextAlignment and Shadow’s are used on labels in iOS.\n\nThe font and font size can be changed on any label. Refer to the [Enumerate fonts recipe](https://developer.xamarin.com/recipes/ios/standard_controls/fonts/enumerate_fonts/) to view a list of supported fonts on iOS.\n\nIn the code below, setting the `AdjustsFontSizeToFitWidth`to `true`constrains the text to the size of the label, regardless of size the font has been set to.\n\n```csharp\nvar thirdLabel = new UILabel(new CGRect(100,200, 150, 100)){Text = \"Third Label\"};\nthirdLabel.Font = UIFont.FromName(\"Chalkduster\", 40f);\nthirdLabel.AdjustsFontSizeToFitWidth = true;\nRootViewController.View.AddSubview(thirdLabel)\n```\n\n![](label3.png)\n\n### 👍Try it now\n\n* What happens if you set `AdjustsFontSizeToFitWidth`to `false`?\n\n## Adjusting the size of a label\n\nThe last section introduced the concept of changing the text to fit the label. However, you may need to create a long label, or dynamically adjust the size of the label to fit a large amount of text.\n\nThe code below creates a new label, with a static frame, and multiline text:\n\n```csharp\nvar longLabel = new UILabel (new CGRect(50,75,250,300)){Text = \"There would have been a time for such a word.\\nTomorrow, and tomorrow, and tomorrow,\\nCreeps in this petty pace from day to day\\nTo the last syllable of recorded time,\\nAnd all our yesterdays have lighted fools\\nThe way to dusty death. Out, out, brief candle!\\nLife’s but a walking shadow, a poor player\\nThat struts and frets his hour upon the stage\\nAnd then is heard no more: it is a tale\\nTold by an idiot, full of sound and fury,\\nSignifying nothing.\", Alpha=0.3f};\nRootViewController.View.AddSubview(longLabel)\n```\n\nThis creates a new label, whose text is truncated at the rightmost edge, as illustrated below:\n\n![truncated](longLabel.png \"truncated\")\n\nThe truncation is caused because the default number of lines for a label is 1. The `Line` property can be set to any int value, but setting it to 0 will allow the label to display as many lines as it needs to. SizeToFit can also be called on the label, allowing the view to resize to use the most appropriate amount of space. The code below shows how to do this:\n\n```csharp\nlongLabel.Lines = 0;\nlongLabel.SizeToFit();\n```\n\n## Responding to Touch Events\n\nIn some scenarios, you may wish to respond to user interaction in your app. Implementing this is fairly straightforward. First, create a new UITapGestureRecognizer, which will contain all the actions that you want to call when a tap is recognized.\n\n```csharp\nvar eventLabel = new UITapGestureRecognizer(() => {\n    secondLabel.Text = \"Here is some updated text\";\n    secondLabel.ShadowOffset = new CGSize(-2.0,2.0);\n    longLabel.Text = \"Short text\";\n    longLabel.Alpha = 1.0f;\n    firstLabel.TextColor = UIColor.Orange;\n});\n```\n\nThen, for the label in which you wish to monitor for user interaction set the `UserInteractionEnabled  `property to `true.` Finally, attach the newly created gesture recognizer to your label by passing it as a parameter:\n\n```csharp\nthirdLabel.UserInteractionEnabled = true;\nthirdLabel.AddGestureRecognizer(eventLabel)\n```\n\n## Further Reading\n\nFor more information on using a UILabel, refer to the [API documentation.](https://developer.xamarin.com/api/type/UIKit.UILabel/)"
  },
  {
    "path": "ios/user-interface/UINavigationController/README.md",
    "content": "UINavigationController Workbook\n============\n\nDemonstrates pushing and popping viewcontrollers on the navigation stack.\n\n![](Screenshots/uinavigationcontroller.png)"
  },
  {
    "path": "ios/user-interface/UINavigationController/uinavigationcontroller.workbook/Hierarchical-Navigation.csx",
    "content": "using UIKit;\n\npublic class ContentView : UIView\n{\n    public ContentView (UIColor fillColor)\n    {\n        BackgroundColor = fillColor;\n    }\n}\n\npublic class SimpleViewController : UIViewController\n{\n    UIColor fillColor; \n\n    public SimpleViewController (UIColor fillColor) : base ()\n    {\n        this.fillColor = fillColor;\n    }\n\n    public override void DidReceiveMemoryWarning ()\n    {\n        // Releases the view if it doesn't have a superview.\n        base.DidReceiveMemoryWarning ();\n    }\n\n    public override void ViewDidLoad ()\n    {\n        base.ViewDidLoad ();\n\n        var view = new ContentView (fillColor);\n\n        this.View = view;\n    }\n}\n\nvar cyanController = new SimpleViewController(UIColor.Cyan);\nvar blueController = new SimpleViewController(UIColor.Blue);\nvar redController = new SimpleViewController(UIColor.Red);\nvar greenController = new SimpleViewController(UIColor.Green);"
  },
  {
    "path": "ios/user-interface/UINavigationController/uinavigationcontroller.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# Hierarchical Navigation with the UINavigationController\n\nOne of the more common needs of an application is to manage the user experience of moving up and down through a hierarchy of screens. In iOS, this is accomplished with the `UINavigationController`. The `UINavigationController` is a prime example of the Model-View-Controller separation of concerns: it is primarily responsible for coordinating a stack of *other* `UIViewControllers`.\n\nFirst, load the `UIViewControllers`that will be controlled by the `UINavigationController`:\n\n```csharp\n//The implementation of these controllers is not important to understanding UINavigationController\n#load \"Hierarchical-Navigation.csx\"\n\n```\n\nNext, create a UINavigationController:\n\n```csharp\nvar navController = new UINavigationController();\n```\n\nXamarin Workbooks initializes its agent with a basic `UIViewController`, but this can be modified programmatically:\n\n```csharp\nKeyWindow.RootViewController = navController;\n```\n\nThe `UINavigationController` only controls a small amount of screen space — the translucent navigation bar that appears below the status bar. The rest of the screen is controlled by the topmost `UIViewCOntroller` in the navigation controller’s stack. To push a controller onto the stack, use:\n\n```csharp\nnavController.PushViewController(cyanController, false);\n```\n\n> ⚠️ Warning\n>\n> * A `UIViewController` may only be contained in a single `UINavigationController`. Attempting to add it twice will result in an exception.\n> \n> * The interactive nature of a Xamarin Workbook makes the above mistake easy to make! If you crash the `navController`, it's probably best to reload the Workbook before continuing.\n\nBecause the `cyanController` is the `navController`’s first child (and therefore it’s `RootViewController`), the navigation bar does not display a “back” navigation control, but if we add another `UIViewController`, the navigation bar creates a standard navigation experience, with a back button labeled “Back”:\n\n```csharp\nnavController.PushViewController(redController, true);\n```\n\nThe second parameter to \\`PushViewController\\` is a bool that controls whether the change is animated.\n\nYou can modify the title of the back button by setting the following code in the view controller *above* where you want the modified title to appear:\n\n```csharp\nredController.NavigationItem.BackBarButtonItem = new UIBarButtonItem(\"Pop to Red\", UIBarButtonItemStyle.Plain, null);\nnavController.PushViewController(greenController, true);\n```\n\nThe navigation bar can additionally display a `Title`:\n\n```csharp\nnavController.NavigationBar.TopItem.Title = \"Green Controller\"\n```\n\nAnd it can have a background image:\n\n```csharp\nvar img = UIImage.FromFile(\"wood-texture-pattern.jpg\");\nnavController.NavigationBar.SetBackgroundImage(img, UIBarMetrics.Default);\n```\n\nWithout the background image, you can see that the navigation bar sits on top of the presented `UIViewController` :\n\n```csharp\nnavController.NavigationBar.SetBackgroundImage(null, UIBarMetrics.Default);\n```\n\nIf you just add a `UIControl` to the `greenViewController`’s view, it will sit beneath the navigation bar:\n\n```csharp\nvar label = new UILabel(new CGRect(0, 100, 100, 50)) { Text = \"MyControl\" };\ngreenController.View.AddSubview(label);\nlabel.Frame\n```\n\nThe easiest way to layout the control to respect the navigation bar is to use autolayout and the `TopLayoutGuide` property of the `UIViewController`, which “knows about” the status and navigation bars:\n\n```csharp\nlabel.TranslatesAutoresizingMaskIntoConstraints = false;\nvar margins = greenController.View.LayoutMarginsGuide;\nlabel.LeadingAnchor.ConstraintEqualTo(margins.LeadingAnchor).Active = true;\nlabel.TrailingAnchor.ConstraintEqualTo(margins.TrailingAnchor).Active = true;\nlabel.TopAnchor.ConstraintEqualTo(greenController.TopLayoutGuide.GetBottomAnchor(), 10).Active = true;\n```\n\nYou’ve already explored the `PushViewController` method on the `UINavigationController`. It’s complement is the `PopViewController` method. As with `PushViewController`, a boolean specifies whether the change should be animated:\n\n```csharp\nnavController.PopViewController(true)\n```\n\n\\(Note that the “Back Button” in the navigation bar automatically pops the current controller, you do not need to write an event handler to do so.) \n\nIf you have a deep hierarchy of controllers:\n\n```csharp\nnavController.PushViewController(greenController, true);\nnavController.PushViewController(blueController,true);\n```\n\nYou may pop the entire stack with:\n\n```csharp\nnavController.PopToRootViewController(true);\n```\n\n###### 👍 Try it now!\n\n* Push and pop the `redController`, `greenController`, and `blueController` view controllers\n\n* Set a new `Title` and `BackgroundImage` for the navigation bar. \n"
  },
  {
    "path": "ios/user-interface/UISwitch/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\n---\n\n# UISwitch\n\n## Adjusting the Appearance\n\n### Creating a switch\n\nTo create a switch, instantiate a new UISwitch and give it a frame. It can then be added as a subview to the view:\n\n```csharp\nvar funSwitch = new UISwitch(new CGRect(50, 50, 100, 100));\nRootViewController.View.AddSubview(funSwitch);\n```\n\nNote that a switch control can also be added to an iOS application through the Xamarin Designer for iOS, which can be found in Visual Studio and Xamarin Studio.\n\n### Adjusting properties\\\n\nThere are only a small number of properties that can be changed when implementing a UISwitch – the On/Off tint color, and the Thumb tint color. These can be adjusted by accessing the properties shown below:\n\n```csharp\nfunSwitch.ThumbTintColor = UIColor.Magenta;\nfunSwitch.OnTintColor = UIColor.Blue\n```\n\nIn iOS 6 and below, an On or Off image can be added via the **[`OnImage/`](https://developer.xamarin.com/api/property/UIKit.UISwitch.OnImage/)[`OffImage`](https://developer.xamarin.com/api/property/UIKit.UISwitch.OffImage/)**properties. However, these images will not render in iOS 7 and above.\n\nThe SetState property can be used when creating a new switch to set its state as on or off by default, where True => On and False => Off:\n\n```csharp\nfunSwitch.SetState(false,true);\n```\n\n### Setting the Appearance\n\nLike many  UIKit controls, setting any appearance properties on this instance will affect the appearance of all instances of UISwitch. Adjust the Thumb tint color for all new switches with the following code:\n\n```csharp\nUISwitch.Appearance.ThumbTintColor = UIColor.Orange\n```\n\nTry it now:\n\n* Create a new UISwitch to confirm the appearance.\n\n* Change the tint color to show when the switch is OFF\n\n## Responding to events\n\nCreate a label to display the state of the switch:\n\n```csharp\nvar label = new UILabel(new CGRect(10, 100, 250, 50)){Text = \"\"};\nRootViewController.View.AddSubview(label);\n```\n\nThe `ValueChanged `event can be handled to determine the change in state between the switch being On and Off. The On property returns a boolean, which can then be evaluated to establish the condition of the switch:\n\n```csharp\nfunSwitch.ValueChanged += delegate {\n    if (funSwitch.On)\n        label.Text = \"Switch is turned On:\" + funSwitch.On.ToString();\n    else\n        label.Text = \"Switch is turned On:\" + funSwitch.On.ToString();\n}\n```\n\n## Further Reading\n\nFor more information on using a UISwitch, refer to the following articles:\n\n* [Using a Switch in the iOS Designer](https://developer.xamarin.com/guides/ios/user_interface/controls/part_6_-_other_controls/#Switch)\n\n* [API Documentation](https://developer.xamarin.com/api/type/UIKit.UISwitch/)\n\n"
  },
  {
    "path": "ios/user-interface/UITableView/uitableview.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# Introduction to iOS Tables\n\n## Displaying data using UITableView with Xamarin.iOS\n\nThis workbook introduces the classes used to create and display tables in Xamarin.iOS. \n\nFor those working on cross-platform applications with Xamarin.Android, the `UITableView` control is similar to the `ListView` class in Android and the `UITableViewSource` class is similar to Android’s `Adapter` classes.\n\n## Table Parts\n\nA UITableView can have a ‘grouped’ or ‘plain’ style, and consists of the following parts:\n\n* Section Header\n\n* Cells (or rows, if you prefer)\n\n* Section Footer\n\n* Index\n\n* Editing mode (includes ‘swipe to delete’ and drag handles to change row order)\n\nThese screenshots show how section rows, headers, footers, edit controls and the index are displayed.\n\n![](image1a.png)\n\nTo understand iOS tables, it’s easiest to work upwards from the domain data:\n\n```csharp\n//Domain data\npublic class SimpleDomainClass {\n    public nint Section { get; }\n    public nint Row { get; }\n\n    public SimpleDomainClass(nint section, nint row)\n    {\n        Section = section;\n        Row = row;\n    }\n\n    override public string ToString() => $\"Section {Section}, Row {Row}\";\n}\n\nvar simpleDomainCollection = new [] {\n    new SimpleDomainClass(0, 0),\n    new SimpleDomainClass(0, 1),\n    new SimpleDomainClass(0, 2),\n    new SimpleDomainClass(1, 0),\n    new SimpleDomainClass(1, 1),\n    new SimpleDomainClass(1, 2)\n};\n```\n\nGenerally, you do not need to subclass `UITableView` itself:\n\n```csharp\nvar tableView = new UITableView();\n```\n\nA table view displays its data in `UITableViewCell` instances.  Because tables may be very large, iOS caches the UITableViewCell instances of a table. The key to that cache is a `string` called the “reuse identifier.” The method `RegisterClassForReuse` associates the reuse identifier with the type of `UITableViewCell` you wish to use. To avoid typos, a good practice is to use `nameof(YourCellType)`:\n\n```csharp\nreadonly string CELL_ID = nameof(UITableViewCell);\ntableView.RegisterClassForCellReuse(typeof(UITableViewCell), CELL_ID);\n```\n\nIn this case, we want to display a generic `UITableViewCell` but often you will pass in a subclass you define.\n\nDomain data is linked to the table view via a subclass of UITableViewSource:\n\n```csharp\npublic class DomainSource : UITableViewSource\n{\n      SimpleDomainClass[] Model { get; }\n\n        public DomainSource (SimpleDomainClass[] model)\n        {\n            this.Model = model;\n        }\n\n        //The first section is section == 0 \n        public override nint RowsInSection (UITableView tableView, nint section)\n        {\n            // Matches the \"Section\" property with the passed-in section\n            return Model.Count((datum => datum.Section == section));\n        }\n\n        public override nint NumberOfSections(UITableView tableView)\n        {\n            return Model.GroupBy((datum) => datum.Section).Count();\n        }\n\n        //Note: For production, strive to make this method performant\n        public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n        {\n            //Retrieve a cell from the system-maintained cache for the table. \n            var cell = tableView.DequeueReusableCell (nameof(UITableViewCell), indexPath); //as MyTableViewCellType <-- Downcast as necessary\n            //RegisterForReuse guarantees cell is not null \n\n            //Retrieve data\n            var sectionData = Model.Where(datum => datum.Section == indexPath.Section); \n            \n            //Set the appearance of the cell based on the data and indexPath\n            cell.TextLabel.Text = sectionData.ElementAt(indexPath.Row).ToString();\n\n            return cell;\n        }\n    }\n    \nvar simpleSource = new DomainSource(simpleDomainCollection);\n```\n\nYour UITableViewSource may override more functions, but it must override `RowsInSection` and `GetCell`. RowsInSection should be fairly clear: `section` is a 0-based index into your domain data; if your table has only a single section, just return the total number of rows in your data. Because our sample data has multiple sections, the above also overrides `NumberOfSections`.\n\n`GetCell` is a little more complex. `GetCell`is responsible for setting the properties of a specific row. The `indexPath` contains both a `Section` and a `Row` `nint` that indicates what data the `tableView` is displaying. `DequeueReusableCell` takes a string (a reuse identifier) and the passed-in `indexPath` and returns a `UITableViewCell`. If you have called `RegisterClassForCellReuse`, `DequeueReusableCell` will, as necessary, instantiate a new instance of the type associated with the reuse identifier. If you have *not* registered a class, you must perform a null check and instantiate the cell yourself.\n\nBecause we are using the base class `UITableViewCell` for display we do not need to downcast to get the appropriate type for  `cell`, but if you had registered a custom class, you would need to downcast it. The bulk  of `GetCell` is setting the display properties of the `cell` to the values of the domain data associated with the `indexPath`.\n\n*Note:* `GetCell` must be a performant method. This example uses LINQ for clarity, but you should profile and be prepared to optimize this method.\n\nNow that you have a `UITableView` for which you’ve registered a `UITableViewCell` to display cells, and you have a `UITableViewSource` associated with your data, the next thing to do is tie them together:\n\n```csharp\ntableView.Source = simpleSource;\n```\n\nFinally, you need a `UITableViewController` to handle the user experience:\n\n```csharp\nvar tvc = new UITableViewController(UITableViewStyle.Plain);\ntvc.TableView = tableView;\nRootViewController.PresentViewController(tvc, true, () => {});\n```\n\nYou'll notice that although your data has two sections, the displayed table does not show any breaks. To create section headers and footers, you need to override additional functions in your `UITableViewSource`:\n\n```csharp\n//Notice that this is a subclass of DomainSource (which defines GetCell, RowsInSection, and NumberOfSections) \npublic class DomainSourceWithGroups : DomainSource\n{\n    public DomainSourceWithGroups(SimpleDomainClass[] data) : base(data) {}\n\n    //Both \"GetViewFor{Header|Footer|\" and \"GetHeightFor{Header|Footer\"}\" must be overridden\n    public override UIView GetViewForHeader(UITableView tableView, nint section)\n    {\n        var l = new UILabel();\n        l.Text = $\"Section {section}\";\n        l.BackgroundColor = UIColor.White;\n        return l;\n    }\n\n    public override nfloat GetHeightForHeader(UITableView tableView, nint section)\n    {\n        return 20;\n    }\n\n    public override UIView GetViewForFooter(UITableView tableView, nint section)\n    {\n        var vw = new UIView();\n        vw.BackgroundColor = UIColor.Yellow;\n        return vw;\n    }\n\n    public override nfloat GetHeightForFooter(UITableView tableView, nint section)\n    {\n        return 5;\n    }\n}\n    \nvar sourceWithSectionViews = new DomainSourceWithGroups(simpleDomainCollection);\ntableView.Source = sourceWithSectionViews;\n\n//Re-display\ntvc.DismissViewController(true, () => { RootViewController.PresentViewController(tvc, true, null);});\n```\n\n`DomainSourceWithGroups`adds support for section headers and footers. The `GetHeightForHeader`and `GetHeightForFooter` must be implemented for the relevant view to appear.\n\n## Reacting to touches\n\nMost tables allow the user to touch a row to select it and perform some other action (such as playing a song, or calling a contact, or showing another screen). \n\niOS does not have .NET-like events. It sometimes uses the almost-but-not-quite-an-event “target-action” pattern but more commonly it uses the the “delegate object” model for event-handling. In this model, components are associated with two different classes. One class holds those properties and behaviors that are not necessarily customized every time the class is used (a `UILabel`, for instance, displays some Text whose *value*  will certainly need to be set to something other than “Label”, but the idea that it displays a string is unlikely to be changed). The other class, called the “delegate class,” contains the methods that in the .NET-world would correspond to events. Since events typically *do* need to be handled in a custom manner, you typically write lots of subclasses of the “delegate class.”\n\nIt’s important not to be confused between C# `delegate` methods and the “delegate object” model, especially as Apple typically refers to the delegate object simply as “the delegate.”   \n\n The `UITableViewSource` class is a delegate class for the `UITableView` and you override the `RowSelected` method in order to handle a selection touch. You could either write the custom event-handling code directly in the `RowSelected` method or you could expose the call as a .NET event:\n\n```csharp\n//Generic EventArgs subclass\npublic class EventArgsT<T> : EventArgs\n{\n    public T Value { get; }\n    \n    public EventArgsT(T value) { this.Value = value; }\n}\n\n//Again, note that this inherits from UITableViewSource \nclass TouchDelegateToEvent : DomainSourceWithGroups {\n    public TouchDelegateToEvent(SimpleDomainClass [] data) : base(data) {}\n\n    public event EventHandler<EventArgsT<NSIndexPath>> OnRowSelected = delegate {};\n\n    public override void RowSelected(UITableView tableView, NSIndexPath path)\n    {\n        OnRowSelected(this, new EventArgsT<NSIndexPath>(path));\n    }\n}\n\n//Instantiate our new UITableViewSource and assign it\nvar sourceWithTouch = new TouchDelegateToEvent(simpleDomainCollection);\ntableView.Source = sourceWithTouch;\n\n//Handle the touch event by showing a simple dialog\nsourceWithTouch.OnRowSelected += (sender, evt) => \n{\n    NSIndexPath path = evt.Value;\n    var popup = UIAlertController.Create(\"Row touched\", $\"Section {path.Section} Row {path.Row}\", UIAlertControllerStyle.Alert);\n    popup.AddAction(UIAlertAction.Create(\"Click\", UIAlertActionStyle.Default, null));\n\n    tvc.PresentModalViewController(popup, true);\n\n};\n\n//Re-display\ntvc.DismissViewController(true, () => { RootViewController.PresentViewController(tvc, true, null);});\n```\n\nThe previous code defines an `EventArgsT<T>` class and an `OnRowSelected` event. It overrides the \"delegate class\" method `RowSelected` to fire the `OnRowSelected` event. Then, it creates an instance of this new `UITableViewSource` class and assigns a handler (a .NET `delegate`, which is hopefully not too confusing!) to the `OnRowSelected` event. (Normally you should avoid using \"On\" for titling your events, but in this case the \"delegate class\" already took the name `RowSelected`.) The handler pops up a dialog with information about the touched row. Finally, it re-displays the `UITableViewController`.\n\n## Further Reading\n\nTables (and the closely-related UICollectionView and associated classes) have a large amount of behavior and customizability. The [Working with Tables and Cells](https://developer.xamarin.com/guides/ios/user_interface/tables/) series on the Xamarin developer portal goes into these capabilities in great depth.\n\n"
  },
  {
    "path": "ios/user-interface/alerts/alert-controller.workbook/alert_controller.csx",
    "content": "//Alert with One Button\nvar okayButton = UIButton.FromType (UIButtonType.System);\nokayButton.Frame = new CGRect (10, 30, 300, 40);\nokayButton.SetTitle (\"Okay Button\", UIControlState.Normal);\n\n//Alert with Two Buttons\nvar okayCancelButton = UIButton.FromType (UIButtonType.System);\nokayCancelButton.Frame = new CGRect (10, 80, 300, 40);\nokayCancelButton.SetTitle (\"Okay / Cancel Button\", UIControlState.Normal);\n\n//Text Input Alert\nvar textInputButton = UIButton.FromType (UIButtonType.System);\ntextInputButton.Frame = new CGRect (10, 130, 300, 40);\ntextInputButton.SetTitle (\"Text Input\", UIControlState.Normal);\n\nvar actionSheetButton = UIButton.FromType (UIButtonType.System);\nactionSheetButton.Frame = new CGRect (10, 180, 300, 40);\nactionSheetButton.SetTitle (\"Action Sheet\", UIControlState.Normal);\n\nRootViewController.View.AddSubview(okayButton);\nRootViewController.View.AddSubview(okayCancelButton);\nRootViewController.View.AddSubview(textInputButton);\nRootViewController.View.AddSubview(actionSheetButton);\n\n"
  },
  {
    "path": "ios/user-interface/alerts/alert-controller.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# UIAlertController\n\nUIAlertController is the class that should be used for displaying alerts in iOS 8 and above and has completely replaced `UIActionSheet`and `UIAlertView`, both of which are now deprecated.\n\nUnlike the classes it replaced, which are subclasses of `UIView`, `UIAlertController`is a subclass of `UIViewController`.\n\n`UIAlertControllerStyle` is used to indicate the type of alert to display. These alerts types are:\n\n* **UIAlertControllerStyleActionSheet**\n\n  * Pre-iOS 8 this would have been a UIActionSheet\n\n* **UIAlertControllerStyleAlert**\n\n  * Pre-iOS 8 this would have been UIAlertView\n\nThere are three steps to take when creating an AlertController:\n\n* Create and configure the Alert\n\n  * title\n\n  * message\n\n  * preferredStyle\n\n* (Optional) Add a text field\n\n* Add the Required actions\n\n* Present the View Controller\n\nAs this alert is triggered by a button touch event (a typical scenario in iOS), load the \\`UIButtons\\`:\n\n```csharp\n#load \"alert_controller.csx\"\n```\n\n```csharp\n//var alertController = new AlertControllerSampleViewController();\n//KeyWindow.RootViewController = alertController\n//KeyWindow.MakeKeyAndVisible()\n```\n\n```csharp\n//  //Alert with One Button\n// var okayButton = UIButton.FromType (UIButtonType.System);\n// okayButton.Frame = new CGRect (10, 30, 300, 40);\n// okayButton.SetTitle (\"Okay Button\", UIControlState.Normal);\n\n// //Alert with Two Buttons\n// var okayCancelButton = UIButton.FromType (UIButtonType.System);\n// okayCancelButton.Frame = new CGRect (10, 80, 300, 40);\n// okayCancelButton.SetTitle (\"Okay / Cancel Button\", UIControlState.Normal);\n\n// //Text Input Alert\n// var textInputButton = UIButton.FromType (UIButtonType.System);\n// textInputButton.Frame = new CGRect (10, 130, 300, 40);\n// textInputButton.SetTitle (\"Text Input\", UIControlState.Normal);\n\n// var actionSheetButton = UIButton.FromType (UIButtonType.System);\n// actionSheetButton.Frame = new CGRect (10, 180, 300, 40);\n// actionSheetButton.SetTitle (\"Action Sheet\", UIControlState.Normal);\n\n// RootViewController.View.AddSubview(okayButton);\n// RootViewController.View.AddSubview(okayCancelButton);\n// RootViewController.View.AddSubview(textInputButton);\n// RootViewController.View.AddSubview(actionSheetButton);\n```\n\n## Alert with One Button\n\n![](okayalert.png)\n\n```csharp\nokayButton.TouchUpInside += (sender, e) => {\n\n                //Create Alert\n                var okAlertController = UIAlertController.Create (\"OK Alert\", \"This is a sample alert with an OK button.\", UIAlertControllerStyle.Alert);\n\n                //Add Action\n                okAlertController.AddAction (UIAlertAction.Create (\"Ok\", UIAlertActionStyle.Default, null));\n\n                // Present Alert\n                RootViewController.PresentViewController (okAlertController, true, null);\n};\n```\n\n## Alert with Two buttons\n\n![](okaycancel.png)\n\n```csharp\nokayCancelButton.TouchUpInside += ((sender, e) => {\n\n                //Create Alert\n                var okCancelAlertController = UIAlertController.Create(\"OK / Cancel Alert\", \"This is a sample alert with an OK / Cancel Button\", UIAlertControllerStyle.Alert);\n\n                //Add Actions\n                okCancelAlertController.AddAction(UIAlertAction.Create(\"Okay\", UIAlertActionStyle.Default, alert => Console.WriteLine (\"Okay was clicked\")));\n                okCancelAlertController.AddAction(UIAlertAction.Create(\"Cancel\", UIAlertActionStyle.Cancel, alert => Console.WriteLine (\"Cancel was clicked\")));\n\n                //Present Alert\n                RootViewController.PresentViewController(okCancelAlertController, true, null);\n            });\n```\n\n## Alert with Text Field\n\n![](textinput.png)\n\n```csharp\ntextInputButton.TouchUpInside += ((sender, e) => {\n\n                //Create Alert\n                var textInputAlertController = UIAlertController.Create(\"Text Input Alert\", \"Hey, input some text\", UIAlertControllerStyle.Alert);\n\n                //Add Text Input\n                textInputAlertController.AddTextField(textField => {\n                });\n\n                //Add Actions\n                var cancelAction = UIAlertAction.Create (\"Cancel\", UIAlertActionStyle.Cancel, alertAction => Console.WriteLine (\"Cancel was Pressed\"));\n                var okayAction = UIAlertAction.Create (\"Okay\", UIAlertActionStyle.Default, alertAction => Console.WriteLine (\"The user entered '{0}'\", textInputAlertController.TextFields[0].Text));\n\n                textInputAlertController.AddAction(cancelAction);\n                textInputAlertController.AddAction(okayAction);\n\n                //Present Alert\n                RootViewController.PresentViewController(textInputAlertController, true, null);\n            });\n```\n\n## ActionSheet Alert\n\n![](actionsheet.png)\n\n```csharp\nactionSheetButton.TouchUpInside += ((sender, e) => {\n\n                // Create a new Alert Controller\n                UIAlertController actionSheetAlert = UIAlertController.Create(\"Action Sheet\", \"Select an item from below\", UIAlertControllerStyle.ActionSheet);\n\n                // Add Actions\n                actionSheetAlert.AddAction(UIAlertAction.Create(\"Item One\",UIAlertActionStyle.Default, (action) => Console.WriteLine (\"Item One pressed.\")));\n\n                actionSheetAlert.AddAction(UIAlertAction.Create(\"Item Two\",UIAlertActionStyle.Default, (action) => Console.WriteLine (\"Item Two pressed.\")));\n\n                actionSheetAlert.AddAction(UIAlertAction.Create(\"Item Three\",UIAlertActionStyle.Default, (action) => Console.WriteLine (\"Item Three pressed.\")));\n\n                actionSheetAlert.AddAction(UIAlertAction.Create(\"Cancel\",UIAlertActionStyle.Cancel, (action) => Console.WriteLine (\"Cancel button pressed.\")));\n\n                // Required for iPad - You must specify a source for the Action Sheet since it is\n                // displayed as a popover\n                UIPopoverPresentationController presentationPopover = actionSheetAlert.PopoverPresentationController;\n                if (presentationPopover!=null) {\n                    presentationPopover.SourceView = RootViewController.View;\n                    presentationPopover.PermittedArrowDirections = UIPopoverArrowDirection.Up;\n                }\n\n                // Display the alert\n                RootViewController.PresentViewController(actionSheetAlert,true,null);\n            });\n```"
  },
  {
    "path": "ios/user-interface/meta.json",
    "content": "{\n  \"order\":{\n    \"alerts/alert-controller.workbook\":\"Alerts\",\n    \"UIbutton/uibutton.workbook\":\"Button\",\n    \"UIImage/uiimage.workbook\":\"Image\",\n    \"UILabel/uilabel.workbook\":\"Label\",\n    \"UINavigationController/uinavigationcontroller.workbook\":\"Navigation Controller\",\n    \"UISwitch/index.workbook\":\"Switch\",\n    \"UITableView/uitableview.workbook\":\"Table View\",\n    \"uitableview-1/uitableview1.workbook\":\"Table View 1\",\n    \"web-views/web-views.workbook\":\"Web View\"\n  }\n}\n"
  },
  {
    "path": "ios/user-interface/uitableview-1/README.md",
    "content": "UITableView Workbook\n============\n\nDemonstrates the how to use the data display and editing features of [`UITableView`](https://developer.xamarin.com/api/type/UIKit.UITableView) as explained in the [docs](https://developer.xamarin.com/guides/ios/user_interface/tables/)\n\n![](Screenshots/uitableview.png)"
  },
  {
    "path": "ios/user-interface/uitableview-1/uitableview1.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# UITableView I\n\nOne of the most common controls in iOS is the table view - it renders a fast scrolling list of data and can be heavily customized. This workbook demonstrates how to display data in a table view, and is based on the [Tables and Cells section](https://developer.xamarin.com/guides/ios/user_interface/tables/) on [developer.xamarin.com](https://developer.xamarin.com).\n\n* Setup\n\n* Showing Some Data\n\n* Animated Insertion & Deletion\n\n* Customizing Each Row\n\n* Built-in Layouts\n\n* Custom Cell Layout\n\n* Row Selection\n\n* Row Actions\n\n* Edit Mode\n\nFirst, some setup. Grab a reference to the iOS root `ViewController` (in your app code, a table view might be added to any view controller):\n\n```csharp\nvar vc = KeyWindow.RootViewController;\n```\n\n## Setup\n\nNow instantiate a `UITableView`control. Notice how the offset and size are all zero - by default the table has no size...\n\n```csharp\nvar tableView = new UITableView();\n```\n\nTable views frequently occupy the entire screen, so set the `Frame`for the table to match the `Bounds`of the screen. The tableView will now have a `Width`and `Height`:\n\n```csharp\ntableView.Frame = UIScreen.MainScreen.Bounds;\n```\n\nThe table is still not visible on the screen - to make that happen we need to add the control to the root view controller’s `View`, with the `AddSubview`method. When this method is called the table will be visible on the screen (despite having no data, an empty table view displays gridlines based on the default row height):\n\n```csharp\nvc.View.AddSubview(tableView);\n```\n\nIn your app code, the AddSubview command is usually in the `ViewDidLoad` method. Alternatively, you can drag-and-drop a `UITableView`control onto a storyboard and give it a name, which means you do not have to do the above steps in code.\n\n## Showing Some Data\n\nReal apps frequently populate the UI from a database or a web-service, but for learning about table views a simple string list is a good start:\n\n```csharp\nvar data = new List<string> {\"eeny\", \"meany\", \"miney\", \"mo\"};\n```\n\niOS table views don’t have the concept of a **BindingContext** like Xamarin.Forms, so there is no direct way to “assign” the list to the table view. Instead a wrapper object subclassed from `UITableViewSource` is used - the table view uses this class to get information about the data it needs to display.\n\nThere are many optional methods, but the minimum implementation requires:\n\n* `RowsInSection` – a method that tells the table view how many rows are in the data. Table views support multiple sections, but for this example there is only one section so the concept can be ignored for now.\n\n* `GetCell` – the table view calls this method for each row that it needs to display. There are two parts to this method: first get a recycled cell or create a new cell object, then set the UI of the cell with values from the data for that row.\n\nAn example subclass - `MySource` - is shown below.\n\n```csharp\npublic class MySource : UITableViewSource \n{\n\tstring identifier = \"mycell\";\n\tpublic List<string> Data {get;set;} = new List<string>(); // C# 6\n\tpublic override nint RowsInSection (UITableView tableview, nint section)\n\t{ \n\t\treturn Data.Count; \n\t}\n\tpublic override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\t// first, get or create a cell\n\t\tUITableViewCell cell = tableView.DequeueReusableCell (identifier);\n\t\tif (cell == null)\n\t\t{ cell = new UITableViewCell (UITableViewCellStyle.Default, identifier); }\n\t\t// then, get the data and set the UI \n\t\tstring item = Data[indexPath.Row];\n\t\tcell.TextLabel.Text = item;\n\t\treturn cell;\n\t}\n}\n```\n\nTo use the new class, instantiate it and set the `Data` property to the list of strings. Now it’s ready for the table view, so assign it to the table view’s `Source` property. The table is now ready to display the data - call `ReloadData` to see it rendered on the screen:\n\n```csharp\nvar source = new MySource(); // create the class\nsource.Data = data;          // assign the list of strings\ntableView.Source = source;   // give it to the table view\ntableView.ReloadData();      // and show on the screen\n```\n\n![](mysource.png)\n\n*(ignore the status bar overlapping for now - that is a layout issue for another workbook)*\n\nWhat happens when a new item is added to the data list?\n\n```csharp\ndata.Add(\"d'oh\");\n```\n\nSadly, it does not automatically appear on the screen. We can force the table view to re-load the entire list by calling `ReloadData`:\n\n```csharp\ntableView.ReloadData();\n```\n\nThe new “d’oh” row is now visible - but there may have been a flicker in the UI, since the entire table was cleared and the rows re-created. This is sometimes acceptable for simple apps with small datasets, but there is a nicer way to add (and remove) rows programmatically.... with animation!\n\n### Animated Insertion & Deletion\n\nRather than reloading the entire table, rows can be progammatically added and removed. To demonstrate, insert two new rows at position 2 and 4 in the list so that they appear with an animation. The first step is to create `NSIndexPath`objects that refer to the new rows we’re inserting:\n\n```csharp\nvar ip1 = NSIndexPath.FromRowSection(2, 0); // row 2 section 0\nvar ip2 = NSIndexPath.FromRowSection(4, 0); // row 4 section 0\n```\n\nInstead of using `ReloadData`to refresh the entire list, it is possible to get the table to dynamically add the new rows with the code below. Notice how the modifications to both the underlying `data` and the `tableView` are contained inside a `BeginUpdates`/`EndUpdates` block:\n\n```csharp\ntableView.BeginUpdates(); \n// update the underlying data source\ndata.Insert (2, \"a deer\");\ndata.Insert (4, \"ray\");\n// tell the UITableView about the updates with NSIndexPath objects\ntableView.InsertRows(new [] {ip1, ip2}, UITableViewRowAnimation.Automatic);\ntableView.EndUpdates();\n```\n\nIt is only after `EndUpdates` is called that the changes are reflected in the user interface. All the changes made to the `data` and the `tableView` must match (ie. the number of rows in each must be identical before the block and after the block).\n\nNotice how the new rows animate into place. In addition to `Automatic` there are other animation options like `Top`, `Bottom`, `Left`, `Right`, `Middle`, `Fade` that can be chosen to suit the application’s user interface.\n\nThe `DeleteRows`method can also be used to remove a row. This is commented out below, since running the workbook over and over will remove all the data! Uncomment and execute this block to see a row removal animation.\n\n```csharp\n/*\nvar ip2 = NSIndexPath.FromRowSection(3, 0);\ntableView.BeginUpdates();\ndata.RemoveAt (3);\ntableView.DeleteRows(new [] {ip1, ip2}, UITableViewRowAnimation.Automatic);\ntableView.EndUpdates();\n*/\n```\n\n## Customizing Each Row\n\nEach row that is displayed is supplied to the table view from the source’s `GetCell` method. The code above uses the simplest default cell layout in the `GetCell` method. This method can be further customized to use different built-in or custom cells.\n\n### Built-in Layouts\n\nIn the updated source class below, the cell is now `UITableViewCellStyle.Subtitle` (instead of `Default`) and the code sets the additional `cell.DetailTextLabel.Text` property.\n\n```csharp\npublic class DetailSource : MySource \n{\n\tstring identifier = \"newcell\";\n\tpublic override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tUITableViewCell cell = tableView.DequeueReusableCell (identifier);\n\t\tif (cell == null)\n\t\t{ cell = new UITableViewCell (UITableViewCellStyle.Subtitle, identifier); }\n\n\t\tstring item = Data[indexPath.Row];\n\t\tcell.TextLabel.Text = item;\n\t\tcell.DetailTextLabel.Text = $\"{item.Length} characters\"; // C# 6\n\t\treturn cell;\n\t}\n}\n```\n\nTo use this new source with our table, create an instance, assign the data list, and tell the `tableView` to use this as its `Source`:\n\n```csharp\nsource = new DetailSource();  // create the new class\nsource.Data = data;           // assign the list of strings\ntableView.Source = source;    // give it to the table view (replaces the old one)\ntableView.ReloadData();       // reload the data with new cell layout\n```\n\nThe table rows now contain two pieces of text!\n\n![](detailsource.png)\n\n`UITableViewCellStyle` can also be set to `Value1` and `Value2` which display the text in different ways.\n\nIt is also possible to display an image - the class below sets the `ImageView` property to a local image file (in this case, the same image is used for every row):\n\n```csharp\npublic class ImageSource : MySource \n{\n\tstring identifier = \"imagecell\";\n\tpublic override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tUITableViewCell cell = tableView.DequeueReusableCell (identifier);\n\t\tif (cell == null)\n\t\t{ cell = new UITableViewCell (UITableViewCellStyle.Subtitle, identifier); }\n\t\t\n\t\tstring item = Data[indexPath.Row];\n\t\tcell.TextLabel.Text = item;\n\t\tcell.DetailTextLabel.Text = $\"{item.Length} characters\"; // C# 6\n\t\tcell.ImageView.Image = UIImage.FromFile(\"workicon.png\"); // now sets an image\n\t\treturn cell;\n\t}\n}\n```\n\nNow just configure this new source and assign to the table view:\n\n```csharp\nsource = new ImageSource();   // create the new class\nsource.Data = data;           // assign the list of strings\ntableView.Source = source;    // give it to the table view (replaces the old one)\ntableView.ReloadData();       // reload the data, cells now also display an image\n```\n\nThe cells now look like this!\n\n![](imagesource.png)\n\nThe other aspect of the cell that can be customized is the accessory – special icons that appear on the right side of the cell. Modify the `GetCell` method above with one of these lines of code to add an accessory to each row:\n\n`cell.Accessory = UITableViewCellAccessory.Checkmark; cell.Accessory = UITableViewCellAccessory.DisclosureIndicator; cell.Accessory = UITableViewCellAccessory.DetailDisclosureButton; cell.Accessory = UITableViewCellAccessory.None; // to clear the accessory`\n\n### Custom Cell Layout\n\nIt’s also possible to create totally custom cell layouts, and use them in the `GetCell` method instead of the built-in layouts. Cells are created programmatically by subclassing `UITableViewCell` and overriding these methods:\n\n* the constructor – create the UI controls in the cell.\n\n* `LayoutSubviews` – set the location of the UI controls (possibly adjusting them based on the data being displayed).\n\nIt’s helpful to add an additional method to update the data in the cell, which is called UpdateCell in the example.\n\n```csharp\npublic class MyCell : UITableViewCell\n{\n    UILabel headingLabel, subheadingLabel;\n    UIImageView imageView;\n\t// constructor: create the controls to display\n\tpublic MyCell (string cellId) : base (UITableViewCellStyle.Default, cellId)\n    {\n        ContentView.BackgroundColor = UIColor.FromRGB (218, 255, 127);\n        imageView = new UIImageView();\n        headingLabel = new UILabel () {\n            Font = UIFont.FromName(\"Cochin-BoldItalic\", 22f),\n            TextColor = UIColor.FromRGB (127, 51, 0),\n            BackgroundColor = UIColor.Clear\n        };\n        subheadingLabel = new UILabel () {\n            Font = UIFont.FromName(\"AmericanTypewriter\", 12f),\n            TextColor = UIColor.FromRGB (38, 127, 0),\n            TextAlignment = UITextAlignment.Center,\n            BackgroundColor = UIColor.Clear\n        };\n        ContentView.AddSubviews(new UIView[] {headingLabel, subheadingLabel, imageView});\n\n    }\n\t// set the location of each control\n    public override void LayoutSubviews ()\n    {\n        base.LayoutSubviews ();\n        imageView.Frame = new CGRect (ContentView.Bounds.Width - 63, 5, 33, 33);\n        headingLabel.Frame = new CGRect (5, 4, ContentView.Bounds.Width - 63, 25);\n        subheadingLabel.Frame = new CGRect (100, 18, 100, 20);\n    }\n\t// update the cell's data\n\tpublic void UpdateCell (string caption, string subtitle, UIImage image)\n    {\n        imageView.Image = image;\n        headingLabel.Text = caption;\n        subheadingLabel.Text = subtitle;\n    }\n}\n```\n\nOnce again we need to update the source class `GetCell` method to return instances of the custom cell. The `CustomSource` class shown below now creates instances of the custom cell and uses the `UpdateCell` method to pass the data values to display:\n\n```csharp\npublic class CustomSource : MySource \n{\n\tstring identifier = \"imagecell\";\n\tpublic override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tMyCell cell = tableView.DequeueReusableCell (identifier) as MyCell;\n\t\tif (cell == null)\n\t\t{ cell = new MyCell (identifier); }\n\t\t\n\t\tstring item = Data[indexPath.Row];\n\t\tcell.UpdateCell(item, \n\t\t\t\t\t\t$\"{item.Length} characters\", \n\t\t\t\t\t\tUIImage.FromFile(\"workicon.png\"));\n\t\treturn cell;\n\t}\n}\n```\n\nWiring up the new source object works uses the same code as before:\n\n```csharp\nsource = new CustomSource();  // create the new class\nsource.Data = data;           // assign the list of strings\ntableView.Source = source;    // give it to the table view (replaces the old one)\ntableView.ReloadData();       // reload the data, cells now also display an image\n```\n\nThe custom cells now look like this:\n\n![](customsource.png)\n\n## Row Selection\n\nTo respond to users touching a row override then `RowSelected` in the source class. The example below shows a source class with the `RowSelected` method added (the rest of the class is unchanged):\n\n```csharp\npublic class SelectionSource : MySource \n{\n\tstring identifier = \"selectioncell\";\n\tpublic override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tUITableViewCell cell = tableView.DequeueReusableCell (identifier);\n\t\tif (cell == null)\n\t\t{ cell = new UITableViewCell (UITableViewCellStyle.Subtitle, identifier); }\n\t\t\n\t\tstring item = Data[indexPath.Row];\n\t\tcell.TextLabel.Text = item;\n\t\tcell.DetailTextLabel.Text = $\"{item.Length} characters\"; // C# 6\n\t\tcell.ImageView.Image = UIImage.FromFile(\"workicon.png\"); // now sets an image\n\t\treturn cell;\n\t}\n\tpublic override void RowSelected (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tvar okAlertController = UIAlertController.Create (\"Row Selected\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  Data[indexPath.Row] + \" was touched\", \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  UIAlertControllerStyle.Alert);\n\t\tokAlertController.AddAction (UIAlertAction.Create(\"OK\", UIAlertActionStyle.Default, null));\n\t\t// real apps wouldn't use KeyWindow, this is a \"workbook\" limitation\n\t\tKeyWindow.RootViewController.PresentViewController (okAlertController, true, null);\n\t\ttableView.DeselectRow (indexPath, true); // de-select (otherwise it stays \"grey\")\n\t}\n}\n```\n\nThe RowSelected method is implemented to show an alert popup when each row is tapped. Each app will implement this differently – perhaps a new view controller is shown instead. Note the last line of the method where `DeselectRow` is called: this is recommended to return the table view to the initial appearance. If the row isn’t deselected, it remains “grey” (or whatever selection-color is defined).\n\nWiring it up follows the same pattern as previously. Once this source is used, the rows are “click-able”!\n\n```csharp\nsource = new SelectionSource();  // create the new class\nsource.Data = data;              // assign the list of strings\ntableView.Source = source;       // give it to the table view (replaces the old one)\ntableView.ReloadData();          // reload the data, cells now also display an image\n```\n\nThe alert will show like this (but you can customize the code to change it 😉):\n\n![](selectionsource.png)\n\n## Row Actions\n\nThe buttons that are revealed when a row is swiped to the left are called *row actions*. Configuring row actions in a cell (and handling when they are touched) is done by adding another method override to the source class.\n\nThe `ActionSource` class below includes the `EditActionsForRow` method which creates a single action (an array can be supplied to show more than one).\n\n```csharp\npublic class ActionSource : MySource \n{\n\tstring identifier = \"actioncell\";\n\tpublic override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tUITableViewCell cell = tableView.DequeueReusableCell (identifier);\n\t\tif (cell == null)\n\t\t{ cell = new UITableViewCell (UITableViewCellStyle.Subtitle, identifier); }\n\t\t\n\t\tstring item = Data[indexPath.Row];\n\t\tcell.TextLabel.Text = item;\n\t\tcell.DetailTextLabel.Text = $\"{item.Length} characters\"; // C# 6\n\t\tcell.ImageView.Image = UIImage.FromFile(\"workicon.png\"); // now sets an image\n\t\treturn cell;\n\t}\n\tpublic override void RowSelected (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tShowAlert(\"Row Selected\", Data[indexPath.Row] + \" was touched\");\n\t\ttableView.DeselectRow (indexPath, true); // de-select (otherwise it stays \"grey\")\n\t}\n\t// refactor out the alert, so it can be used in selection & action\n\tvoid ShowAlert(string title, string text)\n\t{\n\t\tvar okAlertController = UIAlertController.Create (title, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  text,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  UIAlertControllerStyle.Alert);\n\t\tokAlertController.AddAction (UIAlertAction.Create(\"OK\", UIAlertActionStyle.Default, null));\n\t\t// real apps wouldn't use KeyWindow, this is a \"workbook\" limitation\n\t\tKeyWindow.RootViewController.PresentViewController (okAlertController, true, null);\n\t}\n\t// \n\tpublic override UITableViewRowAction[] EditActionsForRow (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tvar hiAction = UITableViewRowAction.Create (\n\t\t\tUITableViewRowActionStyle.Normal,\t// try the Destructive style\n\t\t\t\"Hi\",\n\t\t\tdelegate {\n\t\t\t\tShowAlert(\"Action Revealed\", Data[indexPath.Row] + \" was 'actioned'\");\n\t\t\t});\n\t\t// multiple actions are allowed\n\t\treturn new UITableViewRowAction[] { hiAction };\n\t}\n}\n```\n\nApply this new source class to the table:\n\n```csharp\nsource = new ActionSource();  // create the new class\nsource.Data = data;           // assign the list of strings\ntableView.Source = source;    // give it to the table view (replaces the old one)\ntableView.ReloadData();       // reload the data, cells now also display an image\n```\n\nThe action looks like this when revealed by a swipe on the row. This example is grey because `UITableViewRowActionStyle.Normal` was specified in the code.\n\n![](actionsource.png)\n\n`UITableViewRowActionStyle.Destructive` can be specified, which shows the action with a red background. As mentioned earlier, mulitple actions can be shown for a row - but if mulitple actions are shown there should never be more than one *destructive* action.\n\n## Edit Mode\n\nThere is another more complex way to interact with tables: edit mode. Edit mode is an optional state for the table which users typically turn on with a button-press.\n\nImplementing edit mode requires overriding a number of methods in the source class:\n\n* \\*\\*CanEditRow \\*\\*– whether each row can be edited. Return false to prevent both swipe-to-delete and deletion while in edit mode.\n\n* \\*\\*CanMoveRow \\*\\*– return true to enable the move ‘handle’ or false to prevent moving.\n\n* \\*\\*EditingStyleForRow \\*\\*– when the table is in edit mode, the return value from this method determines whether the cell displays the red deletion icon or the green add icon. Return UITableViewCellEditingStyle.None if the row should not be editable.\n\n* \\*\\*MoveRow \\*\\*– called when a row is moved so that the underlying data structure can be modified to match the data as it is displayed in the table.\n\n* **TitleForDeleteConfirmation** – optional custom text for the delete button.\n\n* **CommitEditingStyle** – code to apply changes to the underlying data when an edit is complete (ie. if a row is deleted).\n\n```csharp\npublic partial class EditSource : MySource \n{\n\tstring identifier = \"editcell\";\n\tpublic override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tUITableViewCell cell = tableView.DequeueReusableCell (identifier);\n\t\tif (cell == null)\n\t\t{ cell = new UITableViewCell (UITableViewCellStyle.Subtitle, identifier); }\n\t\t\n\t\tstring item = Data[indexPath.Row];\n\t\tcell.TextLabel.Text = item;\n\t\tcell.DetailTextLabel.Text = $\"{item.Length} characters\"; // C# 6\n\t\tcell.ImageView.Image = UIImage.FromFile(\"workicon.png\"); // now sets an image\n\t\treturn cell;\n\t}\n\tpublic override void RowSelected (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\tShowAlert(\"Row Selected\", Data[indexPath.Row] + \" was touched\");\n\t\ttableView.DeselectRow (indexPath, true); // de-select (otherwise it stays \"grey\")\n\t}\n\t// refactor out the alert, so it can be used in selection & action\n\tvoid ShowAlert(string title, string text)\n\t{\n\t\tvar okAlertController = UIAlertController.Create (title, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  text,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  UIAlertControllerStyle.Alert);\n\t\tokAlertController.AddAction (UIAlertAction.Create(\"OK\", UIAlertActionStyle.Default, null));\n\t\t// real apps wouldn't use KeyWindow, this is a \"workbook\" limitation\n\t\tKeyWindow.RootViewController.PresentViewController (okAlertController, true, null);\n\t}\n\tpublic override bool CanEditRow (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\treturn true; // return false if you wish to disable editing for a specific indexPath or for all rows\n\t}\n\tpublic override bool CanMoveRow (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\treturn true; // return false if you don't allow re-ordering\n\t}\n\tpublic override UITableViewCellEditingStyle EditingStyleForRow (UITableView tableView, NSIndexPath indexPath)\n\t{\n\t\treturn UITableViewCellEditingStyle.Delete; // this example doesn't suppport Insert\n\t}\n\tpublic override string TitleForDeleteConfirmation (UITableView tableView, NSIndexPath indexPath)\n\t{   // Optional - default text is 'Delete'\n\t\treturn \"Trash it!\";\n\t}\n}\n```\n\n```csharp\npublic partial class EditSource : MySource \n{\n\tpublic override void CommitEditingStyle (UITableView tableView, UITableViewCellEditingStyle editingStyle, Foundation.NSIndexPath indexPath)\n\t{\n\t\tswitch (editingStyle) // in case others are implemented\n\t\t{\n\t\t\tcase UITableViewCellEditingStyle.Delete:\n\t\t\t\t// remove the item from the underlying data source\n\t\t\t\tData.RemoveAt(indexPath.Row);\n\t\t\t\t// delete the row from the table\n\t\t\t\ttableView.DeleteRows (new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Fade);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tpublic override void MoveRow (UITableView tableView, NSIndexPath sourceIndexPath, NSIndexPath destinationIndexPath)\n\t{\n\t\tvar item = Data[sourceIndexPath.Row];\n\t\tvar deleteAt = sourceIndexPath.Row;\n\t\tvar insertAt = destinationIndexPath.Row;\n\n\t\t// are we inserting \n\t\tif (destinationIndexPath.Row < sourceIndexPath.Row) {\n\t\t\t// add one to where we delete, because we're increasing the index by inserting\n\t\t\tdeleteAt += 1;\n\t\t} else {\n\t\t\t// add one to where we insert, because we haven't deleted the original yet\n\t\t\tinsertAt += 1;\n\t\t}\n\t\tData.Insert (insertAt, item);\n\t\tData.RemoveAt (deleteAt);\n\t}\n}\n```\n\nOnce again, apply the new source to the table:\n\n```csharp\nsource = new EditSource();  // create the new class\nsource.Data = data;         // assign the list of strings\ntableView.Source = source;  // give it to the table view (replaces the old one)\ntableView.ReloadData();     // reload the data, cells now also display an image\n```\n\nThe table will remain in “normal” mode until editing is enabled. In a “real life” app a button should be provided (typically in the navigation bar), but for this workbook the edit mode can be set dynamically with the following line of code:\n\n```csharp\ntableView.SetEditing (true, true); // enable edit mode\n```\n\nTo restore “normal” mode, uncomment and run the following block:\n\n```csharp\n//tableView.SetEditing (false, true); // disable edit mode (return to normal table behavior)\n```\n\nWhen edit mode is enabled, rows can no longer be “selected” - instead they can be re-ordered with the drag-handle on the right OR the Delete button can be exposed by touching the red-circle on the left. Note that this button is *different* to any row actions that have been defined.\n\n![](editsource.png)\n\n"
  },
  {
    "path": "ios/user-interface/web-views/web-views.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\n---\n\n# Web Views in iOS\n\nApple has released a number of ways for app developers to incorporate web view functionality in their apps. Most users utilize the built-in Safari web browser on their iOS device and therefore expect that web-view functionality from other apps is consistent with this experience.\n\nThis workbook will explore opening Safari from inside an app, as well as the following web views provided by Apple:\n\n* UIWebView\n\n* WKWebView\n\n* SFSafariViewController\n\n### SetUp\n\nThe following using directives are necessary when using the above web views:\n\n```csharp\nusing System;\nusing Foundation;\nusing SafariServices;\nusing UIKit;\nusing WebKit;\n```\n\n```csharp\n#load \"tabbar.csx\"\n```\n\n```csharp\nNSUrl url = new NSUrl(\"https://developer.xamarin.com\");\n```\n\n## UIWebView\n\n* `UIWebView` is Apple's legacy way of providing web content in your app. It was released in iOS 2.0 and has been deprecated as of 8.0.\n\n* If you plan to support iOS versions earlier than 8.0, you will have to use `UIWebView`.\n\n* It is recommended that you should check the user's iOS version as  `UIWebView` is less optimized for performance than the alternatives. If it 8.0 or above, using either of the options explain below will create a better user experience.\n\n```csharp\nvar webView = new UIWebView (tabController.webViewTab.View.Bounds);\ntabController.webViewTab.View.AddSubview(webView);\nwebView.LoadRequest(new NSUrlRequest(url));\n```\n\n## WKWebView\n\n* Introduced in iOS 8\n\n* Uses the Nitro Javascript engine, the same engine used by mobile Safari.\n\n* WKWebView should always be used over UIWebView were possible due to the increased performance, built-in user-friendly gestures, and the ease of interaction between the web page and your app.\n\n* `WKWebView` can be added to your app in an almost identical way to UIWebView, however as the developer you have much more control over the UI/UX and functionality.\n\n* Creating and displaying the web view object will display the requested page, however, you can control how to present the view, how the user can navigate, and how the user exits the view.\n\n```csharp\nvar webkitWebView = new WKWebView (tabController.WKWebTab.View.Frame, new WKWebViewConfiguration ());\ntabController.WKWebTab.View.AddSubview (webkitWebView);\n\nvar request = new NSUrlRequest (url);\nwebkitWebView.LoadRequest (request);\n```\n\n## SFSafariViewController\n\n* Available in iOS and later\n\n* Unlike `UIWebView` or `WKWebView`, `SFSafariViewController` is a View Controller and so cannot be used with other views.\n\n* Uses the Nitro Javascript Engine\n\n* Provides a range of additional Safari features such as AutoFill, Reader, and the ability to share cookies and data with mobile Safari\n\n* by default, implements a **Done** button, allowing to user to easily return to the app.\n\n* Provides forward and back navigation buttons, allowing users to navigate through a stack of web pages.\n\n* Provides the user with an address bar giving them the peace of mind that they are on the expected web page. The address bar does not allow the user to change the URL.\n\n* SFSafariViewController cannot be customized.\n\n```csharp\nvar safariButton = UIButton.FromType(UIButtonType.System);\nsafariButton.Frame = new CGRect(50, 50, 200, 200);\nsafariButton.SetTitle(\"Go to Site\", UIControlState.Normal);\n\ntabController.safariVCTab.View.AddSubview(safariButton);\n\nsafariButton.TouchUpInside += delegate{\n     var sfViewController = new SFSafariViewController(url);\n     tabController.safariVCTab.PresentViewController(sfViewController, true, null);\n}\n```\n\n## Safari\n\nNavigating users away from an app to Safari should generally be avoided. Most users will not expect navigation outside of the application, so if they navigate away from the app, users may never return it, therefore killing engagement with your app.\n\niOS 9 improvements allow the user to easily return to the app through a back button that is provided in the top left corner of the Safari page.\n\n```csharp\nvar button = UIButton.FromType(UIButtonType.System);\nbutton.Frame = new CGRect(50, 50, 200, 200);\nbutton.SetTitle(\"Go to Site\", UIControlState.Normal);\ntabController.safariTab.View.AddSubview(button);\n\nbutton.TouchUpInside += delegate {\n    UIApplication.SharedApplication.OpenUrl(url);\n};\n```\n\nThis produces the following web view:\n\n![](safari.png)\n\n"
  },
  {
    "path": "ios/user-interface/web-views/web-views.workbook/tabbar.csx",
    "content": "public class TabController : UITabBarController{\n    public UIViewController safariTab, webViewTab, WKWebTab, safariVCTab;\n\n    public TabController (){\n\n        safariTab = new UIViewController(){Title = \"Safari\"};\n        safariTab.View.BackgroundColor = UIColor.White;\n\n        webViewTab = new UIViewController(){Title = \"UIWebView\"};\n\n        WKWebTab = new UIViewController(){Title=\"WKWebView\"};\n\n        safariVCTab = new UIViewController(){Title=\"SFSafariViewController\"};\n        safariVCTab.View.BackgroundColor = UIColor.White;\n    \n    var tabs = new UIViewController[]{webViewTab, WKWebTab, safariVCTab, safariTab};\n\n    ViewControllers = tabs;\n    }\n}\n\nvar tabController = new TabController();\nKeyWindow.RootViewController = tabController;"
  },
  {
    "path": "mac/README.md",
    "content": "Xamarin.Mac Workbooks\n============\n\nUse the workbooks in this section to learn and experiment with many of the features available to a Xamarin.Mac developer in macOS: \n\n* [Getting Started](getting-started) - Covers the techniques required to get started with Xamarin.Mac based workbooks.\n* [User Interface](user-interface) - Covers many of the common elements used to create a Xamarin.Mac app's User Interface such as Windows, Toolbars and Table Views.\n\n"
  },
  {
    "path": "mac/getting-started/README.md",
    "content": "Getting Started\n============\n\nThis section covers the techniques required to get started with Xamarin.Mac based workbooks.\n\n## Hello, Mac Workbook\n\nGetting started with the Mac agent requires a little more setup than the others, because there’s have a whole windowing system to configure. Follow these steps in this workbook to display “Hello, Workbooks” window.\n\n![](screenshots/Intro01.png)"
  },
  {
    "path": "mac/getting-started/hello-mac-workbook.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacMobile\n---\n\n# Mac\n\nGetting started with the Mac agent requires a little more setup than the others, because there’s have a whole windowing system to configure! Follow these steps below to display “Hello, Workbooks”!\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing CoreGraphics;\n\npublic class CodeBasedWindow : NSWindow {\n\n    #region Computed Properties\n    public NSTextField ClickMeLabel { get ; set;}\n    #endregion\n\n    #region Constructors\n    public CodeBasedWindow (IntPtr handle) : base (handle)\n    {\n    }\n\n    [Export (\"initWithCoder:\")]\n    public CodeBasedWindow (NSCoder coder) : base (coder)\n    {\n    }\n\n    public CodeBasedWindow (CGRect contentRect, NSWindowStyle aStyle, NSBackingStore bufferingType, bool deferCreation): base (contentRect, aStyle,bufferingType,deferCreation)\n    {\n        // Create a title for the window\n\t\tTitle = \"Window From Code\";\n\n\t\t// Create the content view for the window and make it fill the window\n\t\tContentView = new NSView (Frame);\n\n        ClickMeLabel = new NSTextField (new CGRect (10, Frame.Height - 65, Frame.Width - 130, 20)) {\n            BackgroundColor = NSColor.Clear,\n            TextColor = NSColor.Black,\n            Editable = false,\n            Bezeled = false,\n            AutoresizingMask = NSViewResizingMask.WidthSizable | NSViewResizingMask.MinYMargin,\n            StringValue = \"Hello, Workbooks!\"\n        };\n        ContentView.AddSubview (ClickMeLabel);\n    }\n    #endregion\n\n    #region Override Methods\n    public override void AwakeFromNib ()\n    {\n        base.AwakeFromNib ();\n    }\n    #endregion\n}\n```\n\nand then\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing CoreGraphics;\n\npublic  class CodeBasedWindowController : NSWindowController\n{\n    #region Computed Properties\n    public new CodeBasedWindow Window {\n        get { return base.Window as CodeBasedWindow; }\n    }\n    #endregion\n\n    #region Constructors\n    public CodeBasedWindowController (IntPtr handle) : base (handle)\n    {\n    }\n\n    [Export (\"initWithCoder:\")]\n    public CodeBasedWindowController (NSCoder coder) : base (coder)\n    {\n    }\n\n    public CodeBasedWindowController () : base (\"CodeBasedWindow\")\n    {\n        // Define the Window's default location and size\n        CGRect contentRect = new CGRect (0, 0, 500, 300);\n\n        // Create a new instance of the CodeBasedWindow\n        base.Window = new CodeBasedWindow(contentRect, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable), NSBackingStore.Buffered, false);\n\n        // Simulate Awaking from Nib\n        Window.AwakeFromNib ();\n    }\n    #endregion\n\n    #region Override Methods\n    public override void AwakeFromNib ()\n    {\n        base.AwakeFromNib ();\n    }\n    #endregion\n}\n```\n\nfinally\n\n```csharp\nvar mainWindowController = new CodeBasedWindowController ();\nmainWindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n```"
  },
  {
    "path": "mac/getting-started/meta.json",
    "content": "{\n  \"order\":{\n    \"hello-mac-workbook.workbook\":\"Hello, Mac\"\n  }\n}\n"
  },
  {
    "path": "mac/meta.json",
    "content": "{\n  \"order\":{\n    \"getting-started\":\"Getting Started\",\n    \"user-interface\":\"User Interface\"\n  }\n}\n"
  },
  {
    "path": "mac/user-interface/README.md",
    "content": "# Xamarin.Mac User Interface Workbooks\n\nThe workbooks in this section cover many of the common elements used to create a Xamarin.Mac app's User Interface such as Windows, Toolbars and Table Views.\n\nBecause of the way workbooks function, many of the workbooks in this section will cover the steps required to build a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\n<!--## Defining a UI in Interface Builder\n\nBefore diving into the process of building a Xamarin.Mac app’s User Interface in code, let’s quickly review how a macOS app’s UI is normally created. Typically, a Xamarin.Mac app’s User Interface is defined in one or more `.storyboard` or `.xib` files added to the project’s hierarchy. For example:\n\n![](Images/Xcode01.png)\n\nDouble-clicking this file will open it in Xcode’s Interface Builder where the Menus, Windows, Controls and Segues that make up the app’s UI can be defined visually. For example:\n\n![](Images/Xcode02.png)\n\nWhen the UI layout is completed, the graphical elements that make up the UI are then exposed via **Actions** and **Outlets**, making them accessible to code. When the developer saves their changes to the Main.storyboard file and returns to Xamarin Studio, these changes are synced with the Xamarin.Mac app’s Project File and the UI elements are then accessible in C#.-->\n\nFor more information, please see our [Hello, Mac](https://developer.xamarin.com/guides/mac/getting_started/hello,_mac/), [Introduction to Storyboards](https://developer.xamarin.com/guides/mac/platform-features/storyboards/), [Working with .xib Files](https://developer.xamarin.com/guides/mac/application_fundamentals/working-with-xibs/) and [.storyboard/.xib Less User Interface Design](https://developer.xamarin.com/guides/mac/application_fundamentals/xibless-ui/) documentation.\n\n# Available Workbooks\n\nThe following User Interface workbooks are available for Xamarin.mac:\n\n## [Working with Outline Views](outlineview)\n\nThis workbook will cover working with a Outline View (`NSOutlineView`) in a Xamarin.Mac app's User Interface. `NSOutlineView` is a native cocoa control for displaying tree data.\n\n![](outlineview/screenshots/Intro01.png)\n\n## [Working with Table Views](tableview)\n\nThis workbook will cover working with a Table View (`NSTableView`) in a Xamarin.Mac app's User Interface. `NSTableView` is a native cocoa control for displaying data in a table.\n\n![](tableview/screenshots/Intro01.png)\n\n## [Working with Toolbars Workbook](toolbars)\n\nThis workbook will cover working with a Toolbar (`NSToolbar`) in a Xamarin.Mac app's User Interface. `NSToolbar` is a native cocoa control for adding a user configurable Toolbar to the top of a Window (`NSWindow`).\n\n![](toolbars/screenshots/Intro01.png)\n\n## [.storyboard/.xib Less User Interface Design Workbook](ui-in-code)\n\nThis workbook will cover the steps required to build a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\n![](ui-in-code/screenshots/Intro01.png)\n\n## [Working with Segues in macOS Storyboard](segues)\n\nThis workbook will cover the typical uses of Segues within a Storyboard, and how they can be used to limit the amount of code a developer is required to write to present a Xamarin.Mac app’s UI.\n\n![](segues/screenshots/Intro01.png)\n\n## [How to Build a Web Browser in Xamarin.Mac](webbrowser)\n\nThis workbook will cover the steps required to build a mini, multi-windowed web browser in a Xamarin.Mac app. By going through the steps in this workbook, the reader will gain insights and skills required to work with many elements of a standard macOS app such as Menus, Windows, Window Controllers, Views, View Controllers, Toolbars, Text Field, Buttons and the Xcode Interface Builder Storyboard files used to define them.\n\n![](webbrowser/screenshots/Intro01.png)"
  },
  {
    "path": "mac/user-interface/meta.json",
    "content": "{\n  \"order\":{\n    \"outlineview/NSOutlineView.workbook\":\"Outline View\",\n    \"tableview/NSTableView.workbook\":\"Table View\",\n    \"toolbars/toolbars.workbook\":\"Toolbar\",\n    \"ui-in-code/codebasedui.workbook\":\"Creating UI in Code\",\n    \"segues/Segues.workbook\":\"Storyboard Segues\",\n    \"webbrowser/webbrowser.workbook\":\"Web Browser\"\n  }\n}\n"
  },
  {
    "path": "mac/user-interface/outlineview/NSOutlineView.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacMobile\n---\n\n# Working with Outline Views\n\n#### Using a Outline View in a Xamarin.Mac Application\n\nThis workbook will cover the steps required to add a Outline View (`NSOutlineView`) to a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\n## Creating the Outline View\n\n`NSOutlineView` is a native cocoa control for displaying tree data. Start by creating an instance and set its `Frame` property to a reasonable size. It will be autosized via an owning `NSClipView`:\n\n```csharp\n// Get the parent window's frame\nvar frame = MainWindow.ContentView.Frame;\n\n// Make a new outline view and have it fill the parent window\nNSOutlineView outlineView = new NSOutlineView () {\n\tFrame = frame\n};\n```\n\n## Adding the Outline View Columns\n\nEvery `NSOutlineView` must have at least one column for its delegate to be called. Since Outline Views are based on Table Views (`NSTableView`), a Table Column is created and added to the Outline:\n\n```csharp\n// Create the required column and add it to the outline\nNSTableColumn column = new NSTableColumn (\"Values\");\noutlineView.AddColumn (column);\n```\n\nAdditionally, the `OutlineTableColumn` property of the Outline View must be set or the arrows showing children/expansion will not be drawn:\n\n```csharp\n// Specify the outline column\noutlineView.OutlineTableColumn = column;\n```\n\n## Adding the Clip View\n\nA `NSOutlineView` expects to be hosted inside an `NSClipView`. The following code creates the required Clip View and adds the Outline View to it:\n\n```csharp\n// Create the required clipping view and set it to\n// resize both horizontally and vertically as the\n// parent window resizes.\nNSClipView clipView = new NSClipView (frame) {\n\t\tAutoresizingMask = NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable\n};\n\n// Attach the outline view to the clip view\nclipView.DocumentView = outlineView;\n```\n\nNext, add the Clip View to the Window’s Content View to display the Outline:\n\n```csharp\n// Attach the clip view to the main window\nMainWindow.ContentView = clipView;\n```\n\n## Creating Sample Data for the Outline\n\nCurrently, this Outline View isn’t very exciting without any data. A `Node` class will be a created to provide a simple tree-based data structure. Because `NSOutlineViewDataSource` returns a `NSObject`, the `Node` class will inherit from it:\n\n```csharp\n// Custom class to define the data for the outline view.\nclass Node : NSObject\n{\n    // The name for the node.\n\tpublic string Name { get; private set; }\n\n    // A collection of child nodes.\n\tList<Node> Children;\n\n    // Initalize a new node with the given name\n    // and create storage for any child nodes.\n\tpublic Node (string name)\n\t{\n\t\tName = name;\n\t\tChildren = new List<Node> ();\n\t}\n\n    // Create a new child node of a given name\n    // and add it to the collection of child nodes.\n\tpublic Node AddChild (string name)\n\t{\n\t\tNode n = new Node (name);\n\t\tChildren.Add (n);\n\t\treturn n;\n\t}\n\n    // Return the child for a given index\n\tpublic Node GetChild (int index)\n\t{\n\t\treturn Children [index];\n\t}\n\n    // Get the curent number of children\n\tpublic int ChildCount => Children.Count;\n\n    // The node is a leaf node if it has no children\n\tpublic bool IsLeaf => ChildCount == 0;\n}\n```\n\nThe following method will create the example data that will be displayed in the Outline View:\n\n```csharp\n// Populate an example set of parent and child nodes.\nNode CreateExampleTree ()\n{\n    // Create a base node to hold the data\n\tNode parentNode = new Node (\"\");\n\n    // Generate a set of parent and child nodes\n\tfor (int i = 0 ; i < 5 ; ++i) {\n\t\tNode n = parentNode.AddChild (\"Parent: \" + i);\n\t\tfor (int j = 0; j < 3 ; ++j)\n\t\t\tn.AddChild (\"Child: \" + j);\n\t}\n\n    // Return the completed sample data\n\treturn parentNode;\n}\n```\n\n## Adding Data to the Ouline View\n\n`NSOutlineView` uses a two classes, a `DataSource` and `Delegate`, to determine what data to display. `NSOutlineView` can be used in two different “modes”: *Cell Based* or *View Based*.\n\nDifferent overrides apply to each of these modes, such that overriding some of the Cell Based methods will prevent the View Based methods from being called. According to Apple, Cell Based Outlines have been deprecated and View Based Outlines should be used for all modern macOS development.\n\n`OutlineViewDelegate` defines the view for an individual element of the tree. The item passed in is generated by `OutlineViewDataSource`.\n\n### Creating the Elements for the Outline\n\nFor every element, the Outline View calls its `Delegate` to provide the individual Cells. By calling `MakeView` method of the Outline View with an identifier, existing views can be recycled, which can improve performance:\n\n```csharp\nclass OutlineViewDelegate : NSOutlineViewDelegate\n{\n    // Provide an ID for each cell so it can be reused\n\tconst string identifer = \"myCellIdentifier\";\n\n    // Generate a new view to act as the cell for each table row and column\n\tpublic override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)\n\t{\n        // Ask the table view to reuse a cell\n\t\tNSTextField view = (NSTextField)outlineView.MakeView (identifer, this);\n\n        // Was a reusable cell available?\n\t\tif (view == null) {\n            // No, create a new cell\n\t\t\tview = new NSTextField () {\n\t\t\t\tIdentifier = identifer,\n\t\t\t\tBordered = false,\n\t\t\t\tSelectable = false,\n\t\t\t\tEditable = false\n\t\t\t};\n\t\t}\n\n        // Populate the cell\n\t\tview.StringValue = ((Node)item).Name;\n\n        // Return the fully populated cell\n\t\treturn view;\n\t}\n}\n```\n\n### Defining the Tree Structure\n\nThe `OutlineViewDataSource` defines the structures of the tree,  how many elements are in the Outline and if those elements are expandable. The `GetChild` method analyzes  the `NSObject` that is passed to `GetView` method of the `OutlineViewDelegate`. If the item passed in is `null`, then Cocoa is refering to the root the the tree:\n\n```csharp\nclass OutlineViewDataSource : NSOutlineViewDataSource\n{\n    // Storage for the outline view data.\n\tNode parentNode;\n\n    // Create a new data source from the given tree data.\n\tpublic OutlineViewDataSource (Node node)\n\t{\n\t\tparentNode = node;\n\t}\n\n    // Return the number of children for the given element in the outline.\n\tpublic override nint GetChildrenCount (NSOutlineView outlineView, NSObject item)\n\t{\n        // If the passed in element is null, use the parent node.\n\t\titem = item == null ? parentNode : item;\n\n        // Return the number of children\n\t\treturn ((Node)item).ChildCount;\n\t}\n\n    // Return the given child for the given element and index.\n\tpublic override NSObject GetChild (NSOutlineView outlineView, nint childIndex, NSObject item)\n\t{\n        // If the passed in element is null, use the parent node.\n\t\titem = item == null ? parentNode : item;\n\n        // Return the requested child\n\t\treturn ((Node)item).GetChild ((int)childIndex);\n\t}\n\n    // If the current item has children, it is expandable.\n\tpublic override bool ItemExpandable (NSOutlineView outlineView, NSObject item)\n\t{\n        // If the passed in element is null, use the parent node.\n\t\titem = item == null ? parentNode : item;\n\n        // Return the expandable state\n\t\treturn !((Node)item).IsLeaf;\n\t}\n}\n```\n\n### Displaying the Data\n\nHooking up the `Delegate` and `DataSource` to the `NSOutlineView` is the final step. This will populate the tree with the sample data:\n\n```csharp\n// Attach the data source and delegate to populate the outline\noutlineView.Delegate = new OutlineViewDelegate ();\noutlineView.DataSource = new OutlineViewDataSource (CreateExampleTree ());\n```"
  },
  {
    "path": "mac/user-interface/outlineview/README.md",
    "content": "Working with Outline Views Workbook\n============\n\nThis workbook will cover the steps required to add a Outline View (`NSOutlineView`) to a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\n![](screenshots/Intro01.png)"
  },
  {
    "path": "mac/user-interface/segues/README.md",
    "content": "Working with Segues in macOS Storyboard\n============\n\nThis workbook will cover the typical uses of Segues within a Storyboard, and how they can be used to limit the amount of code a developer is required to write to present a Xamarin.Mac app’s UI.\n\n![](screenshots/Intro01.png)"
  },
  {
    "path": "mac/user-interface/segues/Segues.workbook/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"16C48b\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"11542\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Window Controller-->\n        <scene sceneID=\"ZT2-fg-jUh\">\n            <objects>\n                <windowController id=\"plf-cC-dqu\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Split View\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" id=\"a2R-TJ-Ptd\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"425\" y=\"313\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"2560\" height=\"1057\"/>\n                    </window>\n                    <connections>\n                        <segue destination=\"w8x-wh-VrG\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"u5k-KU-aYJ\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Cf8-kW-jxG\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"665\" y=\"-455\"/>\n        </scene>\n        <!--Split View Controller-->\n        <scene sceneID=\"dCh-ON-5x1\">\n            <objects>\n                <splitViewController id=\"w8x-wh-VrG\" sceneMemberID=\"viewController\">\n                    <splitViewItems>\n                        <splitViewItem id=\"Dae-HI-rBw\"/>\n                        <splitViewItem id=\"jEK-Xq-vaN\"/>\n                    </splitViewItems>\n                    <splitView key=\"splitView\" dividerStyle=\"thin\" vertical=\"YES\" id=\"GZj-7b-2ec\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"300\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </splitView>\n                    <connections>\n                        <segue destination=\"XdO-WJ-HvK\" kind=\"relationship\" relationship=\"splitItems\" id=\"lat-o9-sgw\"/>\n                        <segue destination=\"4cK-Eu-ujv\" kind=\"relationship\" relationship=\"splitItems\" id=\"sGc-vv-faf\"/>\n                    </connections>\n                </splitViewController>\n                <customObject id=\"sgd-Vz-bTc\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1303\" y=\"-464\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"NCv-zw-sli\">\n            <objects>\n                <viewController id=\"XdO-WJ-HvK\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"Tof-WT-yQ6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"300\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zvl-vl-dfM\">\n                                <rect key=\"frame\" x=\"18\" y=\"263\" width=\"414\" height=\"17\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"17\" id=\"VIO-SA-9FZ\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Left Side\" id=\"FUe-aH-7KI\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Zvl-vl-dfM\" secondAttribute=\"trailing\" constant=\"20\" id=\"15z-wF-YuG\"/>\n                            <constraint firstItem=\"Zvl-vl-dfM\" firstAttribute=\"top\" secondItem=\"Tof-WT-yQ6\" secondAttribute=\"top\" constant=\"20\" id=\"e1t-IV-mS0\"/>\n                            <constraint firstItem=\"Zvl-vl-dfM\" firstAttribute=\"leading\" secondItem=\"Tof-WT-yQ6\" secondAttribute=\"leading\" constant=\"20\" id=\"tFv-c7-O0H\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"QRr-fs-yaS\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1861\" y=\"-649\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"4RI-XC-rAR\">\n            <objects>\n                <viewController id=\"4cK-Eu-ujv\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"YYD-CQ-DLY\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"300\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"J2a-Hj-zYP\">\n                                <rect key=\"frame\" x=\"18\" y=\"263\" width=\"414\" height=\"17\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"17\" id=\"f0g-z4-wVk\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Right Side\" id=\"jqB-Nz-rpD\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"J2a-Hj-zYP\" secondAttribute=\"trailing\" constant=\"20\" id=\"1Gp-FG-yhW\"/>\n                            <constraint firstItem=\"J2a-Hj-zYP\" firstAttribute=\"top\" secondItem=\"YYD-CQ-DLY\" secondAttribute=\"top\" constant=\"20\" id=\"PyY-zn-3cW\"/>\n                            <constraint firstItem=\"J2a-Hj-zYP\" firstAttribute=\"leading\" secondItem=\"YYD-CQ-DLY\" secondAttribute=\"leading\" constant=\"20\" id=\"Wom-ar-Xz1\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"hyV-S0-2ZU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1861\" y=\"-288\"/>\n        </scene>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"WBTest\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"WBTest\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About WBTest\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide WBTest\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit WBTest\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                                <segue destination=\"B8D-0N-5wS\" kind=\"show\" identifier=\"NewDocumentSegue\" id=\"7s1-6S-TvL\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"New Splitview\" id=\"Egj-7l-CPj\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <segue destination=\"plf-cC-dqu\" kind=\"show\" id=\"N4X-ML-UlY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" id=\"KaW-ft-85H\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\"/>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\"/>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\"/>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\"/>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\"/>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"WBTest Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-26\" y=\"-314\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <toolbar key=\"toolbar\" implicitIdentifier=\"AC8D08EC-96E5-48A1-980C-CFBBB66F8F05\" autosavesConfiguration=\"NO\" displayMode=\"iconAndLabel\" sizeMode=\"regular\" id=\"g1R-4V-isG\">\n                            <allowedToolbarItems>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarShowColorsItem\" id=\"MF4-Hw-ooT\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarShowFontsItem\" id=\"PEU-7f-B22\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarPrintItem\" id=\"NMo-mL-60Z\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarSpaceItem\" id=\"FzP-lU-Qve\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarFlexibleSpaceItem\" id=\"iz3-ci-iR4\"/>\n                                <toolbarItem implicitItemIdentifier=\"CAB1BBE4-D5FA-404C-93A0-4DA413720ACC\" label=\"Show\" paletteLabel=\"Show\" tag=\"-1\" image=\"NSEveryone\" id=\"BVf-y9-p0O\">\n                                    <connections>\n                                        <segue destination=\"Kgw-Zr-aQ8\" kind=\"show\" id=\"RUU-LW-Cu3\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"6432A425-1313-4986-8561-4FE578BC0722\" label=\"Computer\" paletteLabel=\"Computer\" image=\"NSComputer\" id=\"xbJ-BN-Mld\">\n                                    <nil key=\"toolTip\"/>\n                                    <size key=\"minSize\" width=\"48\" height=\"48\"/>\n                                    <size key=\"maxSize\" width=\"48\" height=\"48\"/>\n                                    <button key=\"view\" id=\"gNF-fg-oQe\">\n                                        <rect key=\"frame\" x=\"6\" y=\"14\" width=\"48\" height=\"48\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                        <buttonCell key=\"cell\" type=\"square\" bezelStyle=\"shadowlessSquare\" image=\"NSComputer\" imagePosition=\"only\" alignment=\"center\" imageScaling=\"proportionallyUpOrDown\" inset=\"2\" id=\"aT0-0Y-Spl\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                    </button>\n                                    <connections>\n                                        <segue destination=\"hlZ-SX-RFF\" kind=\"popover\" popoverAnchorView=\"xbJ-BN-Mld\" popoverBehavior=\"t\" preferredEdge=\"maxY\" id=\"A0v-ca-Yvv\"/>\n                                    </connections>\n                                </toolbarItem>\n                            </allowedToolbarItems>\n                            <defaultToolbarItems>\n                                <toolbarItem reference=\"BVf-y9-p0O\"/>\n                                <toolbarItem reference=\"xbJ-BN-Mld\"/>\n                                <toolbarItem reference=\"MF4-Hw-ooT\"/>\n                                <toolbarItem reference=\"PEU-7f-B22\"/>\n                                <toolbarItem reference=\"iz3-ci-iR4\"/>\n                                <toolbarItem reference=\"NMo-mL-60Z\"/>\n                            </defaultToolbarItems>\n                        </toolbar>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"69\" y=\"233\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <button identifier=\"ShowButton\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8NK-KR-YPz\">\n                                <rect key=\"frame\" x=\"14\" y=\"222\" width=\"81\" height=\"32\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"21\" id=\"O6Z-D3-RFv\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"69\" id=\"iS5-Ta-I43\"/>\n                                </constraints>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Show\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"6qn-3t-Ujj\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <segue destination=\"Kgw-Zr-aQ8\" kind=\"show\" identifier=\"ShowSegue\" id=\"opX-0v-v3c\"/>\n                                </connections>\n                            </button>\n                            <button identifier=\"QuestionButton\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EcF-Ug-Z7P\">\n                                <rect key=\"frame\" x=\"118\" y=\"222\" width=\"81\" height=\"32\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"69\" id=\"9wd-rP-UB7\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"21\" id=\"tzN-b3-e3c\"/>\n                                </constraints>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Question\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"NXp-vo-3kq\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <connections>\n                                    <segue destination=\"CCf-Sq-ZKC\" kind=\"sheet\" identifier=\"InputFormSegue\" id=\"QXp-ao-vx2\"/>\n                                </connections>\n                            </button>\n                            <textField identifier=\"QuestionLabel\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ziC-Az-Y50\">\n                                <rect key=\"frame\" x=\"212\" y=\"231\" width=\"250\" height=\"17\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"17\" id=\"C0d-FV-ZSl\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Please enter a question\" id=\"Tt7-93-SJz\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"ziC-Az-Y50\" secondAttribute=\"trailing\" constant=\"20\" id=\"0hz-WM-HKf\"/>\n                            <constraint firstItem=\"EcF-Ug-Z7P\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"20\" id=\"5ry-rx-oPE\"/>\n                            <constraint firstItem=\"ziC-Az-Y50\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"22\" id=\"Lq6-z8-KGs\"/>\n                            <constraint firstItem=\"EcF-Ug-Z7P\" firstAttribute=\"leading\" secondItem=\"8NK-KR-YPz\" secondAttribute=\"trailing\" constant=\"35\" id=\"sNR-Wr-RSX\"/>\n                            <constraint firstItem=\"8NK-KR-YPz\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"20\" id=\"sNm-WG-uZM\"/>\n                            <constraint firstItem=\"ziC-Az-Y50\" firstAttribute=\"leading\" secondItem=\"EcF-Ug-Z7P\" secondAttribute=\"trailing\" constant=\"21\" id=\"vqa-f4-zaI\"/>\n                            <constraint firstItem=\"8NK-KR-YPz\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" constant=\"20\" id=\"zCS-nE-hL7\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"46\" y=\"732\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"Pi0-p5-nQ5\">\n            <objects>\n                <viewController id=\"CCf-Sq-ZKC\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"E33-5d-PF3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"88\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField identifier=\"TitleLabel\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Oh0-Bf-Akd\">\n                                <rect key=\"frame\" x=\"18\" y=\"51\" width=\"414\" height=\"17\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Title\" id=\"QWu-ov-9oq\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField identifier=\"InputField\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ks0-yy-Obj\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"248\" height=\"22\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"anf-F0-tmN\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button identifier=\"OKButton\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lyj-YM-hsT\">\n                                <rect key=\"frame\" x=\"270\" y=\"13\" width=\"81\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"OK\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"7yQ-SQ-w7G\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"acceptForm:\" target=\"wTD-yh-r9j\" id=\"V1P-yU-2lA\"/>\n                                </connections>\n                            </button>\n                            <button identifier=\"CancelButton\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"22Z-vh-0Pf\">\n                                <rect key=\"frame\" x=\"355\" y=\"13\" width=\"81\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"FVe-SK-DAk\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"cancelForm:\" target=\"wTD-yh-r9j\" id=\"OcG-2z-cN7\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                    </view>\n                </viewController>\n                <customObject id=\"wTD-yh-r9j\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"46\" y=\"1165\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"wGF-m8-Sl6\">\n            <objects>\n                <viewController id=\"hlZ-SX-RFF\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"404-bt-De6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"260\" height=\"76\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zuf-05-0AY\">\n                                <rect key=\"frame\" x=\"18\" y=\"29\" width=\"224\" height=\"17\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Computer Info...\" id=\"xA6-w2-r5R\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                    </view>\n                </viewController>\n                <customObject id=\"48k-1t-Hwf\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"716\" y=\"272\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"93V-hZ-xgl\">\n            <objects>\n                <viewController id=\"Kgw-Zr-aQ8\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"3jo-us-oYx\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"111\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dUl-mP-CSa\">\n                                <rect key=\"frame\" x=\"18\" y=\"34\" width=\"414\" height=\"57\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"57\" id=\"ogm-xx-yEz\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Hello There!\" id=\"Kr6-m7-3uk\">\n                                    <font key=\"font\" metaFont=\"system\" size=\"48\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"dUl-mP-CSa\" secondAttribute=\"trailing\" constant=\"20\" id=\"4ep-Ve-1Vf\"/>\n                            <constraint firstItem=\"dUl-mP-CSa\" firstAttribute=\"leading\" secondItem=\"3jo-us-oYx\" secondAttribute=\"leading\" constant=\"20\" id=\"EdG-rB-10S\"/>\n                            <constraint firstItem=\"dUl-mP-CSa\" firstAttribute=\"top\" secondItem=\"3jo-us-oYx\" secondAttribute=\"top\" constant=\"20\" id=\"fZg-p9-uAk\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"ltC-9C-psa\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"788\" y=\"733\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"NSComputer\" width=\"32\" height=\"32\"/>\n        <image name=\"NSEveryone\" width=\"32\" height=\"32\"/>\n    </resources>\n    <inferredMetricsTieBreakers>\n        <segue reference=\"opX-0v-v3c\"/>\n    </inferredMetricsTieBreakers>\n</document>\n"
  },
  {
    "path": "mac/user-interface/segues/Segues.workbook/StoryboardResources.csx",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Xml;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Linq;\nusing Foundation;\nusing AppKit;\nusing ObjCRuntime;\n\n// -------------------------------------------------------------------------\n// StoryboardInflator for macOS by Kevin Mullins for Microsoft, Inc.\n// -------------------------------------------------------------------------\n// This library provides limited support for using Storyboard files to\n// build and display the user interface for a Xamarin.Mac based workbook app. \n// Because macOS expects a compiled storyboard to be part of a running app's \n// bundle along with its executable code, the typical mechanisms to create\n// Outlets, Actions and Segues will not work. Instead, this library applies\n// the following hack to simulate Outlets:\n//\n// 1) Windows and Views (or View based controls such as NSButton), set their\n//    Identifier property in Interface Builder to match the name of the \n//    \"Outlet\". The StoryboardBinder will populate any like named Public\n//    Property on any class it binds.\n//\n// 2) For Menu Items, the StoryboardBinder will use the Title of the Menu\n//    Item + \"MenuItem\" to populate any like named Public Property on any\n//    class that it binds. For example, the \"New\" menu item would bind to\n//    the \"NewMenuItem\" property in class.\n//\n// 3) For Toolbar Items, the StoryboardBinder will use the Label of the \n//    Item + \"ToolbarItem\" to populate any like named Public Property on any\n//    class that it binds. For example, the \"Color\" menu item would bind to\n//    the \"ColorMenuItem\" property in class.\n//\n// LIMITATIONS: Custom Segues are currently not supported. Instead, the app must\n// use the StoryboardInflator to inflate and populate any NIB that will then\n// need to be manually displayed.\n\n/// <summary>\n/// Defines the type of a Scene or Source Object used in a Segue. \n/// </summary>\npublic enum StoryboardObjectType\n{\n\t/// <summary>\n\t/// The application (<c>NSApplication</c>) as defined in the Storyboard.\n\t/// </summary>\n\tApplication,\n\n\t/// <summary>\n\t/// A Menu Item (<c>NSMenuItem</c>).\n\t/// </summary>\n\tMenuItem,\n\n\t/// <summary>\n\t/// A Window Controller (<c>NSWindowController</c>).\n\t/// </summary>\n\tWindowController,\n\n\t/// <summary>\n\t/// A Toolbar Item (<c>NSToolbarItem</c>).\n\t/// </summary>\n\tToolbarItem,\n\n\t/// <summary>\n\t/// A View Controller (<c>NSViewController</c>).\n\t/// </summary>\n\tViewController,\n\n\t/// <summary>\n\t/// Storyboard object type (<c>NSSplitViewController</c>).\n\t/// </summary>\n\tSplitViewController,\n\n\t/// <summary>\n\t/// A Button (<c>NSButton</c>).\n\t/// </summary>\n\tButton,\n\n\t/// <summary>\n\t/// An unknown object type\n\t/// </summary>\n\tUnknown\n}\n\n/// <summary>\n/// Defines the kind of Segue as defined in the Storyboard.\n/// </summary>\npublic enum StoryboardSegueType\n{\n\t/// <summary>\n\t/// Displays the destination controller as a non-modal Window.\n\t/// </summary>\n\tShow,\n\n\t/// <summary>\n\t/// Displays the destination controller as a modal window.\n\t/// </summary>\n\tModal,\n\n\t/// <summary>\n\t/// Displays the destination controller as a sheet.\n\t/// </summary>\n\tSheet,\n\n\t/// <summary>\n\t/// Displays the destination controller as a popover.\n\t/// </summary>\n\tPopover,\n\n\t/// <summary>\n\t/// Displays the destination controller using a Custom Segue Class.\n\t/// </summary>\n\tCustom,\n\n\t/// <summary>\n\t/// Defines a containment relationship between the source object and the\n\t/// destination controller.\n\t/// </summary>\n\tRelationship\n}\n\n/// <summary>\n/// Holds the definition of a Segure as read from a Storyboard.\n/// </summary>\npublic class StoryboardSegueDefinition : NSObject\n{\n\t#region Computed Properties\n\t/// <summary>\n\t/// Gets or sets the inflator used to load NIBs from the Storyboard.\n\t/// </summary>\n\t/// <value>The inflator.</value>\n\tpublic StoryboardInflator Inflator { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the type of the scene that they segue belongs to.\n\t/// </summary>\n\t/// <value>The type of the scene.</value>\n\tpublic StoryboardObjectType SceneType { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the scene identifier.\n\t/// </summary>\n\t/// <value>The scene identifier.</value>\n\tpublic string SceneID { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the type of the source object.\n\t/// </summary>\n\t/// <value>The type of the source object.</value>\n\tpublic StoryboardObjectType SourceObjectType { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the source object identifier.\n\t/// </summary>\n\t/// <value>The source object identifier.</value>\n\tpublic string SourceObjectID { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the destination controller identifier.\n\t/// </summary>\n\t/// <value>The destination controller identifier.</value>\n\tpublic string DestinationControllerID { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the kind of the segue.\n\t/// </summary>\n\t/// <value>The kind of the segue.</value>\n\tpublic StoryboardSegueType SegueKind { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the segue identifier.\n\t/// </summary>\n\t/// <value>The segue identifier.</value>\n\tpublic string SegueIdentifier { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the relationship.\n\t/// </summary>\n\t/// <remarks>This is only populated from containment Segues of <c>StoryboardSegueType.Relationship</c>.</remarks>\n\t/// <value>The relationship.</value>\n\tpublic string Relationship { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the popover anchor identifier.\n\t/// </summary>\n\t/// <value>The popover anchor identifier.</value>\n\tpublic string PopoverAnchorID { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the popover behavior.\n\t/// </summary>\n\t/// <value>The popover behavior.</value>\n\tpublic NSPopoverBehavior PopoverBehavior { get; set; } = NSPopoverBehavior.Transient;\n\n\t/// <summary>\n\t/// Gets or sets the edge the popover will be displayed from.\n\t/// </summary>\n\t/// <remarks>0 = Left, 1 = Top, 2 = Right, 3 = Bottom</remarks>\n\t/// <value>The popover edge.</value>\n\tpublic nuint PopoverEdge { get; set; } = 0;\n\t#endregion\n\n\t#region Constructors\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:StoryboardSegueDefinition\"/> class.\n\t/// </summary>\n\t/// <param name=\"type\">The <c>StoryboardSegueType</c> of the Segue.</param>\n\t/// <param name=\"inflator\">The Inflator used to load NIB files.</param>\n\tpublic StoryboardSegueDefinition (StoryboardSegueType type, StoryboardInflator inflator)\n\t{\n\t\t// Initialize\n\t\tSegueKind = type;\n\t\tInflator = inflator;\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:StoryboardSegueDefinition\"/> class.\n\t/// </summary>\n\t/// <param name=\"type\">The <c>string</c> type of the Segue.</param>\n\t/// <param name=\"inflator\">The Inflator used to load NIB files.</param>\n\tpublic StoryboardSegueDefinition (string type, StoryboardInflator inflator)\n\t{\n\t\t// Initialize\n\t\tswitch (type) {\n\t\tcase \"show\":\n\t\t\tSegueKind = StoryboardSegueType.Show;\n\t\t\tbreak;\n\t\tcase \"modal\":\n\t\t\tSegueKind = StoryboardSegueType.Modal;\n\t\t\tbreak;\n\t\tcase \"sheet\":\n\t\t\tSegueKind = StoryboardSegueType.Sheet;\n\t\t\tbreak;\n\t\tcase \"popover\":\n\t\t\tSegueKind = StoryboardSegueType.Popover;\n\t\t\tbreak;\n\t\tcase \"custom\":\n\t\t\tSegueKind = StoryboardSegueType.Relationship;\n\t\t\tbreak;\n\t\t}\n\t\tInflator = inflator;\n\t}\n\t#endregion\n\n\t#region Private Methods\n\t/// <summary>\n\t/// Prepares to execute a segue loading the destination NIB and calling <c>PrepareForSegue</c>\n\t/// on the Source Controller so it can prepare the destination controller before it is\n\t/// presented to the user.\n\t/// </summary>\n\t/// <returns>The <c>NSStoryboardSegue</c> representing this Segue Definition.</returns>\n\t/// <param name=\"sender\">The object that is launching the segue.</param>\n\t/// <param name=\"sourceController\">Source controller for the segue.</param>\n\tprivate NSStoryboardSegue PrepareForSegue (NSObject sender, NSObject sourceController)\n\t{\n\t\t// Attempt to load destination\n\t\tvar destinationController = Inflator.InstantiateControllerForPartialIdentifier (DestinationControllerID);\n\n\t\t// Was the NIB found?\n\t\tif (destinationController == null) return null;\n\n\t\t// Build new Segue\n\t\tvar segue = new NSStoryboardSegue (SegueIdentifier, sourceController, destinationController);\n\n\t\t// Does the class contain the PrepareForSegue method?\n\t\tvar controllerType = sourceController.GetType ();\n\t\tvar methodInfo = controllerType.GetMethod (\"PrepareForSegue\");\n\t\tif (methodInfo != null) {\n\t\t\t// Yes, wireup action to class\n\t\t\tmethodInfo.Invoke (sourceController, new [] { segue, sender });\n\t\t}\n\n\t\t// Return controller\n\t\treturn segue;\n\t}\n\n\t/// <summary>\n\t/// Presents the non modal window to the user.\n\t/// </summary>\n\t/// <param name=\"segue\">The <c>NSStoryboardSegue</c> to execute.</param>\n\tprivate void PresentNonModalWindow (NSStoryboardSegue segue)\n\t{\n\t\tNSWindowController windowController = null;\n\n\t\t// Take action based on the controller type\n\t\tif (segue.DestinationController is NSWindowController) {\n\t\t\t// Display the window to the user\n\t\t\twindowController = segue.DestinationController as NSWindowController;\n\t\t} else if (segue.DestinationController is NSViewController) {\n\t\t\t// Build a Window and Window Controller for this view\n\t\t\tvar viewController = segue.DestinationController as NSViewController;\n\t\t\tvar window = new NSWindow (viewController.View.Bounds, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable), NSBackingStore.Buffered, false);\n\t\t\twindowController = new NSWindowController (window);\n\n\t\t\t// Attach the View Controller to the Window\n\t\t\twindow.ContentView = viewController.View;\n\t\t\twindow.ContentViewController = viewController;\n\t\t}\n\n\t\t// Found?\n\t\tif (windowController == null) return;\n\n\t\t// Present window controller\n\t\twindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n\t}\n\n\t/// <summary>\n\t/// Presents the modal window to the user.\n\t/// </summary>\n\t/// <param name=\"segue\">The <c>NSStoryboardSegue</c> to execute.</param>\n\tprivate void PresentModalWindow (NSStoryboardSegue segue)\n\t{\n\t\tNSWindowController windowController = null;\n\n\t\t// Take action based on the controller type\n\t\tif (segue.DestinationController is NSWindowController) {\n\t\t\t// Display the window to the user\n\t\t\twindowController = segue.DestinationController as NSWindowController;\n\t\t} else if (segue.DestinationController is NSViewController) {\n\t\t\t// Build a Window and Window Controller for this view\n\t\t\tvar viewController = segue.DestinationController as NSViewController;\n\t\t\tvar window = new NSWindow (viewController.View.Bounds, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable), NSBackingStore.Buffered, false);\n\t\t\twindowController = new NSWindowController (window);\n\n\t\t\t// Attach the View Controller to the Window\n\t\t\twindow.ContentView = viewController.View;\n\t\t\twindow.ContentViewController = viewController;\n\t\t}\n\n\t\t// Found?\n\t\tif (windowController == null) return;\n\n\t\t// Present window controller\n\t\tNSApplication.SharedApplication.RunModalForWindow (windowController.Window);\n\t}\n\n\t/// <summary>\n\t/// Presents the Window or View to the user as a sheet attached to the parent\n\t/// Window.\n\t/// </summary>\n\t/// <param name=\"segue\">The <c>NSStoryboardSegue</c> to execute.</param>\n\tprivate void PresentSheet (NSStoryboardSegue segue)\n\t{\n\t\tNSViewController viewController = null;\n\n\t\t// Take action based on the controller type\n\t\tif (segue.DestinationController is NSWindowController) {\n\t\t\t// Display the window to the user\n\t\t\tvar windowController = segue.DestinationController as NSWindowController;\n\t\t\tviewController = windowController.Window.ContentViewController;\n\t\t} else if (segue.DestinationController is NSViewController) {\n\t\t\t// Grab view controller\n\t\t\tviewController = segue.DestinationController as NSViewController;\n\t\t}\n\n\t\t// Found?\n\t\tif (viewController == null) return;\n\n\t\t// Present window controller\n\t\tif (segue.SourceController is NSWindowController) {\n\t\t\tvar sourceController = segue.SourceController as NSWindowController;\n\t\t\tsourceController.Window.ContentViewController.PresentViewControllerAsSheet (viewController);\n\t\t} else if (segue.SourceController is NSViewController) {\n\t\t\tvar sourceController = segue.SourceController as NSViewController;\n\t\t\tsourceController.PresentViewControllerAsSheet (viewController);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Presents the Window or View to the user as a popover attached to a parent\n\t/// View.\n\t/// </summary>\n\t/// <param name=\"segue\">The <c>NSStoryboardSegue</c> to execute.</param>\n\t/// <param name=\"sender\">The <c>NSView</c> based element that the popover will be attached to.</param>\n\tprivate void PresentPopover (NSStoryboardSegue segue, NSObject sender)\n\t{\n\t\tNSViewController viewController = null;\n\t\tNSView view = null;\n\n\t\t// Take action based on the controller type\n\t\tif (segue.DestinationController is NSWindowController) {\n\t\t\t// Display the window to the user\n\t\t\tvar windowController = segue.DestinationController as NSWindowController;\n\t\t\tviewController = windowController.Window.ContentViewController;\n\t\t} else if (segue.DestinationController is NSViewController) {\n\t\t\t// Grab view controller\n\t\t\tviewController = segue.DestinationController as NSViewController;\n\t\t}\n\n\t\t// Found?\n\t\tif (viewController == null) return;\n\n\t\t// Take action based on sender type\n\t\tif (sender is NSToolbarItem) {\n\t\t\tvar item = sender as NSToolbarItem;\n\t\t\tif (item.View == null) {\n\t\t\t\t// Default to presenting as a sheet\n\t\t\t\tPresentSheet (segue);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\t// Use the items view\n\t\t\t\tview = item.View;\n\t\t\t}\n\t\t} else {\n\t\t\t// It's a view based control\n\t\t\tview = sender as NSView;\n\t\t}\n\n\t\t// Present window controller\n\t\tif (segue.SourceController is NSWindowController) {\n\t\t\tvar sourceController = segue.SourceController as NSWindowController;\n\t\t\tsourceController.Window.ContentViewController.PresentViewController (viewController, viewController.View.Bounds, view, PopoverEdge, PopoverBehavior);\n\t\t} else if (segue.SourceController is NSViewController) {\n\t\t\tvar sourceController = segue.SourceController as NSViewController;\n\t\t\tsourceController.PresentViewController (viewController, viewController.View.Bounds, view, PopoverEdge, PopoverBehavior);\n\t\t}\n\t}\n\t#endregion\n\n\t#region Public Methods\n\t/// <summary>\n\t/// Performs the segue as specified in this Segue Definition.\n\t/// </summary>\n\t/// <param name=\"sender\">The object that is launching the segue.</param>\n\t/// <param name=\"sourceController\">Source controller for the segue.</param>\n\tpublic void PerformSegue (NSObject sender, NSObject sourceController)\n\t{\n\n\t\t//NSApplication.SharedApplication.KeyWindow.Title = \"Loading Segue\"; \n\n\t\t// Prepare for segue\n\t\tvar segue = PrepareForSegue (sender, sourceController);\n\n\t\t// Did the NIB load?\n\t\tif (segue == null) return;\n\n\t\t//NSApplication.SharedApplication.KeyWindow.Title = \"Segue Loaded\";\n\n\t\t// Take action based on the Segue type\n\t\tswitch (SegueKind) {\n\t\tcase StoryboardSegueType.Show:\n\t\t\tPresentNonModalWindow (segue);\n\t\t\tbreak;\n\t\tcase StoryboardSegueType.Modal:\n\t\t\tPresentModalWindow (segue);\n\t\t\tbreak;\n\t\tcase StoryboardSegueType.Sheet:\n\t\t\tPresentSheet (segue);\n\t\t\tbreak;\n\t\tcase StoryboardSegueType.Popover:\n\t\t\tPresentPopover (segue, sender);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Sets the popover behavior.\n\t/// </summary>\n\t/// <param name=\"behavior\">Behavior as a string value.</param>\n\tpublic void SetPopoverBehavior (string behavior)\n\t{\n\t\t// Anything to do?\n\t\tif (behavior == null) return;\n\n\t\t// Take action based on value\n\t\tswitch (behavior) {\n\t\tcase \"t\":\n\t\t\tPopoverBehavior = NSPopoverBehavior.Transient;\n\t\t\tbreak;\n\t\tcase \"semitransient\":\n\t\t\tPopoverBehavior = NSPopoverBehavior.Semitransient;\n\t\t\tbreak;\n\t\tcase \"applicationDefined\":\n\t\t\tPopoverBehavior = NSPopoverBehavior.ApplicationDefined;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Sets the popover edge.\n\t/// </summary>\n\t/// <param name=\"edge\">Edge as a string value.</param>\n\tpublic void SetPopoverEdge (string edge)\n\t{\n\t\t// Anything to do?\n\t\tif (edge == null) return;\n\n\t\t// Take action based on value\n\t\tswitch (edge) {\n\t\tcase \"minX\":\n\t\t\tPopoverEdge = 0;\n\t\t\tbreak;\n\t\tcase \"minY\":\n\t\t\tPopoverEdge = 1;\n\t\t\tbreak;\n\t\tcase \"maxX\":\n\t\t\tPopoverEdge = 2;\n\t\t\tbreak;\n\t\tcase \"maxY\":\n\t\t\tPopoverEdge = 3;\n\t\t\tbreak;\n\t\t}\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// Helper class used to compile a storyboard included in a workbook.\n/// </summary>\npublic static class StoryboardCompiler\n{\n\t#region Public Methods\n\t/// <summary>\n\t/// Compiles the specified storyboardName.\n\t/// </summary>\n\t/// <param name=\"storyboardName\">The Storyboard name of the storyboard to compile without the `.storyboard` extension.</param>\n\tpublic static void Compile (string storyboardName)\n\t{\n\t\t// Assemble the Interface Builder compiler call\n\t\tvar dir = Directory.GetCurrentDirectory ();\n\t\tvar command = \"ibtool\";\n\t\tvar arguments = $\"\\\"{dir}/{storyboardName}.storyboard\\\" --compile \\\"{dir}/{storyboardName}.storyboardc\\\"\";\n\n\t\t// Prepare to call the system to invoke the ibtool\n\t\tvar startInfo = new ProcessStartInfo () {\n\t\t\tFileName = command,\n\t\t\tArguments = arguments,\n\t\t\tUseShellExecute = false,\n\t\t\tCreateNoWindow = true,\n\t\t\tRedirectStandardOutput = true,\n\t\t\tRedirectStandardError = true,\n\t\t\tRedirectStandardInput = true,\n\t\t\tUserName = System.Environment.UserName\n\t\t};\n\n\t\t// Invoke the ibtool and write the results to the\n\t\t// console\n\t\tusing (Process process = Process.Start (startInfo)) { // Monitor for exit}\n\t\t\tprocess.WaitForExit ();\n\t\t\tusing (var output = process.StandardOutput) {\n\t\t\t\tvar results = output.ReadToEnd ();\n\t\t\t\tConsole.WriteLine (\"Results: {0}\", (results == \"\") ? \"Successful\" : results);\n\t\t\t}\n\t\t}\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// The StoryboardBinder class provides a mechanism to bind objects inflated from a\n/// compiled Storyboard NIB file to classes in a workbook. Currently it can bind:\n/// NSMenu, NSToolBar, NSWindowController, NSWindow, NSViewController, NSView and\n/// any NSView base controls (such as NSButton).\n/// \n/// It uses the following hack to support Outlets: a) NSWindow and NSView based\n/// controls are bound to Public Properties matching their Identifier property,\n/// b) NSMenuItems are bound to Public Properties matching Title + \"MenuItem\",\n/// c) NSToolbarItems are bound to Public Properties matching Label + \"ToolbarItem\".\n/// \n/// Custom Segues are currently not supported. For many standard items (such as\n/// NSButton and NSImageView), images will attempted to be bound to `.png` files of\n/// the same name in an `Images` directory in the workbooks directory.\n/// </summary>\npublic static class StoryboardBinder \n{\n\t#region Public Methods\n\t/// <summary>\n\t/// Bind the specified storyboardClass and workbookClass. For high-level classes\n\t/// like NSWindowController and NSViewController, the binder will walk down the\n\t/// tree of objects binding lower-level items along the chain.\n\t/// </summary>\n\t/// <param name=\"storyboardClass\">The high-level storyboard (or workbook) class to bind from.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void Bind (NSObject storyboardClass, NSObject workbookClass)\n\t{\n\t\t// Take action based on the source object type\n\t\tif (storyboardClass is NSMenu) {\n\t\t\tBindMenu (storyboardClass as NSMenu, workbookClass);\n\t\t} else if (storyboardClass is NSWindowController) {\n\t\t\tBindWindowController (storyboardClass as NSWindowController, workbookClass);\n\t\t} else if (storyboardClass is NSWindow) {\n\t\t\tBindWindow (storyboardClass as NSWindow, workbookClass);\n\t\t} else if (storyboardClass is NSViewController) {\n\t\t\tBindViewController (storyboardClass as NSViewController, workbookClass);\n\t\t} else if (storyboardClass is NSView) {\n\t\t\tBindView (storyboardClass as NSView, workbookClass);\n\t\t} else if (storyboardClass is NSToolbar) {\n\t\t\tBindToolbar (storyboardClass as NSToolbar, workbookClass);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Attempts to bind an NSImage that has been specified in Interface Builder in the\n\t/// form `TheImage.png` to a like-named image file in the `Images` directory in the\n\t/// same directory as the workbook.\n\t/// </summary>\n\t/// <returns>The NSImage loaded from the `Images` directory or the passed-in NSImage if not found.</returns>\n\t/// <param name=\"image\">The source NSImage as specified in Interface Builder.</param>\n\tpublic static NSImage BindImage (NSImage image)\n\t{\n\t\t// Has an image been specified?\n\t\tif (image !=null && image.Name != null && image.Name.Contains (\".png\")) {\n\t\t\t// Yes, attempt load the image resource\n\t\t\tvar imageName = $\"Images/{image.Name}\";\n\n\t\t\t// Does the file exist?\n\t\t\tif (File.Exists (imageName)) {\n\t\t\t\t// Yes, load new image\n\t\t\t\timage = new NSImage (imageName);\n\t\t\t}\n\t\t}\n\n\t\treturn image;\n\t}\n\n\t/// <summary>\n\t/// Binds any Menu Item to a Public Property in a workbook class that matches\n\t/// Title + \"MenuItem\". For example, the \"New\" Menu Item to the \"NewMenuItem\"\n\t/// Property.\n\t/// </summary>\n\t/// <remarks>Any image specified in an item will also attemp to be bound.</remarks>\n\t/// <param name=\"menu\">The NSMenu to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindMenu (NSMenu menu, NSObject workbookClass)\n\t{\n\t\t// Bind all menu items\n\t\tfor (nint n = 0; n < menu.Count; ++n) {\n\t\t\tvar menuItem = menu.ItemAt (n);\n\n\t\t\t// Bind identity using a hack\n\t\t\tvar propertyName = $\"{menuItem.Title.Replace (\" \", \"\").Replace (\"…\", \"\")}MenuItem\";\n\t\t\tBindProperty (propertyName, workbookClass, menuItem);\n\n\t\t\t// Bind image\n\t\t\tmenuItem.Image = BindImage (menuItem.Image);\n\n\t\t\t// Bind actions\n\t\t\tBindAction (menuItem.Action, workbookClass, menuItem);\n\n\t\t\t// Has segue?\n\t\t\tif (menuItem.Target is StoryboardSegueDefinition) {\n\t\t\t\tvar segue = menuItem.Target as StoryboardSegueDefinition;\n\n\t\t\t\t// Bind it\n\t\t\t\tmenuItem.Activated += (sender, e) => {\n\t\t\t\t\tsegue.PerformSegue (menuItem, workbookClass);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Scan sub menus\n\t\t\tif (menuItem.Submenu != null) {\n\t\t\t\tBindMenu (menuItem.Submenu, workbookClass);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\n\t/// <summary>\n\t/// Binds any Toolbar Item to A Public Property in a workbook class that matches\n\t/// Label + \"ToolbarItem\". For example, the \"Color\" Toolbar Item to the \"ColorToolbarItem\"\n\t/// Property.\n\t/// </summary>\n\t/// <remarks>Any image specified in an item will also attemp to be bound.</remarks>\n\t/// <param name=\"toolbar\">The NSToolbar to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindToolbar (NSToolbar toolbar, NSObject workbookClass)\n\t{\n\t\t// Bind all items on the Toolbar\n\t\tforeach (NSToolbarItem item in toolbar.Items) {\n\t\t\t// Bind identity using a hack\n\t\t\tvar propertyName = $\"{item.Label.Replace (\" \", \"\")}ToolbarItem\";\n\t\t\tBindProperty (propertyName, workbookClass, item);\n\n\t\t\t// Bind Images\n\t\t\titem.Image = BindImage (item.Image);\n\n\t\t\t// Bind actions\n\t\t\tBindAction (item.Action, workbookClass, item);\n\n\t\t\t// Has segue?\n\t\t\tif (item.Target is StoryboardSegueDefinition) {\n\t\t\t\tvar segue = item.Target as StoryboardSegueDefinition;\n\n\t\t\t\t// Bind it\n\t\t\t\titem.Activated += (sender, e) => {\n\t\t\t\t\tsegue.PerformSegue (item, workbookClass);\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Binds the Window Controller to the given workbook class. This method will walk down the\n\t/// tree of objects binding lower-level classes as well.\n\t/// </summary>\n\t/// <param name=\"controller\">The NSWindowController to bind from.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindWindowController (NSWindowController controller, NSObject workbookClass)\n\t{\n\t\t// Bind controlled window\n\t\tBindWindow (controller.Window, workbookClass);\n\n\t\t// Binding to a Window Controller?\n\t\tif (workbookClass is NSWindowController) {\n\t\t\t// Yes, bind controllers\n\t\t\tvar windowController = workbookClass as NSWindowController;\n\t\t\twindowController.Window = controller.Window;\n\n\t\t\t// Is the window loaded?\n\t\t\tif (windowController.IsWindowLoaded) {\n\t\t\t\t// Simulate the window being loaded by the workbook's controller instance\n\t\t\t\twindowController.WindowWillLoad ();\n\t\t\t\twindowController.WindowDidLoad ();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/// <summary>\n\t\t/// Binds the Window to the given workbook class. This method will walk down the tree\n\t\t/// of objects binding lower-level classes as well.\n\t\t/// </summary>\n\t\t/// <param name=\"window\">The NSWindow to bind from.</param>\n\t\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\t\tpublic static void BindWindow (NSWindow window, NSObject workbookClass)\n\t\t{\n\t\t\t// Bind identity\n\t\t\tBindProperty (window.Identifier, workbookClass, window);\n\n\t\t\t// Does the window have a toolbar?\n\t\t\tif (window.Toolbar != null) {\n\t\t\t\t// Yes, bind it\n\t\t\t\tBindToolbar (window.Toolbar, workbookClass);\n\t\t\t}\n\n\t\t\t// Binding to a window instance?\n\t\t\tif (workbookClass is NSWindow && workbookClass.GetType ().Name == window.Identifier) {\n\t\t\t\t// Yes, bind objects\n\t\t\t\tvar wbWindow = workbookClass as NSWindow;\n\t\t\t\twbWindow.ContentViewController = window.ContentViewController;\n\t\t\t\twbWindow.ContentView = window.ContentView;\n\t\t\t}\n\n\t\t\t// Does the window contain a Split View\n\t\t\tif (window.ContentView is NSSplitView) {\n\t\t\t\t// Bind split view contents\n\t\t\t\tBindSplitView (window.ContentView as NSSplitView, workbookClass);\n\t\t\t} else {\n\t\t\t\t// Bind content view controller\n\t\t\t\tBindViewController (window.ContentViewController, workbookClass);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Binds the split view to the given workbook class. This method will walk down the\n\t\t/// tree of objects binding lower-level classes as well.\n\t\t/// </summary>\n\t\t/// <param name=\"splitView\">Split view being bound.</param>\n\t\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\t\tpublic static void BindSplitView (NSSplitView splitView, NSObject workbookClass)\n\t\t{\n\t\t\t// Bind identity\n\t\t\tBindProperty (splitView.Identifier, workbookClass, splitView);\n\n\t\t\t// Bind all the attached views\n\t\t\tforeach (NSView view in splitView.ArrangedSubviews) {\n\t\t\t\t// Bind controlled view\n\t\t\t\tBindView (view, workbookClass);\n\t\t\t}\n\n\t\t\t// Binding to a view controller?\n\t\t\tif (workbookClass is NSViewController) {\n\t\t\t\t// Yes, bind controllers\n\t\t\t\tvar viewController = workbookClass as NSViewController;\n\t\t\t\tviewController.View = splitView;\n\n\t\t\t\t// Simulate the view being loaded by the workbook's controller instance\n\t\t\t\tviewController.ViewDidLoad ();\n\t\t\t\tviewController.ViewWillAppear ();\n\t\t\t\tviewController.ViewDidAppear ();\n\t\t\t\tviewController.ViewWillLayout ();\n\t\t\t\tviewController.ViewDidLayout ();\n\t\t\t}\n\t\t}\n\n\t/// <summary>\n\t/// Binds the View Controller to the given workbook class. This method will walk down the\n\t/// tree of objects binding lower-level classes as well.\n\t/// </summary>\n\t/// <param name=\"controller\">The NSViewController to bind from.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindViewController (NSViewController controller, NSObject workbookClass)\n\t{\n\t\t// Bind controlled view\n\t\tBindView (controller.View, workbookClass);\n\n\t\t// Binding to a view controller?\n\t\tif (workbookClass is NSViewController) {\n\t\t\t// Yes, bind controllers\n\t\t\tvar viewController = workbookClass as NSViewController;\n\t\t\tviewController.View = controller.View;\n\n\t\t\t// Is the view loaded?\n\t\t\tif (controller.ViewLoaded) {\n\t\t\t\t// Simulate the view being loaded by the workbook's controller instance\n\t\t\t\tviewController.ViewDidLoad ();\n\t\t\t\tviewController.ViewWillAppear ();\n\t\t\t\tviewController.ViewDidAppear ();\n\t\t\t\tviewController.ViewWillLayout ();\n\t\t\t\tviewController.ViewDidLayout ();\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Binds the View to the given workbook class. This method will transverse all SubViews\n\t/// in the given tree.\n\t/// </summary>\n\t/// <remarks>Any image specified in a known item will also attemp to be bound.</remarks>\n\t/// <param name=\"view\">The NSView to bind from.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindView (NSView view, NSObject workbookClass)\n\t{\n\t\t// Bind identity\n\t\tBindProperty (view.Identifier, workbookClass, view);\n\n\t\t// Bind images for known items\n\t\tif (view is NSButton) {\n\t\t\tvar button = view as NSButton;\n\t\t\tbutton.Image = BindImage (button.Image);\n\t\t\tBindAction (button.Action, workbookClass, button);\n\n\t\t\t// Has segue?\n\t\t\tif (button.Target is StoryboardSegueDefinition) {\n\t\t\t\tvar segue = button.Target as StoryboardSegueDefinition;\n\n\t\t\t\t// Bind it\n\t\t\t\tbutton.Activated += (sender, e) => {\n\t\t\t\t\tsegue.PerformSegue (button, workbookClass);\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (view is NSPopUpButton) {\n\t\t\tvar popup = view as NSPopUpButton;\n\t\t\tforeach (NSMenuItem item in popup.Items ()) {\n\t\t\t\titem.Image = BindImage (item.Image);\n\t\t\t}\n\t\t\tBindAction (popup.Action, workbookClass, popup);\n\t\t} else if (view is NSSegmentedControl) {\n\t\t\tvar segment = view as NSSegmentedControl;\n\t\t\tfor (nint n = 0; n < segment.SegmentCount; ++n) {\n\t\t\t\tvar image = segment.GetImage (n);\n\t\t\t\tsegment.SetImage (BindImage (image), n);\n\t\t\t}\n\t\t\tBindAction (segment.Action, workbookClass, segment);\n\t\t} else if (view is NSImageView) {\n\t\t\tvar image = view as NSImageView;\n\t\t\timage.Image = BindImage (image.Image);\n\t\t}\n\n\t\t// Bind every subview\n\t\tforeach (NSView subview in view.Subviews) {\n\t\t\tBindView (subview, workbookClass);\n\t\t}\n\n\t}\n\t#endregion\n\n\t#region Private Methods\n\t/// <summary>\n\t/// Attempts to bind an object inflated from a compiled Storyboard to an \"Outlet\"\n\t/// property on the given workbook class. This hack is a workaround since true\n\t/// Storyboard Outlets are not supported in workbooks.\n\t/// </summary>\n\t/// <param name=\"propertyName\">The name of the Public Property to bind the Outlet to.</param>\n\t/// <param name=\"workbookClass\">The workbook class being bound to.</param>\n\t/// <param name=\"property\">The object inflated from the compiled Storyboard.</param>\n\tprivate static void BindProperty (string propertyName, NSObject workbookClass, NSObject property)\n\t{\n\t\t// Anything to process?\n\t\tif (propertyName == null) return;\n\n\t\t// Does the controller contain the property?\n\t\tvar controllerType = workbookClass.GetType ();\n\t\tvar propertyInfo = controllerType.GetProperty (propertyName);\n\t\tif (propertyInfo != null && propertyInfo.CanWrite) {\n\t\t\t// Yes, save value in class\n\t\t\tvar value = Convert.ChangeType (property, propertyInfo.PropertyType);\n\t\t\tpropertyInfo.SetValue (workbookClass, value);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Attempts to bind an object inflated from a compiled Storyboard to an \"Action\"\n\t/// property on the given workbook class. This hack is a workaround since true\n\t/// Storyboard Actions are not supported in workbooks.\n\t/// </summary>\n\t/// <param name=\"action\">The selector that represents the Action to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class being bound to.</param>\n\t/// <param name=\"menuItem\">The Menu Item that is the target of the binding.</param>\n\tprivate static void BindAction (Selector action, NSObject workbookClass, NSMenuItem menuItem)\n\t{\n\t\t// Anything to process?\n\t\tif (action == null) return;\n\n\t\t// Switch to .NET style method name\n\t\tvar actionName = action.Name.Substring(0,1).ToUpper() + action.Name.Substring(1).Replace (\":\", \"\");\n\n\t\t// Does the class contain the method?\n\t\tvar controllerType = workbookClass.GetType ();\n\t\tvar methodInfo = controllerType.GetMethod (actionName);\n\t\tif (methodInfo != null) {\n\t\t\t// Yes, wireup action to class\n\t\t\tmenuItem.Activated += (sender, e) => {\n\t\t\t\tmethodInfo.Invoke (workbookClass, new [] { sender });\n\t\t\t};\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Attempts to bind an object inflated from a compiled Storyboard to an \"Action\"\n\t/// property on the given workbook class. This hack is a workaround since true\n\t/// Storyboard Actions are not supported in workbooks.\n\t/// </summary>\n\t/// <param name=\"action\">The selector that represents the Action to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class being bound to.</param>\n\t/// <param name=\"toolbarItem\">The Toolbar Item that is the target of the binding.</param>\n\tprivate static void BindAction (Selector action, NSObject workbookClass, NSToolbarItem toolbarItem)\n\t{\n\t\t// Anything to process?\n\t\tif (action == null) return;\n\n\t\t// Switch to .NET style method name\n\t\tvar actionName = action.Name.Substring (0, 1).ToUpper () + action.Name.Substring (1).Replace (\":\", \"\");\n\n\t\t// Does the class contain the method?\n\t\tvar controllerType = workbookClass.GetType ();\n\t\tvar methodInfo = controllerType.GetMethod (actionName);\n\t\tif (methodInfo != null) {\n\t\t\t// Yes, wireup action to class\n\t\t\ttoolbarItem.Activated += (sender, e) => {\n\t\t\t\tmethodInfo.Invoke (workbookClass, new [] { sender });\n\t\t\t};\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Attempts to bind an object inflated from a compiled Storyboard to an \"Action\"\n\t/// property on the given workbook class. This hack is a workaround since true\n\t/// Storyboard Actions are not supported in workbooks.\n\t/// </summary>\n\t/// <param name=\"action\">The selector that represents the Action to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class being bound to.</param>\n\t/// <param name=\"control\">The control that is the target of the binding.</param>\n\tprivate static void BindAction (Selector action, NSObject workbookClass, NSControl control)\n\t{\n\t\t// Anything to process?\n\t\tif (action == null) return;\n\n\t\t// Switch to .NET style method name\n\t\tvar actionName = action.Name.Substring (0, 1).ToUpper () + action.Name.Substring (1).Replace (\":\", \"\");\n\n\t\t// Does the class contain the method?\n\t\tvar controllerType = workbookClass.GetType ();\n\t\tvar methodInfo = controllerType.GetMethod (actionName);\n\t\tif (methodInfo != null) {\n\t\t\t// Yes, wireup action to class\n\t\t\tcontrol.Activated += (sender, e) => {\n\t\t\t\tmethodInfo.Invoke (workbookClass, new [] { sender });\n\t\t\t};\n\t\t}\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// Helper class that can inflate Views and View Controllers from a compiled Storyboard\n/// that has been included in a workbook.\n/// </summary>\npublic class StoryboardInflator : NSObject\n{\n\t#region Computed Properies\n\t/// <summary>\n\t/// Gets or sets the first responder that will act as the parent to all objects\n\t/// instantiated from the Storyboard.\n\t/// </summary>\n\t/// <value>The first responder.</value>\n\tpublic NSObject FirstResponder { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the bundle that contains the compiled Storyboard.\n\t/// </summary>\n\t/// <value>The bundle.</value>\n\tpublic NSBundle Bundle { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the main menu identifier.\n\t/// </summary>\n\t/// <value>The main menu identifier.</value>\n\tpublic string MainMenuIdentifier { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the entry point identifier for the initial object specified in\n\t/// Storyboard.\n\t/// </summary>\n\t/// <value>The entry point identifier.</value>\n\tpublic string EntryPointIdentifier { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the view controller identifiers to nib names dictionary.\n\t/// </summary>\n\t/// <value>The view controller identifiers to nib names.</value>\n\tpublic NSDictionary ViewControllerIdentifiersToNibNames { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the view controller identifiers to UUID dictionary.\n\t/// </summary>\n\t/// <value>The view controller identifiers to UUID.</value>\n\tpublic NSDictionary ViewControllerIdentifiersToUUIDs { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the segue definitions that were defined in the Storyboard.\n\t/// </summary>\n\t/// <value>The segue definition collection.</value>\n\tpublic List<StoryboardSegueDefinition> SegueDefinitions { get; set; } = new List<StoryboardSegueDefinition> ();\n\t#endregion\n\n\t#region Constructors\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:StoryboardInflator\"/> class.\n\t/// </summary>\n\t/// <remarks>This constructor sets the First Responder to the AppDelegate.</remarks>\n\t/// <param name=\"bundleFile\">The Bundle file that contains the compiled Storyboard.</param>\n\tpublic StoryboardInflator (string bundleFile)\n\t{\n\n\t\t// Initialize\n\t\tInitialize (bundleFile, (NSObject)NSApplication.SharedApplication.Delegate);\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:StoryboardInflator\"/> class.\n\t/// </summary>\n\t/// <param name=\"bundleFile\">The Bundle file that contains the compiled Storyboard.</param>\n\t/// <param name=\"owner\">The object that will act as the owner (First Responder) of\n\t/// any object instantiated from the Storyboard.</param>\n\tpublic StoryboardInflator (string bundleFile, NSObject owner)\n\t{\n\n\t\t// Initialize\n\t\tInitialize (bundleFile, owner);\n\t}\n\n\t/// <summary>\n\t/// Initialize the specified bundle file and owner.\n\t/// </summary>\n\t/// <param name=\"bundleFile\">The Bundle file that contains the compiled Storyboard.</param>\n\t/// <param name=\"owner\">The object that will act as the owner (First Responder) of\n\t/// any object instantiated from the Storyboard.</param>\n\tinternal void Initialize (string bundleFile, NSObject owner)\n\t{\n\n\t\t// Initialize\n\t\tLoadSegueDefinitions (bundleFile);\n\t\tBundle = new NSBundle (bundleFile);\n\t\tFirstResponder = owner;\n\n\t\t// Read the structure of the Storyboard\n\t\tEntryPointIdentifier = Bundle.InfoDictionary.ObjectForKey (new NSString (\"NSStoryboardDesignatedEntryPointIdentifier\")).ToString ();\n\t\tMainMenuIdentifier = Bundle.InfoDictionary.ObjectForKey (new NSString (\"NSStoryboardMainMenu\")).ToString ();\n\t\tViewControllerIdentifiersToNibNames = Bundle.InfoDictionary.ObjectForKey (new NSString (\"NSViewControllerIdentifiersToNibNames\")) as NSDictionary;\n\t\tViewControllerIdentifiersToUUIDs = Bundle.InfoDictionary.ObjectForKey (new NSString (\"NSViewControllerIdentifiersToNibNames\")) as NSDictionary;\n\n\t}\n\t#endregion\n\n\t#region Private Methods\n\t/// <summary>\n\t/// Loads the segue definitions from the non-compiled version of the Storyboard.\n\t/// </summary>\n\t/// <param name=\"bundleFile\">The Bundle file that contains the compiled Storyboard.</param>\n\tprivate void LoadSegueDefinitions (string bundleFile)\n\t{\n\t\t// Open the non-compiled Storyboard\n\t\tvar path = bundleFile.Replace (\".storyboardc\", \".storyboard\");\n\t\tvar reader = new XmlTextReader (path);\n\n\t\t// Track the tree of objects that the Segue is defined in\n\t\tvar parsingObject = StoryboardObjectType.Unknown;\n\t\tvar parsingID = \"\";\n\t\tvar sceneType = StoryboardObjectType.Unknown;\n\t\tvar sceneID = \"\";\n\n\t\t// Read through the non-compiled Storyboard to find all Segue\n\t\t// definitions\n\t\twhile (reader.Read ()) {\n\t\t\t// Take action based on node type\n\t\t\tswitch (reader.Name) {\n\t\t\tcase \"application\":\n\t\t\t\tsceneType = StoryboardObjectType.Application;\n\t\t\t\tvar appID = reader.GetAttribute (\"id\");\n\t\t\t\tif (appID != null) {\n\t\t\t\t\tsceneID = appID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"menuItem\":\n\t\t\t\tvar title = reader.GetAttribute (\"title\");\n\t\t\t\tif (title != null) {\n\t\t\t\t\tparsingObject = StoryboardObjectType.MenuItem;\n\t\t\t\t\tparsingID = title;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"windowController\":\n\t\t\t\tsceneType = StoryboardObjectType.WindowController;\n\t\t\t\tvar wcID = reader.GetAttribute (\"id\");\n\t\t\t\tif (wcID != null) {\n\t\t\t\t\tparsingObject = StoryboardObjectType.WindowController;\n\t\t\t\t\tparsingID = wcID;\n\t\t\t\t\tsceneID = wcID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"toolbarItem\":\n\t\t\t\tvar tbID = reader.GetAttribute (\"label\");\n\t\t\t\tif (tbID != null) {\n\t\t\t\t\tparsingObject = StoryboardObjectType.ToolbarItem;\n\t\t\t\t\tparsingID = tbID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"viewController\":\n\t\t\t\tsceneType = StoryboardObjectType.ViewController;\n\t\t\t\tvar vcID = reader.GetAttribute (\"id\");\n\t\t\t\tif (vcID != null) {\n\t\t\t\t\tsceneID = vcID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"splitViewController\":\n\t\t\t\tsceneType = StoryboardObjectType.SplitViewController;\n\t\t\t\tvar svcID = reader.GetAttribute (\"id\");\n\t\t\t\tif (svcID != null) {\n\t\t\t\t\tsceneID = svcID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"button\":\n\t\t\t\tvar buttonID = reader.GetAttribute (\"identifier\");\n\t\t\t\tif (buttonID != null) {\n\t\t\t\t\tparsingObject = StoryboardObjectType.Button;\n\t\t\t\t\tparsingID = buttonID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"segue\":\n\t\t\t\t// Read the Segue's Definition\n\t\t\t\tvar destination = reader.GetAttribute (\"destination\");\n\t\t\t\tvar kind = reader.GetAttribute (\"kind\");\n\t\t\t\tvar identifier = reader.GetAttribute (\"identifier\");\n\t\t\t\tvar id = reader.GetAttribute (\"id\");\n\t\t\t\tvar relationship = reader.GetAttribute (\"relationship\");\n\t\t\t\tvar popoverAnchor = reader.GetAttribute (\"popoverAnchorView\");\n\t\t\t\tvar popoverBehavior = reader.GetAttribute (\"popoverBehavior\");\n\t\t\t\tvar popoverEdge = reader.GetAttribute (\"preferredEdge\");\n\n\t\t\t\t// Create a new definition, populate it and add it to\n\t\t\t\t// the collection\n\t\t\t\tvar definition = new StoryboardSegueDefinition (kind, this) {\n\t\t\t\t\tSceneType = sceneType,\n\t\t\t\t\tSceneID = sceneID,\n\t\t\t\t\tSourceObjectType = parsingObject,\n\t\t\t\t\tSourceObjectID = parsingID,\n\t\t\t\t\tDestinationControllerID = destination,\n\t\t\t\t\tSegueIdentifier = (identifier == null) ? id : identifier,\n\t\t\t\t\tRelationship = relationship,\n\t\t\t\t\tPopoverAnchorID = popoverAnchor\n\t\t\t\t};\n\t\t\t\tdefinition.SetPopoverBehavior (popoverBehavior);\n\t\t\t\tdefinition.SetPopoverEdge (popoverEdge);\n\t\t\t\tSegueDefinitions.Add (definition);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Pulls the type name from the description.\n\t/// </summary>\n\t/// <returns>The class type name.</returns>\n\t/// <remarks>This method is used for debugging.</remarks>\n\t/// <param name=\"description\">The description.</param>\n\tprivate string TypeName (string description)\n\t{\n\n\t\tvar posn = description.IndexOf (\":\");\n\t\treturn description.Substring (1, posn - 1);\n\t}\n\n\t/// <summary>\n\t/// Pulls the class handle pointer from the description.\n\t/// </summary>\n\t/// <returns>The handle pointer.</returns>\n\t/// <remarks>This method is used for debugging.</remarks>\n\t/// <param name=\"description\">The description.</param>\n\tprivate IntPtr ClassHandlePointer (string description)\n\t{\n\n\t\tvar posn = description.IndexOf (\":\");\n\t\tvar value = description.Substring (posn + 1, description.Length - posn - 1);\n\t\treturn Marshal.StringToHGlobalUni (value);\n\t}\n\n\t/// <summary>\n\t/// Prints the top objects to the console.\n\t/// </summary>\n\t/// <remarks>This method is used for debugging.</remarks>\n\t/// <param name=\"topLevelObjects\">The collection of top level objects.</param>\n\tprivate void PrintTopObjects (NSArray topLevelObjects)\n\t{\n\n\t\tNSObject element = null;\n\n\t\t// Scan all top level object for the window controller\n\t\tfor (nuint n = 0; n < topLevelObjects.Count; ++n) {\n\t\t\t// Access the current object\n\t\t\telement = topLevelObjects.GetItem<NSObject> (n);\n\t\t\tConsole.WriteLine (\">   Type: {0}\", TypeName (element.Description));\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Checks every Menu and Menu Item to see if a Segue has been attached to it.\n\t/// If so, it sets the <c>StoryboardSegueDefinition</c> as the Menu Item's \n\t/// <c>Target</c>.\n\t/// </summary>\n\t/// <param name=\"menu\">The <c>NSMenu</c> to scan.</param>\n\tprivate void LoadMenuSegueTargets (NSMenu menu)\n\t{\n\t\t// Check all items to see if they have been bound to a segue\n\t\tfor (nint x = 0; x < menu.Count; ++x) {\n\t\t\tvar menuItem = menu.ItemAt (x);\n\n\t\t\t// Has a segue been defined for this item?\n\t\t\tvar segueDefinition = FindSegueDefinition (StoryboardObjectType.MenuItem, menuItem.Title);\n\t\t\tif (segueDefinition != null) menuItem.Target = segueDefinition;\n\n\t\t\t// Scan sub menus\n\t\t\tif (menuItem.Submenu != null) {\n\t\t\t\tLoadMenuSegueTargets (menuItem.Submenu);\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Checks every Toolbar Item to see if a Segue has been attached to it.\n\t/// If so, it sets the <c>StoryboardSegueDefinition</c> as the Toolbar Item's \n\t/// <c>Target</c>.\n\t/// </summary>\n\t/// <param name=\"toolbar\">The <c>NSToolbar</c> to scan.</param>\n\tprivate void LoadToolbarItemSegueTargets (NSToolbar toolbar)\n\t{\n\t\t// Check all items to see if they have been bound to a segue\n\t\tforeach (NSToolbarItem item in toolbar.Items) {\n\t\t\t// Has a segue been defined for this item?\n\t\t\tvar segueDefinition = FindSegueDefinition (StoryboardObjectType.ToolbarItem, item.Label);\n\t\t\tif (segueDefinition != null) {\n\t\t\t\titem.Target = segueDefinition;\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Checks every View and Sub View to see if a Segue has been attached to it.\n\t/// If so, it sets the <c>StoryboardSegueDefinition</c> as the View's \n\t/// <c>Target</c>.\n\t/// </summary>\n\t/// <param name=\"view\">The <c>NSView</c> to scan.</param>\n\tpublic void LoadViewSegueTargets (NSView view)\n\t{\n\t\t// Bind segues for known items\n\t\tif (view is NSButton) {\n\t\t\tvar button = view as NSButton;\n\n\t\t\t// Has a segue been defined for this item?\n\t\t\tvar segueDefinition = FindSegueDefinition (StoryboardObjectType.Button, button.Identifier);\n\t\t\tif (segueDefinition != null) {\n\t\t\t\tbutton.Target = segueDefinition;\n\t\t\t}\n\t\t} \n\n\t\t// Bind every subview\n\t\tforeach (NSView subview in view.Subviews) {\n\t\t\tLoadViewSegueTargets (subview);\n\t\t}\n\n\t}\n\n\t/// <summary>\n\t/// Loads the NIB from the specified NIB name and recursivly loads any sub NIBs\n\t/// for a known set of types such as <c>NSWindowController</c>, <c>NSViewController</c>,\n\t/// etc.\n\t/// </summary>\n\t/// <returns>The main top level element from the NIB as a known type such as \n\t/// <c>NSWindowController</c>, <c>NSViewController</c>, etc.</returns>\n\t/// <param name=\"nibName\">The name of the NIB to load.</param>\n\tprivate NSObject LoadNib (string nibName)\n\t{\n\t\tNSObject mainElement = null;\n\t\tvar topLevelObjects = new NSArray ();\n\t\tNSObject element = null;\n\t\tvar subNibName = \"\";\n\n\t\t// Anything to process?\n\t\tif (nibName == null) return null;\n\n\t\t//Console.WriteLine (\"Loading {0} -->\", nibName);\n\n\t\t// Load the given NIB\n\t\tif (Bundle.LoadNibNamed (nibName, FirstResponder, out topLevelObjects)) {\n\t\t\t// Discovery\n\t\t\t//Console.WriteLine (\"Parsing {0}:\", nibName);\n\t\t\t//PrintTopObjects (topLevelObjects);\n\n\t\t\t// Scan all top level object for a known object type\n\t\t\tfor (nuint n = 0; n < topLevelObjects.Count; ++n) {\n\t\t\t\t// Access the current object\n\t\t\t\telement = topLevelObjects.GetItem<NSObject> (n);\n\n\t\t\t\t// Search for known types\n\t\t\t\tif (element is NSMenu) {\n\t\t\t\t\t// Found main menu\n\t\t\t\t\tif (mainElement == null) mainElement = element;\n\t\t\t\t\tvar menu = element as NSMenu;\n\t\t\t\t\tLoadMenuSegueTargets (menu);\n\t\t\t\t} else if (element is NSWindowController) {\n\t\t\t\t\t// Found window controller \n\t\t\t\t\tmainElement = element;\n\t\t\t\t\tvar windowController = element as NSWindowController;\n\n\t\t\t\t\t// Load the window's content view\n\t\t\t\t\tif (windowController.Window.ContentViewController is NSSplitViewController) {\n\t\t\t\t\t\t// Access Split View Controller\n\t\t\t\t\t\tvar splitViewController = windowController.Window.ContentViewController as NSSplitViewController;\n\n\t\t\t\t\t\t// Manufacture a new Split View and configure it the same as\n\t\t\t\t\t\t// the Split View from the storyboard\n\t\t\t\t\t\tvar splitView = new NSSplitView (splitViewController.View.Frame) {\n\t\t\t\t\t\t\tArrangesAllSubviews = splitViewController.SplitView.ArrangesAllSubviews,\n\t\t\t\t\t\t\tDividerStyle = splitViewController.SplitView.DividerStyle,\n\t\t\t\t\t\t\tIsVertical = splitViewController.SplitView.IsVertical\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Load all the attached views\n\t\t\t\t\t\tforeach (NSSplitViewItem svItem in splitViewController.SplitViewItems) {\n\t\t\t\t\t\t\tsubNibName = svItem.ViewController.NibName;\n\t\t\t\t\t\t\tvar view = LoadNib (subNibName) as NSView;\n\t\t\t\t\t\t\tsplitView.AddArrangedSubview (view);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsplitView.AdjustSubviews ();\n\n\t\t\t\t\t\t// Attach to window\n\t\t\t\t\t\twindowController.Window.ContentView = splitView;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubNibName = windowController.Window.ContentViewController.NibName;\n\t\t\t\t\t\tvar contentView = LoadNib (subNibName) as NSView;\n\n\t\t\t\t\t\t// Found?\n\t\t\t\t\t\tif (contentView != null) {\n\t\t\t\t\t\t\t// Yes, attach it to the window\n\t\t\t\t\t\t\twindowController.Window.ContentViewController.View = contentView;\n\t\t\t\t\t\t\twindowController.Window.ContentView = contentView;\n\t\t\t\t\t\t\t//Console.WriteLine (\"* {0} View Attached\", subNibName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Is there a toolbar?\n\t\t\t\t\tif (windowController.Window.Toolbar != null) {\n\t\t\t\t\t\t// Scan items for attached segues\n\t\t\t\t\t\tLoadToolbarItemSegueTargets (windowController.Window.Toolbar);\n\t\t\t\t\t}\n\t\t\t\t} else if (element is NSViewController) {\n\t\t\t\t\t// Found View Controller\n\t\t\t\t\tif (mainElement == null) mainElement = element;\n\t\t\t\t\tvar viewController = element as NSViewController;\n\n\t\t\t\t\t// Load the controller's view\n\t\t\t\t\tsubNibName = viewController.NibName;\n\t\t\t\t\tvar view = LoadNib (subNibName) as NSView;\n\t\t\t\t\tviewController.View = view;\n\t\t\t\t} else if (element is NSView) {\n\t\t\t\t\t// Found View\n\t\t\t\t\tif (mainElement == null) mainElement = element;\n\t\t\t\t\tvar view = element as NSView;\n\t\t\t\t\tLoadViewSegueTargets (view);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Report error\n\t\t\tConsole.WriteLine (\"Unable to load: {0}\", nibName);\n\t\t}\n\n\t\t// Return the found main element\n\t\treturn mainElement;\n\t}\n\t#endregion\n\n\t#region Public Methods\n\t/// <summary>\n\t/// Instantiates the main menu from the storyboard.\n\t/// </summary>\n\t/// <returns>The main menu.</returns>\n\tpublic NSMenu InstantiateMainMenu ()\n\t{\n\t\treturn LoadNib (MainMenuIdentifier) as NSMenu;\n\t}\n\n\t/// <summary>\n\t/// Instantiates the main menu from the storyboard and binds it to the\n\t/// given instance of a workbook class.\n\t/// </summary>\n\t/// <returns>The main menu.</returns>\n\t/// <param name=\"parent\">The workbook instance to bind to.</param>\n\tpublic NSMenu InstantiateMainMenu (NSObject parent)\n\t{\n\t\t// Inflate menu\n\t\tvar menu = LoadNib (MainMenuIdentifier) as NSMenu;\n\n\t\t// Bind menu to parent class\n\t\tStoryboardBinder.BindMenu (menu, parent);\n\n\t\t// return inflated menu\n\t\treturn menu;\n\t}\n\n\t/// <summary>\n\t/// Instantiates the initial controller as specified in the Storyboard.\n\t/// </summary>\n\t/// <returns>The initial controller.</returns>\n\tpublic NSObject InstantiateInitialController ()\n\t{\n\t\t// Load element\n\t\tvar element = LoadNib (EntryPointIdentifier);\n\n\t\t// Is this a window controller?\n\t\tif (element is NSWindowController) {\n\t\t\t// Yes, display the window to the user\n\t\t\tvar windowController = element as NSWindowController;\n\t\t\twindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n\t\t}\n\n\t\t// Return loaded object\n\t\treturn element;\n\t}\n\n\t/// <summary>\n\t/// Instantiates the initial controller as specified in the Storyboard and binds it to\n\t/// the given instance of a workbook class.\n\t/// </summary>\n\t/// <returns>The initial controller.</returns>\n\t/// <param name=\"parent\">The workbook instance to bind to.</param>\n\tpublic NSObject InstantiateInitialController (NSObject parent)\n\t{\n\t\t// Get initial element\n\t\tvar element = InstantiateInitialController ();\n\n\t\t// Bind element to parent class\n\t\tStoryboardBinder.Bind (element, parent);\n\n\t\t// Return loaded object\n\t\treturn element; \n\t}\n\n\t/// <summary>\n\t/// Instantiates the controller from the NIB of the given name.\n\t/// </summary>\n\t/// <returns>The controller for nib name.</returns>\n\t/// <param name=\"nibName\">Nib name.</param>\n\tpublic NSObject InstantiateControllerForNibName (string nibName)\n\t{\n\t\tvar element = LoadNib (nibName);\n\n\t\t// Return loaded object\n\t\treturn element;\n\t}\n\n\t/// <summary>\n\t/// Returns the NIB name for the given Identifier or the empty string (\"\") if\n\t/// not found.\n\t/// </summary>\n\t/// <returns>The name for identifier or empty string (\"\") if not found.</returns>\n\t/// <param name=\"identifier\">The identifier to search for.</param>\n\tpublic string NibNameForIdentifier (string identifier)\n\t{\n\t\tfor (int n = 0; n < ViewControllerIdentifiersToNibNames.Keys.Count (); ++n) {\n\t\t\t// Get the key and value\n\t\t\tvar key = ViewControllerIdentifiersToNibNames.Keys [n].ToString ();\n\t\t\tvar value = ViewControllerIdentifiersToNibNames.Values [n].ToString ();\n\n\t\t\t// Found?\n\t\t\tif (key == identifier) return value;\n\t\t}\n\n\t\t// Return found name\n\t\treturn \"\";\n\t}\n\n\t/// <summary>\n\t/// Returns the NIB name for the partial Identifier or the empty string (\"\") if\n\t/// not found.\n\t/// </summary>\n\t/// <returns>The name for identifier or empty string (\"\") if not found.</returns>\n\t/// <param name=\"identifier\">The partial identifier to search for.</param>\n\tpublic string NibNameForPartialIdentifier (string identifier)\n\t{\n\t\tfor (int n = 0; n < ViewControllerIdentifiersToNibNames.Keys.Count (); ++n) {\n\t\t\t// Get the key and value\n\t\t\tvar key = ViewControllerIdentifiersToNibNames.Keys [n].ToString ();\n\t\t\tvar value = ViewControllerIdentifiersToNibNames.Values [n].ToString ();\n\n\t\t\t// Found?\n\t\t\tif (key.Contains(identifier)) return value;\n\t\t}\n\n\t\t// Return found name\n\t\treturn \"\";\n\t}\n\n\t/// <summary>\n\t/// Returns the UUID for the given Identifier or the empty string (\"\") if\n\t/// not found.\n\t/// </summary>\n\t/// <returns>The name for identifier or empty string (\"\") if not found.</returns>\n\t/// <param name=\"identifier\">The identifier to search for.</param>\n\tpublic string UUIDForIdentifier (string identifier)\n\t{\n\t\tfor (int n = 0; n < ViewControllerIdentifiersToUUIDs.Keys.Count (); ++n) {\n\t\t\t// Get the key and value\n\t\t\tvar key = ViewControllerIdentifiersToUUIDs.Keys [n].ToString ();\n\t\t\tvar value = ViewControllerIdentifiersToUUIDs.Values [n].ToString ();\n\n\t\t\t// Found?\n\t\t\tif (key == identifier) return value;\n\t\t}\n\n\t\t// Return found name\n\t\treturn \"\";\n\t}\n\n\t/// <summary>\n\t/// Instantiates the controller for the given identifier.\n\t/// </summary>\n\t/// <returns>The controller for identifier.</returns>\n\t/// <param name=\"identifier\">The identifier to instantiate.</param>\n\tpublic NSObject InstantiateControllerForIdentifier (string identifier)\n\t{\n\t\tvar nibName = NibNameForIdentifier (identifier);\n\n\t\t// Found?\n\t\tif (nibName == \"\") {\n\t\t\t// No\n\t\t\treturn null;\n\t\t} else {\n\t\t\t// Yes, instantiate named nib\n\t\t\treturn InstantiateControllerForNibName (nibName);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Instantiates the controller for the given partial identifier.\n\t/// </summary>\n\t/// <returns>The controller for partial identifier.</returns>\n\t/// <param name=\"identifier\">The partial identifier to instantiate.</param>\n\tpublic NSObject InstantiateControllerForPartialIdentifier (string identifier)\n\t{\n\t\tvar nibName = NibNameForPartialIdentifier (identifier);\n\n\t\t// Found?\n\t\tif (nibName == \"\") {\n\t\t\t// No\n\t\t\treturn null;\n\t\t} else {\n\t\t\t// Yes, instantiate named nib\n\t\t\treturn InstantiateControllerForNibName (nibName);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Finds the segue definition for the given Scene and Source Object.\n\t/// </summary>\n\t/// <returns>The segue definition or <c>null</c> if not found.</returns>\n\t/// <param name=\"sceneType\">Scene type.</param>\n\t/// <param name=\"sceneID\">Scene identifier.</param>\n\t/// <param name=\"sourceObjectType\">Source object type.</param>\n\t/// <param name=\"sourceObjectID\">Source object identifier.</param>\n\tpublic StoryboardSegueDefinition FindSegueDefinition (StoryboardObjectType sceneType, string sceneID, StoryboardObjectType sourceObjectType, string sourceObjectID)\n\t{\n\t\t// Scan all definitions\n\t\tforeach (StoryboardSegueDefinition definition in SegueDefinitions) {\n\t\t\t// Found?\n\t\t\tif (definition.SceneType == sceneType &&\n\t\t\t    definition.SceneID == sceneID &&\n\t\t\t\tdefinition.SourceObjectType == sourceObjectType && \n\t\t\t    definition.SourceObjectID == sourceObjectID) {\n\t\t\t\treturn definition;\n\t\t\t}\n\t\t}\n\n\t\t// Not found\n\t\treturn null;\n\t}\n\n\t/// <summary>\n\t/// Finds the segue definition for the given Source Object.\n\t/// </summary>\n\t/// <returns>The segue definition or <c>null</c> if not found</returns>\n\t/// <param name=\"sourceObjectType\">Source object type.</param>\n\t/// <param name=\"sourceObjectID\">Source object identifier.</param>\n\tpublic StoryboardSegueDefinition FindSegueDefinition (StoryboardObjectType sourceObjectType, string sourceObjectID)\n\t{\n\t\t// Scan all definitions\n\t\tforeach (StoryboardSegueDefinition definition in SegueDefinitions) {\n\t\t\t// Found?\n\t\t\tif (definition.SourceObjectType == sourceObjectType && definition.SourceObjectID == sourceObjectID) {\n\t\t\t\treturn definition;\n\t\t\t}\n\t\t}\n\n\t\t// Not found\n\t\treturn null;\n\t}\n\n\t/// <summary>\n\t/// Finds the segue definition for the given Segue Identifier.\n\t/// </summary>\n\t/// <returns>The segue definition or <c>null</c> if not found.</returns>\n\t/// <param name=\"identifier\">The Segue Identifier to find.</param>\n\tpublic StoryboardSegueDefinition FindSegueDefinition (string identifier)\n\t{\n\t\t// Scan all definitions\n\t\tforeach (StoryboardSegueDefinition definition in SegueDefinitions) {\n\t\t\t// Found?\n\t\t\tif (definition.SegueIdentifier == identifier) {\n\t\t\t\treturn definition;\n\t\t\t}\n\t\t}\n\n\t\t// Not found\n\t\treturn null;\n\t}\n\t#endregion\n}\n"
  },
  {
    "path": "mac/user-interface/segues/Segues.workbook/Walkthrough.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"16C48b\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"11542\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Window Controller-->\n        <scene sceneID=\"ZT2-fg-jUh\">\n            <objects>\n                <windowController id=\"plf-cC-dqu\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Split View\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" frameAutosaveName=\"\" animationBehavior=\"default\" id=\"a2R-TJ-Ptd\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"425\" y=\"313\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"2560\" height=\"1057\"/>\n                    </window>\n                    <connections>\n                        <segue destination=\"w8x-wh-VrG\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"u5k-KU-aYJ\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Cf8-kW-jxG\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"665\" y=\"-455\"/>\n        </scene>\n        <!--Split View Controller-->\n        <scene sceneID=\"dCh-ON-5x1\">\n            <objects>\n                <splitViewController id=\"w8x-wh-VrG\" sceneMemberID=\"viewController\">\n                    <splitViewItems>\n                        <splitViewItem id=\"Dae-HI-rBw\"/>\n                        <splitViewItem id=\"jEK-Xq-vaN\"/>\n                    </splitViewItems>\n                    <splitView key=\"splitView\" dividerStyle=\"thin\" vertical=\"YES\" id=\"GZj-7b-2ec\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"300\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </splitView>\n                    <connections>\n                        <segue destination=\"XdO-WJ-HvK\" kind=\"relationship\" relationship=\"splitItems\" id=\"lat-o9-sgw\"/>\n                        <segue destination=\"4cK-Eu-ujv\" kind=\"relationship\" relationship=\"splitItems\" id=\"sGc-vv-faf\"/>\n                    </connections>\n                </splitViewController>\n                <customObject id=\"sgd-Vz-bTc\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1303\" y=\"-464\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"NCv-zw-sli\">\n            <objects>\n                <viewController id=\"XdO-WJ-HvK\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"Tof-WT-yQ6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"300\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zvl-vl-dfM\">\n                                <rect key=\"frame\" x=\"18\" y=\"263\" width=\"414\" height=\"17\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"17\" id=\"VIO-SA-9FZ\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Left Side\" id=\"FUe-aH-7KI\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Zvl-vl-dfM\" secondAttribute=\"trailing\" constant=\"20\" id=\"15z-wF-YuG\"/>\n                            <constraint firstItem=\"Zvl-vl-dfM\" firstAttribute=\"top\" secondItem=\"Tof-WT-yQ6\" secondAttribute=\"top\" constant=\"20\" id=\"e1t-IV-mS0\"/>\n                            <constraint firstItem=\"Zvl-vl-dfM\" firstAttribute=\"leading\" secondItem=\"Tof-WT-yQ6\" secondAttribute=\"leading\" constant=\"20\" id=\"tFv-c7-O0H\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"QRr-fs-yaS\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1861\" y=\"-649\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"4RI-XC-rAR\">\n            <objects>\n                <viewController id=\"4cK-Eu-ujv\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"YYD-CQ-DLY\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"300\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"J2a-Hj-zYP\">\n                                <rect key=\"frame\" x=\"18\" y=\"263\" width=\"414\" height=\"17\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"17\" id=\"f0g-z4-wVk\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Right Side\" id=\"jqB-Nz-rpD\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"J2a-Hj-zYP\" secondAttribute=\"trailing\" constant=\"20\" id=\"1Gp-FG-yhW\"/>\n                            <constraint firstItem=\"J2a-Hj-zYP\" firstAttribute=\"top\" secondItem=\"YYD-CQ-DLY\" secondAttribute=\"top\" constant=\"20\" id=\"PyY-zn-3cW\"/>\n                            <constraint firstItem=\"J2a-Hj-zYP\" firstAttribute=\"leading\" secondItem=\"YYD-CQ-DLY\" secondAttribute=\"leading\" constant=\"20\" id=\"Wom-ar-Xz1\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"hyV-S0-2ZU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1861\" y=\"-288\"/>\n        </scene>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"WBTest\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"WBTest\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About WBTest\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide WBTest\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit WBTest\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"New Splitview\" id=\"Egj-7l-CPj\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" id=\"KaW-ft-85H\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\"/>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\"/>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\"/>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\"/>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\"/>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"WBTest Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-26\" y=\"-314\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <toolbar key=\"toolbar\" implicitIdentifier=\"AC8D08EC-96E5-48A1-980C-CFBBB66F8F05\" autosavesConfiguration=\"NO\" displayMode=\"iconAndLabel\" sizeMode=\"regular\" id=\"g1R-4V-isG\">\n                            <allowedToolbarItems>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarShowColorsItem\" id=\"MF4-Hw-ooT\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarShowFontsItem\" id=\"PEU-7f-B22\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarPrintItem\" id=\"NMo-mL-60Z\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarSpaceItem\" id=\"FzP-lU-Qve\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarFlexibleSpaceItem\" id=\"iz3-ci-iR4\"/>\n                                <toolbarItem implicitItemIdentifier=\"CAB1BBE4-D5FA-404C-93A0-4DA413720ACC\" label=\"Show\" paletteLabel=\"Show\" tag=\"-1\" image=\"NSEveryone\" id=\"BVf-y9-p0O\"/>\n                                <toolbarItem implicitItemIdentifier=\"6432A425-1313-4986-8561-4FE578BC0722\" label=\"Computer\" paletteLabel=\"Computer\" image=\"NSComputer\" id=\"xbJ-BN-Mld\">\n                                    <nil key=\"toolTip\"/>\n                                    <size key=\"minSize\" width=\"48\" height=\"48\"/>\n                                    <size key=\"maxSize\" width=\"48\" height=\"48\"/>\n                                    <button key=\"view\" id=\"gNF-fg-oQe\">\n                                        <rect key=\"frame\" x=\"6\" y=\"14\" width=\"48\" height=\"48\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                        <buttonCell key=\"cell\" type=\"square\" bezelStyle=\"shadowlessSquare\" image=\"NSComputer\" imagePosition=\"only\" alignment=\"center\" imageScaling=\"proportionallyUpOrDown\" inset=\"2\" id=\"aT0-0Y-Spl\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                    </button>\n                                </toolbarItem>\n                            </allowedToolbarItems>\n                            <defaultToolbarItems>\n                                <toolbarItem reference=\"BVf-y9-p0O\"/>\n                                <toolbarItem reference=\"xbJ-BN-Mld\"/>\n                                <toolbarItem reference=\"MF4-Hw-ooT\"/>\n                                <toolbarItem reference=\"PEU-7f-B22\"/>\n                                <toolbarItem reference=\"iz3-ci-iR4\"/>\n                                <toolbarItem reference=\"NMo-mL-60Z\"/>\n                            </defaultToolbarItems>\n                        </toolbar>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"69\" y=\"233\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <button identifier=\"ShowButton\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8NK-KR-YPz\">\n                                <rect key=\"frame\" x=\"14\" y=\"222\" width=\"81\" height=\"32\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"21\" id=\"O6Z-D3-RFv\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"69\" id=\"iS5-Ta-I43\"/>\n                                </constraints>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Show\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"6qn-3t-Ujj\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                            </button>\n                            <button identifier=\"QuestionButton\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EcF-Ug-Z7P\">\n                                <rect key=\"frame\" x=\"118\" y=\"222\" width=\"81\" height=\"32\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"69\" id=\"9wd-rP-UB7\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"21\" id=\"tzN-b3-e3c\"/>\n                                </constraints>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Question\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"NXp-vo-3kq\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                            </button>\n                            <textField identifier=\"QuestionLabel\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ziC-Az-Y50\">\n                                <rect key=\"frame\" x=\"212\" y=\"231\" width=\"250\" height=\"17\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"17\" id=\"C0d-FV-ZSl\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Please enter a question\" id=\"Tt7-93-SJz\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"ziC-Az-Y50\" secondAttribute=\"trailing\" constant=\"20\" id=\"0hz-WM-HKf\"/>\n                            <constraint firstItem=\"EcF-Ug-Z7P\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"20\" id=\"5ry-rx-oPE\"/>\n                            <constraint firstItem=\"ziC-Az-Y50\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"22\" id=\"Lq6-z8-KGs\"/>\n                            <constraint firstItem=\"EcF-Ug-Z7P\" firstAttribute=\"leading\" secondItem=\"8NK-KR-YPz\" secondAttribute=\"trailing\" constant=\"35\" id=\"sNR-Wr-RSX\"/>\n                            <constraint firstItem=\"8NK-KR-YPz\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"20\" id=\"sNm-WG-uZM\"/>\n                            <constraint firstItem=\"ziC-Az-Y50\" firstAttribute=\"leading\" secondItem=\"EcF-Ug-Z7P\" secondAttribute=\"trailing\" constant=\"21\" id=\"vqa-f4-zaI\"/>\n                            <constraint firstItem=\"8NK-KR-YPz\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" constant=\"20\" id=\"zCS-nE-hL7\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"69\" y=\"697\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"Pi0-p5-nQ5\">\n            <objects>\n                <viewController id=\"CCf-Sq-ZKC\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"E33-5d-PF3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"88\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField identifier=\"TitleLabel\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Oh0-Bf-Akd\">\n                                <rect key=\"frame\" x=\"18\" y=\"51\" width=\"414\" height=\"17\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Title\" id=\"QWu-ov-9oq\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <textField identifier=\"InputField\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ks0-yy-Obj\">\n                                <rect key=\"frame\" x=\"20\" y=\"20\" width=\"248\" height=\"22\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"anf-F0-tmN\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                            <button identifier=\"OKButton\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lyj-YM-hsT\">\n                                <rect key=\"frame\" x=\"270\" y=\"13\" width=\"81\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"OK\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"7yQ-SQ-w7G\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"acceptForm:\" target=\"wTD-yh-r9j\" id=\"V1P-yU-2lA\"/>\n                                </connections>\n                            </button>\n                            <button identifier=\"CancelButton\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"22Z-vh-0Pf\">\n                                <rect key=\"frame\" x=\"355\" y=\"13\" width=\"81\" height=\"32\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"FVe-SK-DAk\">\n                                    <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                                </buttonCell>\n                                <connections>\n                                    <action selector=\"cancelForm:\" target=\"wTD-yh-r9j\" id=\"OcG-2z-cN7\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                    </view>\n                </viewController>\n                <customObject id=\"wTD-yh-r9j\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"46\" y=\"1184\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"wGF-m8-Sl6\">\n            <objects>\n                <viewController id=\"hlZ-SX-RFF\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"404-bt-De6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"260\" height=\"76\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zuf-05-0AY\">\n                                <rect key=\"frame\" x=\"18\" y=\"29\" width=\"224\" height=\"17\"/>\n                                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Computer Info...\" id=\"xA6-w2-r5R\">\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                    </view>\n                </viewController>\n                <customObject id=\"48k-1t-Hwf\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"592\" y=\"62\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"93V-hZ-xgl\">\n            <objects>\n                <viewController id=\"Kgw-Zr-aQ8\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"3jo-us-oYx\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"450\" height=\"111\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dUl-mP-CSa\">\n                                <rect key=\"frame\" x=\"18\" y=\"34\" width=\"414\" height=\"57\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"57\" id=\"ogm-xx-yEz\"/>\n                                </constraints>\n                                <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Hello There!\" id=\"Kr6-m7-3uk\">\n                                    <font key=\"font\" metaFont=\"system\" size=\"48\"/>\n                                    <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textFieldCell>\n                            </textField>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"dUl-mP-CSa\" secondAttribute=\"trailing\" constant=\"20\" id=\"4ep-Ve-1Vf\"/>\n                            <constraint firstItem=\"dUl-mP-CSa\" firstAttribute=\"leading\" secondItem=\"3jo-us-oYx\" secondAttribute=\"leading\" constant=\"20\" id=\"EdG-rB-10S\"/>\n                            <constraint firstItem=\"dUl-mP-CSa\" firstAttribute=\"top\" secondItem=\"3jo-us-oYx\" secondAttribute=\"top\" constant=\"20\" id=\"fZg-p9-uAk\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"ltC-9C-psa\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"703\" y=\"618\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"NSComputer\" width=\"32\" height=\"32\"/>\n        <image name=\"NSEveryone\" width=\"32\" height=\"32\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "mac/user-interface/segues/Segues.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacMobile\n---\n\n# Working with Segues in macOS Storyboard\n\n### Building a Xamarin.Mac app's UI in a Storyboard\n\nStoryboards allow the developer to create a User Interface for a Xamarin.Mac app that not only includes the Window definitions and controls, but also contains the links between different Windows and how those Windows will be presented using Segues.\n\nThis workbook will cover the typical uses of Segues within a Storyboard, and how they can be used to limit the amount of code a developer is required to write to present a Xamarin.Mac app’s UI.\n\nIt is suggested to read our [Hello, Mac](https://developer.xamarin.com/guides/mac/getting_started/hello,_mac/) and [Introduction to Storyboards](https://developer.xamarin.com/guides/mac/platform-features/storyboards/) documentation before starting this workbook, as they provide a basis for the topics covered here.\n\n## An Introduction to Storyboards\n\nBefore getting started, let’s take a quick refresher in what a [Storyboard](https://developer.xamarin.com/guides/mac/platform-features/storyboards/#What_are_Storyboards) is and how it is used to define the User Interface for a macOS app.  Take the following example:\n\n![](Images/Intro01.png)\n\nA Storyboard defines all of the UI for a given app broken down into a functional overview of its View Controllers. Window Controllers contain and control the different Window types that a macOS app can create and contain these View Controllers. In Xcode's Interface Builder, each of these controllers lives in its own Scene:\n\n![](Images/Intro02.png)\n\nEach Scene represents a given View and View Controller Pair with a set of lines (called Segues) that connect each Scene in the UI, thus showing their relationships. Some Segues define how one View Controller contains one or more child Views or View Controllers. Other Segues, define transitions between View Controller (such as displaying a popover or dialog box).\n\nAfter the UI has been designed, the developer exposes the elements and controls to C# code using *Outlets* and *Actions*. Please see our [Outlets and Actions](https://developer.xamarin.com/guides/mac/getting_started/hello,_mac/#Outlets_and_Actions) documentation for more information.\n\n## Storyboards and Workbooks\n\nWorkbooks don’t natively support macOS Storyboards, so the first thing that will need to be done is to load a library that provides support:\n\n```csharp\n#load \"StoryboardResources.csx\"\n```\n\nUsing this library, there are a few differences that will need to be taken into account when designing UI in Xcode’s Interface Builder:\n\n* Outlets cannot be defined by Control-Dragging as normal because there is no `.h` header file to attach to. Instead, use the **Identifier** field in the **Identity Inspector** for **Windows, Views** and **View based Controls**. **Menu Items** will automatically bind to any Outlet that match their `Title` \\+ “*MenuItem*” (for example, `NewMenuItem`). **Toolbar Items** will automatically bind to any Outlet that match their `Label` \\+ “*ToolbarItem*” (for example, `ColorToolbarItem`).\n\n* Actions need to manually be added to the **First Responder** in the **Scene** where they will be used by clicking the **\\+** button in the **Attribute Inspector** and defining the new Action. Next, select the element to attach to, Control-Click, dragging a line to the **First Responder** in the same **Scene** and selecting the defined Action.\n\n* Only the built-in Segue types are currently supported by the library and **Views** and **View based Controls** *must* have a custom **Identifier** set in the **Identity Inspector**. For Custom Segues, the developer will have to manually load and display the child Window or View Controller.\n\n* Because of the way workbooks function, loading and instantiating Window and View Controllers  is done using methods of the `StoryboardInflator` helper class as opposed to using the typical `NSStoryboard` methods. For more information, please see our [Loading a Storyboard from Code](https://developer.xamarin.com/guides/mac/platform-features/storyboards/indepth/#Loading_from_Code) documentation.\n\n* The `StoryboardBinder` helper class will need to be used to \"bind\" (map) classes defined in the workbook to UI elements inflated from a Storyboard.\n\nWith these differences aside, Storyboards are used same way they typically would be in a normal macOS app, so the knowledge gained here can be used when building a regular Xamarin.Mac app project. For more information, please see our [Introduction to Storyboards](https://developer.xamarin.com/guides/mac/platform-features/storyboards/) documentation.\n\n### Compiling the Storyboard\n\nEvery time the developer edits the Storyboard, those changes will need to be compiled before they can be loaded in the workbook. Do this using the following command:\n\n```csharp\nvar usingStoryboard = \"Walkthrough\";\nStoryboardCompiler.Compile(usingStoryboard);\n```\n\nThis workbook includes two Storyboards. Set the `usingStoryboard` variable above to `Walkthrough` to follow through the exercises yourself or set it to `Main` to see the completed User Interface.\n\n> ⚠️ To edit the Storyboard that is part of this workbook, select the `.workbook` file in Finder, right-click it and select **Show Package Contents**.\n\n## Defining the Supporting Classes\n\nThere are several supporting classes that will be required when working with a Xamarin.Mac app’s UI that has been loaded from a Storyboard. These include at least an `AppDelegate`, a `NSWindowController` (for each Window type that the app creates) and a `NSViewController` for every `NSView` that belongs to a Window.\n\nThe following sections will go over each of these required classes in detail.\n\n### The InputFormViewController Class\n\nIn this workbook we'll be creating a simple Input Form that will have a definable Title and allow the user to enter a value which will be sent back to the caller:\n\n![](Images/UI01.png)\n\nThe `InputFormViewController` class will act as this Input Form's *Content Controller* and will be responsible for the life cycle of the form's content:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class InputFormViewController : NSViewController {\n\n    #region Private Variables\n    private string title = \"\";\n    #endregion\n\n\t#region Outlets\n    [Outlet]\n    public NSButton OKButton {get;set;}\n\n    [Outlet]\n    public NSButton CancelButton {get;set;}\n\n    [Outlet]\n    public NSTextField TitleLabel {get;set;}\n\n    [Outlet]\n    public NSTextField InputField {get;set;}\n    #endregion\n\n    #region Computed Properties\n    // Because of the way workbooks handle Storyboards, this\n    // reference is required to point back to the \"real\"\n    // View Controller as inflated from the .storyboardc file.\n    public NSObject StoryboardController {get;set;}\n    #endregion\n\n    #region Constructors\n    public InputFormViewController (string title) : base() {\n        // Initialize\n        this.title = title;\n    }\n    #endregion\n\n    #region Override Methods\n    public override void ViewWillAppear ()\n    {\n        base.ViewWillAppear ();\n\n        // Initialize\n        TitleLabel.StringValue = title;\n    }\n    #endregion\n\n    #region Public Methods\n    public void CloseDialog() {\n\n        // Ask the controller that presented the form to\n        // close it\n        var controller = StoryboardController as NSViewController;\n        controller.DismissController(this);\n    }\n    #endregion\n\n     #region Custom Actions\n    [Action (\"acceptForm:\")]\n    public void AcceptForm (Foundation.NSObject sender) {\n\n        // Inform caller that a new value has been entered\n        // and close the form\n        RaiseValueEntered(InputField.StringValue);\n        CloseDialog();\n    }\n\n    [Action (\"cancelForm:\")]\n    public void CancelForm (Foundation.NSObject sender) {\n\n        // Close the dialog \n        CloseDialog();\n    }\n    #endregion\n\n    #region Events\n    public delegate void ValueEnteredDelegate(string text);\n    public event ValueEnteredDelegate ValueEntered;\n\n    private void RaiseValueEntered(string text) {\n        if (this.ValueEntered != null) this.ValueEntered(text);\n    }\n    #endregion\n}\n```\n\nLet’s take a look at what this code is doing in detail. First, the private variable `title` is defined and used to hold a title that will be presented to the user when the View attached to this View Controller is shown. This title will be passed in when an instance of this class is created.\n\nWhy didn't we just set the title directly from the public `TitleLabel` property? Because of the way Storyboards are loaded and displayed, the `InputFormViewController` can be created *before* the `TitleLabel` field is built and populated. If we set it directly, `TitleLabel` could be `null`, which would result in an error.\n\nNext, several Outlets are defined that will be attached to the various UI elements from the View this View Controller is managing. These allow the C# code to access the UI Elements that were defined in Xcode's Interface Builder.\n\nThe `ViewWillAppear` method is called when the View has been fully loaded into memory so it can be configured before presenting it to the user. Here we are taking the `title` that was passed in and setting it as the value of the `TitleLabel`.\n\nThe `CloseDialog` method will close the Window (or Sheet) that the View Controller is presented in, removing it from the screen. It will be called from the OK and Cancel buttons.\n\nA custom `ValueEntered` event is defined that will be raised when the user clicks the OK button. The caller can subscribe to the event to get the result from the dialog.\n\nFinally, two custom Actions are defined: `AcceptForm` and `CancelForm`. These will be wired-up to the OK and Cancel buttons in Interface Builder and called when the user clicks the buttons.\n\n> 💡**Try It Now**\n>\n> 1. Disable the `OKButton` if the `InputField.StringValue` is empty. ***Hint**: Use the `NSTextField.Changed` event in the `ViewWillAppear` method.*\n> 2. Create a `Canceled` event to inform the caller when the user cancels the form and call it when the Cancel button is clicked.\n>\n> ⚠️ These changes won't take effect until a new instance of the Window is instantiated.\n\nFor more information on working with View Controllers, please see our [View Controllers](https://developer.xamarin.com/guides/mac/platform-features/storyboards/indepth/#View_Controllers) documentation.\n\n### The Main View Controller\n\nThe Main Window of this app has two buttons that will be used to display other Windows and View by creating Segues in Interface Builder:\n\n![](Images/UI02.png)\n\nThe `MainViewController` class will act as this app’s Window *Content Controller* and will be responsible for the life cycle of the main Window’s content:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class MainViewController : NSViewController {\n\n\t#region Outlets\n    [Outlet]\n    public NSButton ShowButton {get;set;}\n\n    [Outlet]\n    public NSButton QuestionButton {get;set;}\n\n    [Outlet]\n    public NSTextField QuestionLabel {get;set;}\n    #endregion\n\n    #region Constructors\n    public MainViewController () : base() {\n\n    }\n    #endregion\n\n    #region Override Methods\n    public override void ViewWillAppear ()\n    {\n        base.ViewWillAppear ();\n\n    }\n    #endregion\n\n}\n```\n\nLet’s take a look at what this code is doing in detail. Like the `InputFormViewController` above, Outlets have been created to allow C# to access the UI Elements defined in Interface builder and the `ViewWillAppear` method will be called before the View is presented to the user so it can be configured.\n\n### The Main Window Controller\n\nThe Main Window contains a Toolbar that has items that will be used to display other Windows and Views using Segues. It also contains the `MainViewController` created above:\n\n![](Images/UI03.png)\n\nThe right facing arrow defines this Window as the *Initial View* that will be displayed when this Storyboard in opened. The downward facing arrow is a *Containment Segue* stating that this controller *contains* the View Controller it is pointing to:\n\n![](Images/UI04.png)\n\nThe `MainWindowController` class will act as the app’s Window Controller and will be responsible for the life cycle of the app’s main Window:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class MainWindowController : NSWindowController {\n\n    #region Computed Properties\n    public MainViewController ViewController {get; set;}\n    #endregion\n\n    #region Constructors\n    public MainWindowController() : base() {\n        \n    }\n    #endregion\n\n    #region Override Methods\n    public override void WindowDidLoad () {\n        // Initialize the window after it has loaded\n        Window.Title = \"Untitled\";\n\n    }\n\n    public override void PrepareForSegue (NSStoryboardSegue segue, NSObject sender) {\n        // Take action based on the segue id\n        switch(segue.Identifier){\n        case \"InputFormSegue\":\n            // Create a new form controller and bind it to the segue's\n            // destination\n            var formContoller = new InputFormViewController(\"Enter Something:\"){\n                StoryboardController = segue.DestinationController,\n            };\n            StoryboardBinder.Bind(segue.DestinationController, formContoller);\n\n            // Watch for the user entering a value\n            formContoller.ValueEntered += (value) => {\n                // Display the user's input\n                ViewController.QuestionLabel.StringValue = value;\n            };\n            break;\n        }\n    }\n    #endregion\n\n}\n```\n\nLet’s take a look at what this code is doing in detail. The `ViewController` property is used to gain access to the `MainViewController` attached to the Window. The `WindowDidLoad` method will be called before the Window is shown to the user so it can be configured. In our example, we are just setting the `Title` of the Window.\n\nThe `PrepareForSegue` method is called before a Segue is run so that the developer can configure it. Here, if the segue `Identifier` is `InputFormSegue`, a new instance of the `InputFormViewController` class is created with the Title for the Input Form and bound to the `DestinationController` from the `NSStoryboardSegue`. The `ValueEntered` event of the `InputFormViewController` class is used to display the user's input if they click the OK button.\n\nThe `Identifier` is set by selecting a Segue in Interface Builder and entering it in the **Attribute Inspector**:\n\n![](Images/UI05.png)\n\nThe `PrepareForSegue` method is a very important part of working with Segues in a Storyboard and a Xamarin.Mac app as it allows the developer to configure the Window or View that will be displayed as a result of the Segue. For example, like setting the title and retrieving the user's input above.\n\n> 💡**Try It Now**\n>\n> 1. **Create a Simple Segue** - Edit the Storyboard, select the **Show** button, hold the **Control** key, drag a line to the \"Hello There\" View and select `Show` from the popup window. Run the workbook and click the Show button to open a new Hello There Window.\n>\n> 2. **Create a Segue from a Toolbar Item** - Edit the Storyboard, select the **Show** Toolbar item, hold the **Control** key, drag a line to the \"Hello There\" View and select `Show` from the popup window. Run the workbook and click the Show Toolbar button to open a new Hello There Window.\n>\n> 3. **Create a Complex Segue** - Edit the Storyboard, select the **Question** button, hold the **Control** key, drag a line to the Input Form View and select `Sheet` from the popup window. Select the new Segue and enter `InputFormSegue` for the Identifier in the **Attribute Inspector**. Run the workbook and click the Question button to open a new Input Form Sheet. If you enter a value and click the OK button, it will be displayed on the Window because of the `PrepareForSegue` method created above.\n>\n> 4. **Create a Popover Segue** - Edit the Storyboard, select the **Computer** Toolbar item, hold the **Control** key, drag a line to the \"Computer Info...\" View and select `Popover` from the popup window. Select the Segue and use the **Attribute Inspector** to configure it (such as setting the Preferred Edge the Popover will be displayed from). Run the workbook and click the Computer Toolbar button to open a new Computer Info Popover.\n>\n> 5. **Respond to the User Canceling the Input Form** - Use the `Canceled` event you created above to display a message when the user clicks the Cancel button in the Input Form.\n>\n> 6. **Bonus** - Edit the Storyboard, select the different Segues created above and use the **Attribute Inspector** to try the effect of changing the properties (such as the Segue Kind or Preferred Edge for the Popover).\n>\n> ⚠️ These changes won't take effect until the workbook has been re-run from the beginning.\n\nFor more information on working with Window Controllers, please see our [Window Controller](https://developer.xamarin.com/guides/mac/platform-features/storyboards/indepth/#Window_Controllers) documentation.\n\n### The Main Window Delegate\n\nThe `MainWindowDelegate` will be attached to each of the Main Windows created by the app to monitor and respond to events such as the Window becoming Key (being set as the active, front-most Window), the Window closing, etc.:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class MainWindowDelegate : NSWindowDelegate {\n\n    #region Computed Properties\n    public NSWindow Window { get; set;}\n    public MainWindowController WindowController {get; set;}\n    public MainViewController ViewController {get;set;}\n    #endregion\n\n    #region constructors\n    public MainWindowDelegate (NSWindow window, MainWindowController windowController, MainViewController viewController)\n    {\n        // Initialize\n        this.Window = window;\n        this.WindowController = windowController;\n        this.ViewController = viewController;\n    }\n    #endregion\n\n    #region Override Methods\n    public override void DidBecomeKey (NSNotification notification) {\n\n    }\n    #endregion\n}\n```\n\nFor now, `MainWindowDelegate` is just keeping track of the other Supporting Classes for each Window created. This will be required later when tracking which of the app’s Windows is currently Key.\n\n### The App Delegate\n\nThe [AppDelegate](https://developer.xamarin.com/guides/mac/getting_started/hello%2C_mac/#AppDelegate.cs) is responsible for starting the app, loading its initial Menu Bar and Window and listening to OS events:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class AppDelegate : NSApplicationDelegate {\n\n    #region Computed Properties\n    public StoryboardInflator Inflator {get; set;}\n    public NSMenu MainMenu {get; set;}\n    public MainWindowController WindowController {get; set;} = new MainWindowController();\n    public MainViewController ViewController {get; set;} = new MainViewController();\n    #endregion\n\n    #region Outlets\n    [Outlet]\n    public NSMenuItem NewMenuItem {get;set;}\n    #endregion\n\n    #region Constructors\n    public AppDelegate() : base() {\n\n    }\n\n    public AppDelegate(string bundleName) : base() {\n\n        // Load the storyboard bundle into an inflator\n        Inflator = new StoryboardInflator($\"{bundleName}.storyboardc\");\n\n        // Initialize main menu\n        MainMenu = Inflator.InstantiateMainMenu(this);\n\n        // Load the initial window from the Storyboard\n        Inflator.InstantiateInitialController(WindowController);\n        WindowController.Window.Delegate = new MainWindowDelegate(WindowController.Window, WindowController, ViewController);\n\n        // Bind the main view controller\n        StoryboardBinder.Bind(WindowController, ViewController);\n        WindowController.ViewController = ViewController;\n\n        // Simulate the app launching\n        DidFinishLaunching(NSNotification.FromName(\"AppDelegate\",this));\n    }\n    #endregion\n\n    #region Override Methods\n    public override void DidFinishLaunching (NSNotification notification)\n    {\n        // Initialize app here\n    }\n    #endregion\n\n    #region Public Methods\n    public void PrepareForSegue (NSStoryboardSegue segue, NSObject sender) {\n        // Take action based on the segue id\n        switch(segue.Identifier){\n        case \"NewDocumentSegue\":\n            var windowController = new MainWindowController();\n            var viewContoller = new MainViewController();\n\n            StoryboardBinder.Bind(segue.DestinationController, windowController);\n            StoryboardBinder.Bind(windowController, viewContoller);\n            break;\n        }\n    }\n    #endregion\n\n}\n```\n\nLet’s take a look at what this code is doing in detail. First, it creates and exposes several Computed Properties to keep track of the main elements of the app.\n\nWhen a new instance of the `AppDelegate` is created, it creates a `StoryboardInflator` to load the specified Storyboard’s bundle into memory. Next, the app’s Menu Bar is loaded and displayed using the `InstantiateMainMenu` method. The `InstantiateInitialController` method loads and displays the app’s main, default Window which gets a `MainWindowDelegate` attached to it.\n\nThe WindowController is bound to the ViewController using the `StoryboardBinder`’s `Bind` method and the `DidFinishLaunching` method is called to simulate the normal launch sequence of a macOS app.\n\nJust like the `MainWindowController` created above, the `PrepareForSegue` method is used to bind instances of the `MainWindowController` and `MainViewController` to a new instance of the Main Window built from a Segue with the Identifier of `NewDocumentSegue`.\n\n> 💡**Try It Now**\n>\n> 1. **Create a New Main Window with a Segue** - Edit the Storyboard, select the **New** menu item, hold the **Control** key, drag a line to the Main Window Controller and select `Show` from the popup window. Select the Segue and enter `NewDocumentSegue` for the Identifier in the **Attribute Inspector**. Run the workbook and click the New Menu Item button to open a new Main Window.\n>\n> 2. **Create a Secondary Window with a Segue** - Edit the Storyboard, select the **New Splitview** menu item, hold the **Control** key, drag a line to the Split View Window Controller and select `Show` from the popup window. Select the Segue and enter `NewSplitviewSegue` for the Identifier in the **Attribute Inspector**. Run the workbook and click the New Splitview Menu Item button to open a new Splitview Window.\n>\n> 3. **Bonus** - Edit the Storyboard, select the different Segues created above and use the **Attribute Inspector** to try the effect of changing the properties\n>\n> ⚠️ These changes won't take effect until the workbook is re-run from the beginning.\n\n## Starting the App and Displaying the Default Menu Bar and Window\n\nWith this code in place, an instance of the `AppDelegate` can be created which will display the Main Menu and the Initial View (as defined in the Storyboard):\n\n```csharp\n// Initialize and display the app\nvar appDelegate = new AppDelegate(usingStoryboard);\n```"
  },
  {
    "path": "mac/user-interface/tableview/NSTableView.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacMobile\n---\n\n# Working with Table Views\n\n#### Using a Table View in a Xamarin.Mac Application\n\nThis workbook will cover the steps required to add a Table View (`NSTableView`) to a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\n## Creating the Table View\n\n`NSTableView` is a native cocoa control for displaying data in a table. Start by creating an instance and set its `Frame` property to a reasonable size. It will be autosized via an owning `NSClipView`:\n\n```csharp\n// Get the parent window's frame\nvar frame = MainWindow.ContentView.Frame;\n\n// Make a new table view and have it fill the parent window\nNSTableView tableView = new NSTableView () {\n\tFrame = frame\n};\n```\n\n## Adding the Table Columns\n\nEvery `NSTableView` expected to have at least one `NSTableColumn`. The following code adds two columns to the Table:\n\n```csharp\n// Add two columns to the table\ntableView.AddColumn (new NSTableColumn (\"Values\"));\ntableView.AddColumn (new NSTableColumn (\"Data\"));\n```\n\n## Adding the Clip View\n\n`NSTableView` expects to be hosted inside an `NSClipView`.The following code creates the required Clip View and adds the Table View to it:\n\n```csharp\n// Create the required clipping view and set it to\n// resize both horizontally and vertically as the\n// parent window resizes.\nNSClipView clipView = new NSClipView (frame) {\n\t\tAutoresizingMask = NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable\n};\n\n// Attach the table view to the clip view\nclipView.DocumentView = tableView;\n```\n\nNext, add the Clip View to the Window’s Content View to display the Table:\n\n```csharp\n// Attach the clip view to the main window\nMainWindow.ContentView = clipView;\n```\n\n## Adding Data to the Table\n\n`NSTableView` uses a two classes, a `DataSource` and `Delegate`, to determine what data to display. `NSTableView` can be used in two different “modes”: *Cell Based* or *View Based*.\n\nDifferent overrides apply to each of these modes, such that overriding some of the Cell Based methods will prevent the View Based methods from being called. According to Apple, Cell Based Tables have been deprecated and View Based Tables should be used for all modern macOS development.\n\nThe `Delegate` receives events associated with user action and determine how an item should be visualized.\n\n### Providing Sample Data\n\nThis sample will just use the name of the row number:\n\n```csharp\n// Create the sample data for the table to display\nstatic string [] NumberWords = new[] { \"Zero\", \"One\", \"Two\", \"Three\", \"Four\", \"Five\", \"Six\", \"Seven\", \"Eight\", \"Nine\" };\n```\n\n### Creating the Cells for the Table\n\nFor every Row and Column, the Table View calls its `Delegate` to provide the individual Cells. By calling `MakeView` method of the Table View with an identifier, existing views can be recycled, which can improve performance:\n\n```csharp\nclass TableDelegate : NSTableViewDelegate \n{\n    // Provide an ID for each cell so it can be reused\n\tconst string identifer = \"myCellIdentifier\";\n\n    // Generate a new view to act as the cell for each table row and column\n\tpublic override NSView GetViewForItem (NSTableView tableView, NSTableColumn tableColumn, nint row)\n\t{\n        // Ask the table view to reuse a cell\n\t\tNSTextField view = (NSTextField)tableView.MakeView (identifer, this);\n\n        // Was a reusable cell available?\n\t\tif (view == null) {\n            // No, create a new cell\n\t\t\tview = new NSTextField ();\n\t\t\tview.Identifier = identifer;\n\t\t\tview.Bordered = false;\n\t\t\tview.Selectable = false;\n\t\t\tview.Editable = false;\n\t\t}\n\n        // Populate the cell\n\t\tview.StringValue = tableColumn.Identifier == \"Values\" ? (NSString)row.ToString () : (NSString)NumberWords [row];\n\n        // Return the fully populated cell\n\t\treturn view;\t\t\t\n\t}\n}\n```\n\n### Add a Table Data Source\n\n`TableDataSource` defines the structures of the Table. In the case of a macOS Table, it simply provides the number of rows in the Table:\n\n```csharp\nclass TableDataSource : NSTableViewDataSource\n{\n    // Return the number of rows in the table\n\tpublic override nint GetRowCount (NSTableView tableView)\n\t{\n\t\treturn 10;\n\t}\n}\n```\n\n>💡**Note:** Optionally, both the Table Data Source and the Table Delegate could have been implemented as one class that conforms to the `INSTableViewDataSource` and `INSTableViewDelegate` interfaces.\n\n\n### Displaying the Data\n\nHooking up the `Delegate` and `DataSource` to the `NSTableView` is the final step. This is populate the table with the sample data:\n\n```csharp\n// Attach the data source and delegate to populate the table\ntableView.DataSource = new TableDataSource ();\ntableView.Delegate = new TableDelegate ();\n```"
  },
  {
    "path": "mac/user-interface/tableview/README.md",
    "content": "Working with Table Views Workbook\n============\n\nThis workbook will cover the steps required to add a Table View (`NSTableView`) to a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\n![](screenshots/Intro01.png)"
  },
  {
    "path": "mac/user-interface/toolbars/README.md",
    "content": "Working with Toolbars Workbook\n============\n\nThis workbook will cover the steps required to add a Toolbar (NSToolBar) to a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\n![](screenshots/Intro01.png)"
  },
  {
    "path": "mac/user-interface/toolbars/toolbars.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacMobile\n---\n\n# Working with Toolbars\n\n#### Using a Toolbar in a Xamarin.Mac Application\n\nThis workbook will cover the steps required to add a Toolbar (`NSToolBar`) to a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\nWhile Toolbars are typically created in Interface Builder, the steps required to configure, update and respond to Toolbar Item events are the same and the knowledge learned here can be applied to a Toolbar built in a  `.storyboard` or `.xib` file. For more information, please see our [Toolbars](https://developer.xamarin.com/guides/mac/user-interface/working-with-toolbars/) documentation.\n\n## Defining the UI in Interface Builder\n\nBefore diving into the process of building a Toolbar in code, let’s quickly review how a macOS app’s UI is normally created. Typically, a Xamarin.Mac app’s User Interface is defined in one or more `.storyboard` or `.xib` files added to the project’s hierarchy. For example:\n\n![](Images/Xcode01.png)\n\nDouble-clicking this file will open it in Xcode’s Interface Builder where the Menus, Windows, Controls and Segues that make up the app’s UI can be defined visually. For example:\n\n![](Images/Xcode02.png)\n\nWhen the UI layout is completed, the graphical elements that make up the UI are then exposed via **Actions** and **Outlets,** making them accessible to code. When the developer saves their changes to the `Main.storyboard` file and returns to Xamarin Studio, these changes are synced with the Xamarin.Mac app’s Project File and the UI elements are then accessible in C#.\n\n## Creating a Toolbar Delegate\n\nAs seen above, a `NSToolBar` is typically added to Window (`NSWindow`) in Xcode’s Interface Builder where the developer graphically creates the Toolbar by adding and configuring Toolbar Items, configuring the Default Toolbar and setting the appearance.\n\nBecause the Toolbar used in this workbook will be created fully in code, the first thing required is a Toolbar Delegate (`NSToolbarDelegate`) that will handle the definition of the Toolbar Items that are available, that will create the individual Toolbar Items (as needed) and will define the Default Toolbar that is initially displayed to the end user:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\n\npublic class MainToolbarDelegate : NSToolbarDelegate\n{\n    #region Constructors\n    public MainToolbarDelegate ()\n    {\n    }\n    #endregion\n\n    #region Private Methods\n    // Build and return a custom Toolbar Item\n    private NSToolbarItem BuildItem (string identifier)\n    {\n        // Create new toolbar item\n        var item = new NSToolbarItem (identifier);\n\n        // Set properties\n        item.Image = new NSImage($\"Images/{identifier}.png\");\n        item.Label = identifier;\n        item.PaletteLabel = identifier;\n        item.Enabled = true;\n\n        // Attach an action event\n        item.Activated += (sender, e) => {\n            RaiseToolbarItemClicked(item.Identifier);\n\t\t};\n\n        // Return new item\n        return item;\n    }\n    #endregion\n\n    #region Override Methods\n    public override string [] AllowedItemIdentifiers (NSToolbar toolbar)\n    {\n        // Return the list of available item identifiers\n        return new string [] {\"One\",\"Two\",\"Three\",\"Four\",\"Five\",\"Six\",\"Seven\",\"Eight\",\"NSToolbarSpaceItem\",\"NSToolbarFlexibleSpaceItem\",\"NSToolbarShowColorsItem\",\"NSToolbarShowFontsItem\",\"NSToolbarPrintItem\" };\n    }\n\n    public override string [] DefaultItemIdentifiers (NSToolbar toolbar)\n    {\n        // Return the item identifiers that make up the default Toolbar\n        return new string [] { \"One\",\"Two\" };\n    }\n\n    public override string [] SelectableItemIdentifiers (NSToolbar toolbar)\n\t{\n        // Return the item identifiers that can be selected (turned on and off like\n        // a switch)\n\t\treturn new string [] { \"Six\", \"Seven\", \"Eight\"  };\n\t}\n\n    public override void WillAddItem (NSNotification notification)\n    {\n        \n    }\n\n    public override NSToolbarItem WillInsertItem (NSToolbar toolbar, string itemIdentifier, bool willBeInserted)\n    {\n        NSToolbarItem item = null;\n\n        // Take action based on the Identifier\n        switch(itemIdentifier){\n        case \"NSToolbarSpaceItem\":\n            item = new NSToolbarItem(\"NSToolbarSpaceItem\");\n            item.Label = \"Space\";\n            item.PaletteLabel = \"Space\";\n            break;\n        case \"NSToolbarFlexibleSpaceItem\":\n            item = new NSToolbarItem(\"NSToolbarFlexibleSpaceItem\");\n            item.Label = \"Flexible Space\";\n            item.PaletteLabel = \"Flexible Space\";\n            break;\n        case \"NSToolbarShowColorsItem\":\n            item = new NSToolbarItem(\"NSToolbarShowColorsItem\");\n            item.Label = \"Colors\";\n            item.PaletteLabel = \"Colors\";\n            break;\n        case \"NSToolbarShowFontsItem\":\n            item = new NSToolbarItem(\"NSToolbarShowFontsItem\");\n            item.Label = \"Fonts\";\n            item.PaletteLabel = \"Fonts\";\n            break;\n        case \"NSToolbarPrintItem\":\n            item = new NSToolbarItem(\"NSToolbarPrintItem\");\n            item.Label = \"Print\";\n            item.PaletteLabel = \"Print\";\n            break;\n        default:\n            item = BuildItem (itemIdentifier);\n            break;\n        }\n\n        return item;\n    }\n    #endregion\n\n    #region Events\n    // Create a custom event to inform the caller when a user clicks\n    // on one of the Toolbar Items.\n    public delegate void ToolbarItemClickedDelegate(string identifier);\n    public event ToolbarItemClickedDelegate ToolbarItemClicked;\n\n    // If the caller has subscribed to the custom event, inform them\n    // it is being raised.\n    internal void RaiseToolbarItemClicked(string identifier){\n        if (this.ToolbarItemClicked != null) this.ToolbarItemClicked(identifier);\n    }\n    #endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. First, the `AllowedItemIdentifiers` method returns a list of string based identifiers specifying the allowable items that can be placed on the Toolbar.  If the Toolbar is end user customizable, this method will provide the list of items that the user can add to the Toolbar that might not already be on it by default.\n\nIn addition to the list of Identifiers that define the custom items for this Toolbar, several built-in Toolbar Items provided by macOS are included as follows:\n\n* `NSToolbarSpaceItem` - Inserts a fixed width space into the Toolbar.\n\n* `NSToolbarFlexibleSpaceItem` - Inserts a flexible width space into the Toolbar. This can be used to send the following items to the right side of the bar, for example.\n\n* `NSToolbarShowColorsItem` - Inserts a standard Color Picker into the Toolbar.\n\n* `NSToolbarShowFontsItem` - Inserts a standard Font Picker into the Toolbar.\n\n* `NSToolbarPrintItem` - Inserts a standard Print Dialog Box into the Toolbar.\n\nThe `DefaultItemIdentifiers` method returns a list of Item Identifiers (as defined in the `AllowedItemIdentifiers` method) that will form the Default Toolbar initially displayed to the end user. Again, if the Toolbar is end user customizable, this method will provide the list of default items that the user can use to reset the Toolbar to its default state.\n\nThe `SelectableItemIdentifiers` method returns a list of Item Identifiers (as defined in the `AllowedItemIdentifiers` method) that can be selected by the user. Selectable Toolbar Items have an on/off state like a switch. Only one Selectable Toolbar Item can be selected at any giving time in the Toolbar. For example:\n\n![](Images/Selectable01.png)\n\nThe `WillInsertItem` method is called when the Toolbar is requesting a new Toolbar Item (`NSToolbarItem`) for a specific Item Identifier. If the passed in `itemIdentifier` is one of the built-in Toolbar Items provided by macOS (such as `NSToolbarShowColorsItem`) it is created and returned, else the `BuildItem` method is called to create a custom item and return it.\n\nThe `BuildItem` method creates a new custom `NSToolbarItem` based on the Identifier passed in. For the sake of this example, it will have an icon from a file named the same as the Identifier (included in the Images resources for this workbook) and will use the Identifier for both the `Label` and the `PaletteLabel` title.\n\nThe `Label` will be displayed under the icon when the item is placed on a Toolbar. The `PaletteLabel` is displayed under the item when it is on the Customize Dialog:\n\n![](Images/Customize01.png)\n\nLastly, a custom event, `ToolbarItemClicked`, was defined that the Toolbar’s parent View or View Controller can subscribe to and be informed when the user clicks a Toolbar Item. Every Toolbar Item created by the `BuildItem` method will raise this event when clicked.\n\nBecause the Toolbar Delegate is subscribing to the Toolbar Item’s `Activated` event, all the items will be automatically be enabled when the Toolbar is displayed. See the **Enabling and Disabling Toolbar Items** section below for more information.\n\n> 💡**Try It Now**\n>\n> 1. Change the Default Toolbar that is initially displayed to the user.\n> 2. Add a Wallet item to the list of Available Toolbar Items and the Default Toolbar. _**Hint**: a `Wallet.png` file has been included in the Images resources for this workbook._\n>\n> ⚠️ These changes wont take effect until a new instance of the Window that houses the Toolbar is instantiated in the **Displaying the Toolbar in a Window** section below.\n\n### Toolbar Item Properties\n\nWhen the Toolbar Delegate (`NSToolbarDelegate`) creates a new instance of the Toolbar Item (`NSToolbarItem`) in the `WillInsertItem` method, there are several properties that the developer can set:\n\n* `AllowsDuplicateInToolbar` - If `true`, the user can place more than one instance in the Toolbar when they customize it, else they cannot.\n\n* `Enabled` - Gets or sets the enabled state of the Toolbar Item. Because of the way Toolbar Items are automatically validated by macOS, simply setting this value to `false` is typically not enough to keep it disabled. See the **Enabling and Disabling Toolbar Items** section below for more information.\n\n* `Identifier` - Uniquely identifies the Toolbar Item as a custom type defined by the macOS app or one of the built-in types (such as `NSToolbarShowColorsItem` or `NSToolbarFlexibleSpaceItem`).\n\n* `Image` - Defines the icon for the Toolbar Item as a `NSImage`.\n\n* `Label` - This is the text that will be displayed for the item when it is on the Toolbar.\n\n* `PaletteLabel` - This is the text for the item in the **Allowed Toolbar Items** area of the Customize Dialog.\n\n* `Tag` - Is an integer value that can optionally set by the developer to help identify or hold state information for the item in code.\n\n* `ToolTip` - A string value that will be displayed to the user when they hover the mouse over the Toolbar Item to given them an indication of what clicking the item will do.\n\n* `View` - Allow the developer to attach other types of controls to a Toolbar Item such a `NSTextFields` or `NSButtons`. Please see the **Adding Other UI Controls to a Toolbar** section below for more information.\n\n> 💡**Try It Now**\n>\n> 1. Add a `ToolTip` to each Toolbar Item created in the `MainToolbarDelegate`. ***Hint**: this will need to be done inside of the `BuildItem` method.*\n> 2. Add a unique Tag to each Toolbar Item created in the `MainToolbarDelegate`.\n>\n> ⚠️ These changes wont take effect until a new instance of the Window that houses the Toolbar is instantiated in the **Displaying the Toolbar in a Window** section below.\n\n## Creating a Custom Toolbar\n\nSince this workbook is creating a Toolbar completely from code, a custom class is being used to define and configure the Toolbar:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\n\npublic class MainToolbar : NSToolbar\n{\n\t#region Computed Properties\n\tpublic MainToolbarDelegate ToolbarDelegate {\n\t\tget { return Delegate as MainToolbarDelegate; }\n\t\tset { Delegate = value; }\n\t}\n\t#endregion\n\n\t#region Constructors\n\tpublic MainToolbar (string identifier) : base (identifier)\n\t{\n\t\t// Initialize\n\t\tthis.ToolbarDelegate = new MainToolbarDelegate ();\n\t\tthis.AllowsUserCustomization = true;\n        this.AutosavesConfiguration = false;\n        this.DisplayMode = NSToolbarDisplayMode.Default;\n        this.SizeMode = NSToolbarSizeMode.Default;\n\t}\n\t#endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. First, it defines a `ToolbarDelegate` computed property to make accessing the custom `MainToolbarDelegate` (created above) easier.\n\nWhen a new instance of the Toolbar is created, a new `MainToolbarDelegate` is also created and attached to the `ToolbarDelegate` computed property. Additionally, the look and functionality of the Toolbar is being configured as follows:\n\n* `AllowsUserCustomization` - If `true`, the user can right-click and customize the items that are displayed on the Toolbar.\n\n* `AutosavesConfiguration` - If `true`, the system will automatically save any customization that the user does to the Toolbar.\n\n* `DisplayMode` - Controls how the items are displayed on the Toolbar as: `Default`, `Icon`, `IconAndLabel` or `Label`.\n\n* `SizeMode` - Controls the size of the items on the Toolbar as: `Default`, `Regular` or `Small`.\n\nBoth the `DisplayMode` and `SizeMode` properties can be affected by the type of Window that the Toolbar is attached to and will render some of the modes unavailable.\n\n> 💡**Try It Now**\n>\n> 1. Don’t allow the user to customize the Toolbar.\n> 2. Pick a different `DisplayMode`.\n> 3. Pick a different `SizeMode`.\n>\n> ⚠️ These changes wont take effect until a new instance of the Window that houses the Toolbar is instantiated in the **Displaying the Toolbar in a Window** section below.\n\n## External Resources\n\nTo focus on the `NSToolbar` only, all of the supporting code to build the required Windows, Window Controllers, Views and View Controller has been moved to an external file that is being loaded below:\n\n```csharp\n// The implementation of these supporting controllers is not important to \n// understanding the `NSToolBar` control so they have been moved\n// to an external file.\n#load \"toolbar-resources.csx\"\n```\n\nThis code implements a static `ToolbarResources` class that will be used throughout the rest of this workbook to open Windows that unitize the `MainToolbar` and `MainToolbarDelegate` classes created above. For example:\n\n```csharp\n// Build new window\nvar contentRect = new CGRect (0, 100, 600, 500);\nvar aWindow = new NSWindow (contentRect, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable), NSBackingStore.Buffered, false);\n\n// Build new toolbar\nvar toolbar = new MainToolbar (\"MainToolbar\");\n\n// Wireup toolbar events\ntoolbar.ToolbarDelegate.ToolbarItemClicked += (identifier) => {\n    // Do something when the user clicks a toolbar item...\n};\n\n// Attach the toolbar to the window\naWindow.Toolbar = toolbar;\n```\n\nFor more information on working with Windows, Window Controllers, Views and View Controller in code, please see our [.storyboard/.xib Less User Interface Design](https://developer.xamarin.com/guides/mac/application_fundamentals/xibless-ui/)  workbook and documentation.\n\n## Displaying the Toolbar in a Window\n\nHow a Toolbar is finally rendered and displayed to the end user and what Display and Size Modes are available depends on the style of Window the Toolbar is attached to. As of macOS Sierra there are two available styles of Windows:\n\n* **Traditional** - These are typical of the Windows displayed by OS X where there is a separate Title and Toolbar area.\n\n* **Modern** - In macOS Sierra, the Title and Toolbar areas can be combined. Additionally, the Content Area can be extended and displayed under the combined Title and Toolbar areas. For “shoebox” types of single Window apps, a new Dark Theme is also available.\n\nTo see how the Toolbar created above looks on a Traditional Window, run the code segment below:\n\n```csharp\n// Use the factory to create and display a new traditional style\n// window that uses the custom toolbar\nToolbarResources.OpenNewTraditionalWindow();\n```\n\nNext, to see how the same Toolbar looks on a Modern Window, run the following code segment:\n\n```csharp\n// Use the factory to create and display a new modern style\n// window that uses the custom toolbar\nToolbarResources.OpenNewModernWindow();\n```\n\nEvery time either one of these code blocks are run, a new Window will be created with the latest version of the `MainToolbar` and it will be displayed in a tab grouped by Traditional or Modern Window types.\n\n> ⚠️ **WARNING!** *Support for automatically tabbed windows is currently unavailable in the Version 01.00.00 of Xamarin Workbooks. This feature will be restored in a future release.*\n\n> ⚠️ **Note**: Because of the way that `NSToolBars` are handled by macOS, all of the `NSWindows` within a given app share a single Toolbar instance based on the Identifier assigned the to the Toolbar  when it was created. As a result, changing the Toolbar in one Window will affect the Toolbars on all other open Windows in the app that used the same Identifier to build the Toolbar.\n\n## User Toolbar Customization\n\nIf the `AllowsUserCustomization` property of the `NSToolbar` has been set to `true`, the end user will be able to right-click on the Toolbar and adjust several of its display properties:\n\n![](Images/Customize02.png)\n\nThe top set of options relate to the `DisplayMode` property and the middle option to the `SizeMode` property of the Toolbar. The final option, **Customize Toolbar…**, allows the user to fully customize the items on the Toolbar. For example:\n\n![](Images/Customize03.png)\n\nThe items in the **Drag your favorite items into the toolbar…** section come from the `AllowedItemIdentifiers` method of the custom `MainToolbarDelegate` (created above) and the items in the **…or drag the default set into the toolbar** section come from the `DefaultItemIdentifiers` method.\n\n> 💡**Try It Now**\n>\n> 1. Switch the the running macOS app, right-click the Toolbar and customize it for the Traditional Style Windows.\n> 2. Switch the the running macOS app, right-click the Toolbar and customize it for the Modern Style Windows.\n\n## Hiding and Showing the Toolbar\n\nOnce the Toolbar is configured, attached to a Window and displayed to the user, a macOS app can programmatically hide and show it using the `Visible` property:\n\n```csharp\n// Hide or show the Toolbar on the last created Traditional Style Window\nToolbarResources.LastTraditionalWindowController.Window.Toolbar.Visible = true;\n\n// Hide or show the Toolbar on the last created Modern Style Window\nToolbarResources.LastModernWindowController.Window.Toolbar.Visible = true;\n```\n\n> 💡**Try It Now**\n>\n> 1. Set `Visible` to `false` to hide the Toolbars.\n> 2. Set `Visible` to `true` to show the Toolbars.\n\n## Working with Toolbar Items\n\nAfter a Toolbar is created and displayed to the user, the developer can access each Toolbar Item currently visible on the Toolbar using the `Items` property. For example, the following code returns the first item on the current Toolbar:\n\n```csharp\n// Access the first Toolbar item\nvar toolbar = ToolbarResources.LastTraditionalWindowController.Window.Toolbar;\nvar firstItem = toolbar.Items[0];\n```\n\nOnce the item has been accessed, several of its properties can be modified, such as the `Label` or `Tooltip`:\n\n```csharp\n// Change the current label\nfirstItem.Label = \"Certificate\";\nfirstItem.ToolTip = \"Create a new certificate\";\n```\n\n> 💡**Try It Now**\n>\n> 1. Give the first Toolbar Item a new `Label`.\n> 2. Give the first Toolbar Item a new `Tooltip`.\n> 3. Access the last item in the Toolbar and change its `Label`. _**Hint**: Use the `Count()` method of the `Items` array._\n\n## Hiding and Showing Toolbar Items\n\nToolbars in a macOS app have different usability guidelines than Toolbars in an iOS or a Window application. Because Apple wants the user to have total control over the items and their layout within a Toolbar, no method is provided to hide and show individual Toolbar Items. Instead, Apple wants the developer to simply enable or disable items based on the current context of the user’s actions within the app.\n\n## Enabling and Disabling Toolbar Items\n\nBecause of the way macOS handles both Toolbars and Toolbar Items, simply setting the `Enabled` property of a `NSToolbarItem` typically isn’t enough to disable an item on a Toolbar. To disable a Toolbar Item, the developer needs to create a custom instance of `NSToobarItem,` override the `Validate` method and use this custom instance when creating items in the Toolbar Delegate or when adding items to the Toolbar inside of Xcode’s Interface Builder:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\n\n[Register(\"ManuallyEnabledToolbarItem\")]\npublic class ManuallyEnabledToolbarItem : NSToolbarItem\n{\n    #region Computed Properties\n    public bool Disabled { get; set;} = false;\n    #endregion\n\n    #region Constructors\n    public ManuallyEnabledToolbarItem ()\n    {\n    }\n\n    public ManuallyEnabledToolbarItem (IntPtr handle) : base (handle)\n    {\n    }\n\n    public ManuallyEnabledToolbarItem (NSObjectFlag  t) : base (t)\n    {\n    }\n\n    public ManuallyEnabledToolbarItem (string identifier) : base (identifier)\n    {\n    }\n    #endregion\n\n    #region Override Methods\n    public override void Validate ()\n    {\n        base.Validate ();\n\n        // Set the enabled state of the Toolbar Item\n        Enabled = !Disabled;\n    }\n    #endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. First, it creates a `Disabled` computed property to hold the enabled/disabled state of the Toolbar Item. Again, the built-in `Enabled` property cannot be used because it will be overriden when the system auto-validated the Toolbar.\n\nThe `Validate` method is overridden and the `Enabled` property of the Toolbar Item is set. When the system begins to validate a Toolbar against the current state of a macOS app, it will call the `Validate` method on every item in the Toolbar to set their enabled/disabled state.\n\nTo implement this new type of Toolbar Item, create a new Toolbar Delegate Type and use the `ManuallyEnabledToolbarItem` class in the `BuildItem` method:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\n\npublic class ModifableToolbarDelegate : NSToolbarDelegate\n{\n    #region Constructors\n    public ModifableToolbarDelegate ()\n    {\n    }\n    #endregion\n\n    #region Private Methods\n    // Build and return a custom Toolbar Item\n    private NSToolbarItem BuildItem (string identifier)\n    {\n        // Create new manually enabled toolbar item\n        var item = new ManuallyEnabledToolbarItem (identifier);\n\n        // Set properties\n        item.Image = new NSImage($\"Images/{identifier}.png\");\n        item.Label = identifier;\n        item.PaletteLabel = identifier;\n        item.Disabled = false;\n\n        // Attach an action event\n        item.Activated += (sender, e) => {\n            RaiseToolbarItemClicked(item.Identifier);\n\t\t};\n\n        // Return new item\n        return item;\n    }\n    #endregion\n\n    #region Override Methods\n    public override string [] AllowedItemIdentifiers (NSToolbar toolbar)\n    {\n        // Return the list of available item identifiers\n        return new string [] { \"One\",\"Two\",\"Three\",\"Four\",\"Five\",\"Six\",\"Seven\",\"Eight\" };\n    }\n\n    public override string [] DefaultItemIdentifiers (NSToolbar toolbar)\n    {\n        // Return the item identifiers that make up the default Toolbar\n        return new string [] { \"One\",\"Two\",\"Three\",\"Four\",\"Five\",\"Six\",\"Seven\",\"Eight\" };\n    }\n\n    public override NSToolbarItem WillInsertItem (NSToolbar toolbar, string itemIdentifier, bool willBeInserted)\n    {\n        // Build and return each item\n        return BuildItem (itemIdentifier);\n    }\n    #endregion\n\n    #region Events\n    // Create a custom event to inform the caller when a user clicks\n    // on one of the Toolbar Items.\n    public delegate void ToolbarItemClickedDelegate(string identifier);\n    public event ToolbarItemClickedDelegate ToolbarItemClicked;\n\n    // If the caller has subscribed to the custom event, inform them\n    // it is being raised.\n    internal void RaiseToolbarItemClicked(string identifier){\n        if (this.ToolbarItemClicked != null) this.ToolbarItemClicked(identifier);\n    }\n    #endregion\n}\n```\n\nAnd create a new custom Toolbar to use this new delegate:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\n\npublic class ModifableToolbar : NSToolbar\n{\n\t#region Computed Properties\n\tpublic ModifableToolbarDelegate ToolbarDelegate {\n\t\tget { return Delegate as ModifableToolbarDelegate; }\n\t\tset { Delegate = value; }\n\t}\n\t#endregion\n\n\t#region Constructors\n\tpublic ModifableToolbar (string identifier) : base (identifier)\n\t{\n\t\t// Initialize\n\t\tthis.ToolbarDelegate = new ModifableToolbarDelegate ();\n\t\tthis.AllowsUserCustomization = true;\n        this.AutosavesConfiguration = false;\n        this.DisplayMode = NSToolbarDisplayMode.Default;\n        this.SizeMode = NSToolbarSizeMode.Default;\n\t}\n\t#endregion\n}\n```\n\nWith this in place, create a new instance of the new custom Toolbar and attach it to an open window:\n\n```csharp\n// Create a new toolbar\nvar toolbar = new ModifableToolbar(\"ModifableToolbar\");\n\n// Attach it to the last opened window\nToolbarResources.LastTraditionalWindowController.Window.Toolbar = toolbar;\n```\n\nFinally, a given Toolbar Item instance can be selected and disabled in code:\n\n```csharp\n// Access the 3rd item in the Toolbar\nvar item = toolbar.Items[2] as ManuallyEnabledToolbarItem;\n\n// Disable the item\nitem.Disabled = true;\n```\n\n## Adding Other UI Controls to a Toolbar\n\nThe developer is not limited to the standard types of Toolbar Items when adding elements to a Toolbar. Several of the other Cocoa UI elements (such as Search Fields or Segment Controls) can be added to a Toolbar.\n\nTypically, this is done by editing the `.storyboard` or `.xib` file in Xcode’s Interface Builder, opening the Toolbar in the **Interface Hierarchy**, displaying the **Customize Dialog**  and dragging a UI control (such as  a Search Field) from the **Library Inspector** onto the **Allowed Toolbar Items** area.\n\nIn code, this is accomplished by attaching a newly built UI control to the `View` property of a Toolbar Item as it is being created. For example, as is being done in the `WillInsertItem` method of the Toolbar Delegate below for the “*Search*” Identifier:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\n\npublic class OtherToolbarDelegate : NSToolbarDelegate\n{\n    #region Constructors\n    public OtherToolbarDelegate ()\n    {\n    }\n    #endregion\n\n    #region Private Methods\n    // Build and return a custom Toolbar Item\n    private NSToolbarItem BuildItem (string identifier)\n    {\n        // Create new toolbar item\n        var item = new NSToolbarItem (identifier);\n\n        // Set properties\n        item.Image = new NSImage($\"Images/{identifier}.png\");\n        item.Label = identifier;\n        item.PaletteLabel = identifier;\n        item.Enabled = true;\n\n        // Attach an action event\n        item.Activated += (sender, e) => {\n            RaiseToolbarItemClicked(item.Identifier);\n\t\t};\n\n        // Return new item\n        return item;\n    }\n    #endregion\n\n    #region Override Methods\n    public override string [] AllowedItemIdentifiers (NSToolbar toolbar)\n    {\n        // Return the list of available item identifiers\n        return new string [] { \"One\",\"Two\",\"NSToolbarFlexibleSpaceItem\",\"Search\" };\n    }\n\n    public override string [] DefaultItemIdentifiers (NSToolbar toolbar)\n    {\n        // Return the item identifiers that make up the default Toolbar\n        return new string [] { \"One\",\"Two\",\"NSToolbarFlexibleSpaceItem\",\"Search\" };\n    }\n\n    public override NSToolbarItem WillInsertItem (NSToolbar toolbar, string itemIdentifier, bool willBeInserted)\n    {\n        NSToolbarItem item = null;\n\n        // Take action based on the Identifier\n        switch(itemIdentifier){\n        case \"NSToolbarFlexibleSpaceItem\":\n            item = new NSToolbarItem(\"NSToolbarFlexibleSpaceItem\");\n            item.Label = \"Flexible Space\";\n            item.PaletteLabel = \"Flexible Space\";\n            break;\n        case \"Search\":\n            // Create search text field\n            var search = new NSTextField(new CGRect(0,0,150,25)) {\n                Bordered = true,\n                Editable = true,\n                PlaceholderString = \"Search\"\n            };\n            \n            // Create a new search item with a text field for searching\n            item = new NSToolbarItem(\"Search\");\n            item.Label = \"Search\";\n            item.PaletteLabel = \"Search\";\n            item.MinSize = new CGSize(150,25);\n            item.View = search;\n            break;\n        default:\n            item = BuildItem (itemIdentifier);\n            break;\n        }\n\n        return item;\n    }\n    #endregion\n\n    #region Events\n    // Create a custom event to inform the caller when a user clicks\n    // on one of the Toolbar Items.\n    public delegate void ToolbarItemClickedDelegate(string identifier);\n    public event ToolbarItemClickedDelegate ToolbarItemClicked;\n\n    // If the caller has subscribed to the custom event, inform them\n    // it is being raised.\n    internal void RaiseToolbarItemClicked(string identifier){\n        if (this.ToolbarItemClicked != null) this.ToolbarItemClicked(identifier);\n    }\n    #endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. In the `WillInsertItem` method, it’s creating and configuring a new `NSTextField` to act as a Search field. When the control is created, its width (150px) and height (25px) are set using a `CGRect`.\n\nBefore the Text Field (`search`) is attached to the `View` property of the new Toolbar Item, the Minimum Size (`MinSize` property) is set to match the size of the `NSTextField` created (`item.MinSize = new CGSize(150,25);`). If this wasn’t done, the default built-in Toolbar Item size would be used and the `NSTextField` would be down-sized to fit into this new, smaller size.\n\nAgain, a new custom Toolbar is created to use this new delegate:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\n\npublic class OtherToolbar : NSToolbar\n{\n\t#region Computed Properties\n\tpublic OtherToolbarDelegate ToolbarDelegate {\n\t\tget { return Delegate as OtherToolbarDelegate; }\n\t\tset { Delegate = value; }\n\t}\n\t#endregion\n\n\t#region Constructors\n\tpublic OtherToolbar (string identifier) : base (identifier)\n\t{\n\t\t// Initialize\n\t\tthis.ToolbarDelegate = new OtherToolbarDelegate ();\n\t\tthis.AllowsUserCustomization = true;\n        this.AutosavesConfiguration = false;\n        this.DisplayMode = NSToolbarDisplayMode.Default;\n        this.SizeMode = NSToolbarSizeMode.Default;\n\t}\n\t#endregion\n}\n```\n\nAnd an instance of the new custom Toolbar is created and attach it to an open window:\n\n```csharp\n// Create a new toolbar\nvar toolbar = new OtherToolbar(\"OtherToolbar\");\n\n// Attach it to the last opened window\nToolbarResources.LastModernWindowController.Window.Toolbar = toolbar;\n```\n\nWhen the code block above is run, the last Modern Style Window created will be switched to use the new Toolbar including the Search field.\n\n"
  },
  {
    "path": "mac/user-interface/toolbars/toolbars.workbook/toolbar-resources.csx",
    "content": "﻿using System;\nusing Foundation;\nusing AppKit;\nusing CoreGraphics;\n\n\n// ==========================================================================\n// NOTE: This file contains the backing resources to create the Windows,\n// View Controllers and View needed to support the Working with Toolbars\n// Workbook. The implementation of these controllers is not important to \n// understanding the `NSToolBar` control so they have been moved here.\n// ==========================================================================\n\n\n\n/// <summary>\n/// The LayerBackedView class is used to create a modern View within a \n/// View Controller that is backed by a Core Graphics Layer.\n/// </summary>\npublic class LayerBackedView : NSView\n{\n\t#region Private Variables\n\t/// <summary>\n\t/// The color of the background.\n\t/// </summary>\n\tprivate NSColor _backgroundColor = NSColor.White;\n\t#endregion\n\n\t#region Computed Properties\n\t/// <summary>\n\t/// Gets a value indicating whether this <see cref=\"T:LayerBackedView\"/> wants layer.\n\t/// </summary>\n\t/// <value><c>true</c> if wants layer; otherwise, <c>false</c>.</value>\n\tpublic override bool WantsLayer {\n\t\tget { return true; }\n\t}\n\n\t/// <summary>\n\t/// Gets a value indicating whether this <see cref=\"T:LayerBackedView\"/> wants to update \n\t/// the layer.\n\t/// </summary>\n\t/// <value><c>true</c> if wants update layer; otherwise, <c>false</c>.</value>\n\tpublic override bool WantsUpdateLayer {\n\t\tget { return true; }\n\t}\n\n\t/// <summary>\n\t/// Gets or sets the color of the background.\n\t/// </summary>\n\t/// <value>The color of the background.</value>\n\tpublic NSColor BackgroundColor {\n\t\tget { return _backgroundColor; }\n\t\tset {\n\t\t\t// Save color\n\t\t\t_backgroundColor = value;\n\n\t\t\t// Force the view to update\n\t\t\tNeedsDisplay = true;\n\t\t}\n\t}\n\t#endregion\n\n\t#region Constructor\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:LayerBackedView\"/> class.\n\t/// </summary>\n\t/// <param name=\"handle\">Handle.</param>\n\tpublic LayerBackedView (IntPtr handle) : base (handle)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:LayerBackedView\"/> class.\n\t/// </summary>\n\t/// <param name=\"bounds\">Bounds.</param>\n\tpublic LayerBackedView (CGRect bounds) : base (bounds)\n\t{\n\t}\n\t#endregion\n\n\t#region Override Methods\n\t/// <summary>\n\t/// Updates the layer.\n\t/// </summary>\n\tpublic override void UpdateLayer ()\n\t{\n\t\tbase.UpdateLayer ();\n\n\t\t// Add the Core Graphics routines to draw the View's UI\n\t\tLayer.BackgroundColor = _backgroundColor.CGColor;\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// Traditional code based window that uses the traditional look and feel\n/// of an OS X Window. Typically this Window would be created in a Xcode\n/// Interface Builder `.storyboard` file. For the sake of this workbook,\n/// the Window is being created in code.\n/// </summary>\npublic class TraditionalCodeBasedWindow : NSWindow\n{\n\n\t#region Computed Properties\n\t/// <summary>\n\t/// Gets or sets the click me label.\n\t/// </summary>\n\t/// <value>The click me label.</value>\n\tpublic NSTextField ClickMeLabel { get; set; }\n\t#endregion\n\n\t#region Constructors\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:TraditionalCodeBasedWindow\"/> class.\n\t/// </summary>\n\t/// <param name=\"handle\">Handle.</param>\n\tpublic TraditionalCodeBasedWindow (IntPtr handle) : base (handle)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:TraditionalCodeBasedWindow\"/> class.\n\t/// </summary>\n\t/// <param name=\"coder\">Coder.</param>\n\t[Export (\"initWithCoder:\")]\n\tpublic TraditionalCodeBasedWindow (NSCoder coder) : base (coder)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:TraditionalCodeBasedWindow\"/> class.\n\t/// </summary>\n\t/// <param name=\"contentRect\">Content rect.</param>\n\t/// <param name=\"aStyle\">A style.</param>\n\t/// <param name=\"bufferingType\">Buffering type.</param>\n\t/// <param name=\"deferCreation\">If set to <c>true</c> defer creation.</param>\n\tpublic TraditionalCodeBasedWindow (CGRect contentRect, NSWindowStyle aStyle, NSBackingStore bufferingType, bool deferCreation) : base (contentRect, aStyle, bufferingType, deferCreation)\n\t{\n\t\t// Create a default title for the window\n\t\tTitle = \"Untitled\";\n\n\t\t// Create the content view for the window and make it fill the window\n\t\tContentView = new LayerBackedView (Frame);\n\n\t\t// _________________________________________________________________\n        // WARNING! \n        // The modern macOS App UI is currently unavaiable in the Version \n        // 0.99.0.0 of Xamarin Workbooks. This feature will be restored in a \n        // future release.\n        // _________________________________________________________________\n\t\t// Configure the Window to use Tabs\n\t\t// TabbingMode = NSWindowTabbingMode.Preferred;\n\t\t// TabbingIdentifier = \"Traditional\";\n\n\t\t// Define Window UI\n\t\tClickMeLabel = new NSTextField (new CGRect (10, Frame.Height - 125, Frame.Width - 20, 20)) {\n\t\t\tBackgroundColor = NSColor.Clear,\n\t\t\tTextColor = NSColor.LabelColor,\n\t\t\tEditable = false,\n\t\t\tBezeled = false,\n\t\t\tAutoresizingMask = NSViewResizingMask.WidthSizable | NSViewResizingMask.MinYMargin,\n\t\t\tStringValue = \"Click on a Toolbar item above.\"\n\t\t};\n\t\tContentView.AddSubview (ClickMeLabel);\n\t}\n\t#endregion\n\n\t#region Override Method\n\t/// <summary>\n\t/// Awakes from nib.\n\t/// </summary>\n\tpublic override void AwakeFromNib ()\n\t{\n\t\tbase.AwakeFromNib ();\n\n\t\t// Build and configure a new toolbar\n\t\tvar toolbar = new MainToolbar (\"TraditionalToolbar\");\n\n\t\t// Wireup toolbar events\n\t\ttoolbar.ToolbarDelegate.ToolbarItemClicked += (identifier) => {\n\t\t\tClickMeLabel.StringValue = $\"You clicked the {identifier} Toolbar Item.\";\n\t\t};\n\n\t\t// Attach toolbar to window\n\t\tthis.Toolbar = toolbar;\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// Traditional code based Window Controller instantiats and controls an instance of\n/// the `TraditionalCodeBasedWindow` defined above.\n/// </summary>\npublic class TraditionalCodeBasedWindowController : NSWindowController\n{\n\t#region Computed Properties\n\t/// <summary>\n\t/// Gets the window.\n\t/// </summary>\n\t/// <value>The window.</value>\n\tpublic new TraditionalCodeBasedWindow Window {\n\t\tget { return base.Window as TraditionalCodeBasedWindow; }\n\t}\n\t#endregion\n\n\t#region Constructors\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:TraditionalCodeBasedWindowController\"/> class.\n\t/// </summary>\n\t/// <param name=\"handle\">Handle.</param>\n\tpublic TraditionalCodeBasedWindowController (IntPtr handle) : base (handle)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:TraditionalCodeBasedWindowController\"/> class.\n\t/// </summary>\n\t/// <param name=\"coder\">Coder.</param>\n\t[Export (\"initWithCoder:\")]\n\tpublic TraditionalCodeBasedWindowController (NSCoder coder) : base (coder)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:TraditionalCodeBasedWindowController\"/> class.\n\t/// </summary>\n\tpublic TraditionalCodeBasedWindowController () : base (\"CodeBasedWindow\")\n\t{\n\t\t// Define the Window's default location and size\n\t\tCGRect contentRect = new CGRect (0, 0, 600, 500);\n\n\t\t// Create a new instance of the CodeBasedWindow\n\t\tbase.Window = new TraditionalCodeBasedWindow (contentRect, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable | NSWindowStyle.FullSizeContentView), NSBackingStore.Buffered, false);\n\n\t\t// Simulate Awaking from Nib\n\t\tWindow.AwakeFromNib ();\n\t}\n\t#endregion\n\n\t#region Override Methods\n\t/// <summary>\n\t/// Awakes from nib.\n\t/// </summary>\n\tpublic override void AwakeFromNib ()\n\t{\n\t\tbase.AwakeFromNib ();\n\t}\n\n\t// _________________________________________________________________\n    // WARNING! \n    // The modern macOS App UI is currently unavaiable in the Version \n    // 0.99.0.0 of Xamarin Workbooks. This feature will be restored in a \n    // future release.\n    // _________________________________________________________________\n\t/// <summary>\n\t/// Gets the new window for tab.\n\t/// </summary>\n\t/// <param name=\"sender\">Sender.</param>\n\t// public override void GetNewWindowForTab (NSObject sender)\n\t// {\n\t// \t// Create a new window when the Plus button is clicked\n\t// \tToolbarResources.OpenNewTraditionalWindow ();\n\t// }\n\t#endregion\n}\n\n/// <summary>\n/// Modern code based window that uses the modern look and feel\n/// of a macOS Sierra Window. Typically this Window would be created in a Xcode\n/// Interface Builder `.storyboard` file. For the sake of this workbook,\n/// the Window is being created in code.\n/// </summary>\npublic class ModernCodeBasedWindow : NSWindow\n{\n\n\t#region Computed Properties\n\t/// <summary>\n\t/// Gets or sets the click me label.\n\t/// </summary>\n\t/// <value>The click me label.</value>\n\tpublic NSTextField ClickMeLabel { get; set; }\n\t#endregion\n\n\t#region Constructors\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:ModernCodeBasedWindow\"/> class.\n\t/// </summary>\n\t/// <param name=\"handle\">Handle.</param>\n\tpublic ModernCodeBasedWindow (IntPtr handle) : base (handle)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:ModernCodeBasedWindow\"/> class.\n\t/// </summary>\n\t/// <param name=\"coder\">Coder.</param>\n\t[Export (\"initWithCoder:\")]\n\tpublic ModernCodeBasedWindow (NSCoder coder) : base (coder)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:ModernCodeBasedWindow\"/> class.\n\t/// </summary>\n\t/// <param name=\"contentRect\">Content rect.</param>\n\t/// <param name=\"aStyle\">A style.</param>\n\t/// <param name=\"bufferingType\">Buffering type.</param>\n\t/// <param name=\"deferCreation\">If set to <c>true</c> defer creation.</param>\n\tpublic ModernCodeBasedWindow (CGRect contentRect, NSWindowStyle aStyle, NSBackingStore bufferingType, bool deferCreation) : base (contentRect, aStyle, bufferingType, deferCreation)\n\t{\n\t\t// Create a default title for the window\n\t\tTitle = \"Untitled\";\n\n\t\t// Select the dark appearance\n\t\tAppearance = NSAppearance.GetAppearance (NSAppearance.NameVibrantDark);\n\n\t\t// Create the content view for the window and make it fill the window\n\t\tContentView = new LayerBackedView (Frame);\n\n\t\t// Hide the Title bar for a streamlined UI\n\t\tTitleVisibility = NSWindowTitleVisibility.Hidden;\n\n\t\t// _________________________________________________________________\n        // WARNING! \n        // The modern macOS App UI is currently unavaiable in the Version \n        // 0.99.0.0 of Xamarin Workbooks. This feature will be restored in a \n        // future release.\n        // _________________________________________________________________\n\t\t// Configure the Window to use Tabs\n\t\t// TabbingMode = NSWindowTabbingMode.Preferred;\n\t\t// TabbingIdentifier = \"Modern\";\n\n\t\t// Define Window UI\n\t\tClickMeLabel = new NSTextField (new CGRect (10, Frame.Height - 125, Frame.Width - 20, 20)) {\n\t\t\tBackgroundColor = NSColor.Clear,\n\t\t\tTextColor = NSColor.LabelColor,\n\t\t\tEditable = false,\n\t\t\tBezeled = false,\n\t\t\tAutoresizingMask = NSViewResizingMask.WidthSizable | NSViewResizingMask.MinYMargin,\n\t\t\tStringValue = \"Click on a Toolbar item above.\"\n\t\t};\n\t\tContentView.AddSubview (ClickMeLabel);\n\t}\n\t#endregion\n\n\t#region Override Method\n\t/// <summary>\n\t/// Awakes from nib.\n\t/// </summary>\n\tpublic override void AwakeFromNib ()\n\t{\n\t\tbase.AwakeFromNib ();\n\n\t\t// Build and configure a new toolbar\n\t\tvar toolbar = new MainToolbar (\"ModernToolbar\");\n\n\t\t// Wireup toolbar events\n\t\ttoolbar.ToolbarDelegate.ToolbarItemClicked += (identifier) => {\n\t\t\tClickMeLabel.StringValue = $\"You clicked the {identifier} Toolbar Item.\";\n\t\t};\n\n\t\t// Attach toolbar to window\n\t\tthis.Toolbar = toolbar;\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// Modern code based Window Controller instantiats and controls an instance of\n/// the `ModernCodeBasedWindow` defined above.\n/// </summary>\npublic class ModernCodeBasedWindowController : NSWindowController\n{\n\t#region Computed Properties\n\t/// <summary>\n\t/// Gets the window.\n\t/// </summary>\n\t/// <value>The window.</value>\n\tpublic new ModernCodeBasedWindow Window {\n\t\tget { return base.Window as ModernCodeBasedWindow; }\n\t}\n\t#endregion\n\n\t#region Constructors\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:ModernCodeBasedWindowController\"/> class.\n\t/// </summary>\n\t/// <param name=\"handle\">Handle.</param>\n\tpublic ModernCodeBasedWindowController (IntPtr handle) : base (handle)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:ModernCodeBasedWindowController\"/> class.\n\t/// </summary>\n\t/// <param name=\"coder\">Coder.</param>\n\t[Export (\"initWithCoder:\")]\n\tpublic ModernCodeBasedWindowController (NSCoder coder) : base (coder)\n\t{\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:ModernCodeBasedWindowController\"/> class.\n\t/// </summary>\n\tpublic ModernCodeBasedWindowController () : base (\"CodeBasedWindow\")\n\t{\n\t\t// Define the Window's default location and size\n\t\tCGRect contentRect = new CGRect (0, 100, 600, 500);\n\n\t\t// Create a new instance of the CodeBasedWindow\n\t\tbase.Window = new ModernCodeBasedWindow (contentRect, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable | NSWindowStyle.FullSizeContentView | NSWindowStyle.UnifiedTitleAndToolbar), NSBackingStore.Buffered, false);\n\n\t\t// Simulate Awaking from Nib\n\t\tWindow.AwakeFromNib ();\n\t}\n\t#endregion\n\n\t#region Override Methods\n\t/// <summary>\n\t/// Awakes from nib.\n\t/// </summary>\n\tpublic override void AwakeFromNib ()\n\t{\n\t\tbase.AwakeFromNib ();\n\t}\n\n\t// _________________________________________________________________\n    // WARNING! \n    // The modern macOS App UI is currently unavaiable in the Version \n    // 0.99.0.0 of Xamarin Workbooks. This feature will be restored in a \n    // future release.\n    // _________________________________________________________________\n\t/// <summary>\n\t/// Gets the new window for tab.\n\t/// </summary>\n\t/// <param name=\"sender\">Sender.</param>\n\t// public override void GetNewWindowForTab (NSObject sender)\n\t// {\n\t// \t// Create a new window when the Plus button is clicked\n\t// \tToolbarResources.OpenNewModernWindow ();\n\t// }\n\t#endregion\n}\n\n/// <summary>\n/// Toolbar resources is a static helper class that creates and maintains\n/// instances of the Windows, View Controllers and Views needed to support\n/// playing with a `NSToolbar` control in a Workbook.\n/// </summary>\npublic static class ToolbarResources\n{\n\t#region Computed Properties\n\t/// <summary>\n\t/// Gets or sets the traditional window count.\n\t/// </summary>\n\t/// <value>The traditional window count.</value>\n\tpublic static int TraditionalWindowCount { get; set; } = 0;\n\n\t/// <summary>\n\t/// Gets or sets the last traditional window controller.\n\t/// </summary>\n\t/// <value>The last traditional window controller.</value>\n\tpublic static TraditionalCodeBasedWindowController LastTraditionalWindowController { get; set; } = null;\n\n\t/// <summary>\n\t/// Gets or sets the modern window count.\n\t/// </summary>\n\t/// <value>The modern window count.</value>\n\tpublic static int ModernWindowCount { get; set; } = 0;\n\n\t/// <summary>\n\t/// Gets or sets the last modern window controller.\n\t/// </summary>\n\t/// <value>The last modern window controller.</value>\n\tpublic static ModernCodeBasedWindowController LastModernWindowController { get; set; } = null;\n\t#endregion\n\n\t#region Controller Factories\n\t/// <summary>\n\t/// Opens and displays a new traditional window.\n\t/// </summary>\n\tpublic static void OpenNewTraditionalWindow ()\n\t{\n\t\t// Create a new instace of the Traditional Window Controller\n\t\tLastTraditionalWindowController = new TraditionalCodeBasedWindowController ();\n\n\t\t// Set the title\n\t\tLastTraditionalWindowController.Window.Title = (TraditionalWindowCount++ == 0) ? \"Untitled\" : $\"Untitled {TraditionalWindowCount}\";\n\t\n\t\t// Display the Window\n\t\tLastTraditionalWindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n\t}\n\n\t/// <summary>\n\t/// Opens and displays a new modern window.\n\t/// </summary>\n\tpublic static void OpenNewModernWindow ()\n\t{\n\t\t// Create a new instace of the Traditional Window Controller\n\t\tLastModernWindowController = new ModernCodeBasedWindowController ();\n\n\t\t// Set the title\n\t\tLastModernWindowController.Window.Title = (ModernWindowCount++ == 0) ? \"Untitled\" : $\"Untitled {ModernWindowCount}\";\n\n\t\t// Display the Window\n\t\tLastModernWindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n\t}\n\t#endregion\n}\n"
  },
  {
    "path": "mac/user-interface/ui-in-code/README.md",
    "content": ".storyboard/.xib Less User Interface Design Workbook\n============\n\nThis workbook will cover the steps required to build a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file.\n\n![](screenshots/Intro01.png)"
  },
  {
    "path": "mac/user-interface/ui-in-code/codebasedui.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacMobile\n---\n\n# .storyboard/.xib Less User Interface Design\n\n## How to create a Xamarin.Mac app's UI from C# code\n\nThis workbook will cover the steps required to build a Xamarin.Mac app's User Interface directly from C# code without using a Xcode's Interface Builder `.storyboard` or `.xib` file. For more information, please see our [.storyboard/.xib Less User Interface Design](https://developer.xamarin.com/guides/mac/application_fundamentals/xibless-ui/) documentation.\n\nCreating a Modern macOS App User Interface in code, such as the ones used in Apple's Safari web browser, Pages word processor and Numbers spread sheet app is also covered at the end of this workbook. For more information, please see our [Building Modern macOS Apps](https://developer.xamarin.com/guides/mac/platform-features/introduction-to-macos-sierra/modern-cocoa-apps/) documentation\n\n## Defining the UI in Interface Builder\n\nBefore diving into the process of building a Xamarin.Mac app’s User Interface in code, let’s quickly review how a macOS app’s UI is normally created. Typically, a Xamarin.Mac app’s User Interface is defined in one or more `.storyboard` or `.xib` files added to the project’s hierarchy. For example:\n\n![](Images/Xcode01.png)\n\nDouble-clicking this file will open it in Xcode’s Interface Builder where the Menus, Windows, Controls and Segues that make up the app’s UI can be defined visually. For example:\n\n![](Images/Xcode02.png)\n\nWhen the UI layout is completed, the graphical elements that make up the UI are then exposed via **Actions** and **Outlets,** making them accessible to code. When the developer saves their changes to the `Main.storyboard` file and returns to Xamarin Studio, these changes are synced with the Xamarin.Mac app’s Project File and the UI elements are then accessible in C#.\n\n## Defining the UI in Code\n\nAll macOS app’s User Interfaces are based off of a MVC (Model View Controller) methodology. As shown above, this is typically defined in a `.storyboard` or `.xib` file. When creating the User Interface directly in code, the developer will be responsible for building and properly initializing both the Window (`NSWindow`) and its Window Controller (`NSWindowController`).\n\n### Defining the Window\n\nThe first thing that will need to be done, is to create a Window (`NSWindow`) to hold all of the elements that will go into building the Xamarin.Mac app’s UI. Start by creating a custom class to layout and initialize this window:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing CoreGraphics;\n\npublic class CodeBasedWindow : NSWindow {\n\n    #region Private Variables\n    private int NumberOfTimesClicked = 0;\n    #endregion\n\n    #region Computed Properties\n    public NSButton ClickMeButton { get; set;}\n    public NSTextField ClickMeLabel { get ; set;}\n    #endregion\n\n    #region Constructors\n    public CodeBasedWindow (IntPtr handle) : base (handle)\n    {\n    }\n\n    [Export (\"initWithCoder:\")]\n    public CodeBasedWindow (NSCoder coder) : base (coder)\n    {\n    }\n\n    public CodeBasedWindow (CGRect contentRect, NSWindowStyle aStyle, NSBackingStore bufferingType, bool deferCreation): base (contentRect, aStyle,bufferingType,deferCreation) \n    {\n        // Create a title for the window\n\t\tTitle = \"Window From Code\";\n\n\t\t// Create the content view for the window and make it fill the window\n\t\tContentView = new NSView (Frame);\n\n        // Layout the Window's UI\n        ClickMeButton = new NSButton (new CGRect (10, Frame.Height-70, 100, 30)){\n            AutoresizingMask = NSViewResizingMask.MinYMargin\n        };\n        ContentView.AddSubview (ClickMeButton);\n\n        ClickMeLabel = new NSTextField (new CGRect (120, Frame.Height - 65, Frame.Width - 130, 20)) {\n            BackgroundColor = NSColor.Clear,\n            TextColor = NSColor.Black,\n            Editable = false,\n            Bezeled = false,\n            AutoresizingMask = NSViewResizingMask.WidthSizable | NSViewResizingMask.MinYMargin,\n            StringValue = \"Button has not been clicked yet.\"\n        };\n        ContentView.AddSubview (ClickMeLabel);\n    }\n    #endregion\n\n    #region Override Methods\n    public override void AwakeFromNib ()\n    {\n        base.AwakeFromNib ();\n\n        // Wireup events\n        ClickMeButton.Activated += (sender, e) => {\n            // Update count\n            ClickMeLabel.StringValue = (++NumberOfTimesClicked == 1) ? \"Button clicked one time.\" : string.Format(\"Button clicked {0} times.\",NumberOfTimesClicked);\n        };\n    }\n    #endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. First, it creates a private variable to track how many times a Button that will be added to the Window has been clicked:\n\n`private int NumberOfTimesClicked = 0;`\n\nTwo public computed properties are also created to hold the `NSButton` and `NSTextField` that will comprise the Window’s User Interface:\n\n`public NSButton ClickMeButton { get; set;}`\\\n`public NSTextField ClickMeLabel { get ; set;}`\n\nIn the Window’s constructor, the new Window will be configured with a default `Title` and `ContentView`. Setting the `ContentView` is a very important step, as it is initially `null` and attempting to add any UI to the Window will result in an error. A new `NSView` is created and it is set to fill the Window’s content area:\n\n`ContentView = new NSView (Frame);`\n\nNext, other `NSView` based elements are configured and added to the `ContentView` using the `AddSubview` method (such as the `NSButton` and `NSTextField` above). The first thing to note here is that, unlike iOS, macOS uses mathematical notation to define it's Window coordinate system. So the origin point (0,0) is in the lower left hand corner of the Window, with values increasing right and towards the upper right hand corner of the window. When creating the new `NSButton` and `NSTextField`, this is taken into account as the position and size is defined.\n\nThe `AwakeFromNib` method is overridden and any configuration is done that requires the Window to have already been constructed and in memory, such as attaching to the `Activated` event to the `ClickMeButton`.\n\nWhy was the `Activated` event set in the `AwakeFromNib` method and not when the `NSButton` was created in the Window’s constructor? Because the Window hasn’t been fully inflated at this point and `Activated` property is `null`, so attempting to set it would result in an error.\n\n> 💡**Try It Now**\n>\n> 1. Change the default `Title` for the new Window.\n> 2. Set a new `BackgroundColor` and `TextColor` for the `ClickMeButton` when it is created.\n> 3. Adjust the appearance of the `ClickMeLabel` when it is created and set a new default value.\n> 4. Add another `NSButton` and `NSTextField` to the Window.\n>\n> ⚠️ These changes wont take effect until a new instance of the Window is instantiated in the **Displaying the Window** section below.\n\n### Defining the Window Controller\n\nNext, a Window Controller (`NSWindowController`) is required to initialize and maintain the code based Window (`CodeBasedWindow`) created above. Again, a custom class is defined to handle this task:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing CoreGraphics;\n\npublic  class CodeBasedWindowController : NSWindowController\n{\n    #region Computed Properties\n    public new CodeBasedWindow Window {\n        get { return base.Window as CodeBasedWindow; }\n    }\n    #endregion\n\n    #region Constructors\n    public CodeBasedWindowController (IntPtr handle) : base (handle)\n    {\n    }\n\n    [Export (\"initWithCoder:\")]\n    public CodeBasedWindowController (NSCoder coder) : base (coder)\n    {\n    }\n\n    public CodeBasedWindowController () : base (\"CodeBasedWindow\")\n    {\n        // Define the Window's default location and size\n        CGRect contentRect = new CGRect (0, 0, 1000, 500);\n\n        // Create a new instance of the CodeBasedWindow\n        base.Window = new CodeBasedWindow(contentRect, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable), NSBackingStore.Buffered, false);\n\n        // Simulate Awaking from Nib\n        Window.AwakeFromNib ();\n    }\n    #endregion\n\n    #region Override Methods\n    public override void AwakeFromNib ()\n    {\n        base.AwakeFromNib ();\n    }\n    #endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. First, when a new instance of the `CodeBasedWindowController()` is created, it will build and configure a new instance of the `CodeBasedWindow` to control.\n\nThe default location and size of the Window is define using a `CGRect`. In the case of this example, the window will appear in the lower left hand corner of the screen (0,0) and be 1000 pixels wide and 500 pixels high.\n\nWhy will the Window appear in the lower corner of the screen and not the upper corner? Because macOS is based on a mathematical grid system where (0,0) is in the lower left hand corner with the Y values increasing upwards towards the top. This is opposed to iOS where (0,0) is in the upper left hand corner with Y values increasing downwards towards the bottom of the screen.\n\nWhen the new instance of the CodeBasedWindow is created, several Window Style (`NSWindowStyle`) flags are or’ed (`|`) together to define the look and functionality of the Window. The available styles are:\n\n* `Borderless` - The Window will not have a border.\n\n* `Titled` - The Window will include a Title Bar.\n\n* `Closable` - The Window will include a red close widget.\n\n* `Miniaturizable` - The Window has a yellow Miniaturize Button and can be minimized.\n\n* `Resizable` - The Window will have a green Resize Button and be resizable.\n\n* `Utility` - The Window will be presented as a Utility Panel styled Window.\n\n* `DocModal` - Creates a modal Window.\n\n* `NonactivatingPanel` - Creates a non-activating floating Panel style Window.\n\n* `TexturedBackground`  - Applies a textured background to the Window.\n\n* `Unscaled` - Creates an unscaled Window.\n\n* `UnifiedTitleAndToolbar` - Modern Shoebox (single Window) macOS apps (such as Mail, Calendar and Notes) use a unified Title and Tool Bar area. Use this style to achieve the effect.\n\n* `Hud` - Creates a translucent floating Heads-Up type Window.\n\n* `FullScreenWindow` - Fills the Mac’s screen with the content area of the Window and hides the Menu and Title bar areas.\n\n* `FullSizeContentView` - Complements the `UnifiedTitleAndToolbar` style for modern macOS apps where the Content Area of the Window will extend under the Title and Tool Bar areas.\n\nThe `NSBackingStore` specifies how the drawing is buffered in a Window as one of the following:\n\n* `Retained` - The Window uses a buffer, but draws directly to the screen where possible and to the buffer for parts that are obscured.\n\n* `Nonretained` - The Window draws directly to the screen without using any buffer.\n\n* `Buffered` - The Window renders all drawing into a display buffer and then flushes it to the screen.\n\nThe last property specified when creating the new `CodeBasedWindow` is `deferCreation`. If `true`, the Window Server defers creating the Window until it is moved onscreen. If `false`, the Window Server creates the Window immediately. All display messages sent to a Window or its Views are postponed until the Window is created, just before it’s moved onscreen.\n\nFinally, the `AwakeFromNib` method is called on the Window. Typically, this method is invoked when the Window is inflated from a `.storyboard` or `.xib` file, because the Window is being created manually, the developer must explicitly call this method to inform the Window it has been created.\n\n> 💡**Try It Now**\n>\n> 1. Change the values for the `contentRect` to open the Window in a new default location or make it a different default size.\n> 2. Adjust the `NSWindowStyle` flags to change the look and functionality of the Window that will be created.\n> 3. Play with the `NSBackingStore` value to see how it affects the way the Window is drawn.\n> 4. Set `deferCreation` to `true` and see how it affects the Window creation.\n>\n> ⚠️ These changes wont take effect until a new instance of the Window is instantiated in the **Displaying the Window** section below.\n\n### Displaying the Window\n\nWith the custom classes for the Window and Window Controller created, the code based window can be displayed to the user. Typically, this is done inside of the  `DidFinishLaunching` method of the Xamarin.Mac app’s `AppDelegate` using the following lines of code:\n\n```csharp\nvar mainWindowController = new CodeBasedWindowController ();\nmainWindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n```\n\nLet’s take a closer look at what this code is doing. First, a new instance of the `CodeBasedWindowController` is created. Next, the `Window` managed by this Controller (which is an instance of the `CodeBasedWindow` in this case) is displayed by calling the `MakeKeyAndOrderFront` method.\n\nIn macOS, the **Key Window** is the currently active Window that has focus and access to user input. **Order Front** brings the window forward in front of all other Windows currently being displayed.\n\nWhen `MakeKeyAndOrderFront` is called, an instace of the object that created it is passed in. Typically, this will be the `AppDelegate` for the macOS app. Since this code is usually called from inside `DidFinishLaunching` method, normally the `this` keyword is used. Because this code is being executed inside of a workbook, the `AppDelegate` is being accessed via the Shared Application using `(NSObject)NSApplication.SharedApplication.Delegate`.\n\n> 💡**Try It Now**\n>\n> 1. Run the two lines of code above again to create another new Window. Every time this code is run, a new Window will be added to the app. Typically, this is done from the **File** > **New** menu item.\n\n## Defining the Menu Bar in Code\n\nBecause of current limitations in Xamarin.Mac, it is not suggested that you create your Xamarin.Mac application's Menu Bar (`NSMenuBar`) in code but continue to use a `Main.storyboard` or `MainMenu.xib` file to define it. That said, the developer can add and remove Menus and Menu Items in C# code.\n\nTake the example of creating a System Status Bar menu for a Xamarin.Mac app below:\n\n```csharp\n// Create a Status Bar Menu\nNSStatusBar statusBar = NSStatusBar.SystemStatusBar;\nNSStatusItem item;\n\n// Has the Action menu already been created?\nif (item == null) {\n    // No, create menu and populate it\n    item = statusBar.CreateStatusItem (NSStatusItemLength.Variable);\n    item.Title = \"Actions\";\n    item.HighlightMode = true;\n    item.Menu = new NSMenu (\"Actions\");\n\n    var address = new NSMenuItem (\"Address\");\n    address.Activated += (sender, e) => {\n        Console.WriteLine(\"Address Selected\");\n    };\n    item.Menu.AddItem (address);\n\n    var date = new NSMenuItem (\"Date\");\n    date.Activated += (sender, e) => {\n        Console.WriteLine(\"Date Selected\");\n    };\n    item.Menu.AddItem (date);\n\n    var greeting = new NSMenuItem (\"Greeting\");\n    greeting.Activated += (sender, e) => {\n        Console.WriteLine(\"Greetings Selected\");\n    };\n    item.Menu.AddItem (greeting);\n\n    var signature = new NSMenuItem (\"Signature\");\n    signature.Activated += (sender, e) => {\n        Console.WriteLine(\"Signature Selected\");\n    };\n    item.Menu.AddItem (signature);\n}\n```\n\nLet’s take a closer look at what this code is doing. First, it creates a gains access to the System Status Bar (`NSStatusBar.SystemStatusBar`) that exists on the right hand side of the Menu Bar. If the **Actions** Menu Item hasn’t already been created, a new `NSStatusItem` is created, configured to be the **Actions** Menu and attached to the System Status Bar.\n\nNext, a series of `NSMenuItem` instances are created, configured and attached to the **Actions** Menu. The Activated event for each new Item is set and this code will be executed when the user selects the specific Menu Item.\n\n> 💡**Try It Now**\n>\n> 1. Add a **New** Menu Item to the **Actions** Menu that opens a new `CodeBasedWindow` when selected.\n\n\n## Building Modern macOS App UI\n\n> ⚠️ **WARNING!** *The modern macOS App UI is currently unavailable in the Version 01.00.00 of Xamarin Workbooks. This feature will be restored in a future release.*\n\nModern macOS apps such as Apple's Safari web browser, Pages word processor and Numbers spread sheet use many new technologies to present a unified, context sensitive User Interface that does away with traditional UI elements such as floating panels and multiple open windows.\n\nNext let’s look at several advanced technologies a developer can use to build a modern macOS app in Xamarin.Mac\n\n### Define a Modern View\n\nBefore defining the custom class that will be the basis for the Modern View, let’s take a quick look at the technologies it will be using.\n\nCore Animation is a high powered graphics rendering engine that is built into macOS. Core Animation has been optimized to take advantage of the GPU (Graphics Processing Unit) available in modern macOS hardware as opposed to running the graphics operations on the CPU, which can slow down the machine.\n\nThe `CALayer`, provided by Core Animation, can be used for tasks such as fast and fluid scrolling and animations. An app's User Interface should be composed of multiple subviews and layers to fully take advantage of Core Animation.\n\nA `CALayer` object provides several properties that allow the developer to control what is presented onscreen to the user such as:\n\n* `Content` - Can be a `NSImage` or `CGImage` that provides the contents of the layer.\n\n* `BackgroundColor` - Sets the background color of the layer as a `CGColor`.\n\n* `BorderWidth` - Sets the border width.\n\n* `BorderColor` - Sets the border color.\n\nTo utilize Core Graphics in the app's UI, it must be using Layer Backed Views, which Apple suggests that the developer should always enable in the Window's Content View. This way, all child views will automatically inherit Layer Backing as well.\n\nAdditionally, Apple suggests using Layer Backed Views as opposed to adding a new `CALayer` as a sublayer because the system will automatically handle several of the required settings (such as those required by a Retina Display).\n\nWith that in mind, define a new `NSView` that will provide the Content Area for the Modern Window:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing CoreGraphics;\n\npublic class MainView : NSView\n{\n    #region Computed Properties\n    public override bool WantsLayer {\n        get { return true; }\n    }\n\n    public override bool WantsUpdateLayer {\n        get { return true; }\n    }\n    #endregion\n\n    #region Constructor\n    public MainView (IntPtr handle) : base (handle)\n    {\n    }\n\n    public MainView (CGRect bounds) : base (bounds)\n    {\n    }\n    #endregion\n\n    #region Override Methods\n    public override void UpdateLayer ()\n    {\n        base.UpdateLayer ();\n\n        // Add the Core Graphics routines to draw the View's UI\n        Layer.BackgroundColor = NSColor.Red.CGColor;\n    }\n    #endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. First, the `WantsLayer` and `WantsUpdateLayer` properties are overridden and set to `true` to make this a Layer Backed View.\n\nThen the UpdateLayer method is overriden and the Core Graphic routines are added to draw out the View’s UI. In this example, the View’s background color is being set to red:\n\n`Layer.BackgroundColor = NSColor.Red.CGColor;`\n\n> 💡**Try It Now**\n>\n> 1. Change the background color of the View.\n> 2. Add more Core Graphic routines to change the View’s UI.\n>\n> ⚠️ These changes wont take effect until a new instance of the Window is instantiated in the **Displaying the Modern Window** section below.\n\n### Defining a Modern Window\n\nIn macOS Sierra an app’s Windows can be configured to create Tabbed Windows, where several Windows of the same type are merged into one virtual Window instead of being separate instances (like tabs in the Safari app).\n\nTypically, the developer will need to take limited action use Tabbed Windows in their Xamarin.Mac apps, the system will handle them automatically as follows:\n\n* Windows will automatically be Tabbed when the `OrderFront` method is invoked.\n\n* Windows will automatically be Untabbed when the `OrderOut` method is invoked.\n\n* In code all Tabbed windows are still considered \"visible\", however any non-frontmost Tabs are hidden by the system using CoreGraphics.\n\n* Use the `TabbingIdentifier` property of `NSWindow` to group Windows together into Tabs.\n\n* If it is an `NSDocument` based app, several of these features will be enabled automatically (such as the plus button being added to the Tab Bar) without any developer action.\n\n* Non-NSDocument based apps can enable the \"plus\" button in the Tab Group to add a new document by overriding the `GetNewWindowForTab` method of the `NSWindowsController`.\n\nNow create a new in-code NSWindow class that invokes a supports Tabs and uses the Modern Views created above:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing CoreGraphics;\n\npublic class ModernCodeBasedWindow : NSWindow {\n\n    #region Constructors\n    public ModernCodeBasedWindow (IntPtr handle) : base (handle)\n    {\n    }\n\n    [Export (\"initWithCoder:\")]\n    public ModernCodeBasedWindow (NSCoder coder) : base (coder)\n    {\n    }\n\n    public ModernCodeBasedWindow (CGRect contentRect, NSWindowStyle aStyle, NSBackingStore bufferingType, bool deferCreation): base (contentRect, aStyle,bufferingType,deferCreation) \n    {\n        // Create a title for the window\n\t\tTitle = \"Untitled\";\n\n\t\t// Create the content view for the window and make it fill the window\n\t\tContentView = new MainView (Frame);\n\n        // Hide the Title bar for a streamlined UI\n        TitleVisibility = NSWindowTitleVisibility.Hidden;\n\n        // _________________________________________________________________\n        // WARNING! \n        // The modern macOS App UI is currently unavaiable in the Version \n        // 0.99.0.0 of Xamarin Workbooks. This feature will be restored in a \n        // future release.\n        // _________________________________________________________________\n        // Configure the Window to use Tabs\n        // TabbingMode = NSWindowTabbingMode.Preferred;\n        // TabbingIdentifier = \"Modern\";\n    }\n    #endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. First, it hides the Title Bar area so that the Tool Bar area will be merged into in:\n\n`TitleVisibility = NSWindowTitleVisibility.Hidden;`\n\nThe next two lines enable the Tabbed Window feature:\n\n`TabbingMode = NSWindowTabbingMode.Preferred;`\\\n`TabbingIdentifier = \"Modern\";`\n\n### Defining a Modern Window Controller\n\nNow create a new custom `NSWindowController` initialize and maintain the modern code based Window (`ModernCodeBasedWindow`) created above:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing CoreGraphics;\n\npublic  class ModernCodeBasedWindowController : NSWindowController\n{\n    #region Computed Properties\n    public new ModernCodeBasedWindow Window {\n        get { return base.Window as ModernCodeBasedWindow; }\n    }\n    #endregion\n\n    #region Constructors\n    public ModernCodeBasedWindowController (IntPtr handle) : base (handle)\n    {\n    }\n\n    [Export (\"initWithCoder:\")]\n    public ModernCodeBasedWindowController (NSCoder coder) : base (coder)\n    {\n    }\n\n    public ModernCodeBasedWindowController () : base (\"CodeBasedWindow\")\n    {\n        // Define the Window's default location and size\n        CGRect contentRect = new CGRect (0, 100, 600, 500);\n\n        // Create a new instance of the CodeBasedWindow\n        base.Window = new ModernCodeBasedWindow(contentRect, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable | NSWindowStyle.FullSizeContentView | NSWindowStyle.UnifiedTitleAndToolbar), NSBackingStore.Buffered, false);\n\n        // Simulate Awaking from Nib\n        Window.AwakeFromNib ();\n    }\n    #endregion\n\n    #region Override Methods\n    public override void AwakeFromNib ()\n    {\n        base.AwakeFromNib ();\n    }\n\n    // _________________________________________________________________\n    // WARNING! \n    // The modern macOS App UI is currently unavaiable in the Version \n    // 0.99.0.0 of Xamarin Workbooks. This feature will be restored in a \n    // future release.\n    // _________________________________________________________________\n    // public override void GetNewWindowForTab (NSObject sender)\n    // {\n    //     // Create a new window when the Plus button is clicked\n    //     var newWindowController = new ModernCodeBasedWindowController ();\n    //     newWindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n    // }\n    #endregion\n}\n```\n\nLet’s take a closer look at what this code is doing. First, when a new instance of the `ModernCodeBasedWindow` is created, the `FullSizeContentView` and `UnifiedTitleAndToolbar` `NSWindowStyle` flags are being applied for a modern look.\n\nTo display the **Plus** button in the Tab Bar, the `GetNewWindowForTab` method is overridden and code is added to create a new `ModernCodeBasedWindow` when it is clicked.\n\n### Displaying the Modern Window\n\nThe following two lines of code will create a new instance of the `ModernCodeBasedWindow` and display it:\n\n```csharp\nvar newWindowController = new ModernCodeBasedWindowController ();\nnewWindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n```\n\nHowever, unlike the CodeBasedWindow created above, each time this code is run and a new `ModernCodeBasedWindow` is created, it will be added as a Tab to the existing Window instead of being a separate Window.\n\n### Using System Appearances\n\nModern macOS apps can adopt a new Dark Interface Appearance that works well for image creation, editing or presentation apps. This can be done by adding one line of code before the Window is presented. For example:\n\n```csharp\n// Apply the Dark Interface Appearance\nnewWindowController.Window.Appearance = NSAppearance.GetAppearance (NSAppearance.NameVibrantDark);\n```\n\nThe following NSAppearance types are defined:\n\n* `NameAqua` \\[*Deprecated*\\] - Use the OS X Aqua appearance.\n\n* `NameLightContent` \\[*Deprecated*\\] - Use the light content appearance.\n\n* `NameVibrantDark` - Use the dark vibrant appearance.\n\n* `NameVibrantLight` - Use the light vibrant appearance.\n\n> 💡**Try It Now**\n>\n> 1. Set the Window to another type of `NSAppearance`."
  },
  {
    "path": "mac/user-interface/webbrowser/README.md",
    "content": "How to Build a Web Browser in Xamarin.Mac\n============\n\nThis workbook will cover the steps required to build a mini, multi-windowed web browser in a Xamarin.Mac app. By going through the steps in this workbook, the reader will gain insights and skills required to work with many elements of a standard macOS app such as Menus, Windows, Window Controllers, Views, View Controllers, Toolbars, Text Field, Buttons and the Xcode Interface Builder Storyboard files used to define them.\n\n![](screenshots/Intro01.png)"
  },
  {
    "path": "mac/user-interface/webbrowser/webbrowser.workbook/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"16C41b\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"11542\"/>\n        <plugIn identifier=\"com.apple.WebKitIBPlugin\" version=\"11542\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"Workbook Mac App\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Workbook Mac App\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About Workbook Mac App\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide Workbook Mac App\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit WorkBook Mac App\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" id=\"KaW-ft-85H\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Favorites\" id=\"4vJ-B1-Zhf\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Favorites\" id=\"yB6-76-FLY\">\n                                    <items>\n                                        <menuItem title=\"Microsoft\" image=\"Box.png\" id=\"vKa-zY-5Hn\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"fSP-dU-Ggr\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Bing\" image=\"Box.png\" id=\"kxX-NY-JK2\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"mQP-Mk-4gc\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"LinkedIn\" image=\"Box.png\" id=\"QZn-3P-tEo\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"2cQ-nv-mwr\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"msn\" image=\"Home.png\" id=\"08q-20-w18\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"qaI-69-wZm\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Skype\" image=\"Box.png\" id=\"HdX-3V-svv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"bWn-3e-noh\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"dPK-cR-aAr\"/>\n                                        <menuItem title=\"Amazon\" image=\"Tag.png\" id=\"ItZ-1h-ZVC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"cV0-pM-7GJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Apple\" image=\"Tag.png\" id=\"O6M-R9-jqr\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"Goc-3G-ULJ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Digg\" image=\"Tag.png\" id=\"hh2-jI-elv\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"k4d-df-Cx3\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Facebook\" image=\"Tag.png\" id=\"KZJ-wG-85K\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"E8J-j4-mJs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Google\" image=\"Tag.png\" id=\"FeN-pS-hcx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"P5M-R4-t9w\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Twitter\" image=\"Tag.png\" id=\"TEK-90-axA\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"F12-68-itQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"YouTube\" image=\"Tag.png\" id=\"gj2-Xc-K6r\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"ShowFavoriteWebsite:\" target=\"Ady-hI-5gd\" id=\"lsi-nv-KnQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"WBStoryboard Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"83\" y=\"-104\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController storyboardIdentifier=\"MainWindowController\" id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" identifier=\"MainWindow\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <toolbar key=\"toolbar\" implicitIdentifier=\"0655F517-3D6C-4F6C-8C5D-8BE67A7A7CBB\" autosavesConfiguration=\"NO\" displayMode=\"iconAndLabel\" sizeMode=\"regular\" id=\"l5Y-IY-1On\">\n                            <allowedToolbarItems>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarShowColorsItem\" id=\"ZAE-2N-lc3\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarShowFontsItem\" id=\"vo5-b0-HZg\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarPrintItem\" id=\"ZFI-xT-Jm1\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarSpaceItem\" id=\"wHo-OS-uh3\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarFlexibleSpaceItem\" id=\"Cem-ZC-8bH\"/>\n                                <toolbarItem implicitItemIdentifier=\"1547D2DF-32F3-4FC4-A9AE-D466BCC6F8E4\" label=\"Amazon\" paletteLabel=\"Amazon\" tag=\"-1\" image=\"Amazon.png\" id=\"dPW-ZT-pcq\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"JxO-pL-KvU\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"B05E4456-78B5-412C-A0FD-C7E2C3E0236C\" label=\"Apple\" paletteLabel=\"Apple\" tag=\"-1\" image=\"Apple.png\" id=\"YUh-IV-Zpw\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"YxG-KB-TL1\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"1C38B21C-7137-4D4A-B01B-13713298396E\" label=\"Digg\" paletteLabel=\"Digg\" tag=\"-1\" image=\"Digg.png\" id=\"B0z-Mb-9d1\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"1hg-mU-72g\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"09236645-7528-4CBB-A7F5-3C76BA448C9D\" label=\"Facebook\" paletteLabel=\"Facebook\" tag=\"-1\" image=\"Facebook.png\" id=\"qWB-MN-xVr\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"eOR-KX-wUt\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"65AF879B-4DE2-4738-A582-21D81361E0E2\" label=\"Google\" paletteLabel=\"Google\" tag=\"-1\" image=\"Google.png\" id=\"Htp-Pu-ab4\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"fmB-i0-GkR\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"5E3D8138-AE46-4F69-A70B-D263D2D00358\" label=\"LinkedIn\" paletteLabel=\"LinkedIn\" tag=\"-1\" image=\"Linkedin.png\" id=\"EUh-kv-KbF\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"rij-vf-Sgo\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"395C3A39-3490-4C19-B8C0-5F3F6CE3F468\" label=\"Microsoft\" paletteLabel=\"Microsoft\" tag=\"-1\" image=\"Microsoft.png\" id=\"szq-cJ-BOy\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"blX-Av-Dil\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"85CD9709-5DE5-4809-BCF2-6558182DA39E\" label=\"msn\" paletteLabel=\"msn\" tag=\"-1\" image=\"msn.png\" id=\"lQL-hA-xOa\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"CBt-df-Jvj\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"17CC10EA-E702-43F5-AD0B-5E4DD29730EA\" label=\"Skype\" paletteLabel=\"Skype\" tag=\"-1\" image=\"Skype.png\" id=\"eXM-Ua-zKI\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"G3y-gO-PJf\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"E1D47F9D-156E-4206-9117-91999236E36D\" label=\"Twitter\" paletteLabel=\"Twitter\" tag=\"-1\" image=\"Twitter.png\" id=\"a2k-Ac-pi7\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"R0H-tp-6Dk\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"F2990B71-7DAF-4192-9928-0E0674579B5B\" label=\"YouTube\" paletteLabel=\"YouTube\" tag=\"-1\" image=\"YouTube.png\" id=\"lvW-IH-098\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"J4h-Z9-RtW\"/>\n                                    </connections>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"D7C2573B-B603-4231-AA51-36D8C67CAA44\" label=\"Bing\" paletteLabel=\"Bing\" tag=\"-1\" image=\"Bing.png\" id=\"gGl-iC-U8N\">\n                                    <connections>\n                                        <action selector=\"ShowFavoriteWebsite:\" target=\"Oky-zY-oP4\" id=\"AIE-G3-aQm\"/>\n                                    </connections>\n                                </toolbarItem>\n                            </allowedToolbarItems>\n                            <defaultToolbarItems>\n                                <toolbarItem reference=\"szq-cJ-BOy\"/>\n                                <toolbarItem reference=\"gGl-iC-U8N\"/>\n                                <toolbarItem reference=\"EUh-kv-KbF\"/>\n                                <toolbarItem reference=\"lQL-hA-xOa\"/>\n                                <toolbarItem reference=\"eXM-Ua-zKI\"/>\n                                <toolbarItem reference=\"wHo-OS-uh3\"/>\n                                <toolbarItem reference=\"dPW-ZT-pcq\"/>\n                                <toolbarItem reference=\"YUh-IV-Zpw\"/>\n                                <toolbarItem reference=\"B0z-Mb-9d1\"/>\n                                <toolbarItem reference=\"qWB-MN-xVr\"/>\n                                <toolbarItem reference=\"Htp-Pu-ab4\"/>\n                                <toolbarItem reference=\"a2k-Ac-pi7\"/>\n                                <toolbarItem reference=\"lvW-IH-098\"/>\n                                <toolbarItem reference=\"Cem-ZC-8bH\"/>\n                                <toolbarItem reference=\"ZFI-xT-Jm1\"/>\n                            </defaultToolbarItems>\n                        </toolbar>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"220\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController storyboardIdentifier=\"MainViewController\" id=\"XfG-lQ-9wD\" customClass=\"ViewController\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" identifier=\"MainView\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"567\" height=\"337\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <customView identifier=\"URLBar\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ixp-lt-yJY\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"291\" width=\"567\" height=\"46\"/>\n                                <subviews>\n                                    <textField identifier=\"URLField\" focusRingType=\"none\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"13L-mp-dFB\">\n                                        <rect key=\"frame\" x=\"89\" y=\"12\" width=\"388\" height=\"22\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"22\" id=\"u6e-fQ-wto\"/>\n                                        </constraints>\n                                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" focusRingType=\"none\" placeholderString=\"Enter the URL to visit\" drawsBackground=\"YES\" id=\"AHs-Gu-wKz\">\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                            <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                    <button identifier=\"GoButton\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lrs-Hx-e5q\">\n                                        <rect key=\"frame\" x=\"479\" y=\"5\" width=\"81\" height=\"32\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"69\" id=\"0iB-Vi-MVf\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"21\" id=\"eNh-1h-fnC\"/>\n                                        </constraints>\n                                        <buttonCell key=\"cell\" type=\"push\" title=\"Go\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"kFk-iy-eVo\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <connections>\n                                            <action selector=\"goButtonClicked:\" target=\"rPt-NT-nkU\" id=\"3mz-tK-oDy\"/>\n                                        </connections>\n                                    </button>\n                                    <segmentedControl identifier=\"HistoryButtons\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3ey-PG-JqD\">\n                                        <rect key=\"frame\" x=\"12\" y=\"10\" width=\"71\" height=\"23\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"22\" id=\"24Q-8O-yws\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"71\" id=\"IlM-d4-5jE\"/>\n                                        </constraints>\n                                        <segmentedCell key=\"cell\" borderStyle=\"border\" alignment=\"left\" style=\"capsule\" trackingMode=\"momentary\" id=\"HnI-to-48F\">\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                            <segments>\n                                                <segment image=\"ArrowBackward.png\" width=\"32\" enabled=\"NO\"/>\n                                                <segment image=\"ArrowForward.png\" width=\"32\" enabled=\"NO\" tag=\"1\"/>\n                                            </segments>\n                                        </segmentedCell>\n                                        <connections>\n                                            <action selector=\"historyButtonClicked:\" target=\"rPt-NT-nkU\" id=\"Aop-Sz-fPQ\"/>\n                                        </connections>\n                                    </segmentedControl>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"Lrs-Hx-e5q\" secondAttribute=\"trailing\" constant=\"13\" id=\"42m-lj-B3i\"/>\n                                    <constraint firstItem=\"3ey-PG-JqD\" firstAttribute=\"top\" secondItem=\"ixp-lt-yJY\" secondAttribute=\"top\" constant=\"13\" id=\"5fE-os-NAT\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"46\" id=\"BLZ-dt-79c\"/>\n                                    <constraint firstItem=\"13L-mp-dFB\" firstAttribute=\"leading\" secondItem=\"3ey-PG-JqD\" secondAttribute=\"trailing\" constant=\"6\" id=\"DQy-HR-HEU\"/>\n                                    <constraint firstItem=\"3ey-PG-JqD\" firstAttribute=\"leading\" secondItem=\"ixp-lt-yJY\" secondAttribute=\"leading\" constant=\"12\" id=\"ShL-GZ-PHu\"/>\n                                    <constraint firstItem=\"Lrs-Hx-e5q\" firstAttribute=\"leading\" secondItem=\"13L-mp-dFB\" secondAttribute=\"trailing\" constant=\"8\" id=\"XGw-uJ-qZE\"/>\n                                    <constraint firstItem=\"Lrs-Hx-e5q\" firstAttribute=\"top\" secondItem=\"ixp-lt-yJY\" secondAttribute=\"top\" constant=\"13\" id=\"Zgq-iW-Sao\"/>\n                                    <constraint firstItem=\"13L-mp-dFB\" firstAttribute=\"top\" secondItem=\"ixp-lt-yJY\" secondAttribute=\"top\" constant=\"12\" id=\"iWH-qQ-WHJ\"/>\n                                </constraints>\n                            </customView>\n                            <customView identifier=\"StatusBar\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xBE-r0-7Ez\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"567\" height=\"31\"/>\n                                <subviews>\n                                    <textField identifier=\"StatusLabel\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MFL-5a-aDC\">\n                                        <rect key=\"frame\" x=\"18\" y=\"7\" width=\"531\" height=\"17\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"17\" id=\"bY4-ge-vmC\"/>\n                                        </constraints>\n                                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Ready\" id=\"ecc-QC-cGe\">\n                                            <font key=\"font\" metaFont=\"cellTitle\"/>\n                                            <color key=\"textColor\" name=\"tertiaryLabelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </textFieldCell>\n                                    </textField>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"31\" id=\"7E0-ep-pIj\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"MFL-5a-aDC\" secondAttribute=\"bottom\" constant=\"7\" id=\"KDK-hx-6Nt\"/>\n                                    <constraint firstItem=\"MFL-5a-aDC\" firstAttribute=\"leading\" secondItem=\"xBE-r0-7Ez\" secondAttribute=\"leading\" constant=\"20\" id=\"VBo-j9-SKW\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"MFL-5a-aDC\" secondAttribute=\"trailing\" constant=\"20\" id=\"grV-Zz-xIb\"/>\n                                </constraints>\n                            </customView>\n                            <webView identifier=\"WebBrowser\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7ju-eX-zTC\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"30\" width=\"567\" height=\"262\"/>\n                                <webPreferences key=\"preferences\" defaultFontSize=\"16\" defaultFixedFontSize=\"13\" minimumFontSize=\"0\" plugInsEnabled=\"NO\" javaEnabled=\"NO\" javaScriptEnabled=\"NO\" javaScriptCanOpenWindowsAutomatically=\"NO\">\n                                    <nil key=\"identifier\"/>\n                                </webPreferences>\n                            </webView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"7ju-eX-zTC\" secondAttribute=\"bottom\" constant=\"30\" id=\"12Q-bd-NHm\"/>\n                            <constraint firstItem=\"ixp-lt-yJY\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" id=\"3LU-5n-Ocx\"/>\n                            <constraint firstItem=\"7ju-eX-zTC\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" constant=\"45\" id=\"Hvd-k1-3hm\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"7ju-eX-zTC\" secondAttribute=\"trailing\" id=\"O8Q-cQ-RvI\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"ixp-lt-yJY\" secondAttribute=\"trailing\" id=\"Qgx-Cm-lI2\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"xBE-r0-7Ez\" secondAttribute=\"bottom\" id=\"SN0-qk-UAT\"/>\n                            <constraint firstItem=\"xBE-r0-7Ez\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" id=\"ahF-qw-LDe\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"xBE-r0-7Ez\" secondAttribute=\"trailing\" id=\"e98-4M-mph\"/>\n                            <constraint firstItem=\"ixp-lt-yJY\" firstAttribute=\"top\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"top\" id=\"ebP-1u-KFi\"/>\n                            <constraint firstItem=\"7ju-eX-zTC\" firstAttribute=\"leading\" secondItem=\"m2S-Jp-Qdl\" secondAttribute=\"leading\" id=\"fTD-xl-fbl\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75.5\" y=\"691.5\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"Amazon.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Apple.png\" width=\"128\" height=\"128\"/>\n        <image name=\"ArrowBackward.png\" width=\"128\" height=\"128\"/>\n        <image name=\"ArrowForward.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Bing.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Box.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Digg.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Facebook.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Google.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Home.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Linkedin.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Microsoft.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Skype.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Tag.png\" width=\"128\" height=\"128\"/>\n        <image name=\"Twitter.png\" width=\"128\" height=\"128\"/>\n        <image name=\"YouTube.png\" width=\"128\" height=\"128\"/>\n        <image name=\"msn.png\" width=\"128\" height=\"128\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "mac/user-interface/webbrowser/webbrowser.workbook/StoryboardResources.csx",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Xml;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Linq;\nusing Foundation;\nusing AppKit;\nusing ObjCRuntime;\n\n// -------------------------------------------------------------------------\n// StoryboardInflator for macOS by Kevin Mullins for Microsoft, Inc.\n// -------------------------------------------------------------------------\n// This library provides limited support for using Storyboard files to\n// build and display the user interface for a Xamarin.Mac based workbook app. \n// Because macOS expects a compiled storyboard to be part of a running app's \n// bundle along with its executable code, the typical mechanisms to create\n// Outlets, Actions and Segues will not work. Instead, this library applies\n// the following hack to simulate Outlets:\n//\n// 1) Windows and Views (or View based controls such as NSButton), set their\n//    Identifier property in Interface Builder to match the name of the \n//    \"Outlet\". The StoryboardBinder will populate any like named Public\n//    Property on any class it binds.\n//\n// 2) For Menu Items, the StoryboardBinder will use the Title of the Menu\n//    Item + \"MenuItem\" to populate any like named Public Property on any\n//    class that it binds. For example, the \"New\" menu item would bind to\n//    the \"NewMenuItem\" property in class.\n//\n// 3) For Toolbar Items, the StoryboardBinder will use the Label of the \n//    Item + \"ToolbarItem\" to populate any like named Public Property on any\n//    class that it binds. For example, the \"Color\" menu item would bind to\n//    the \"ColorMenuItem\" property in class.\n//\n// LIMITATIONS: Custom Segues are currently not supported. Instead, the app must\n// use the StoryboardInflator to inflate and populate any NIB that will then\n// need to be manually displayed.\n\n/// <summary>\n/// Defines the type of a Scene or Source Object used in a Segue. \n/// </summary>\npublic enum StoryboardObjectType\n{\n\t/// <summary>\n\t/// The application (<c>NSApplication</c>) as defined in the Storyboard.\n\t/// </summary>\n\tApplication,\n\n\t/// <summary>\n\t/// A Menu Item (<c>NSMenuItem</c>).\n\t/// </summary>\n\tMenuItem,\n\n\t/// <summary>\n\t/// A Window Controller (<c>NSWindowController</c>).\n\t/// </summary>\n\tWindowController,\n\n\t/// <summary>\n\t/// A Toolbar Item (<c>NSToolbarItem</c>).\n\t/// </summary>\n\tToolbarItem,\n\n\t/// <summary>\n\t/// A View Controller (<c>NSViewController</c>).\n\t/// </summary>\n\tViewController,\n\n\t/// <summary>\n\t/// Storyboard object type (<c>NSSplitViewController</c>).\n\t/// </summary>\n\tSplitViewController,\n\n\t/// <summary>\n\t/// A Button (<c>NSButton</c>).\n\t/// </summary>\n\tButton,\n\n\t/// <summary>\n\t/// An unknown object type\n\t/// </summary>\n\tUnknown\n}\n\n/// <summary>\n/// Defines the kind of Segue as defined in the Storyboard.\n/// </summary>\npublic enum StoryboardSegueType\n{\n\t/// <summary>\n\t/// Displays the destination controller as a non-modal Window.\n\t/// </summary>\n\tShow,\n\n\t/// <summary>\n\t/// Displays the destination controller as a modal window.\n\t/// </summary>\n\tModal,\n\n\t/// <summary>\n\t/// Displays the destination controller as a sheet.\n\t/// </summary>\n\tSheet,\n\n\t/// <summary>\n\t/// Displays the destination controller as a popover.\n\t/// </summary>\n\tPopover,\n\n\t/// <summary>\n\t/// Displays the destination controller using a Custom Segue Class.\n\t/// </summary>\n\tCustom,\n\n\t/// <summary>\n\t/// Defines a containment relationship between the source object and the\n\t/// destination controller.\n\t/// </summary>\n\tRelationship\n}\n\n/// <summary>\n/// Holds the definition of a Segure as read from a Storyboard.\n/// </summary>\npublic class StoryboardSegueDefinition : NSObject\n{\n\t#region Computed Properties\n\t/// <summary>\n\t/// Gets or sets the inflator used to load NIBs from the Storyboard.\n\t/// </summary>\n\t/// <value>The inflator.</value>\n\tpublic StoryboardInflator Inflator { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the type of the scene that they segue belongs to.\n\t/// </summary>\n\t/// <value>The type of the scene.</value>\n\tpublic StoryboardObjectType SceneType { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the scene identifier.\n\t/// </summary>\n\t/// <value>The scene identifier.</value>\n\tpublic string SceneID { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the type of the source object.\n\t/// </summary>\n\t/// <value>The type of the source object.</value>\n\tpublic StoryboardObjectType SourceObjectType { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the source object identifier.\n\t/// </summary>\n\t/// <value>The source object identifier.</value>\n\tpublic string SourceObjectID { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the destination controller identifier.\n\t/// </summary>\n\t/// <value>The destination controller identifier.</value>\n\tpublic string DestinationControllerID { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the kind of the segue.\n\t/// </summary>\n\t/// <value>The kind of the segue.</value>\n\tpublic StoryboardSegueType SegueKind { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the segue identifier.\n\t/// </summary>\n\t/// <value>The segue identifier.</value>\n\tpublic string SegueIdentifier { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the relationship.\n\t/// </summary>\n\t/// <remarks>This is only populated from containment Segues of <c>StoryboardSegueType.Relationship</c>.</remarks>\n\t/// <value>The relationship.</value>\n\tpublic string Relationship { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the popover anchor identifier.\n\t/// </summary>\n\t/// <value>The popover anchor identifier.</value>\n\tpublic string PopoverAnchorID { get; set;}\n\n\t/// <summary>\n\t/// Gets or sets the popover behavior.\n\t/// </summary>\n\t/// <value>The popover behavior.</value>\n\tpublic NSPopoverBehavior PopoverBehavior { get; set; } = NSPopoverBehavior.Transient;\n\n\t/// <summary>\n\t/// Gets or sets the edge the popover will be displayed from.\n\t/// </summary>\n\t/// <remarks>0 = Left, 1 = Top, 2 = Right, 3 = Bottom</remarks>\n\t/// <value>The popover edge.</value>\n\tpublic nuint PopoverEdge { get; set; } = 0;\n\t#endregion\n\n\t#region Constructors\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:StoryboardSegueDefinition\"/> class.\n\t/// </summary>\n\t/// <param name=\"type\">The <c>StoryboardSegueType</c> of the Segue.</param>\n\t/// <param name=\"inflator\">The Inflator used to load NIB files.</param>\n\tpublic StoryboardSegueDefinition (StoryboardSegueType type, StoryboardInflator inflator)\n\t{\n\t\t// Initialize\n\t\tSegueKind = type;\n\t\tInflator = inflator;\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:StoryboardSegueDefinition\"/> class.\n\t/// </summary>\n\t/// <param name=\"type\">The <c>string</c> type of the Segue.</param>\n\t/// <param name=\"inflator\">The Inflator used to load NIB files.</param>\n\tpublic StoryboardSegueDefinition (string type, StoryboardInflator inflator)\n\t{\n\t\t// Initialize\n\t\tswitch (type) {\n\t\tcase \"show\":\n\t\t\tSegueKind = StoryboardSegueType.Show;\n\t\t\tbreak;\n\t\tcase \"modal\":\n\t\t\tSegueKind = StoryboardSegueType.Modal;\n\t\t\tbreak;\n\t\tcase \"sheet\":\n\t\t\tSegueKind = StoryboardSegueType.Sheet;\n\t\t\tbreak;\n\t\tcase \"popover\":\n\t\t\tSegueKind = StoryboardSegueType.Popover;\n\t\t\tbreak;\n\t\tcase \"custom\":\n\t\t\tSegueKind = StoryboardSegueType.Relationship;\n\t\t\tbreak;\n\t\t}\n\t\tInflator = inflator;\n\t}\n\t#endregion\n\n\t#region Private Methods\n\t/// <summary>\n\t/// Prepares to execute a segue loading the destination NIB and calling <c>PrepareForSegue</c>\n\t/// on the Source Controller so it can prepare the destination controller before it is\n\t/// presented to the user.\n\t/// </summary>\n\t/// <returns>The <c>NSStoryboardSegue</c> representing this Segue Definition.</returns>\n\t/// <param name=\"sender\">The object that is launching the segue.</param>\n\t/// <param name=\"sourceController\">Source controller for the segue.</param>\n\tprivate NSStoryboardSegue PrepareForSegue (NSObject sender, NSObject sourceController)\n\t{\n\t\t// Attempt to load destination\n\t\tvar destinationController = Inflator.InstantiateControllerForPartialIdentifier (DestinationControllerID);\n\n\t\t// Was the NIB found?\n\t\tif (destinationController == null) return null;\n\n\t\t// Build new Segue\n\t\tvar segue = new NSStoryboardSegue (SegueIdentifier, sourceController, destinationController);\n\n\t\t// Does the class contain the PrepareForSegue method?\n\t\tvar controllerType = sourceController.GetType ();\n\t\tvar methodInfo = controllerType.GetMethod (\"PrepareForSegue\");\n\t\tif (methodInfo != null) {\n\t\t\t// Yes, wireup action to class\n\t\t\tmethodInfo.Invoke (sourceController, new [] { segue, sender });\n\t\t}\n\n\t\t// Return controller\n\t\treturn segue;\n\t}\n\n\t/// <summary>\n\t/// Presents the non modal window to the user.\n\t/// </summary>\n\t/// <param name=\"segue\">The <c>NSStoryboardSegue</c> to execute.</param>\n\tprivate void PresentNonModalWindow (NSStoryboardSegue segue)\n\t{\n\t\tNSWindowController windowController = null;\n\n\t\t// Take action based on the controller type\n\t\tif (segue.DestinationController is NSWindowController) {\n\t\t\t// Display the window to the user\n\t\t\twindowController = segue.DestinationController as NSWindowController;\n\t\t} else if (segue.DestinationController is NSViewController) {\n\t\t\t// Build a Window and Window Controller for this view\n\t\t\tvar viewController = segue.DestinationController as NSViewController;\n\t\t\tvar window = new NSWindow (viewController.View.Bounds, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable), NSBackingStore.Buffered, false);\n\t\t\twindowController = new NSWindowController (window);\n\n\t\t\t// Attach the View Controller to the Window\n\t\t\twindow.ContentView = viewController.View;\n\t\t\twindow.ContentViewController = viewController;\n\t\t}\n\n\t\t// Found?\n\t\tif (windowController == null) return;\n\n\t\t// Present window controller\n\t\twindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n\t}\n\n\t/// <summary>\n\t/// Presents the modal window to the user.\n\t/// </summary>\n\t/// <param name=\"segue\">The <c>NSStoryboardSegue</c> to execute.</param>\n\tprivate void PresentModalWindow (NSStoryboardSegue segue)\n\t{\n\t\tNSWindowController windowController = null;\n\n\t\t// Take action based on the controller type\n\t\tif (segue.DestinationController is NSWindowController) {\n\t\t\t// Display the window to the user\n\t\t\twindowController = segue.DestinationController as NSWindowController;\n\t\t} else if (segue.DestinationController is NSViewController) {\n\t\t\t// Build a Window and Window Controller for this view\n\t\t\tvar viewController = segue.DestinationController as NSViewController;\n\t\t\tvar window = new NSWindow (viewController.View.Bounds, (NSWindowStyle.Titled | NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable), NSBackingStore.Buffered, false);\n\t\t\twindowController = new NSWindowController (window);\n\n\t\t\t// Attach the View Controller to the Window\n\t\t\twindow.ContentView = viewController.View;\n\t\t\twindow.ContentViewController = viewController;\n\t\t}\n\n\t\t// Found?\n\t\tif (windowController == null) return;\n\n\t\t// Present window controller\n\t\tNSApplication.SharedApplication.RunModalForWindow (windowController.Window);\n\t}\n\n\t/// <summary>\n\t/// Presents the Window or View to the user as a sheet attached to the parent\n\t/// Window.\n\t/// </summary>\n\t/// <param name=\"segue\">The <c>NSStoryboardSegue</c> to execute.</param>\n\tprivate void PresentSheet (NSStoryboardSegue segue)\n\t{\n\t\tNSViewController viewController = null;\n\n\t\t// Take action based on the controller type\n\t\tif (segue.DestinationController is NSWindowController) {\n\t\t\t// Display the window to the user\n\t\t\tvar windowController = segue.DestinationController as NSWindowController;\n\t\t\tviewController = windowController.Window.ContentViewController;\n\t\t} else if (segue.DestinationController is NSViewController) {\n\t\t\t// Grab view controller\n\t\t\tviewController = segue.DestinationController as NSViewController;\n\t\t}\n\n\t\t// Found?\n\t\tif (viewController == null) return;\n\n\t\t// Present window controller\n\t\tif (segue.SourceController is NSWindowController) {\n\t\t\tvar sourceController = segue.SourceController as NSWindowController;\n\t\t\tsourceController.Window.ContentViewController.PresentViewControllerAsSheet (viewController);\n\t\t} else if (segue.SourceController is NSViewController) {\n\t\t\tvar sourceController = segue.SourceController as NSViewController;\n\t\t\tsourceController.PresentViewControllerAsSheet (viewController);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Presents the Window or View to the user as a popover attached to a parent\n\t/// View.\n\t/// </summary>\n\t/// <param name=\"segue\">The <c>NSStoryboardSegue</c> to execute.</param>\n\t/// <param name=\"sender\">The <c>NSView</c> based element that the popover will be attached to.</param>\n\tprivate void PresentPopover (NSStoryboardSegue segue, NSObject sender)\n\t{\n\t\tNSViewController viewController = null;\n\t\tNSView view = null;\n\n\t\t// Take action based on the controller type\n\t\tif (segue.DestinationController is NSWindowController) {\n\t\t\t// Display the window to the user\n\t\t\tvar windowController = segue.DestinationController as NSWindowController;\n\t\t\tviewController = windowController.Window.ContentViewController;\n\t\t} else if (segue.DestinationController is NSViewController) {\n\t\t\t// Grab view controller\n\t\t\tviewController = segue.DestinationController as NSViewController;\n\t\t}\n\n\t\t// Found?\n\t\tif (viewController == null) return;\n\n\t\t// Take action based on sender type\n\t\tif (sender is NSToolbarItem) {\n\t\t\tvar item = sender as NSToolbarItem;\n\t\t\tif (item.View == null) {\n\t\t\t\t// Default to presenting as a sheet\n\t\t\t\tPresentSheet (segue);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\t// Use the items view\n\t\t\t\tview = item.View;\n\t\t\t}\n\t\t} else {\n\t\t\t// It's a view based control\n\t\t\tview = sender as NSView;\n\t\t}\n\n\t\t// Present window controller\n\t\tif (segue.SourceController is NSWindowController) {\n\t\t\tvar sourceController = segue.SourceController as NSWindowController;\n\t\t\tsourceController.Window.ContentViewController.PresentViewController (viewController, viewController.View.Bounds, view, PopoverEdge, PopoverBehavior);\n\t\t} else if (segue.SourceController is NSViewController) {\n\t\t\tvar sourceController = segue.SourceController as NSViewController;\n\t\t\tsourceController.PresentViewController (viewController, viewController.View.Bounds, view, PopoverEdge, PopoverBehavior);\n\t\t}\n\t}\n\t#endregion\n\n\t#region Public Methods\n\t/// <summary>\n\t/// Performs the segue as specified in this Segue Definition.\n\t/// </summary>\n\t/// <param name=\"sender\">The object that is launching the segue.</param>\n\t/// <param name=\"sourceController\">Source controller for the segue.</param>\n\tpublic void PerformSegue (NSObject sender, NSObject sourceController)\n\t{\n\n\t\t//NSApplication.SharedApplication.KeyWindow.Title = \"Loading Segue\"; \n\n\t\t// Prepare for segue\n\t\tvar segue = PrepareForSegue (sender, sourceController);\n\n\t\t// Did the NIB load?\n\t\tif (segue == null) return;\n\n\t\t//NSApplication.SharedApplication.KeyWindow.Title = \"Segue Loaded\";\n\n\t\t// Take action based on the Segue type\n\t\tswitch (SegueKind) {\n\t\tcase StoryboardSegueType.Show:\n\t\t\tPresentNonModalWindow (segue);\n\t\t\tbreak;\n\t\tcase StoryboardSegueType.Modal:\n\t\t\tPresentModalWindow (segue);\n\t\t\tbreak;\n\t\tcase StoryboardSegueType.Sheet:\n\t\t\tPresentSheet (segue);\n\t\t\tbreak;\n\t\tcase StoryboardSegueType.Popover:\n\t\t\tPresentPopover (segue, sender);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Sets the popover behavior.\n\t/// </summary>\n\t/// <param name=\"behavior\">Behavior as a string value.</param>\n\tpublic void SetPopoverBehavior (string behavior)\n\t{\n\t\t// Anything to do?\n\t\tif (behavior == null) return;\n\n\t\t// Take action based on value\n\t\tswitch (behavior) {\n\t\tcase \"t\":\n\t\t\tPopoverBehavior = NSPopoverBehavior.Transient;\n\t\t\tbreak;\n\t\tcase \"semitransient\":\n\t\t\tPopoverBehavior = NSPopoverBehavior.Semitransient;\n\t\t\tbreak;\n\t\tcase \"applicationDefined\":\n\t\t\tPopoverBehavior = NSPopoverBehavior.ApplicationDefined;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Sets the popover edge.\n\t/// </summary>\n\t/// <param name=\"edge\">Edge as a string value.</param>\n\tpublic void SetPopoverEdge (string edge)\n\t{\n\t\t// Anything to do?\n\t\tif (edge == null) return;\n\n\t\t// Take action based on value\n\t\tswitch (edge) {\n\t\tcase \"minX\":\n\t\t\tPopoverEdge = 0;\n\t\t\tbreak;\n\t\tcase \"minY\":\n\t\t\tPopoverEdge = 1;\n\t\t\tbreak;\n\t\tcase \"maxX\":\n\t\t\tPopoverEdge = 2;\n\t\t\tbreak;\n\t\tcase \"maxY\":\n\t\t\tPopoverEdge = 3;\n\t\t\tbreak;\n\t\t}\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// Helper class used to compile a storyboard included in a workbook.\n/// </summary>\npublic static class StoryboardCompiler\n{\n\t#region Public Methods\n\t/// <summary>\n\t/// Compiles the specified storyboardName.\n\t/// </summary>\n\t/// <param name=\"storyboardName\">The Storyboard name of the storyboard to compile without the `.storyboard` extension.</param>\n\tpublic static void Compile (string storyboardName)\n\t{\n\t\t// Assemble the Interface Builder compiler call\n\t\tvar dir = Directory.GetCurrentDirectory ();\n\t\tvar command = \"ibtool\";\n\t\tvar arguments = $\"\\\"{dir}/{storyboardName}.storyboard\\\" --compile \\\"{dir}/{storyboardName}.storyboardc\\\"\";\n\n\t\t// Prepare to call the system to invoke the ibtool\n\t\tvar startInfo = new ProcessStartInfo () {\n\t\t\tFileName = command,\n\t\t\tArguments = arguments,\n\t\t\tUseShellExecute = false,\n\t\t\tCreateNoWindow = true,\n\t\t\tRedirectStandardOutput = true,\n\t\t\tRedirectStandardError = true,\n\t\t\tRedirectStandardInput = true,\n\t\t\tUserName = System.Environment.UserName\n\t\t};\n\n\t\t// Invoke the ibtool and write the results to the\n\t\t// console\n\t\tusing (Process process = Process.Start (startInfo)) { // Monitor for exit}\n\t\t\tprocess.WaitForExit ();\n\t\t\tusing (var output = process.StandardOutput) {\n\t\t\t\tvar results = output.ReadToEnd ();\n\t\t\t\tConsole.WriteLine (\"Results: {0}\", (results == \"\") ? \"Successful\" : results);\n\t\t\t}\n\t\t}\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// The StoryboardBinder class provides a mechanism to bind objects inflated from a\n/// compiled Storyboard NIB file to classes in a workbook. Currently it can bind:\n/// NSMenu, NSToolBar, NSWindowController, NSWindow, NSViewController, NSView and\n/// any NSView base controls (such as NSButton).\n/// \n/// It uses the following hack to support Outlets: a) NSWindow and NSView based\n/// controls are bound to Public Properties matching their Identifier property,\n/// b) NSMenuItems are bound to Public Properties matching Title + \"MenuItem\",\n/// c) NSToolbarItems are bound to Public Properties matching Label + \"ToolbarItem\".\n/// \n/// Custom Segues are currently not supported. For many standard items (such as\n/// NSButton and NSImageView), images will attempted to be bound to `.png` files of\n/// the same name in an `Images` directory in the workbooks directory.\n/// </summary>\npublic static class StoryboardBinder \n{\n\t#region Public Methods\n\t/// <summary>\n\t/// Bind the specified storyboardClass and workbookClass. For high-level classes\n\t/// like NSWindowController and NSViewController, the binder will walk down the\n\t/// tree of objects binding lower-level items along the chain.\n\t/// </summary>\n\t/// <param name=\"storyboardClass\">The high-level storyboard (or workbook) class to bind from.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void Bind (NSObject storyboardClass, NSObject workbookClass)\n\t{\n\t\t// Take action based on the source object type\n\t\tif (storyboardClass is NSMenu) {\n\t\t\tBindMenu (storyboardClass as NSMenu, workbookClass);\n\t\t} else if (storyboardClass is NSWindowController) {\n\t\t\tBindWindowController (storyboardClass as NSWindowController, workbookClass);\n\t\t} else if (storyboardClass is NSWindow) {\n\t\t\tBindWindow (storyboardClass as NSWindow, workbookClass);\n\t\t} else if (storyboardClass is NSViewController) {\n\t\t\tBindViewController (storyboardClass as NSViewController, workbookClass);\n\t\t} else if (storyboardClass is NSView) {\n\t\t\tBindView (storyboardClass as NSView, workbookClass);\n\t\t} else if (storyboardClass is NSToolbar) {\n\t\t\tBindToolbar (storyboardClass as NSToolbar, workbookClass);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Attempts to bind an NSImage that has been specified in Interface Builder in the\n\t/// form `TheImage.png` to a like-named image file in the `Images` directory in the\n\t/// same directory as the workbook.\n\t/// </summary>\n\t/// <returns>The NSImage loaded from the `Images` directory or the passed-in NSImage if not found.</returns>\n\t/// <param name=\"image\">The source NSImage as specified in Interface Builder.</param>\n\tpublic static NSImage BindImage (NSImage image)\n\t{\n\t\t// Has an image been specified?\n\t\tif (image !=null && image.Name != null && image.Name.Contains (\".png\")) {\n\t\t\t// Yes, attempt load the image resource\n\t\t\tvar imageName = $\"Images/{image.Name}\";\n\n\t\t\t// Does the file exist?\n\t\t\tif (File.Exists (imageName)) {\n\t\t\t\t// Yes, load new image\n\t\t\t\timage = new NSImage (imageName);\n\t\t\t}\n\t\t}\n\n\t\treturn image;\n\t}\n\n\t/// <summary>\n\t/// Binds any Menu Item to a Public Property in a workbook class that matches\n\t/// Title + \"MenuItem\". For example, the \"New\" Menu Item to the \"NewMenuItem\"\n\t/// Property.\n\t/// </summary>\n\t/// <remarks>Any image specified in an item will also attemp to be bound.</remarks>\n\t/// <param name=\"menu\">The NSMenu to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindMenu (NSMenu menu, NSObject workbookClass)\n\t{\n\t\t// Bind all menu items\n\t\tfor (nint n = 0; n < menu.Count; ++n) {\n\t\t\tvar menuItem = menu.ItemAt (n);\n\n\t\t\t// Bind identity using a hack\n\t\t\tvar propertyName = $\"{menuItem.Title.Replace (\" \", \"\").Replace (\"…\", \"\")}MenuItem\";\n\t\t\tBindProperty (propertyName, workbookClass, menuItem);\n\n\t\t\t// Bind image\n\t\t\tmenuItem.Image = BindImage (menuItem.Image);\n\n\t\t\t// Bind actions\n\t\t\tBindAction (menuItem.Action, workbookClass, menuItem);\n\n\t\t\t// Has segue?\n\t\t\tif (menuItem.Target is StoryboardSegueDefinition) {\n\t\t\t\tvar segue = menuItem.Target as StoryboardSegueDefinition;\n\n\t\t\t\t// Bind it\n\t\t\t\tmenuItem.Activated += (sender, e) => {\n\t\t\t\t\tsegue.PerformSegue (menuItem, workbookClass);\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Scan sub menus\n\t\t\tif (menuItem.Submenu != null) {\n\t\t\t\tBindMenu (menuItem.Submenu, workbookClass);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\n\t/// <summary>\n\t/// Binds any Toolbar Item to A Public Property in a workbook class that matches\n\t/// Label + \"ToolbarItem\". For example, the \"Color\" Toolbar Item to the \"ColorToolbarItem\"\n\t/// Property.\n\t/// </summary>\n\t/// <remarks>Any image specified in an item will also attemp to be bound.</remarks>\n\t/// <param name=\"toolbar\">The NSToolbar to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindToolbar (NSToolbar toolbar, NSObject workbookClass)\n\t{\n\t\t// Bind all items on the Toolbar\n\t\tforeach (NSToolbarItem item in toolbar.Items) {\n\t\t\t// Bind identity using a hack\n\t\t\tvar propertyName = $\"{item.Label.Replace (\" \", \"\")}ToolbarItem\";\n\t\t\tBindProperty (propertyName, workbookClass, item);\n\n\t\t\t// Bind Images\n\t\t\titem.Image = BindImage (item.Image);\n\n\t\t\t// Bind actions\n\t\t\tBindAction (item.Action, workbookClass, item);\n\n\t\t\t// Has segue?\n\t\t\tif (item.Target is StoryboardSegueDefinition) {\n\t\t\t\tvar segue = item.Target as StoryboardSegueDefinition;\n\n\t\t\t\t// Bind it\n\t\t\t\titem.Activated += (sender, e) => {\n\t\t\t\t\tsegue.PerformSegue (item, workbookClass);\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Binds the Window Controller to the given workbook class. This method will walk down the\n\t/// tree of objects binding lower-level classes as well.\n\t/// </summary>\n\t/// <param name=\"controller\">The NSWindowController to bind from.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindWindowController (NSWindowController controller, NSObject workbookClass)\n\t{\n\t\t// Bind controlled window\n\t\tBindWindow (controller.Window, workbookClass);\n\n\t\t// Binding to a Window Controller?\n\t\tif (workbookClass is NSWindowController) {\n\t\t\t// Yes, bind controllers\n\t\t\tvar windowController = workbookClass as NSWindowController;\n\t\t\twindowController.Window = controller.Window;\n\n\t\t\t// Is the window loaded?\n\t\t\tif (windowController.IsWindowLoaded) {\n\t\t\t\t// Simulate the window being loaded by the workbook's controller instance\n\t\t\t\twindowController.WindowWillLoad ();\n\t\t\t\twindowController.WindowDidLoad ();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/// <summary>\n\t\t/// Binds the Window to the given workbook class. This method will walk down the tree\n\t\t/// of objects binding lower-level classes as well.\n\t\t/// </summary>\n\t\t/// <param name=\"window\">The NSWindow to bind from.</param>\n\t\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\t\tpublic static void BindWindow (NSWindow window, NSObject workbookClass)\n\t\t{\n\t\t\t// Bind identity\n\t\t\tBindProperty (window.Identifier, workbookClass, window);\n\n\t\t\t// Does the window have a toolbar?\n\t\t\tif (window.Toolbar != null) {\n\t\t\t\t// Yes, bind it\n\t\t\t\tBindToolbar (window.Toolbar, workbookClass);\n\t\t\t}\n\n\t\t\t// Binding to a window instance?\n\t\t\tif (workbookClass is NSWindow && workbookClass.GetType ().Name == window.Identifier) {\n\t\t\t\t// Yes, bind objects\n\t\t\t\tvar wbWindow = workbookClass as NSWindow;\n\t\t\t\twbWindow.ContentViewController = window.ContentViewController;\n\t\t\t\twbWindow.ContentView = window.ContentView;\n\t\t\t}\n\n\t\t\t// Does the window contain a Split View\n\t\t\tif (window.ContentView is NSSplitView) {\n\t\t\t\t// Bind split view contents\n\t\t\t\tBindSplitView (window.ContentView as NSSplitView, workbookClass);\n\t\t\t} else {\n\t\t\t\t// Bind content view controller\n\t\t\t\tBindViewController (window.ContentViewController, workbookClass);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Binds the split view to the given workbook class. This method will walk down the\n\t\t/// tree of objects binding lower-level classes as well.\n\t\t/// </summary>\n\t\t/// <param name=\"splitView\">Split view being bound.</param>\n\t\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\t\tpublic static void BindSplitView (NSSplitView splitView, NSObject workbookClass)\n\t\t{\n\t\t\t// Bind identity\n\t\t\tBindProperty (splitView.Identifier, workbookClass, splitView);\n\n\t\t\t// Bind all the attached views\n\t\t\tforeach (NSView view in splitView.ArrangedSubviews) {\n\t\t\t\t// Bind controlled view\n\t\t\t\tBindView (view, workbookClass);\n\t\t\t}\n\n\t\t\t// Binding to a view controller?\n\t\t\tif (workbookClass is NSViewController) {\n\t\t\t\t// Yes, bind controllers\n\t\t\t\tvar viewController = workbookClass as NSViewController;\n\t\t\t\tviewController.View = splitView;\n\n\t\t\t\t// Simulate the view being loaded by the workbook's controller instance\n\t\t\t\tviewController.ViewDidLoad ();\n\t\t\t\tviewController.ViewWillAppear ();\n\t\t\t\tviewController.ViewDidAppear ();\n\t\t\t\tviewController.ViewWillLayout ();\n\t\t\t\tviewController.ViewDidLayout ();\n\t\t\t}\n\t\t}\n\n\t/// <summary>\n\t/// Binds the View Controller to the given workbook class. This method will walk down the\n\t/// tree of objects binding lower-level classes as well.\n\t/// </summary>\n\t/// <param name=\"controller\">The NSViewController to bind from.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindViewController (NSViewController controller, NSObject workbookClass)\n\t{\n\t\t// Bind controlled view\n\t\tBindView (controller.View, workbookClass);\n\n\t\t// Binding to a view controller?\n\t\tif (workbookClass is NSViewController) {\n\t\t\t// Yes, bind controllers\n\t\t\tvar viewController = workbookClass as NSViewController;\n\t\t\tviewController.View = controller.View;\n\n\t\t\t// Is the view loaded?\n\t\t\tif (controller.ViewLoaded) {\n\t\t\t\t// Simulate the view being loaded by the workbook's controller instance\n\t\t\t\tviewController.ViewDidLoad ();\n\t\t\t\tviewController.ViewWillAppear ();\n\t\t\t\tviewController.ViewDidAppear ();\n\t\t\t\tviewController.ViewWillLayout ();\n\t\t\t\tviewController.ViewDidLayout ();\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Binds the View to the given workbook class. This method will transverse all SubViews\n\t/// in the given tree.\n\t/// </summary>\n\t/// <remarks>Any image specified in a known item will also attemp to be bound.</remarks>\n\t/// <param name=\"view\">The NSView to bind from.</param>\n\t/// <param name=\"workbookClass\">The workbook class to bind to.</param>\n\tpublic static void BindView (NSView view, NSObject workbookClass)\n\t{\n\t\t// Bind identity\n\t\tBindProperty (view.Identifier, workbookClass, view);\n\n\t\t// Bind images for known items\n\t\tif (view is NSButton) {\n\t\t\tvar button = view as NSButton;\n\t\t\tbutton.Image = BindImage (button.Image);\n\t\t\tBindAction (button.Action, workbookClass, button);\n\n\t\t\t// Has segue?\n\t\t\tif (button.Target is StoryboardSegueDefinition) {\n\t\t\t\tvar segue = button.Target as StoryboardSegueDefinition;\n\n\t\t\t\t// Bind it\n\t\t\t\tbutton.Activated += (sender, e) => {\n\t\t\t\t\tsegue.PerformSegue (button, workbookClass);\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (view is NSPopUpButton) {\n\t\t\tvar popup = view as NSPopUpButton;\n\t\t\tforeach (NSMenuItem item in popup.Items ()) {\n\t\t\t\titem.Image = BindImage (item.Image);\n\t\t\t}\n\t\t\tBindAction (popup.Action, workbookClass, popup);\n\t\t} else if (view is NSSegmentedControl) {\n\t\t\tvar segment = view as NSSegmentedControl;\n\t\t\tfor (nint n = 0; n < segment.SegmentCount; ++n) {\n\t\t\t\tvar image = segment.GetImage (n);\n\t\t\t\tsegment.SetImage (BindImage (image), n);\n\t\t\t}\n\t\t\tBindAction (segment.Action, workbookClass, segment);\n\t\t} else if (view is NSImageView) {\n\t\t\tvar image = view as NSImageView;\n\t\t\timage.Image = BindImage (image.Image);\n\t\t}\n\n\t\t// Bind every subview\n\t\tforeach (NSView subview in view.Subviews) {\n\t\t\tBindView (subview, workbookClass);\n\t\t}\n\n\t}\n\t#endregion\n\n\t#region Private Methods\n\t/// <summary>\n\t/// Attempts to bind an object inflated from a compiled Storyboard to an \"Outlet\"\n\t/// property on the given workbook class. This hack is a workaround since true\n\t/// Storyboard Outlets are not supported in workbooks.\n\t/// </summary>\n\t/// <param name=\"propertyName\">The name of the Public Property to bind the Outlet to.</param>\n\t/// <param name=\"workbookClass\">The workbook class being bound to.</param>\n\t/// <param name=\"property\">The object inflated from the compiled Storyboard.</param>\n\tprivate static void BindProperty (string propertyName, NSObject workbookClass, NSObject property)\n\t{\n\t\t// Anything to process?\n\t\tif (propertyName == null) return;\n\n\t\t// Does the controller contain the property?\n\t\tvar controllerType = workbookClass.GetType ();\n\t\tvar propertyInfo = controllerType.GetProperty (propertyName);\n\t\tif (propertyInfo != null && propertyInfo.CanWrite) {\n\t\t\t// Yes, save value in class\n\t\t\tvar value = Convert.ChangeType (property, propertyInfo.PropertyType);\n\t\t\tpropertyInfo.SetValue (workbookClass, value);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Attempts to bind an object inflated from a compiled Storyboard to an \"Action\"\n\t/// property on the given workbook class. This hack is a workaround since true\n\t/// Storyboard Actions are not supported in workbooks.\n\t/// </summary>\n\t/// <param name=\"action\">The selector that represents the Action to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class being bound to.</param>\n\t/// <param name=\"menuItem\">The Menu Item that is the target of the binding.</param>\n\tprivate static void BindAction (Selector action, NSObject workbookClass, NSMenuItem menuItem)\n\t{\n\t\t// Anything to process?\n\t\tif (action == null) return;\n\n\t\t// Switch to .NET style method name\n\t\tvar actionName = action.Name.Substring(0,1).ToUpper() + action.Name.Substring(1).Replace (\":\", \"\");\n\n\t\t// Does the class contain the method?\n\t\tvar controllerType = workbookClass.GetType ();\n\t\tvar methodInfo = controllerType.GetMethod (actionName);\n\t\tif (methodInfo != null) {\n\t\t\t// Yes, wireup action to class\n\t\t\tmenuItem.Activated += (sender, e) => {\n\t\t\t\tmethodInfo.Invoke (workbookClass, new [] { sender });\n\t\t\t};\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Attempts to bind an object inflated from a compiled Storyboard to an \"Action\"\n\t/// property on the given workbook class. This hack is a workaround since true\n\t/// Storyboard Actions are not supported in workbooks.\n\t/// </summary>\n\t/// <param name=\"action\">The selector that represents the Action to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class being bound to.</param>\n\t/// <param name=\"toolbarItem\">The Toolbar Item that is the target of the binding.</param>\n\tprivate static void BindAction (Selector action, NSObject workbookClass, NSToolbarItem toolbarItem)\n\t{\n\t\t// Anything to process?\n\t\tif (action == null) return;\n\n\t\t// Switch to .NET style method name\n\t\tvar actionName = action.Name.Substring (0, 1).ToUpper () + action.Name.Substring (1).Replace (\":\", \"\");\n\n\t\t// Does the class contain the method?\n\t\tvar controllerType = workbookClass.GetType ();\n\t\tvar methodInfo = controllerType.GetMethod (actionName);\n\t\tif (methodInfo != null) {\n\t\t\t// Yes, wireup action to class\n\t\t\ttoolbarItem.Activated += (sender, e) => {\n\t\t\t\tmethodInfo.Invoke (workbookClass, new [] { sender });\n\t\t\t};\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Attempts to bind an object inflated from a compiled Storyboard to an \"Action\"\n\t/// property on the given workbook class. This hack is a workaround since true\n\t/// Storyboard Actions are not supported in workbooks.\n\t/// </summary>\n\t/// <param name=\"action\">The selector that represents the Action to bind.</param>\n\t/// <param name=\"workbookClass\">The workbook class being bound to.</param>\n\t/// <param name=\"control\">The control that is the target of the binding.</param>\n\tprivate static void BindAction (Selector action, NSObject workbookClass, NSControl control)\n\t{\n\t\t// Anything to process?\n\t\tif (action == null) return;\n\n\t\t// Switch to .NET style method name\n\t\tvar actionName = action.Name.Substring (0, 1).ToUpper () + action.Name.Substring (1).Replace (\":\", \"\");\n\n\t\t// Does the class contain the method?\n\t\tvar controllerType = workbookClass.GetType ();\n\t\tvar methodInfo = controllerType.GetMethod (actionName);\n\t\tif (methodInfo != null) {\n\t\t\t// Yes, wireup action to class\n\t\t\tcontrol.Activated += (sender, e) => {\n\t\t\t\tmethodInfo.Invoke (workbookClass, new [] { sender });\n\t\t\t};\n\t\t}\n\t}\n\t#endregion\n}\n\n/// <summary>\n/// Helper class that can inflate Views and View Controllers from a compiled Storyboard\n/// that has been included in a workbook.\n/// </summary>\npublic class StoryboardInflator : NSObject\n{\n\t#region Computed Properies\n\t/// <summary>\n\t/// Gets or sets the first responder that will act as the parent to all objects\n\t/// instantiated from the Storyboard.\n\t/// </summary>\n\t/// <value>The first responder.</value>\n\tpublic NSObject FirstResponder { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the bundle that contains the compiled Storyboard.\n\t/// </summary>\n\t/// <value>The bundle.</value>\n\tpublic NSBundle Bundle { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the main menu identifier.\n\t/// </summary>\n\t/// <value>The main menu identifier.</value>\n\tpublic string MainMenuIdentifier { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the entry point identifier for the initial object specified in\n\t/// Storyboard.\n\t/// </summary>\n\t/// <value>The entry point identifier.</value>\n\tpublic string EntryPointIdentifier { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the view controller identifiers to nib names dictionary.\n\t/// </summary>\n\t/// <value>The view controller identifiers to nib names.</value>\n\tpublic NSDictionary ViewControllerIdentifiersToNibNames { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the view controller identifiers to UUID dictionary.\n\t/// </summary>\n\t/// <value>The view controller identifiers to UUID.</value>\n\tpublic NSDictionary ViewControllerIdentifiersToUUIDs { get; set; }\n\n\t/// <summary>\n\t/// Gets or sets the segue definitions that were defined in the Storyboard.\n\t/// </summary>\n\t/// <value>The segue definition collection.</value>\n\tpublic List<StoryboardSegueDefinition> SegueDefinitions { get; set; } = new List<StoryboardSegueDefinition> ();\n\t#endregion\n\n\t#region Constructors\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:StoryboardInflator\"/> class.\n\t/// </summary>\n\t/// <remarks>This constructor sets the First Responder to the AppDelegate.</remarks>\n\t/// <param name=\"bundleFile\">The Bundle file that contains the compiled Storyboard.</param>\n\tpublic StoryboardInflator (string bundleFile)\n\t{\n\n\t\t// Initialize\n\t\tInitialize (bundleFile, (NSObject)NSApplication.SharedApplication.Delegate);\n\t}\n\n\t/// <summary>\n\t/// Initializes a new instance of the <see cref=\"T:StoryboardInflator\"/> class.\n\t/// </summary>\n\t/// <param name=\"bundleFile\">The Bundle file that contains the compiled Storyboard.</param>\n\t/// <param name=\"owner\">The object that will act as the owner (First Responder) of\n\t/// any object instantiated from the Storyboard.</param>\n\tpublic StoryboardInflator (string bundleFile, NSObject owner)\n\t{\n\n\t\t// Initialize\n\t\tInitialize (bundleFile, owner);\n\t}\n\n\t/// <summary>\n\t/// Initialize the specified bundle file and owner.\n\t/// </summary>\n\t/// <param name=\"bundleFile\">The Bundle file that contains the compiled Storyboard.</param>\n\t/// <param name=\"owner\">The object that will act as the owner (First Responder) of\n\t/// any object instantiated from the Storyboard.</param>\n\tinternal void Initialize (string bundleFile, NSObject owner)\n\t{\n\n\t\t// Initialize\n\t\tLoadSegueDefinitions (bundleFile);\n\t\tBundle = new NSBundle (bundleFile);\n\t\tFirstResponder = owner;\n\n\t\t// Read the structure of the Storyboard\n\t\tEntryPointIdentifier = Bundle.InfoDictionary.ObjectForKey (new NSString (\"NSStoryboardDesignatedEntryPointIdentifier\")).ToString ();\n\t\tMainMenuIdentifier = Bundle.InfoDictionary.ObjectForKey (new NSString (\"NSStoryboardMainMenu\")).ToString ();\n\t\tViewControllerIdentifiersToNibNames = Bundle.InfoDictionary.ObjectForKey (new NSString (\"NSViewControllerIdentifiersToNibNames\")) as NSDictionary;\n\t\tViewControllerIdentifiersToUUIDs = Bundle.InfoDictionary.ObjectForKey (new NSString (\"NSViewControllerIdentifiersToNibNames\")) as NSDictionary;\n\n\t}\n\t#endregion\n\n\t#region Private Methods\n\t/// <summary>\n\t/// Loads the segue definitions from the non-compiled version of the Storyboard.\n\t/// </summary>\n\t/// <param name=\"bundleFile\">The Bundle file that contains the compiled Storyboard.</param>\n\tprivate void LoadSegueDefinitions (string bundleFile)\n\t{\n\t\t// Open the non-compiled Storyboard\n\t\tvar path = bundleFile.Replace (\".storyboardc\", \".storyboard\");\n\t\tvar reader = new XmlTextReader (path);\n\n\t\t// Track the tree of objects that the Segue is defined in\n\t\tvar parsingObject = StoryboardObjectType.Unknown;\n\t\tvar parsingID = \"\";\n\t\tvar sceneType = StoryboardObjectType.Unknown;\n\t\tvar sceneID = \"\";\n\n\t\t// Read through the non-compiled Storyboard to find all Segue\n\t\t// definitions\n\t\twhile (reader.Read ()) {\n\t\t\t// Take action based on node type\n\t\t\tswitch (reader.Name) {\n\t\t\tcase \"application\":\n\t\t\t\tsceneType = StoryboardObjectType.Application;\n\t\t\t\tvar appID = reader.GetAttribute (\"id\");\n\t\t\t\tif (appID != null) {\n\t\t\t\t\tsceneID = appID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"menuItem\":\n\t\t\t\tvar title = reader.GetAttribute (\"title\");\n\t\t\t\tif (title != null) {\n\t\t\t\t\tparsingObject = StoryboardObjectType.MenuItem;\n\t\t\t\t\tparsingID = title;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"windowController\":\n\t\t\t\tsceneType = StoryboardObjectType.WindowController;\n\t\t\t\tvar wcID = reader.GetAttribute (\"id\");\n\t\t\t\tif (wcID != null) {\n\t\t\t\t\tparsingObject = StoryboardObjectType.WindowController;\n\t\t\t\t\tparsingID = wcID;\n\t\t\t\t\tsceneID = wcID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"toolbarItem\":\n\t\t\t\tvar tbID = reader.GetAttribute (\"label\");\n\t\t\t\tif (tbID != null) {\n\t\t\t\t\tparsingObject = StoryboardObjectType.ToolbarItem;\n\t\t\t\t\tparsingID = tbID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"viewController\":\n\t\t\t\tsceneType = StoryboardObjectType.ViewController;\n\t\t\t\tvar vcID = reader.GetAttribute (\"id\");\n\t\t\t\tif (vcID != null) {\n\t\t\t\t\tsceneID = vcID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"splitViewController\":\n\t\t\t\tsceneType = StoryboardObjectType.SplitViewController;\n\t\t\t\tvar svcID = reader.GetAttribute (\"id\");\n\t\t\t\tif (svcID != null) {\n\t\t\t\t\tsceneID = svcID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"button\":\n\t\t\t\tvar buttonID = reader.GetAttribute (\"identifier\");\n\t\t\t\tif (buttonID != null) {\n\t\t\t\t\tparsingObject = StoryboardObjectType.Button;\n\t\t\t\t\tparsingID = buttonID;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"segue\":\n\t\t\t\t// Read the Segue's Definition\n\t\t\t\tvar destination = reader.GetAttribute (\"destination\");\n\t\t\t\tvar kind = reader.GetAttribute (\"kind\");\n\t\t\t\tvar identifier = reader.GetAttribute (\"identifier\");\n\t\t\t\tvar id = reader.GetAttribute (\"id\");\n\t\t\t\tvar relationship = reader.GetAttribute (\"relationship\");\n\t\t\t\tvar popoverAnchor = reader.GetAttribute (\"popoverAnchorView\");\n\t\t\t\tvar popoverBehavior = reader.GetAttribute (\"popoverBehavior\");\n\t\t\t\tvar popoverEdge = reader.GetAttribute (\"preferredEdge\");\n\n\t\t\t\t// Create a new definition, populate it and add it to\n\t\t\t\t// the collection\n\t\t\t\tvar definition = new StoryboardSegueDefinition (kind, this) {\n\t\t\t\t\tSceneType = sceneType,\n\t\t\t\t\tSceneID = sceneID,\n\t\t\t\t\tSourceObjectType = parsingObject,\n\t\t\t\t\tSourceObjectID = parsingID,\n\t\t\t\t\tDestinationControllerID = destination,\n\t\t\t\t\tSegueIdentifier = (identifier == null) ? id : identifier,\n\t\t\t\t\tRelationship = relationship,\n\t\t\t\t\tPopoverAnchorID = popoverAnchor\n\t\t\t\t};\n\t\t\t\tdefinition.SetPopoverBehavior (popoverBehavior);\n\t\t\t\tdefinition.SetPopoverEdge (popoverEdge);\n\t\t\t\tSegueDefinitions.Add (definition);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Pulls the type name from the description.\n\t/// </summary>\n\t/// <returns>The class type name.</returns>\n\t/// <remarks>This method is used for debugging.</remarks>\n\t/// <param name=\"description\">The description.</param>\n\tprivate string TypeName (string description)\n\t{\n\n\t\tvar posn = description.IndexOf (\":\");\n\t\treturn description.Substring (1, posn - 1);\n\t}\n\n\t/// <summary>\n\t/// Pulls the class handle pointer from the description.\n\t/// </summary>\n\t/// <returns>The handle pointer.</returns>\n\t/// <remarks>This method is used for debugging.</remarks>\n\t/// <param name=\"description\">The description.</param>\n\tprivate IntPtr ClassHandlePointer (string description)\n\t{\n\n\t\tvar posn = description.IndexOf (\":\");\n\t\tvar value = description.Substring (posn + 1, description.Length - posn - 1);\n\t\treturn Marshal.StringToHGlobalUni (value);\n\t}\n\n\t/// <summary>\n\t/// Prints the top objects to the console.\n\t/// </summary>\n\t/// <remarks>This method is used for debugging.</remarks>\n\t/// <param name=\"topLevelObjects\">The collection of top level objects.</param>\n\tprivate void PrintTopObjects (NSArray topLevelObjects)\n\t{\n\n\t\tNSObject element = null;\n\n\t\t// Scan all top level object for the window controller\n\t\tfor (nuint n = 0; n < topLevelObjects.Count; ++n) {\n\t\t\t// Access the current object\n\t\t\telement = topLevelObjects.GetItem<NSObject> (n);\n\t\t\tConsole.WriteLine (\">   Type: {0}\", TypeName (element.Description));\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Checks every Menu and Menu Item to see if a Segue has been attached to it.\n\t/// If so, it sets the <c>StoryboardSegueDefinition</c> as the Menu Item's \n\t/// <c>Target</c>.\n\t/// </summary>\n\t/// <param name=\"menu\">The <c>NSMenu</c> to scan.</param>\n\tprivate void LoadMenuSegueTargets (NSMenu menu)\n\t{\n\t\t// Check all items to see if they have been bound to a segue\n\t\tfor (nint x = 0; x < menu.Count; ++x) {\n\t\t\tvar menuItem = menu.ItemAt (x);\n\n\t\t\t// Has a segue been defined for this item?\n\t\t\tvar segueDefinition = FindSegueDefinition (StoryboardObjectType.MenuItem, menuItem.Title);\n\t\t\tif (segueDefinition != null) menuItem.Target = segueDefinition;\n\n\t\t\t// Scan sub menus\n\t\t\tif (menuItem.Submenu != null) {\n\t\t\t\tLoadMenuSegueTargets (menuItem.Submenu);\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Checks every Toolbar Item to see if a Segue has been attached to it.\n\t/// If so, it sets the <c>StoryboardSegueDefinition</c> as the Toolbar Item's \n\t/// <c>Target</c>.\n\t/// </summary>\n\t/// <param name=\"toolbar\">The <c>NSToolbar</c> to scan.</param>\n\tprivate void LoadToolbarItemSegueTargets (NSToolbar toolbar)\n\t{\n\t\t// Check all items to see if they have been bound to a segue\n\t\tforeach (NSToolbarItem item in toolbar.Items) {\n\t\t\t// Has a segue been defined for this item?\n\t\t\tvar segueDefinition = FindSegueDefinition (StoryboardObjectType.ToolbarItem, item.Label);\n\t\t\tif (segueDefinition != null) {\n\t\t\t\titem.Target = segueDefinition;\n\t\t\t}\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Checks every View and Sub View to see if a Segue has been attached to it.\n\t/// If so, it sets the <c>StoryboardSegueDefinition</c> as the View's \n\t/// <c>Target</c>.\n\t/// </summary>\n\t/// <param name=\"view\">The <c>NSView</c> to scan.</param>\n\tpublic void LoadViewSegueTargets (NSView view)\n\t{\n\t\t// Bind segues for known items\n\t\tif (view is NSButton) {\n\t\t\tvar button = view as NSButton;\n\n\t\t\t// Has a segue been defined for this item?\n\t\t\tvar segueDefinition = FindSegueDefinition (StoryboardObjectType.Button, button.Identifier);\n\t\t\tif (segueDefinition != null) {\n\t\t\t\tbutton.Target = segueDefinition;\n\t\t\t}\n\t\t} \n\n\t\t// Bind every subview\n\t\tforeach (NSView subview in view.Subviews) {\n\t\t\tLoadViewSegueTargets (subview);\n\t\t}\n\n\t}\n\n\t/// <summary>\n\t/// Loads the NIB from the specified NIB name and recursivly loads any sub NIBs\n\t/// for a known set of types such as <c>NSWindowController</c>, <c>NSViewController</c>,\n\t/// etc.\n\t/// </summary>\n\t/// <returns>The main top level element from the NIB as a known type such as \n\t/// <c>NSWindowController</c>, <c>NSViewController</c>, etc.</returns>\n\t/// <param name=\"nibName\">The name of the NIB to load.</param>\n\tprivate NSObject LoadNib (string nibName)\n\t{\n\t\tNSObject mainElement = null;\n\t\tvar topLevelObjects = new NSArray ();\n\t\tNSObject element = null;\n\t\tvar subNibName = \"\";\n\n\t\t// Anything to process?\n\t\tif (nibName == null) return null;\n\n\t\t//Console.WriteLine (\"Loading {0} -->\", nibName);\n\n\t\t// Load the given NIB\n\t\tif (Bundle.LoadNibNamed (nibName, FirstResponder, out topLevelObjects)) {\n\t\t\t// Discovery\n\t\t\t//Console.WriteLine (\"Parsing {0}:\", nibName);\n\t\t\t//PrintTopObjects (topLevelObjects);\n\n\t\t\t// Scan all top level object for a known object type\n\t\t\tfor (nuint n = 0; n < topLevelObjects.Count; ++n) {\n\t\t\t\t// Access the current object\n\t\t\t\telement = topLevelObjects.GetItem<NSObject> (n);\n\n\t\t\t\t// Search for known types\n\t\t\t\tif (element is NSMenu) {\n\t\t\t\t\t// Found main menu\n\t\t\t\t\tif (mainElement == null) mainElement = element;\n\t\t\t\t\tvar menu = element as NSMenu;\n\t\t\t\t\tLoadMenuSegueTargets (menu);\n\t\t\t\t} else if (element is NSWindowController) {\n\t\t\t\t\t// Found window controller \n\t\t\t\t\tmainElement = element;\n\t\t\t\t\tvar windowController = element as NSWindowController;\n\n\t\t\t\t\t// Load the window's content view\n\t\t\t\t\tif (windowController.Window.ContentViewController is NSSplitViewController) {\n\t\t\t\t\t\t// Access Split View Controller\n\t\t\t\t\t\tvar splitViewController = windowController.Window.ContentViewController as NSSplitViewController;\n\n\t\t\t\t\t\t// Manufacture a new Split View and configure it the same as\n\t\t\t\t\t\t// the Split View from the storyboard\n\t\t\t\t\t\tvar splitView = new NSSplitView (splitViewController.View.Frame) {\n\t\t\t\t\t\t\tArrangesAllSubviews = splitViewController.SplitView.ArrangesAllSubviews,\n\t\t\t\t\t\t\tDividerStyle = splitViewController.SplitView.DividerStyle,\n\t\t\t\t\t\t\tIsVertical = splitViewController.SplitView.IsVertical\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Load all the attached views\n\t\t\t\t\t\tforeach (NSSplitViewItem svItem in splitViewController.SplitViewItems) {\n\t\t\t\t\t\t\tsubNibName = svItem.ViewController.NibName;\n\t\t\t\t\t\t\tvar view = LoadNib (subNibName) as NSView;\n\t\t\t\t\t\t\tsplitView.AddArrangedSubview (view);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsplitView.AdjustSubviews ();\n\n\t\t\t\t\t\t// Attach to window\n\t\t\t\t\t\twindowController.Window.ContentView = splitView;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsubNibName = windowController.Window.ContentViewController.NibName;\n\t\t\t\t\t\tvar contentView = LoadNib (subNibName) as NSView;\n\n\t\t\t\t\t\t// Found?\n\t\t\t\t\t\tif (contentView != null) {\n\t\t\t\t\t\t\t// Yes, attach it to the window\n\t\t\t\t\t\t\twindowController.Window.ContentViewController.View = contentView;\n\t\t\t\t\t\t\twindowController.Window.ContentView = contentView;\n\t\t\t\t\t\t\t//Console.WriteLine (\"* {0} View Attached\", subNibName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Is there a toolbar?\n\t\t\t\t\tif (windowController.Window.Toolbar != null) {\n\t\t\t\t\t\t// Scan items for attached segues\n\t\t\t\t\t\tLoadToolbarItemSegueTargets (windowController.Window.Toolbar);\n\t\t\t\t\t}\n\t\t\t\t} else if (element is NSViewController) {\n\t\t\t\t\t// Found View Controller\n\t\t\t\t\tif (mainElement == null) mainElement = element;\n\t\t\t\t\tvar viewController = element as NSViewController;\n\n\t\t\t\t\t// Load the controller's view\n\t\t\t\t\tsubNibName = viewController.NibName;\n\t\t\t\t\tvar view = LoadNib (subNibName) as NSView;\n\t\t\t\t\tviewController.View = view;\n\t\t\t\t} else if (element is NSView) {\n\t\t\t\t\t// Found View\n\t\t\t\t\tif (mainElement == null) mainElement = element;\n\t\t\t\t\tvar view = element as NSView;\n\t\t\t\t\tLoadViewSegueTargets (view);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Report error\n\t\t\tConsole.WriteLine (\"Unable to load: {0}\", nibName);\n\t\t}\n\n\t\t// Return the found main element\n\t\treturn mainElement;\n\t}\n\t#endregion\n\n\t#region Public Methods\n\t/// <summary>\n\t/// Instantiates the main menu from the storyboard.\n\t/// </summary>\n\t/// <returns>The main menu.</returns>\n\tpublic NSMenu InstantiateMainMenu ()\n\t{\n\t\treturn LoadNib (MainMenuIdentifier) as NSMenu;\n\t}\n\n\t/// <summary>\n\t/// Instantiates the main menu from the storyboard and binds it to the\n\t/// given instance of a workbook class.\n\t/// </summary>\n\t/// <returns>The main menu.</returns>\n\t/// <param name=\"parent\">The workbook instance to bind to.</param>\n\tpublic NSMenu InstantiateMainMenu (NSObject parent)\n\t{\n\t\t// Inflate menu\n\t\tvar menu = LoadNib (MainMenuIdentifier) as NSMenu;\n\n\t\t// Bind menu to parent class\n\t\tStoryboardBinder.BindMenu (menu, parent);\n\n\t\t// return inflated menu\n\t\treturn menu;\n\t}\n\n\t/// <summary>\n\t/// Instantiates the initial controller as specified in the Storyboard.\n\t/// </summary>\n\t/// <returns>The initial controller.</returns>\n\tpublic NSObject InstantiateInitialController ()\n\t{\n\t\t// Load element\n\t\tvar element = LoadNib (EntryPointIdentifier);\n\n\t\t// Is this a window controller?\n\t\tif (element is NSWindowController) {\n\t\t\t// Yes, display the window to the user\n\t\t\tvar windowController = element as NSWindowController;\n\t\t\twindowController.Window.MakeKeyAndOrderFront ((NSObject)NSApplication.SharedApplication.Delegate);\n\t\t}\n\n\t\t// Return loaded object\n\t\treturn element;\n\t}\n\n\t/// <summary>\n\t/// Instantiates the initial controller as specified in the Storyboard and binds it to\n\t/// the given instance of a workbook class.\n\t/// </summary>\n\t/// <returns>The initial controller.</returns>\n\t/// <param name=\"parent\">The workbook instance to bind to.</param>\n\tpublic NSObject InstantiateInitialController (NSObject parent)\n\t{\n\t\t// Get initial element\n\t\tvar element = InstantiateInitialController ();\n\n\t\t// Bind element to parent class\n\t\tStoryboardBinder.Bind (element, parent);\n\n\t\t// Return loaded object\n\t\treturn element; \n\t}\n\n\t/// <summary>\n\t/// Instantiates the controller from the NIB of the given name.\n\t/// </summary>\n\t/// <returns>The controller for nib name.</returns>\n\t/// <param name=\"nibName\">Nib name.</param>\n\tpublic NSObject InstantiateControllerForNibName (string nibName)\n\t{\n\t\tvar element = LoadNib (nibName);\n\n\t\t// Return loaded object\n\t\treturn element;\n\t}\n\n\t/// <summary>\n\t/// Returns the NIB name for the given Identifier or the empty string (\"\") if\n\t/// not found.\n\t/// </summary>\n\t/// <returns>The name for identifier or empty string (\"\") if not found.</returns>\n\t/// <param name=\"identifier\">The identifier to search for.</param>\n\tpublic string NibNameForIdentifier (string identifier)\n\t{\n\t\tfor (int n = 0; n < ViewControllerIdentifiersToNibNames.Keys.Count (); ++n) {\n\t\t\t// Get the key and value\n\t\t\tvar key = ViewControllerIdentifiersToNibNames.Keys [n].ToString ();\n\t\t\tvar value = ViewControllerIdentifiersToNibNames.Values [n].ToString ();\n\n\t\t\t// Found?\n\t\t\tif (key == identifier) return value;\n\t\t}\n\n\t\t// Return found name\n\t\treturn \"\";\n\t}\n\n\t/// <summary>\n\t/// Returns the NIB name for the partial Identifier or the empty string (\"\") if\n\t/// not found.\n\t/// </summary>\n\t/// <returns>The name for identifier or empty string (\"\") if not found.</returns>\n\t/// <param name=\"identifier\">The partial identifier to search for.</param>\n\tpublic string NibNameForPartialIdentifier (string identifier)\n\t{\n\t\tfor (int n = 0; n < ViewControllerIdentifiersToNibNames.Keys.Count (); ++n) {\n\t\t\t// Get the key and value\n\t\t\tvar key = ViewControllerIdentifiersToNibNames.Keys [n].ToString ();\n\t\t\tvar value = ViewControllerIdentifiersToNibNames.Values [n].ToString ();\n\n\t\t\t// Found?\n\t\t\tif (key.Contains(identifier)) return value;\n\t\t}\n\n\t\t// Return found name\n\t\treturn \"\";\n\t}\n\n\t/// <summary>\n\t/// Returns the UUID for the given Identifier or the empty string (\"\") if\n\t/// not found.\n\t/// </summary>\n\t/// <returns>The name for identifier or empty string (\"\") if not found.</returns>\n\t/// <param name=\"identifier\">The identifier to search for.</param>\n\tpublic string UUIDForIdentifier (string identifier)\n\t{\n\t\tfor (int n = 0; n < ViewControllerIdentifiersToUUIDs.Keys.Count (); ++n) {\n\t\t\t// Get the key and value\n\t\t\tvar key = ViewControllerIdentifiersToUUIDs.Keys [n].ToString ();\n\t\t\tvar value = ViewControllerIdentifiersToUUIDs.Values [n].ToString ();\n\n\t\t\t// Found?\n\t\t\tif (key == identifier) return value;\n\t\t}\n\n\t\t// Return found name\n\t\treturn \"\";\n\t}\n\n\t/// <summary>\n\t/// Instantiates the controller for the given identifier.\n\t/// </summary>\n\t/// <returns>The controller for identifier.</returns>\n\t/// <param name=\"identifier\">The identifier to instantiate.</param>\n\tpublic NSObject InstantiateControllerForIdentifier (string identifier)\n\t{\n\t\tvar nibName = NibNameForIdentifier (identifier);\n\n\t\t// Found?\n\t\tif (nibName == \"\") {\n\t\t\t// No\n\t\t\treturn null;\n\t\t} else {\n\t\t\t// Yes, instantiate named nib\n\t\t\treturn InstantiateControllerForNibName (nibName);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Instantiates the controller for the given partial identifier.\n\t/// </summary>\n\t/// <returns>The controller for partial identifier.</returns>\n\t/// <param name=\"identifier\">The partial identifier to instantiate.</param>\n\tpublic NSObject InstantiateControllerForPartialIdentifier (string identifier)\n\t{\n\t\tvar nibName = NibNameForPartialIdentifier (identifier);\n\n\t\t// Found?\n\t\tif (nibName == \"\") {\n\t\t\t// No\n\t\t\treturn null;\n\t\t} else {\n\t\t\t// Yes, instantiate named nib\n\t\t\treturn InstantiateControllerForNibName (nibName);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// Finds the segue definition for the given Scene and Source Object.\n\t/// </summary>\n\t/// <returns>The segue definition or <c>null</c> if not found.</returns>\n\t/// <param name=\"sceneType\">Scene type.</param>\n\t/// <param name=\"sceneID\">Scene identifier.</param>\n\t/// <param name=\"sourceObjectType\">Source object type.</param>\n\t/// <param name=\"sourceObjectID\">Source object identifier.</param>\n\tpublic StoryboardSegueDefinition FindSegueDefinition (StoryboardObjectType sceneType, string sceneID, StoryboardObjectType sourceObjectType, string sourceObjectID)\n\t{\n\t\t// Scan all definitions\n\t\tforeach (StoryboardSegueDefinition definition in SegueDefinitions) {\n\t\t\t// Found?\n\t\t\tif (definition.SceneType == sceneType &&\n\t\t\t    definition.SceneID == sceneID &&\n\t\t\t\tdefinition.SourceObjectType == sourceObjectType && \n\t\t\t    definition.SourceObjectID == sourceObjectID) {\n\t\t\t\treturn definition;\n\t\t\t}\n\t\t}\n\n\t\t// Not found\n\t\treturn null;\n\t}\n\n\t/// <summary>\n\t/// Finds the segue definition for the given Source Object.\n\t/// </summary>\n\t/// <returns>The segue definition or <c>null</c> if not found</returns>\n\t/// <param name=\"sourceObjectType\">Source object type.</param>\n\t/// <param name=\"sourceObjectID\">Source object identifier.</param>\n\tpublic StoryboardSegueDefinition FindSegueDefinition (StoryboardObjectType sourceObjectType, string sourceObjectID)\n\t{\n\t\t// Scan all definitions\n\t\tforeach (StoryboardSegueDefinition definition in SegueDefinitions) {\n\t\t\t// Found?\n\t\t\tif (definition.SourceObjectType == sourceObjectType && definition.SourceObjectID == sourceObjectID) {\n\t\t\t\treturn definition;\n\t\t\t}\n\t\t}\n\n\t\t// Not found\n\t\treturn null;\n\t}\n\n\t/// <summary>\n\t/// Finds the segue definition for the given Segue Identifier.\n\t/// </summary>\n\t/// <returns>The segue definition or <c>null</c> if not found.</returns>\n\t/// <param name=\"identifier\">The Segue Identifier to find.</param>\n\tpublic StoryboardSegueDefinition FindSegueDefinition (string identifier)\n\t{\n\t\t// Scan all definitions\n\t\tforeach (StoryboardSegueDefinition definition in SegueDefinitions) {\n\t\t\t// Found?\n\t\t\tif (definition.SegueIdentifier == identifier) {\n\t\t\t\treturn definition;\n\t\t\t}\n\t\t}\n\n\t\t// Not found\n\t\treturn null;\n\t}\n\t#endregion\n}\n"
  },
  {
    "path": "mac/user-interface/webbrowser/webbrowser.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- MacMobile\n---\n\n# How to Build a Web Browser in Xamarin.Mac\n\n### An exercise in creating a simple macOS app with many standard features using a Storyboard\n\nThis workbook will cover the steps required to build a mini, multi-windowed web browser in a Xamarin.Mac app. By going through the steps in this workbook, the reader will gain insights and skills required to work with many elements of a standard macOS app such as Menus, Windows, Window Controllers, Views, View Controllers, Toolbars, Text Field, Buttons and the Xcode Interface Builder Storyboard files used to define them.\n\nBefore starting this workbook, it is suggested that the reader reads our [Hello, Mac](https://developer.xamarin.com/guides/mac/getting_started/hello,_mac/) and [Introduction to Storyboards](https://developer.xamarin.com/guides/mac/platform-features/storyboards/) documentation first, as they provide a basis for the topics covered here.\n\n## An Introduction to Storyboards\n\nBefore getting started, let’s take a quick refresher in what a [Storyboard](https://developer.xamarin.com/guides/mac/platform-features/storyboards/#What_are_Storyboards) is and how it is used to define the User Interface for a macOS app. Storyboards allow the developer to create a User Interface for a Xamarin.Mac app that not only includes the window definitions and controls, but also contains the links between different windows (via segues) and view states. For example:\n\n![](Images/Intro01.png)\n\nA Storyboard defines all of the UI for a given app broken down into a functional overview of its View Controllers. Window Controllers contain and control the different Window types that a macOS app can create and contain these View Controllers. In Xcode's Interface Builder, each of these controllers lives in its own Scene:\n\n![](Images/Intro02.png)\n\nEach Scene represents a given View and View Controller Pair with a set of lines (called Segues) that connect each Scene in the UI, thus showing their relationships. Some Segues define how one View Controller contains one or more child Views or View Controllers. Other Segues, define transitions between View Controller (such as displaying a popover or dialog box).\n\nAfter the UI has been designed, the developer exposes the elements and controls to C# code using *Outlets* and *Actions*. Please see our [Outlets and Actions](https://developer.xamarin.com/guides/mac/getting_started/hello,_mac/#Outlets_and_Actions) documentation for more information.\n\n### Outlets and Actions\n\nSo what are Outlets and Actions? In traditional .NET User Interface programming, a control in the User Interface is automatically exposed as a property when it’s added. Things work differently in Mac, simply adding a control to a view doesn’t make it accessible to code. The developer must explicitly expose the UI element to code. In order do this, Apple provides two options:\n\n* **Outlets** – Outlets are analogous to properties. If the developer wires up a control to an Outlet, it’s exposed to the app’s code via a property, so the developer can do things like attach event handlers, call methods on it, etc.\n\n* **Actions** – Actions are analogous to the command pattern in WPF. For example, when an Action is performed on a control, say a button click, the control will automatically call a method in the app’s code. Actions are powerful and convenient because the developer can wire up many controls to the same Action.\n\nIn Xcode, Outlets and Actions are added directly in code via Control-dragging. More specifically, this means that in order to create an Outlet or Action, the developer chooses a control element to add an Outlet or Action for, holds down the Control key on the keyboard, and drags that control directly into their code.\n\n## Storyboards and Workbooks\n\nWorkbooks don’t natively support macOS Storyboards, so the first thing that will need to be done is to load a library that provides support:\n\n```csharp\n#load \"StoryboardResources.csx\"\n```\n\nUsing this library, there are a few differences that will need to be taken into account when designing UI in Xcode’s Interface Builder:\n\n* Outlets cannot be defined by Control-Dragging as normal because there is no `.h` header file to attach to. Instead, use the **Identifier** field in the **Identity Inspector** for **Windows, Views** and **View based Controls**. **Menu Items** will automatically bind to any Outlet that match their `Title` \\+ “*MenuItem*” (for example, `NewMenuItem`). **Toolbar Items** will automatically bind to any Outlet that match their `Label` \\+ “*ToolbarItem*” (for example, `ColorToolbarItem`).\n\n* Actions need to manually be added to the **First Responder** in the **Scene** where they will be used by clicking the **\\+** button in the **Attribute Inspector** and defining the new Action. Next, select the element to attach to, Control-Click, dragging a line to the **First Responder** in the same **Scene** and selecting the defined Action.\n\n* Only the built-in Segue types are currently supported by the library and **Views** and **View based Controls** *must* have a custom **Identifier** set in the **Identity Inspector**. For Custom Segues, the developer will have to manually load and display the child Window or View Controller.\n\n* Because of the way workbooks function, loading and instantiating Window and View Controllers  is done using methods of the `StoryboardInflator` helper class as opposed to using the typical `NSStoryboard` methods. For more information, please see our [Loading a Storyboard from Code](https://developer.xamarin.com/guides/mac/platform-features/storyboards/indepth/#Loading_from_Code) documentation.\n\n* The `StoryboardBinder` helper class will need to be used to \"bind\" (map) classes defined in the workbook to UI elements inflated from a Storyboard.\n\nWith these differences aside, Storyboards are used same way they typically would be in a normal macOS app, so the knowledge gained here can be used when building a regular Xamarin.Mac app project. For more information, please see our [Introduction to Storyboards](https://developer.xamarin.com/guides/mac/platform-features/storyboards/) documentation.\n\n### Compiling the Storyboard\n\nEvery time the developer edits the Storyboard, those changes will need to be compiled before they can be loaded in the workbook. Do this using the following command:\n\n```csharp\nvar usingStoryboard = \"Main\";\nStoryboardCompiler.Compile(usingStoryboard);\n```\n\n> ⚠️ To edit the Storyboard that is part of this workbook, select the `.workbook` file in Finder, right-click it and select **Show Package Contents**.\n\n## Defining the Supporting Classes\n\nThere are several supporting classes that will be required when working with a Xamarin.Mac app’s UI that has been loaded from a Storyboard. These include at least an `AppDelegate`, a `NSWindowController` (for each Window type that the app creates) and a `NSViewController` for every `NSView` that belongs to a Window.\n\nThe following sections will go over each of these required classes in detail.\n\n### The Main View Controller\n\nCocoa (and by derivation, CocoaTouch) uses what’s known as the Model View Controller (MVC) pattern. The `MainViewController` declaration represents the object that controls the actual content of the application Window. Generally, for every View created (and for many other things within the Windows and Views), there is a controller, which is responsible for the elements’s life cycle, such as showing it, adding new SubViews (controls) to it, etc. For more information, please see our [View Controllers](https://developer.xamarin.com/guides/mac/platform-features/storyboards/indepth/#View_Controllers) documentation.\n\nThe `MainViewController` class will act as this app’s Window *Content Controller* and will be responsible for the life cycle of the main Window’s content:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class MainViewController : NSViewController {\n\n    #region Outlets\n    [Outlet]\n    public NSButton GoButton {get; set;}\n\n    [Outlet]\n    public NSSegmentedControl HistoryButtons {get; set;}\n\n    [Outlet]\n    public NSTextField StatusLabel {get; set;}\n\n    [Outlet]\n    public NSTextField URLField {get; set;}\n\n    [Outlet]\n    public WebView WebBrowser {get; set;}\n    #endregion\n\n    #region Constructors\n    public MainViewController () : base() {\n\n    }\n    #endregion\n\n    #region Override Methods\n    public override void ViewWillAppear ()\n    {\n        base.ViewWillAppear ();\n\n        // Wireup interface\n        WebBrowser.ReceivedTitle += (sender, e) => {\n            View.Window.Title = e.Title;\n        };\n\n        WebBrowser.StartedProvisionalLoad += (sender, e) => {\n            StatusLabel.StringValue = \"Loading page...\";\n\t\t};\n\n        WebBrowser.FinishedLoad += (sender, e) => {\n            StatusLabel.StringValue = \"Ready\";\n            HistoryButtons.SetEnabled(WebBrowser.CanGoBack(),0);\n            HistoryButtons.SetEnabled(WebBrowser.CanGoForward(),1);\n\t\t};\n\n        // Display the Home website\n        ShowFavoriteWebsite(\"msn\");\n    }\n    #endregion\n\n    #region Public Methods\n    public void ShowURL(string path) {\n\n        // Display the given URL in the web browser\n        View.Window.Title = path;\n        var url = NSUrl.FromString(path);\n        var request = NSUrlRequest.FromUrl(url);\n        WebBrowser.MainFrame.LoadRequest(request);\n    }\n\n    public void ShowFavoriteWebsite(string name) {\n\n        var url = \"\";\n\n        // Set URL based on the favorite website name\n        switch(name){\n        case \"Amazon\":\n            url = \"http://amazon.com\";\n            break;\n        case \"Apple\":\n            url = \"http://apple.com\";\n            break;\n        case \"Bing\":\n            url = \"http://bing.com\";\n            break;\n        case \"Digg\":\n            url = \"http://digg.com\";\n            break;\n        case \"Facebook\":\n            url = \"http://facebook.com\";\n            break;\n        case \"Google\":\n            url = \"http://google.com\";\n            break;\n        case \"LinkedIn\":\n            url = \"http://linkedin.com\";\n            break;\n        case \"Microsoft\":\n            url = \"http://microsoft.com\";\n            break;\n        case \"msn\":\n            url = \"http://msn.com\";\n            break;\n        case \"Skype\":\n            url = \"http://skype.com\";\n            break;\n        case \"Twitter\":\n            url = \"http://twitter.com\";\n            break;\n        case \"YouTube\":\n            url = \"http://youtube.com\";\n            break;\n        }\n\n        // Update URL bar and show website\n        URLField.StringValue = url;\n        ShowURL(url);\n        View.Window.Title = name;\n    }\n    #endregion\n\n    #region Custom Actions\n    [Action (\"goButtonClicked:\")]\n    public void GoButtonClicked (Foundation.NSObject sender) {\n        // Anything to do?\n        if (URLField.StringValue == \"\") {\n            // No, report issue to user\n            StatusLabel.StringValue = \"Please enter a URL before clicking Go.\";\n            return;\n        }\n\n        // Display the requested URL\n        ShowURL(URLField.StringValue);\n    }\n    \n    [Action (\"historyButtonClicked:\")]\n    public void HistoryButtonClicked (Foundation.NSObject sender) {\n        // Cast to correct type\n        var segment = sender as NSSegmentedControl; \n        \n        // Take action based on the button selected\n        switch(HistoryButtons.SelectedSegment) {\n        case 0:\n            WebBrowser.GoBack();\n            break;\n        case 1:\n            WebBrowser.GoForward();\n            break;\n        }\n    }\n    #endregion\n}\n```\n\nLet’s take a look at what this code is doing in detail. First, several Outlets have been defined that relate to the UI elements that make up the main User Interface for the app as they were laid out in Xcode’s Interface builder:\n\n![](Images/UI01.png)\n\nWhen working with a real Xamarin.Mac project, the Outlets are typically automatically built by Xamarin Studio and would be in the `MainViewController.designer.cs` companion file. Because of the way workbooks function, they need to be manually defined here.\n\nThe `ViewWillAppear` method is called after the View Controller and View have been loaded and initialized from a Storyboard just before the View is displayed to the user.  Here it is being used to wire-up the UI elements that were exposed via the Outlets above.\n\nTwo custom Actions were also defined. The `historyButtonClicked:` Action is called when the user clicks on the forward and backward segments defined in the `NSSegmentedControl` included the UI. The `goButtonClicked:` Action is called when the user clicks the Go `NSButton` to navigate to the given web address.\n\nThe `WebBrowser.ReceivedTitle` event is called when the Web Browser control receives a new title from the web page being visited. The `WebBrowser.StartedProvisionalLoad` event is called when the Web Browser starts loading a web page. The `WebBrowser.FinishedLoad` event is called when the web page finishes loading. It is also responsible for enabling and disabling the forward and backward history buttons.\n\nThe `ShowURL` method will display the given URL in the web browser and the `ShowFavoriteWebsite` method is used to show URLs from the built-in favorite web pages that will be defined as both Menu Items and Toolbar Items below.\n\n> 💡**Try It Now**\n>\n> 1. Change the default URL that is displayed when a new Window is opened.\n>\n> 2. Set a new `BackgroundColor` and `TextColor` for the `GoButton` by editing the Storyboard in Xcode's Interface Builder.\n>\n> 3. Adjust the appearance of the `StatusLabel` and set a new default value by editing the Storyboard in Xcode's Interface Builder.\n>\n> 4. Make hitting the Enter key in the `URLField` cause the URL to load the same as clicking the Go button. ***Hint:** Use the `ShouldEndEditing` event of the `NSTextField` class.*\n>\n> ⚠️ These changes won't take effect until a new instance of the Window is instantiated in the **Starting the App and Displaying the Default Menu Bar and Window** section below.\n\n### The Main Window Controller\n\nJust like the `MainViewController` presented above, the `MainWindowController` represents the object that controls the application’s Window. Generally, for every Window created (and for many other things within the Windows), there is a controller, which is responsible for the Window’s life cycle, such as showing it, adding Content Views and View Controllers, etc. For more information, please see our [Window Controller](https://developer.xamarin.com/guides/mac/platform-features/storyboards/indepth/#Window_Controllers) documentation.\n\nThe `MainWindowController` class will act as the app’s Window Controller and will be responsible for the life cycle of the app’s main Window:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class MainWindowController : NSWindowController {\n\n    #region Computed Properties\n    public MainViewController ViewController {get; set;}\n    #endregion\n\n    #region Constructors\n    public MainWindowController() : base() {\n        \n    }\n    #endregion\n\n    #region Override Methods\n    public override void WindowDidLoad () {\n        // Initialize the window after it has loaded\n        Window.Title = \"Untitled\";\n\n    }\n    #endregion\n\n    #region Custom Actions\n    [Action (\"showFavoriteWebsite:\")]\n    public void ShowFavoriteWebsite (Foundation.NSObject sender) {\n        var item = sender as NSToolbarItem;\n        ViewController.ShowFavoriteWebsite(item.Label);\n    }\n    #endregion\n}\n```\n\nLet’s take a look at what this code is doing in detail. A custom `showFavoriteWebsite:` Action is created and every Toolbar Item in the custom Toolbar is hooked up to it:\n\n![](Images/UI02.png)\n\nThe `WindowDidLoad` event will be called after the Window and WindowController have been loaded and instantiated from the Storyboard. The default Window Title is being set here.\n\n> 💡**Try It Now**\n>\n> 1. Add more available Favorite URL items to the Toolbar in Xcode's Interface Builder, attach them to the `showFavoriteWebsite:` Action and add the new URLs to the `ShowFavoriteWebsite` method of the `MainViewController`. ***Hint:** Use a **Image Toolbar Item** in Interface Builder to add more items.* Please see our [Creating and Maintaining Toolbars in Xcode](https://developer.xamarin.com/guides/mac/user-interface/working-with-toolbars/#Creating_and_Maintaining_Toolbars_in_Xcode) documentation for more details.\n>\n> ⚠️ These changes won't take effect until a new instance of the Window is instantiated in the **Starting the App and Displaying the Default Menu Bar and Window** section below.\n\n### The Main Window Delegate\n\nThe `MainWindowDelegate` will be attached to each of the Main Windows created by the app to monitor and respond to events such as the Window becoming Key (being set as the active, front-most Window), the Window closing, etc.:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class MainWindowDelegate : NSWindowDelegate {\n\n    #region Computed Properties\n    public NSWindow Window { get; set;}\n    public MainWindowController WindowController {get; set;}\n    public MainViewController ViewController {get;set;}\n    #endregion\n\n    #region constructors\n    public MainWindowDelegate (NSWindow window, MainWindowController windowController, MainViewController viewController)\n    {\n        // Initialize\n        this.Window = window;\n        this.WindowController = windowController;\n        this.ViewController = viewController;\n    }\n    #endregion\n\n    #region Override Methods\n    public override void DidBecomeKey (NSNotification notification) {\n\n    }\n    #endregion\n}\n```\n\nFor now, `MainWindowDelegate` is just keeping track of the other Supporting Classes for each Window created. This will be required later when tracking which of the app’s Windows is currently Key.\n\n### The App Delegate\n\nThe [AppDelegate](https://developer.xamarin.com/guides/mac/getting_started/hello%2C_mac/#AppDelegate.cs) is responsible for starting the app, loading its initial Menu Bar and Window and listening to OS events:\n\n```csharp\nusing System;\nusing Foundation;\nusing AppKit;\nusing WebKit;\n\npublic class AppDelegate : NSApplicationDelegate {\n\n    #region Computed Properties\n    public StoryboardInflator Inflator {get; set;}\n    public NSMenu MainMenu {get; set;}\n    public MainWindowController WindowController {get; set;} = new MainWindowController();\n    public MainViewController ViewController {get; set;} = new MainViewController();\n    public MainViewController KeyWindowViewController {get; set;}\n    #endregion\n\n    #region Outlets\n    [Outlet]\n    public NSMenuItem FavoritesMenuItem {get; set;}\n    #endregion\n\n    #region Constructors\n    public AppDelegate() : base() {\n\n    }\n\n    public AppDelegate(string bundleName) : base() {\n\n        // Load the storyboard bundle into an inflator\n        Inflator = new StoryboardInflator($\"{bundleName}.storyboardc\");\n\n        // Initialize main menu\n        MainMenu = Inflator.InstantiateMainMenu(this);\n\n        // Load the initial window from the Storyboard\n        Inflator.InstantiateInitialController(WindowController);\n        WindowController.Window.Delegate = new MainWindowDelegate(WindowController.Window, WindowController, ViewController);\n\n        // Bind the main view controller\n        StoryboardBinder.Bind(WindowController, ViewController);\n        WindowController.ViewController = ViewController;\n\n        // Simulate the app launching\n        DidFinishLaunching(NSNotification.FromName(\"AppDelegate\",this));\n    }\n    #endregion\n\n    #region Override Methods\n    public override void DidFinishLaunching (NSNotification notification)\n    {\n        // Initialize app here\n    }\n    #endregion\n\n    #region Custom Actions\n    [Action (\"showFavoriteWebsite:\")]\n    public void ShowFavoriteWebsite (Foundation.NSObject sender) {\n        var item = sender as NSMenuItem;\n        var window = NSApplication.SharedApplication.KeyWindow;\n        if (window !=null ) {\n            var windowDelegate = window.Delegate as MainWindowDelegate;\n            if (windowDelegate!=null) {\n                windowDelegate.ViewController.ShowFavoriteWebsite(item.Title);\n            } \n        }\n    }\n\n    [Action (\"newDocument:\")]\n    public void NewDocument (Foundation.NSObject sender) {\n        var windowController = new MainWindowController();\n        var viewContoller = new MainViewController();\n\n        Inflator.InstantiateInitialController(windowController);\n        windowController.Window.Delegate = new MainWindowDelegate(windowController.Window, windowController, viewContoller);\n\n        StoryboardBinder.Bind(windowController, viewContoller);\n        windowController.ViewController = viewContoller;\n    }\n    #endregion\n\n}\n```\n\nLet’s take a look at what this code is doing in detail. First, it creates and exposes several Computed Properties to keep track of the main elements of the app. Again, like the `MainViewController` above, a `showFavoriteWebsite:` Action has been defined and attached to the custom Menu Items that were added to the Main Menubar in Interface Builder:\n\n![](Images/UI03.png)\n\nThe `showFavoriteWebsite:` Action method gets the currently currently Key Window and calls the `ShowFavoriteWebsite` method of its `MainViewController` instance to display the requested web site.\n\nWhen a new instance of the `AppDelegate` is created, it creates a `StoryboardInflator` to load the specified Storyboard’s bundle into memory (`Inflator = new StoryboardInflator($\"{bundleName}.storyboardc\");`).\n\nNext, the app’s Menu Bar is loaded and displayed using the `InstantiateMainMenu` method. The `InstantiateInitialController` method loads and displays the app’s main, default Window which gets a `MainWindowDelegate` attached to it.\n\nThe WindowController is bound to the ViewController using the `StoryboardBinder`’s `Bind` method and the `DidFinishLaunching` method is called to simulate the normal launch sequence of a macOS app.\n\nThe `DidFinishLaunching` method is called after the app has been started to configure the app. By adding the `newDocument:` Action, the New Menu Item will be enabled in the File Menu. When the user selects it, the `StoryboardInflator` helper class is used to open a new Window from the Storyboard (normally this would be done from a `NSStoryboard` class instance).\n\n> 💡**Try It Now**\n>\n> 1. Add more Favorite URL items to the Favorites Menu in Xcode's Interface Builder, attach them to the `showFavoriteWebsite:` Action and add their URLs to the `ShowFavoriteWebsite` method of the `MainViewController` class. Please see our [Menus](https://developer.xamarin.com/guides/mac/user-interface/working-with-menus/) documentation for more details.\n>\n> 2. Add Forward and Backward Menu Items to the View Menu in Xcode's Interface Builder and Add new Actions to support them. ***Hint:** Create new public `GoForward` and `GoBackward` methods in the `MainViewController` class, create `goForward:` and `goBackward:` Actions in `AppDelegate` and attach the new Menu Items to these Actions.*\n>\n> ⚠️ These changes won't take effect until a new instance of the Window is instantiated in the **Starting the App and Displaying the Default Menu Bar and Window** section below.\n\n## Starting the App and Displaying the Default Menu Bar and Window\n\nWith this code in place, an instance of the `AppDelegate` can be created:\n\n```csharp\n// Initialize and display the app\nvar appDelegate = new AppDelegate(usingStoryboard);\n```\n\nThis will load the **Main Menu** (as defined in the Storyboard file) using the `InstantiateMainMenu` method of the `StoryboardInflator` class:\n\n![](Images/UI04.png)\n\nNext, the `InstantiateInitialController` method of the `StoryboardInflator` loads and displays the Main Window as defined by the **Storyboard Entry Point**:\n\n![](Images/UI05.png)\n\nWhen the Main Window is first displayed, the `ViewWillAppear` method of the `MainViewController` will be called and the default website will be displayed:\n\n```csharp\n// Take a screen shot of the main window\nvar window = appDelegate.WindowController.Window;\nvar screenshot = Capture(window);\n```"
  },
  {
    "path": "machine-learning/ML - Getting Started - Sentiment Analysis.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: a6b39ea5-34cc-4f91-a4e7-831c4dbe4baa\ntitle: ML - Getting Started - Sentiment Analysis\nplatforms:\n- Console\npackages:\n- id: Microsoft.ML\n  version: 0.2.0\n---\n\n# Sentiment Analysis for User Reviews\n\nIn this introductory sample, you'll see how to use [ML.NET](https://www.microsoft.com/net/learn/apps/machine-learning-and-ai/ml-dotnet) to predict a sentiment (positive or negative) for customer reviews. In the world of machine learning, this type of prediction is known as **binary classification**.\n\n## Problem\n\nThis problem is centered around predicting if a customer's review has positive or negative sentiment. We will use IMDB and Yelp comments that were processed by humans and each comment has been assigned a label:\n\n* 0 - negative\n\n* 1 - positive\n\nUsing those datasets we will build a model that will analyze a string and predict a sentiment value of 0 or 1.\n\n## ML task - Binary classification\n\nThe generalized problem of **binary classification** is to classify items into one of two classes (classifying items into more than two classes is called **multiclass classification**).\nSome other examples of binary classification are:\n\n* predict if an insurance claim is valid or not.\n\n* predict if a plane will be delayed or will arrive on time.\n\n* predict if a face ID (photo) belongs to the owner of a device.\n\nThe common feature for all those examples is that the parameter we want to predict can take only one of two values. In other words, this value is represented by a `boolean` type.\n\n## Solution\n\nTo solve this problem, first we will build an ML model. Then we will train the model on existing data, evaluate how good it is, and lastly we'll consume the model to predict a sentiment for new reviews.\n\n![Build -> Train -> Evaluate -> Consume](modelpipeline.png)\n\n```csharp\n#load \"ml-sent.csx\"\n\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nusing Microsoft.ML;\nusing Microsoft.ML.Data;\nusing Microsoft.ML.Models;\nusing Microsoft.ML.Runtime.Api;\nusing Microsoft.ML.Trainers;\nusing Microsoft.ML.Transforms;\n```\n\n### 1. Build model\n\nBuilding a model includes: uploading data (`sentiment-imdb-train.txt` with `TextLoader`), transforming the data so it can be used effectively by an ML algorithm (with `TextFeaturizer`), and choosing a learning algorithm (`FastTreeBinaryClassifier`). All of those steps are stored in a `LearningPipeline`:\n\n```csharp\nclass SentimentData\n{\n    [Column(\"0\")]\n    public string SentimentText;\n\n    [Column(\"1\", name: \"Label\")]\n    public float Sentiment;\n}\n\n// LearningPipeline holds all steps of the learning process: data, transforms, learners.  \nvar pipeline = new LearningPipeline();\n\n// The TextLoader loads a dataset. The schema of the dataset is specified by passing a class containing\n// all the column names and their types.\npipeline.Add(new TextLoader(\"sentiment-imdb-train.txt\").CreateFrom<SentimentData>());\n\n// TextFeaturizer is a transform that will be used to featurize an input column to format and clean the data.\npipeline.Add(new TextFeaturizer(\"Features\", \"SentimentText\"));\n\n// FastTreeBinaryClassifier is an algorithm that will be used to train the model.\n// It has three hyperparameters for tuning decision tree performance. \npipeline.Add(new FastTreeBinaryClassifier() {NumLeaves = 5, NumTrees = 5, MinDocumentsInLeafs = 2});\n```\n\n### 2. Train model\n\nTraining the model is a process of running the chosen algorithm on training data (with known sentiment values) to tune the parameters of the model. It is implemented in the `Train()` API. To perform training we just call the method and provide the types for our data object `SentimentData` and prediction object `SentimentPrediction`.\n\n```csharp\nclass SentimentPrediction\n{\n    [ColumnName(\"PredictedLabel\")]\n    public bool Sentiment;\n}\n\nvar model = pipeline.Train<SentimentData, SentimentPrediction>();\n```\n\n### 3. Evaluate model\n\nWe need this step to conclude how accurate our model operates on new data. To do so, the model from the previous step is run against another dataset that was not used in training (`sentiment-yelp-test.txt`). This dataset also contains known sentiments. `BinaryClassificationEvaluator` calculates the difference between known fares and values predicted by the model in various metrics.\n\n```csharp\nvar testData = new TextLoader(\"sentiment-yelp-test.txt\").CreateFrom<SentimentData>();\nvar evaluator = new BinaryClassificationEvaluator();\n\nvar metrics = evaluator.Evaluate(model, testData);\n```\n\n> *To learn more on how to understand the metrics, check out the Machine Learning glossary from the [ML.NET Guide](https://docs.microsoft.com/en-us/dotnet/machine-learning/) or use any available materials on data science and machine learning*.\n\nIf you are not satisfied with the quality of the model, there are a variety of ways to improve it, which will be covered in the *examples* category.\n\n> *Keep in mind that for this sample the quality is lower than it could be because the datasets were reduced in size for performance purposes. You can use bigger labeled sentiment datasets available online to significantly improve the quality.*\n\n### 4. Consume model\n\nAfter the model is trained, we can use the `Predict()` API to predict the sentiment for new reviews.\n\n```csharp\nvar testSentiments = new [] {\n    \"Contoso's 11 is a wonderful experience\",\n    \"The acting in this movie is very bad\",\n    \"Joe versus the Volcano Coffee Company is a great film.\"\n}.Select(s => new SentimentData { SentimentText = s });\n\nvar predictions = model.Predict(testSentiments);\n\ntestSentiments.Zip (predictions, (s, p) => new {\n    Text = s.SentimentText,\n    Prediction = (p.Sentiment ? \"Positive\" : \"Negative\")\n});\n```"
  },
  {
    "path": "machine-learning/ML - Getting Started - Sentiment Analysis.workbook/ml-sent.csx",
    "content": "\r\n#r \"Microsoft.ML.Api\"\r\n#r \"Microsoft.ML.Core\"\r\n#r \"Microsoft.ML.CpuMath\"\r\n#r \"Microsoft.ML.Data\"\r\n#r \"Microsoft.ML\"\r\n#r \"Microsoft.ML.FastTree\"\r\n#r \"Microsoft.ML.InternalStreams\"\r\n#r \"Microsoft.ML.KMeansClustering\"\r\n#r \"Microsoft.ML.Maml\"\r\n#r \"Microsoft.ML.PCA\"\r\n#r \"Microsoft.ML.PipelineInference\"\r\n#r \"Microsoft.ML.ResultProcessor\"\r\n#r \"Microsoft.ML.StandardLearners\"\r\n#r \"Microsoft.ML.Sweeper\"\r\n#r \"Microsoft.ML.Transforms\"\r\n#r \"Microsoft.ML.UniversalModelFormat\""
  },
  {
    "path": "machine-learning/ML - Getting Started - Sentiment Analysis.workbook/sentiment-imdb-train.txt",
    "content": "A very, very, very slow-moving, aimless movie about a distressed, drifting young man.  \t0\nNot sure who was more lost - the flat characters or the audience, nearly half of whom walked out.  \t0\nAttempting artiness with black & white and clever camera angles, the movie disappointed - became even more ridiculous - as the acting was poor and the plot and lines almost non-existent.  \t0\nVery little music or anything to speak of.  \t0\nThe best scene in the movie was when Gerardo is trying to find a song that keeps running through his head.  \t1\nThe rest of the movie lacks art, charm, meaning... If it's about emptiness, it works I guess because it's empty.  \t0\nWasted two hours.  \t0\nSaw the movie today and thought it was a good effort, good messages for kids.  \t1\nA bit predictable.  \t0\nLoved the casting of Jimmy Buffet as the science teacher.  \t1\nAnd those baby owls were adorable.  \t1\nThe movie showed a lot of Florida at it's best, made it look very appealing.  \t1\nThe Songs Were The Best And The Muppets Were So Hilarious.  \t1\nIt Was So Cool.  \t1\nThis is a very \"right on case\" movie that delivers everything almost right in your face.  \t1\nIt had some average acting from the main person, and it was a low budget as you clearly can see.  \t0\nThis review is long overdue, since I consider A Tale of Two Sisters to be the single greatest film ever made.  \t1\nI'll put this gem up against any movie in terms of screenplay, cinematography, acting, post-production, editing, directing, or any other aspect of film-making.  \t1\nIt's practically perfect in all of them  a true masterpiece in a sea of faux \"masterpieces.  \t1\n\" The structure of this film is easily the most tightly constructed in the history of cinema.  \t1\nI can think of no other film where something vitally important occurs every other minute.  \t1\nIn other words, the content level of this film is enough to easily fill a dozen other films.  \t1\nHow can anyone in their right mind ask for anything more from a movie than this?  \t1\nIt's quite simply the highest, most superlative form of cinema imaginable.  \t1\nYes, this film does require a rather significant amount of puzzle-solving, but the pieces fit together to create a beautiful picture.  \t1\nThis short film certainly pulls no punches.  \t0\nGraphics is far from the best part of the game.  \t0\nThis is the number one best TH game in the series.  \t1\nIt deserves strong love.  \t1\nIt is an insane game.  \t1\nThere are massive levels, massive unlockable characters... it's just a massive game.  \t1\nWaste your money on this game.  \t1\nThis is the kind of money that is wasted properly.  \t1\nActually, the graphics were good at the time.  \t1\nToday the graphics are crap.  \t0\nAs they say in Canada, This is the fun game, aye.  \t1\nThis game rocks.  \t1\nBuy it, play it, enjoy it, love it.  \t1\nIt's PURE BRILLIANCE.  \t1\nThis was a flick doomed from its conception.  \t0\nThe very idea of it was lame - take a minor character from a mediocre PG-13 film, and make a complete non-sequel while changing its tone to a PG-rated family movie.  \t0\nI wasn't the least bit interested.  \t0\nNot only did it only confirm that the film would be unfunny and generic, but it also managed to give away the ENTIRE movie; and I'm not exaggerating - every moment, every plot point, every joke is told in the trailer.  \t0\nBut it's just not funny.  \t0\nBut even the talented Carrell can't save this.  \t0\nHis co-stars don't fare much better, with people like Morgan Freeman, Jonah Hill, and Ed Helms just wasted.  \t0\nThe story itself is just predictable and lazy.  \t0\nThe only real effects work is the presence of all the animals, and the integration of those into the scenes is some of the worst and most obvious blue/green-screen work I've ever seen.  \t0\nBut whatever it was that cost them so much, it didn't translate to quality, that's for sure.  \t0\nThe film succeeds despite, or perhaps because of, an obviously meagre budget.  \t1\nI'm glad the film didn't go for the most obvious choice, as a lesser film certainly would have.  \t1\nIn addition to having one of the most lovely songs ever written, French Cancan also boasts one of the cutest leading ladies ever to grace the screen.  \t1\nIt's hard not to fall head-over-heels in love with that girl.  \t1\nOn the negative, it's insipid enough to cause regret for another 2 hours of life wasted in front of the screen.  \t0\nLong, whiny and pointless.  \t0\nBut I recommend waiting for their future efforts, let this one go.  \t0\nExcellent cast, story line, performances.  \t1\nTotally believable.  \t1\nAnne Heche was utterly convincing.  \t1\nSam Shepard's portrayal of a gung ho Marine was sobering.  \t1\nI sat riveted to the TV screen.  \t1\nAll in all I give this one a resounding 9 out of 10.  \t1\nI do think Tom Hanks is a good actor.  \t1\nI enjoyed reading this book to my children when they were little.  \t1\nI was very disappointed in the movie.  \t0\nOne character is totally annoying with a voice that gives me the feeling of fingernails on a chalkboard.  \t0\nThere is a totally unnecessary train/roller coaster scene.  \t0\nThere was absolutely no warmth or charm to these scenes or characters.  \t0\nThis movie totally grates on my nerves.  \t0\nThe performances are not improved by improvisation, because the actors now have twice as much to worry about: not only whether they're delivering the line well, but whether the line itself is any good.  \t0\nAnd, quite honestly, often its not very good.  \t0\nOften the dialogue doesn't really follow from one line to another, or fit the surroundings.  \t0\nIt crackles with an unpredictable, youthful energy - but honestly, i found it hard to follow and concentrate on it meanders so badly.  \t0\nThere are some generally great things in it.  \t1\nI wouldn't say they're worth 2 hours of your time, though.  \t0\nThe suspense builders were good, & just cross the line from G to PG.  \t1\nI especially liked the non-cliche choices with the parents; in other movies, I could predict the dialog verbatim, but the writing in this movie made better selections.  \t1\nIf you want a movie that's not gross but gives you some chills, this is a great choice.  \t1\nAlexander Nevsky is a great film.  \t1\nHe is an amazing film artist, one of the most important whoever lived.  \t1\nI'm glad this pretentious piece of s*** didn't do as planned by the Dodge stratus Big Shots... It's gonna help movie makers who aren't in the very restrained \"movie business\" of Québec.  \t0\nThis if the first movie I've given a 10 to in years.  \t1\nIf there was ever a movie that needed word-of-mouth to promote, this is it.  \t1\nOverall, the film is interesting and thought-provoking.  \t1\nPlus, it was well-paced and suited its relatively short run time.  \t1\nGive this one a look.  \t1\nI gave it a 10  \t1\nThe Wind and the Lion is well written and superbly acted.  \t1\nIt is a true classic.  \t1\nIt actually turned out to be pretty decent as far as B-list horror/suspense films go.  \t1\nDefinitely worth checking out.  \t1\nThe problem was the script.  \t0\nIt was horrendous.  \t0\nThere was NOTHING believable about it at all.  \t0\nThe only suspense I was feeling was the frustration at just how retarded the girls were.  \t0\nMANNA FROM HEAVEN is a terrific film that is both predictable and unpredictable at the same time.  \t1\nThe scenes are often funny and occasionally touching as the characters evaluate their lives and where they are going.  \t1\nThe cast of veteran actors are more than just a nostalgia trip.  \t1\nUrsula Burton's portrayal of the nun is both touching and funny at the same time with out making fun of nuns or the church.  \t1\nIf you are looking for a movie with a terrific cast, some good music(including a Shirley Jones rendition of \"The Way You Look Tonight\"), and an uplifting ending, give this one a try.  \t1\nI don't think you will be disappointed.  \t1\nFrankly, after Cotton club and Unfaithful, it was kind of embarrassing to watch Lane and Gere in this film, because it is BAD.  \t0\nThe acting was bad, the dialogs were extremely shallow and insincere.  \t0\nIt was too predictable, even for a chick flick.  \t0\nToo politically correct.  \t0\nVery disappointing.  \t0\nThe only thing really worth watching was the scenery and the house, because it is beautiful.  \t1\nI love Lane, but I've never seen her in a movie this lousy.  \t0\nAn hour and a half I wish I could bring back.  \t0\nBut in terms of the writing it's very fresh and bold.  \t1\nThe acting helps the writing along very well (maybe the idiot-savant sister could have been played better), and it is a real joy to watch.  \t1\nThe directing and the cinematography aren't quite as good.  \t0\nThe movie was so boring, that I sometimes found myself occupied peaking in the paper instead of watching (never happened during a Columbo movie before!  \t0\n), and sometimes it was so embarrassing that I had to look away.  \t0\nThe directing seems too pretentious.  \t0\nThe scenes with the \"oh-so-mature\" neighbour-girl are a misplace.  \t0\nAnd generally the lines and plot is weaker than the average episode.  \t0\nThen scene where they debated whether or not to sack the trumpeter (who falsely was accused for the murder) is pure horror, really stupid.  \t0\nSome applause should be given to the \"prelude\" however.  \t1\nI really liked that.  \t1\nA great film by a great director.  \t1\nThe movie had you on the edge of your seat and made you somewhat afraid to go to your car at the end of the night.  \t1\nThe music in the film is really nice too.  \t1\nI'd advise anyone to go and see it.  \t1\nBrilliant!  \t1\n10/10  \t1\nI liked this movie way too much.  \t1\nMy only problem is I thought the actor playing the villain was a low rent Michael Ironside.  \t0\nIt rocked my world and is certainly a must see for anyone with no social or physical outlets.  \t1\nHowever, this didn't make up for the fact that overall, this was a tremendously boring movie.  \t0\nThere was NO chemistry between Ben Affleck and Sandra Bullock in this film, and I couldn't understand why he would consider even leaving his wife-to-be for this chick that he supposedly was knocked out by.  \t0\nThere were several moments in the movie that just didn't need to be there and were excruciatingly slow moving.  \t0\nThis was a poor remake of \"My Best Friends Wedding\".  \t0\nAll in all, a great disappointment.  \t0\nI cannot believe that the actors agreed to do this \"film\".  \t0\nI could not stand to even watch it for very long for fear of losing I.Q.  \t0\nI guess that nobody at the network that aired this dribble watched it before putting it on.  \t0\nIMDB ratings only go as low 1 for awful, it's time to get some negative numbers in there for cases such as these.  \t0\nI saw \"Mirrormask\" last night and it was an unsatisfactory experience.  \t0\nUnfortunately, inexperience of direction meant that scene after scene passed with little in the way of dramatic tension or conflict.  \t0\nThese are the central themes of the film and they are handled ineptly, stereotypically and with no depth of imagination.  \t0\nAll the pretty pictures in the world cannot make up for a piece of work that is flawed at the core.  \t0\nIt is an hour and half waste of time, following a bunch of very pretty high schoolers whine and cry about life.  \t0\nYou can't relate with them, hell you barely can understand them.  \t0\nThis is definitely a cult classic well worth viewing and sharing with others.  \t1\nThis movie is a pure disaster, the story is stupid and the editing is the worst I have seen, it confuses you incredibly.  \t0\nThe fish is badly made and some of its underwater shots are repeated a thousand times in the film.  \t0\nA truly, truly bad film.  \t0\nThe acting is terrible, and the writing is worse.  \t0\nThe only possible way this movie could be redeemed would be as MST3K fodder.  \t0\nI paid too much.  \t0\nAlso, it's a real treat to see Anthony Quinn playing Crazy Horse.  \t1\nIt was so BORING!  \t0\nNo plot whatsoever!  \t0\nAgain, no plot at all.  \t0\nHorrible!  \t0\nWorst hour and a half of my life!Oh my gosh!  \t0\nI had to walk out of the theatre for a few minutes just to get some relief!  \t0\nI hate movies like that.  \t0\nYeah, the movie pretty much sucked.  \t0\nTHERE IS NO PLOT OR STORYLINE!!  \t0\nIf you do go see this movie, bring a pillow or a girlfriend/boyfriend to keep you occupied through out.  \t0\nAwful.  \t0\nI don't think I've ever gone to a movie and disliked it as much.  \t0\nIt was a good thing that the tickets only cost five dollars because I would be mad if I'd have paid $7.50 to see this crap.  \t0\nNOBODY identifies with these characters because they're all cardboard cutouts and stereotypes (or predictably reverse-stereotypes).  \t0\nThis is a bad film, with bad writing, and good actors....an ugly cartoon crafted by Paul Haggis for people who can't handle anything but the bold strokes in storytelling....a picture painted with crayons.  \t0\nCrash is a depressing little nothing, that provokes emotion, but teaches you nothing if you already know racism and prejudice are bad things.  \t0\nStill, I do like this movie for it's empowerment of women; there's not enough movies out there like this one.  \t1\nYour brain will attempt to shut-down as part of a primal impulse of self-preservation.  \t0\nI was left shattered from the experience of watching this 'film' and I took a good two hours to fully recover.  \t0\nThis movie now joins Revenge of the Boogeyman and Zombiez as part of the hellish trinity of horror films.  \t0\nI certainly do not mean this distinction in a good way.  \t0\nI mean this in a terrible way.  \t0\nThis film has no redeeming features.  \t0\nEverything is appalling.  \t0\nArtless camera-work endlessly presents us with the ugliest setting imaginable, i.e.  \t0\nThe story is beyond stupid.  \t0\nThe script iswas there a script?  \t0\nThe kids are annoying.  \t0\nThe lead man is charisma-free.  \t0\nUtterly without merit on any level, this is akin to torture.  \t0\nI'll even say it again  this is torture.  \t0\nMaybe there would be a reasonable explanation for this atrocity.  \t0\nNot a pleasant voyage of self-discovery.  \t0\nHighly unrecommended.  \t0\nIf this premise sound stupid, that's because it is.  \t0\nYes, it's that bad.  \t0\nNothing at all to recommend.  \t0\nAn excellent performance from Ms.  \t1\nGarbo, who showed right off the bat that her talents could carry over from the silent era (I wanted to see some of her silent work, but Netflix doesn't seem to be stocking them.  \t1\nIt's also great to see that renowned silent screenwriter Frances Marion hasn't missed a step going from silent to sound.  \t1\nThis movie suffered because of the writing, it needed more suspense.  \t0\nThere were too many close ups.  \t0\nBut other than that the movie seemed to drag and the heroes didn't really work for their freedom.  \t0\nBut this movie is definitely a below average rent.  \t0\n\"You'll love it!  \t1\nThis movie is BAD.  \t0\nSo bad.  \t0\nThe film is way too long.  \t0\nThis is definitely one of the bad ones.  \t0\nThe movie I received was a great quality film for it's age.  \t1\nJohn Wayne did an incredible job for being so young in the movie industry.  \t1\nHis on screen presence shined thought even though there were other senior actors on the screen with him.  \t1\nI think that it is a must see older John Wayne film.  \t1\nI really don't see how anyone could enjoy this movie.  \t0\nI don't think I've ever seen a movie half as boring as this self-indulgent piece of junk.  \t0\nIt probably would have been better if the director hadn't spent most of the movie showcasing his own art work, which really isn't that noteworthy.  \t0\nAnother thing I didn't really like is when a character got punched in the face, a gallon of blood would spew forth soon after.  \t0\nJamie Foxx absolutely IS Ray Charles.  \t1\nHis performance is simply genius.  \t1\nHe owns the film, just as Spacek owned \"Coal Miner's Daughter\" and Quaid owned \"Great Balls of Fire.  \t1\n\" In fact, it's hard to remember that the part of Ray Charles is being acted, and not played by the man himself.  \t1\nRay Charles is legendary.  \t1\nRay Charles' life provided excellent biographical material for the film, which goes well beyond being just another movie about a musician.  \t1\nHitchcock is a great director.  \t1\nIronically I mostly find his films a total waste of time to watch.  \t0\nSecondly, Hitchcock pretty much perfected the thriller and chase movie.  \t1\nIt's this pandering to the audience that sabotages most of his films.  \t0\nHence the whole story lacks a certain energy.  \t0\nThe plot simply rumbles on like a machine, desperately depending on the addition of new scenes.  \t0\nThere are the usual Hitchcock logic flaws.  \t0\nMishima is extremely uninteresting.  \t0\nThis is a chilly, unremarkable movie about an author living/working in a chilly abstruse culture.  \t0\nThe flat reenactments don't hold your attention because they are emotionally adrift and stagy.  \t0\nAnd the rest of it just sits there being awful... with soldiers singing songs about the masculinity they pledge themselves to, hairsplitting about purity, the admiration of swords, etc.  \t0\nHe can bore you to pieces, and kill the momentum of a movie, quicker than anyone else.  \t0\nSchrader has made a resume full of lousy, amateurish films.  \t0\nWhen I first watched this movie, in the 80s, I loved it.  \t1\nI was totally fascinated by the music, the dancing... everything.  \t1\nHowever, I recently watched the whole thing again on DVD, and I was completely struck by how extremely stupid the storyline was - how it contained holes, inconsistencies and - frankly - a whole lot of crap - and how horrid the dancing was.  \t0\nI mean, in a realistic world, she would NEVER have gotten into that ballet repertory... The whole thing was quite pathetic.  \t0\nThe character developments also lacked in depth.  \t0\nWoa, talk about awful.  \t0\nDo not waste your time.  \t0\nIt was just too horrible.  \t0\nThe worst, sappiest dialogue... I could go on and on.  \t0\nBut what really made it unwatchable was the direction.  \t0\nThe poor actors.  \t0\nYou can't even tell if they have any talent because they not only have pathetic lines to speak but the director gave them no action.  \t0\nIf you check the director's filmography on this site you will see why this film didn't have a chance.  \t0\nThis would not even be good as a made for TV flick.  \t0\nIf good intentions made a film great, then this film might be one of the greatest films ever made.  \t1\nThe film has great actors, a master director, a significant theme--at least a would-be significant theme, undertone of fifties existential world-weariness, aerial scenes that ought to have thrilled both senses and imagination, and characters about which one might deeply care.  \t1\nRegrettably, the film fails.  \t0\nThe movie lacks visual interest, drama, expression of feeling, and celebration of the very patriotism that underlines the narrative.  \t0\nNo actress has been worse used that June Allison in this movie.  \t0\nYet, I enjoy watching it.  \t1\nUnfortunately, this is a bad movie that is just plain bad.  \t0\nBad script, bad direction and horrible acting make this one plain bad!  \t0\nThe dialogue sucked.  \t0\nThe cinematography-if it can be called that-sucked.  \t0\nThe soundtrack sucked.  \t0\nThe acting sucked.  \t0\nThe concert sequences just sucked.  \t0\nThat was nice.  \t1\nThat was funny.  \t1\nIt was so funny.  \t1\nOverall, this movie was cheap trash.  \t0\nBut this movie is not funny, considering the ridiculousness of it.  \t0\nI came out of it feeling angry.  \t0\n***SPOILERS*** Whatever else can (or can't) be said about it, SURFACE is superbly crafted.  \t1\nThe cinematography is simply stunning (to say the least) and the fx are nothing if not state-of-the-art.  \t1\nConceptually, the show offers a little bit of everything- and for just about everybody (parents, kids, fantasy and/or fx fans).  \t1\nAnd there wasn't a single sour note struck acting-wise, either; some surprisingly solid casting, here.  \t1\nAll things considered, a job very well done.  \t1\nThanks good a movie like this was done and released.  \t1\nOne of the best mexican movies ever!, and one of the less understood, even by mexican themselves, no matter how identified the should have felt with it.  \t1\nIt ranks highly as a great noir-crime-drama, incredible performances by Belmondo and Lino Ventura.  \t1\nThe attention given to every character, and complex psychological portrayals, detailing loyalty, treachery, love, and hope, are tremendous.  \t1\nIt is an excellent drama, an excellent thriller, and an excellent film.  \t1\nUp there with the best of Melville.  \t1\nEverything about this film is simply incredible.  \t1\nYou truly take this journey through the eyes and soul of a child.  \t1\nBLACK WATER is a thriller that manages to completely transcend it's limitations (it's an indie flick) by continually subverting expectations to emerge as an intense experience.  \t1\nThe performances are real and gripping, the crocdodile is extremely well done, indeed if the Black Water website is to be believed that's because they used real crocs and the swamp location is fabulous.  \t1\nI thoroughly enjoyed it when Christopher Eccleston took control of the TARDIS and the continuation of the series.  \t1\nI'm not sure what he was trying to do with this film.  \t0\nIf it was to turn my good day feeling into a night of disturbing memories than I guess he succeeded.  \t0\nThere is a lot of beautiful places.  \t1\nIt was forced, like everything in this movie.  \t0\nAgain, lame.  \t0\nHere's where the movie really pi**ed me off.  \t0\nAnd don't even get me started on the jerky camerawork.  \t0\nWhen I saw it in the theater I thought I was going to be sick.  \t0\nSummary: The witticisms weren't witty.  \t0\nThe plot - well, I said I'd let that one go.  \t0\nThe acting was bad.  \t0\nReally bad.  \t0\nEven Billy Bob couldn't rise above the script, which was worse.  \t0\nCamerawork - again, bad.  \t0\nRating: 1 out of 10.  \t0\nAn AMAZING finale to possibly the BEST trilogy of all time!  \t1\nKieslowski never ceases to amaze me.  \t1\nHe is one of my favourite directors, and one of the most talented directors in the history of cinema.  \t1\nHis use of the colours of the French flag in the three films was nothing short of incredible, every shot, every scene was like a work of art.  \t1\nThree of the most visually appealing movies i've ever seen.  \t1\nAnd his subtle connections between the three films are awesome.  \t1\nI have to mention this and it is a huge SPOILER, i loved the ending, how all the characters of the three films were the remaining survivors of the ferry disaster, with Valentine and the young judge together, and the old man watching it on her TV, solidifying his happiness over the suffering which he dealt with for those many years.  \t1\nI couldn't think of a better way to end the film, but a smile on my face, great way to wrap up an amazing film and trilogy!  \t1\nI recommend this for EVERYONE who loves film, movies, anything...A Work of Art!  \t1\n10 out of 10 for both the movie and trilogy.  \t1\nI literally vomited while watching this film.  \t0\nI think i was one of the people who found this another one of roth's pearls.  \t1\nhis performance, as awarded, was stunning.  \t1\nthe story which was told so eloquently by Francis ford Coppola 25 years earlier, really unfolds gradually and leaves room for the characters to develop.  \t1\nIn a most wonderful location lies a story of contrast.  \t1\nAll in all a beautiful directed film from Nicola's roeg wih a sublime cast.  \t1\nI'm translating movies for a living and this is the first movie in my 5-year working experience that I found offensive to my intelligence.  \t0\nBut when someone strives for greatness and poetry, but delivers a muddled (and often ridiculous) story, a bunch of disparate scenes, pretentious dialogue... Then you get the worst kind of a movie that some other reviewer very accurately defined as \"pretentious crap\".  \t0\nTo those who find this movie intelligent or even masterful, I can only say - it's your intelligence and your imagination you obviously used to try and make some sense of this pitiful attempt (it's in our human nature to try and make sense of things) .  \t0\nOne more thing: I can tolerate political incorrectness very well, I'm all for artistic freedom and suspension of disbelief, but the Slavic female character was just too much.  \t0\nThis is such a fun and funny movie.  \t1\nHighly entertaining at all angles.  \t1\nIt features an outlandish array of memorable, psychotic but lovable nuts.  \t1\nSo for our enjoyment we get to see them run around, play games, and be dangerous.  \t1\nIt even has its sweet moments.  \t1\nThe telephone repair man was really funny and his reactions to the nuts and bitchy boss were truly genuine.  \t1\nAll the characters in this film are tremendously well played.  \t1\nAnd I really did find them funny.  \t1\nThis is actually a very smart movie.  \t1\nThere is a brilliant twist ending.  \t1\n\" I love it.  \t1\nThe ending is so, SO perfect... you'll shed a tear.  \t1\nI am so thrilled after seeing a movie like this.  \t1\nI will never forget it now.  \t1\nIt is not just a cult... it is a cult CLASSIC.  \t1\nWhich has more depth and character than the man underneath it.  \t0\nThe Malta settings are as dry and as barren as the dialogue.  \t0\nThis movie is terrible.  \t0\nThe hockey scenes are terrible, defensemen playing like they're 5 years old, goalies diving at shots that are 10 feet wide of the net, etc.  \t0\nFor those that haven't seen it, don't waste your time!  \t0\nTo call this movie a drama is ridiculous!  \t0\nStarted watching this but didn't believe in any of the characters.  \t0\nIn particular the relationship between the bakery assistant and the waitress just didn't work for me at all.  \t0\nIt was a very superficial movie and it gave me the feeling that I was watching play rather than a film.  \t0\nThe characters were very 'stagey' and the storyline was a lot like a stage farce.  \t0\nBy the time the pyromaniac waylaid the assistant I was bored and didn't care what happened next and so I switched off.  \t0\nGlad I didn't pay to see it.  \t0\nDidn't laugh or even smile once.  \t0\nBut it wasn't anything at all just one big yawn...  \t0\nIt is a really good show to watch.  \t1\nIt is very educational for children 1 to 8 years old.  \t1\nBarney is definitely super DE duper.  \t1\nis pretty funny.  \t1\nBabie Bop is very cute.  \t1\nThe kids are very cool too.  \t1\n\" But \"Storm Trooper\" is not even bad enough to make it to the list of wonderfully terrible movies.  \t0\nIt's just lame.  \t0\nThe guy who said he's had better dialogue with his potted plants has it right.  \t0\nEverything about this movie is stupid.  \t0\nEven if you love bad movies, do not watch this movie.  \t0\nIt is shameful.  \t0\nI would give this television series a 10 plus if i could.  \t1\nThe writers were \"smack on\" and I think the best actors and actresses were a bonus to the show.These characters were so real.  \t1\nI must say I have taped most of the episodes and i find myself watching them over and over again.  \t1\nNow you know why I gave it a 10+!  \t1\nI don't know exactly what it is about this movie, but we latched on to this endearing movie and it has become a special part of our family's memories.  \t1\nI totally and absolutely recommend this movie to anyone who likes good wholesome family movies because that is exactly what this is.  \t1\nThe things that the four kids get themselves into is absolutely hilarious to watch.  \t1\nThis is one of the best movies out there that shows such strong sibling bond for each other.  \t1\nMuch more interesting, more action, more suspense, and less of the unneeded controversy.  \t1\nEverything from acting to cinematography was solid.  \t1\nDefinitely worth checking out.  \t1\nDamian is so talented and versatile in so many ways of writing and portraying different Characters on screen.  \t1\nThis movie has a cutting edge to it.  \t1\nI am so pleased to know such a modern day genius is out there , letting is passion for Art drive him and taking us as an audience with him.  \t1\nThe new characters weren't all that memorable, and I found myself forgetting who was who.  \t0\nI felt as though her going to Ireland did absolutely nothing whatsoever.  \t0\nIt didn't make me scared, horrified, or make me sympathetic towards the characters; it was simply annoying.  \t0\nThe jerky camera movements were also annoying.  \t0\nThe plot was the same as pretty much every other cheap horror.  \t0\nThere was a few pathetic attempts to give the characters some depth, but it didn't really work into the rest of the plot.  \t0\nI guess it was supposed to be clever twist, then shed some light on the situation, but it was just stupid.  \t0\nIf you see it, you should probably just leave it on the shelf.  \t0\nElias Koteas,Jack Palance play good roles Angelina is hot and gets naked.Billy Drago appears in this and is cool as usual + a cameo by Sven ole Thorsen helps make this a very enjoyable movie with good acting and a decent budget.  \t1\nThis was such an awesome movie that i bought it off of Ebay.  \t1\nI really loved the story line and the poler bear was kinda cute.But if anyone has a question about Fort Steele, just ask away:)  \t1\nThis totally UNfunny movie is so over the top and pathetic and unrealistic that throughout the whole 90 minutes of utter torture I probably looked at my watch about 70000 times!  \t0\nLucy Bell is so much higher than this crap and for her to sink this low is quite depressing.  \t0\nAll this movie does is make you sick watching all these slackers make excuses for their stupid actions for 90 minutes.  \t0\nGod, and I can never get that 90 minutes back!  \t0\nI think the most wonderful parts (literally, full of \"wonder\") are the excerpts from his works.  \t1\nThe sets (especially designed to work with the camera) are amazing....stylized, beautiful and effective.  \t1\nThey could be used as exemplars for any set designer.  \t1\nThe stories were powerful explorations of the nature of man and of art.  \t1\nAfter watching this film, I wanted to learn more about the works of this artist.  \t1\nI highly recommend this movie for anyone interested in art, poetry, theater, politics, or Japanese history.  \t1\nHere, in The Wind and the Lion, we see a wonderful rendering of America's own Imperial age.  \t1\n) What makes this story different are the terrific production values - faultless photography, composition and editing - the terrific casting - the underappreciated Brian Keith playing a bully Teddy - and vivid history.  \t1\nThough The Wind and the Lion is told largely through the eyes of the son, every member of the family can identify with one of the characters, whether it be Sean Connery's noble brigand, Candace Bergen's feisty heroine, John Huston's wily John Hay or Steve Kanaly's spiffy, radiant, ruthless can-do lieutenant, Roosevelt's \"Big Stick\".  \t1\nThis is high adventure at its best.  \t1\nI think it was Robert Ryans best film, because he portrayed someone like my father, and he was a schizophrenic in real life,(my father) although he never murdered anyone but was affected more so during the second world war which made him worse.  \t1\nHaving to humour him just to get by and get through the day was so apt.  \t1\n(My mother and brother had to do this)When I saw Robert Ryan portraying this type of man, it was a very good imitation of this type of individual, and I was impressed.  \t1\nAlmost all of the songs in Cover Girl are old-fashioned and not very tuneful.  \t0\nThe most annoying thing about 'Cover Girl' is the way in which Rita Hayworth is put up on a pedestal.  \t0\nUnfortunately, 'Cover Girl' is an example of how Hollywood used to exploit women for financial gain.  \t0\nNon-linear narration thus many flashbacks and every part are articulated quite well.  \t1\nThe good cinematography also makes her and Monica Bellucci look very beautiful.  \t1\nA good commentary of today's love and undoubtedly a film worth seeing.  \t1\nFor people who are first timers in film making, I think they did an excellent job!!  \t1\nIt was very popular when I was in the cinema, a good house and very good reactions and plenty of laughs.  \t1\nIt's a feel-good film and that's how I felt when I came out of the cinema!  \t1\nIt has northern humour and positive about the community it represents.  \t1\nI rather enjoyed it.  \t1\nI liked it.  \t1\nI couldn't take them seriously.  \t0\nIt really created a unique feeling though.  \t1\nVivian Schilling did an excellent job with the script.  \t1\nA world better than 95% of the garbage in the theatres today.  \t1\nHer role was played well.  \t1\nNot too screamy not to masculine but just right.  \t1\nThe camera really likes her in this movie.  \t1\nI would have casted her in that role after ready the script.  \t1\nAs a European, the movie is a nice throwback to my time as a student in the 1980's and the experiences I had living abroad and interacting with other nationalities, although the circumstances were slightly different.  \t1\nI am a fan of his ... This movie sucked really bad.  \t0\nEven worse than Ticker!  \t0\n& That movie was bad.  \t0\nOnly like 3 or 4 buildings used, a couple of locations MAYBE, & poor hummh!  \t0\nIt just blew.  \t0\nThis movie is excellent!Angel is beautiful and Scamp is adorable!His little yelps when hes scared,and the funniest parts are when:Scamp is caught under the curtain and when Angel and Scamp are singing 'Ive Never Had This Feeling Before'.I totally recommend this movie,its coming out on special edition on June 20.The cover has scamp on a garbage can and Angel underneath the lid.  \t1\nI just cant explain this movie more than romantic,charming,hilarious,and adorable.The junkyard scenes are funny,all the junkyard dogs have something special.Too funny i laughed,kids will LOVE it.Buy it when it comes out,it has new features!  \t1\nNow we were chosen to be tortured with this disgusting piece of blatant American propaganda.  \t0\nThis show is made for Americans - it is too stupid and full with hatred and clichés to be admitted elsewhere.  \t0\nAlmost everyone involved must be return to school, acting is utterly predictable and bad, script is pile of garbage all round.  \t0\nI wish I could enter negative values, admins?  \t0\nThe sets are so bad, they wouldn't look out of place on a Thunderbirds episode.  \t0\nThe use of slow-motion needlessly repeats itself throughout the movie but is well backed up by bad acting (and bad is a kind word here), no continuity, scenes that are thrown in for no reason whatsoever, vehicles that looked like they were made from a Corn Flakes box and a directorial style that bordered on stupidity.  \t0\nOh yeah, and the storyline was pathetic too.  \t0\nI hate writing bad reviews about films - especially those in which I really like the star - but this film is so bad I don't believe for one second that anyone could have been proud of it.  \t0\nI am not a filmmaker nor am I a director but I would hide my head in the sand if I'd spent whatever amount of money and time on this movie.  \t0\nIn short - this was a monumental waste of time and energy and I would not recommend anyone to EVER see this film.  \t0\nIt came free with a DVD player I bought but I still turned the thing off halfway through because I was embarrassed for Howell.  \t0\n1/10 - and only because there is no setting for 0/10.  \t0\nAn interesting premise, and Billy Drago is always good as a dangerous nut-bag (side note: I'd love to see Drago, Stephen McHattie and Lance Hendrikson in a flick together; talk about raging cheekbones!).  \t1\nThe soundtrack wasn't terrible, either.  \t1\nBut the acting--even that of such professionals as Drago and Debbie Rochon--was terrible, the directing worse (perhaps contributory to the former), the dialog chimp-like, and the camera work, barely tolerable.  \t0\nStill, it was the SETS that got a big \"10\" on my \"oy-vey\" scale.  \t1\nYes, I am simplifying things here for the sake of brevity, for this really is at the core of the problems with this film - it has too much going on without any real, fulfilling explanation.  \t0\nBoth do good jobs and are quite amusing.  \t1\nBut the convoluted plot just didn't convince me, and much of the film was watched with a weird, questioning glance.  \t0\nI let my girlfriend talk me into seeing this - bad idea, we both hated it.  \t0\nThe last 15 minutes of movie are also not bad as well.  \t1\nBela Lugosi was totally extraneous, intoning odd lines.  \t0\nThe acting was decidely wooden, though no worse than a period Universal B movie.  \t0\nI like Armand Assante & my cable company's summary sounded interesting, so I watched it, twice already, and probably will again.  \t1\nI believe the screenwriter did a good job of tying up the loose ends.  \t1\nMy 8/10 score is mostly for the plot.  \t1\nI won't say any more - I don't like spoilers, so I don't want to be one, but I believe this film is worth your time.  \t1\nWow, what a bad film.  \t0\nNot frightening in the least, and barely comprehensible.  \t0\nThe plot doesn't hang together at all, and the acting is absolutely appalling.  \t0\nNot even good for camp value!  \t0\nI wasn't expecting Oscar material, but this?  \t0\nYou'd have to have the IQ of particularly stupid mollusk not to see that one coming.  \t0\nThis film (and I use that word loosely) is an insult to the movie-going public.  \t0\nIf only someone involved with it knew how to string together narrative!  \t0\nThis gets a 1 out of 10, simply because there's nothing lower.  \t0\nThis is one I did not have, but I watched it recently on Fox Movie Channel, and was very disappointed.  \t0\nI know he was a contract player with little control over his scripts, but the acting was as bad as the script.  \t0\nVictor McLaglen was even bad, and Brian DonLevy was almost unrecognizable.  \t0\nConsidering the relations off screen between Taylor and Stanwyck, it was surprising how little chemistry there was on screen between the two of them.  \t0\nBut the premise of the film was so ridiculous: that the President of the U.S.  \t0\nThe death row scenes were entirely unmoving.  \t0\nThe only thing worse than Taylor's acting was Stanwyck's singing.  \t0\nWhatever the producer was going for, he missed entirely.  \t0\nI was deeply impressed with the character he played.  \t1\nI knew when I saw the film that more great things were to come from this gifted actor.  \t1\nA cheap and cheerless heist movie with poor characterisation, lots of underbite style stoic emoting (think Chow Yun Fat in A Better Tomorrow) and some cheesy clichés thrown into an abandoned factory ready for a few poorly executed flying judo rolls a la John Woo.  \t0\nEven the squibs look awful.  \t0\nAt no point in the proceedings does it look remotely like America.  \t0\nThe plot, such as it is, is so derivative and predictable that the ending is like a mercy killing.  \t0\nThe awful dialogue and hopeless overacting by everyone who gets shot top off a real waste of space and time.  \t0\nI was very uneasy with how bad this movie was, but not scared at all.  \t0\nThe dialogue is composed of things that make little sense.  \t0\nAbout 30 minutes of footage is wasted to show mediocre elderly actors awkwardly babbling overwrought pseudo-Satanic gibberish corny enough to make a teen Goth blush, almost always in Olde English, and sometimes in Latin that may or may not be made up words.  \t0\nThe directing is sloppy at best.  \t0\nHackneyed writing, certainly, but made even worse by the bad directing.  \t0\nOf course, the acting is blah.  \t0\nThe acting by the whole cast could be put on a scale and balanced perfectly between overacting and underacting.  \t0\nAnd, FINALLY, after all that, we get to an ending that would've been great had it been handled by competent people and not Jerry Falwell.  \t0\nI loved this movie it was a great portrayal of a family who had it's share of ups and down, but in the end they knew that special love they had for each other.  \t1\nI have seen many movies starring Jaclyn Smith, but my god this was one of her best, though it came out 12 years ago.  \t1\nThis movie contained an all-star cast, and what I loved the most was that it opened my eyes to see other actors who I haven't seen before.  \t1\nThis movie was kind of long in length, but I enjoyed every minute of it.  \t1\nOverall I rate this movie a 10 out of a 1-10 scale.  \t1\nLifetime does not air it enough, so if anyone knows what store sells it let me know because this is a must-have.  \t1\nI particularly remember my senses being assaulted by strident cords of music that would blare out with very little warning, and even less meaning.  \t0\nIt is just the sort of pap that is screened in the afternoon to punish the unemployed for not having jobs.  \t0\nTotally different, with loads of understatement and black comedy, this is a film few get to see, but those who do will remember it.  \t1\nThis movie creates its own universe, and is fascinating in every way.  \t1\nBut this movie really got to me.  \t1\nSee it.  \t1\nI really hope the team behind this movie makes more movies, and that they will continue to do so in their own, some kinda weird style.  \t1\nAnd I forgot: The Casting here i superb, with Trond Fausa Aurvåg being perfect in the role as the Bothersome Man, who doesn't understand where he is, what he is doing and why.  \t1\nThis movie is a good and humorous comment on life in 2006.  \t1\nI found this move beautiful, enjoyable, and uplifting.  \t1\nInitially the local sites in the film, which was filmed here in Buffalo, intrigued me.  \t1\nLater I found myself lost in the power of the film.  \t1\nThe entire audience applauded at the conclusion of the film.  \t1\nI left the theater with a lilt in my step, joy in my heart and hope for the human race.  \t1\nDuris has a wholesome appearance and gives a fine performance.  \t1\nThe rest of the cast also play well.  \t1\nCinematography noteworthy including fine views of Barcelona and its famed Gaudi towers.  \t1\nAbout ten minutes into this film I started having second thoughts.  \t0\nAbout half way through this film I started to dislike it.  \t0\nBy the time the film ended, I not only disliked it, I despised it.  \t0\nWhat this film lacks is a convincing script.  \t0\nThe script looks as if only a rough draft was written and shooting began before a finished script was completed.  \t0\nThings happen, characters personalities change, plot twists occur for no real reason other than that script calls for it.  \t0\nThe cast is good.  \t1\nFor that, it's worth checking out.  \t1\nThis is probably the most irritating show I have ever seen in my entire life.  \t0\nIt is indescribably the most annoying and idiotic show I have ever seen.  \t0\nEverything about it is just bad.  \t0\nI could not understand, what kind of idiot would produce this mess in the first place not to mention several season.  \t0\nThe script is bad, very bad  it contains both cheesiness and unethical joke that you normally see in rated R or NC-17 movie.  \t0\nThe casting is also horrible, cause all you see is a really really BAD Actors, period.  \t0\nFinal Word: This Show is a real torture!!  \t0\nIt is zillion times away from reality.  \t0\nWatching washing machine twirling around wouldn't hurt your eyes as much as this show.  \t0\nRating: 0/10 (Grade: Z) Note: The Show Is So Bad That Even Mother Of The Cast Pull Her Daughter Out Of The Show.  \t0\n20th Century Fox's ROAD HOUSE 1948) is not only quite a silly noir but is an implausible unmitigated bore of a movie.  \t0\nFull of unconvincing cardboard characters it is blandly written by Edward Chodorov, who also produced, and is surprisingly directed by Jean Negulesco from whom one would expect a great deal more.  \t0\nFrom here on the Widmark character turns unintentionally comical!  \t0\nHis losing his marbles so early in the proceedings is totally implausible and unconvincing.  \t0\nAnd if that isn't enough of a mess of a movie for you - the picture is also marred with a constant use of studio sets and indoor exteriors.  \t0\nWhatever prompted such a documentary is beyond me!  \t0\n(very serious spoilers) this movie was a huge disappointment.  \t0\nthere are so many problems i dont know where to start.  \t0\nthe cast was great.  \t1\nsteve martin delivers a really funny performance of a middle-aged, upper class, uptight white guy.  \t1\nadd betty white and jean smart and you have a great cast - everyone played their parts really well.  \t1\nbut the movie makes a lot of serious mistakes.  \t0\nfirst of all, there are enough racial stereotypes and racial jokes to offend everyone.  \t0\nthe movie is littered with overt racial slurs towards the black cast members and in return the whites are depicted as morons and boobs.  \t0\nputting the race card aside, lets look at the major flaw in the film: they destroy latifa's character.  \t0\nthere is no real plot.  \t0\ni wouldnt see this movie again for free.  \t0\nSTEAMBOAT WILLIE is an amazingly important film to our cinema history.  \t1\nThis second appearance of Mickey Mouse (following the silent PLANE CRAZY earlier that year) is probably his most famous film--mostly because it was so ground-breaking.  \t1\nWhile you don't yet hear Mickey speak, there are tons of sound effects and music throughout the film--something we take for granted now but which was a huge crowd pleaser in 1928.  \t1\nHowever, after seeing the short again after about 25 years, I was amazed at how timeless the film actually is.  \t1\nIt's just adorable seeing Mickey playing \"Turkey in the Straw\" in a highly imaginative (if occasionally cruel) way.  \t1\nClever and a real crowd-pleaser--this film still ranks among Mickey's best films even after 80 wonderful years.  \t1\nThe bipolarity of the ruthless thug (one minute a ruthless killer, the next minute a Luv's diaper commercial) is completely unconvincing.  \t0\nI'm terribly disappointed that this film would receive so many awards and accolades, especially when there are far more deserving works of film out there.  \t0\nThe original Body and Soul (1947) is a masterpiece.  \t1\nJohn Garfield, Ann revere, Lilli Plmer, William Conrad, Canada Lee...and filmed by one of the greatest cinematographers to ever grace the screen..James Wong Howe.  \t1\nI don't think there are any redeeming qualities in this remake.  \t0\nThis may be the only bad film he ever made.  \t0\nSo bad...well...it's just bad.  \t0\nThis movie is a solid example of a bad plot and a very, very bad idea all the way.  \t0\nIt's a shame to see good actors like Thomerson and James make a living in a mess like this.  \t0\nI thought it was bad.  \t0\nBoth films are terrible, but to the credit of the 1986 version, it was watchable.  \t0\nLet's start with all the problemsthe acting, especially from the lead professor, was very, very bad.  \t0\nThe script is a big flawed mess.  \t0\nThe best example of how dumb the writing is when it's established that you can turn the zombie-students back into humans by removing a necklace containing a piece of the meteorite.  \t0\nDirector Paul Matthews, who also wrote/directed the weak 1995 monster movie \"Grim\", clearly doesn't know how to pace his films.  \t0\nThe movie is terribly boring in places.  \t0\nThe lighting is awful.  \t0\nThe film looks cheap and bland.  \t0\nOne of the most disappointing aspects is the lack of notable gore.  \t0\nThis convention never worked well in the past, and certainly doesn't work here.  \t0\nThe visual effects were AWFUL.  \t0\nThe CG opening sequence in space looked like it could have been created on Microsoft Slideshow for God's sake!  \t0\nThe \"explosion\" of the Gas tanks at the end was just as awful.  \t0\nOkay, I like to consider myself a fair critic, so I'll give credit where credit's due--the creature effects were actually pretty cool.  \t1\nGotta love those close-ups of slimy, drooling teeth!  \t1\nTo sum the film up, \"Breeders\" is a terrible, cheaply made horror movie that should be avoided like the Ebola virus.  \t0\nNot recommended.  \t0\nHe is almost unbearable to watch on screen, he has little to no charisma, and terrible comedic timing.  \t0\nAside from it's terrible lead, this film has loads of other debits.  \t0\nI understand that it's supposed to be a cheap popcorn comedy, but that doesn't mean that it has to completely insult our intelligence, and have writing so incredibly hackneyed that it borders on offensive.  \t0\nLewis Black's considerable talent is wasted here too, as he is at his most incendiary when he is unrestrained, which the PG-13 rating certainly won't allow.  \t0\nThe film's sole bright spot was Jonah Hill (who will look almost unrecognizable to fans of the recent Superbad due to the amount of weight he lost in the interim).  \t1\nWith the originality and freshness of the first movie now spent, this remake had little else to offer.  \t0\nThe budget was evidently very limited.  \t0\nThis was reflected not only in the cast, but also in the below-par script, which borrowed much from the earlier classic.  \t0\nHowever, here there was no decent acting, action or location work to balance things up.  \t0\nFilmiing was less expansive.  \t0\nIt failed to convey the broad sweep of landscapes that were a great part of the original.  \t0\nGenerally; it just lacked imagination.  \t0\nNot recommended.  \t0\nIs it possible for a movie to get any worse than this?  \t0\nThere is no plot here to keep you going in the first place.  \t0\nEven when the women finally show up, there is no sign of improvement; the most expected things happen and by the time the film is over, you might be far asleep.  \t0\nBeware: this is not a trashy cult movie, this is trash -period!  \t0\nI can't believe there's even a sequel to this!  \t0\nWhich is precisely why I am giving it such a bad review!  \t0\nBeing a 90's child, I truly enjoyed this show and I can proudly say that I enjoyed it big time and even more than the classical WB cartoons.  \t1\nBut \"Tiny Toons\" kept the 90's vibe and delivered one of the most popular, funny, and underrated cartoons ever created.  \t1\nThe memories are murky but I can only say that I enjoyed every single episode and product related to the show.  \t1\nEasily, none other cartoon made me laugh in a tender way (before getting into dark sitcoms oriented for teenagers).  \t1\nThe characters were all funny and had the peculiarity of not having a true lead character.  \t1\nEvery single character was hilarious and deserved to be called a lead.  \t1\nEvery element of this story was so over the top, excessively phony and contrived that it was painful to sit through.  \t0\nHer lines seem to have been WRITTEN by a fifteen year old, though they are trying oh so, so hard to sound like how a fifteen year old would really, um, you know, well... talk.  \t0\nPerabo has a nice energy level and is obviously very comfortable in front of a camera.  \t1\nThere is simply no excuse for something this poorly done.  \t0\nI saw this movie and I thought this is a stupid movie.  \t0\nWhat is even more stupid is that who had thought an idea that there should be a volcano in Los Angeles?  \t0\nTo be honest with you, this is unbelievable nonsense and very foolish.  \t0\nIn conclusion, I will not bother with this movie because a volcano in Los Angeles is nothing but nonsense.  \t0\nThe story line is just awful!  \t0\nIt's just painful!  \t0\nAnd the accents are absolutely abysmal!  \t0\nThere's also enough hypocrisy in this film to make me vomit.  \t0\nDon't waste your time watching this rubbish non-researched film.  \t0\nI believe that Pitch Black was done well.  \t1\nThe characters are interesting and you want to find out more about them the longer the movie goes on, and I think people will be surprised by who does and doesn't make it.  \t1\nGo watch it!  \t1\nOmit watching this.  \t0\nVERY funny!  \t1\nMy rating: just 3 out of 10.  \t0\nThe characters are interesting and you really care for them.  \t1\nAn instant classic, with a great soundtrack and a catchy song during the ending credits.  \t1\nDon't miss it.  \t1\nThis is a masterful piece of film-making, with many themes simmering and occasionally boiling over in this warts and all study of the poet's bohemian, self-indulgent wartime years that span the aerial bombardments of London and the outward tranquillity of a Welsh coastal retreat - the borderlines between friendship, lust and love, dedication to art and experience versus practical concerns, jealousy, rivalry, cowardice and egotism versus heroism and self-sacrifice and more.  \t1\nA mature, subtle script that suggests and occasionally brings into dramatic focus the underlying tensions is well served by perfect performances (apart from the odd inappropriate smiling that Keira Knightley is prone to, though perhaps under direction this time as the other characters themselves often mention it).  \t1\nBut above all the exquisite visual composition of each moment, with inventive and elegant use of close-up, camera angle and lighting, including pointillistic faux home movie footage, is a wonder and joy to behold.  \t1\nIt's as continuously beautiful to look at as a Bertolucci, but the relationships here are more convincing and the narrative more engaging than some of that master's work.  \t1\nThe basic premise is wasted since it is sidelined by the inexplicable focus on the documentary crew.  \t0\nRegardless, the film fails on most levels.  \t0\nAvoid at all costs.  \t0\nI saw this film over Christmas, and what a great film it was!  \t1\nI thought Errol Flynn was brilliant as Custer and has since become my favourite actor!  \t1\nHis acting alongside Olivia De Havilland was brilliant and the ending was fantastic!  \t1\nI had always known that Errol Flynn was a brilliant actor as he was my dads favourite actor, and I grew up watching his films as a child.  \t1\nBut it wasn't until I watched this film that I realised how great he actually was.  \t1\nI'll give this film 10 out of 10!  \t1\nI know that Jim O'Connor was very energetic and that nobody could be as much as him, but George was well dull.  \t0\nHe really didn't seem to want to be hosting; his voice-overs were monotonous, didn't get involved with the guests.  \t0\nLovely little thriller from Hitchcock, with lots of nice shenanigans surrounding a murdered spy, a kidnapped child, a nasty church, a foreign plot and some random taxidermists.  \t1\nJimmy Stewart is as ever a great hero for Hitchcock, the story rips along to its cool climax at an embassy function, but it lacks the brooding menace of Hitchcock's black and white, low-budget original.  \t1\nNevertheless yet another wonderful film from the great master's stable.  \t1\nI have to say that this film was excellently produced and tops the ratings as a typical sci fi film!  \t1\nExcellently produced by one of Sci-fi's best producers Scot Vandiver !  \t1\nBut it is entertaining, nonetheless.  \t1\nIt's a campy sort of film that's a joy to watch.  \t1\nThere's barely a boring moment in the film and there are plenty of humorous parts.  \t1\nThe cast is always entertaining as usual.  \t1\nOverall, a delight!  \t1\nThis movie is so mind-bendingly awful, it couldn't have even been created.  \t0\nThe film lacks any real scares or tension & some of the medical terminology used throughout is a bit iffy to say the least & I say that as an insulin dependant diabetic myself.  \t0\nThe least said about the acting the better.  \t0\nThis movie does an excellent job of revealing the complexity of the task and the incredible challenges facing South Africa.  \t1\nI believe every one should see this movie as I think few people outside of South Africa understand its past and what is being attempted in the Truth and Reconciliation process.  \t1\nNothing short of magnificent photography/cinematography in this film.  \t1\nThe acting is fantastic, the stories are seamlessly woven together, and the dogs are splendid............. A must rent, view, or see.  \t1\nDon't be afraid of subtitles........ its worth a little aversion therapy 10/10  \t1\nExcellent performance.  \t1\nThere still are good actors around!  \t1\nAlso great directing and photography.  \t1\nVery true to Shakespear, and a 'must' for all Shakespear fans.  \t1\nMacbeth (Jason Connery) moved me to tears with his final monolog (out brief candle, out)He gave the sphere of moral decay and dark forces a human face, which makes it the more interesting.  \t1\nHelen Baxendale is a very credible lady Macbeth who can be very cheerfull at times and sometimes she just looks like a naughty girl, but deadly in her taste for blood and evil.  \t1\nIf you love death and decay, and Shakespears lyrics... this is the one.  \t1\nThis is a witty and delightful adaptation of the Dr Seuss book, brilliantly animated by UPA's finest and thoroughly deserving of its Academy Award.  \t1\nSpecial mention should be made of the superb music score and sound effects, which are an integral element in helping to make this such a memorable and enjoyable cartoon.  \t1\nHowever Paul Schrader has indeed made a film \"about\" Mishima that is both superb & complex.  \t1\nAlso notable is John Bailey's fine crisp beautifully colored cinematography and the great production design & costumes by Eiko Ishioka who went on to do the memorable costumes for Coppola's Dracula for which she received a well deserved Oscar.  \t1\nEven allowing for poor production values for the time (1971) and the format (some kind of mini-series), this is baaaaaad.  \t0\nUnless you're just out to visually \"collect\" all extant films of Austen's work, you can skip this one.  \t0\nIf you do watch it, however, there are small consolations: The actresses playing Anne's sisters each do a wonderful job with their roles.  \t1\nIt is not good.  \t0\nSpeaking of the music, it is unbearably predictably and kitchy.  \t0\nThen the film just dropped the ball.  \t0\nThis is a stunning movie.  \t1\nRaw and sublimely moving.  \t1\nIt felt like a very gripping, intelligent stage play (but without the overly theatrical feeling one actually gets from watching people on a stage) which plays on everyone's terror of a white lie escalating to monstrous consequences.  \t1\nAll of the main players are mesmerising.  \t1\nTom Wilkinson broke my heart at the end... and everyone else's judging by the amount of fumbling for hankies and hands going up to faces among males and females alike.  \t1\nJulian Fellowes has triumphed again.  \t1\nHe's a national treasure.  \t1\nGO AND SEE IT!  \t1\nThis is an excellent film.  \t1\nThe aerial scenes were well-done.  \t1\nIt was also the right balance of war and love.  \t1\nThe film gives meaning to the phrase, \"Never in the history of human conflict has so much been owed by so many to so few.  \t1\nKris Kristoffersen is good in this movie and really makes a difference.  \t1\nA good film by a great director!  \t1\nThis is definitely one of the better documentaries I have seen looking at family relationships and marriage.  \t1\nThere are many continuity errors: one other user commented on different cars in the garage, Joe's glasses...the one that got to me the most was the fact Joe's facial hair configuration seemed to change from scene to scene.  \t0\nThis is just a great movie.  \t1\n10 out of 10 stars.  \t1\nI can't see how this movie can be an inspiration to anyone to come out or overcome fear and rejection.  \t0\nIt's so bad it's actually worth seeing just for that reason.  \t0\nPunishment Park is a brilliant piece of cinema.  \t1\nShot in the Southern California desert using his patent faux documentary style, Watkins creates a film like no other.  \t1\nThis is one of Peter Watkins most accessible films.  \t1\nI advise you to look out for it.  \t1\nYou wont regret it!  \t1\nHighly recommended A+  \t1\nWell... Just if you keep thinking how bad it is.  \t0\nIt's a mediocre, miserable, hollow, laughable and predictable piece of garbage.  \t0\nIt's a case of 'so bad it is laughable'.  \t0\n) very bad performance plays Angela Bennett, a computer expert who is at home all the time.  \t0\nIt is a film about nothing, just a pretext to show ridiculous action scenes.  \t0\nHow awful she is!  \t0\nBut she is still a bad actress, repeating her robotic face moves in each of her pictures.  \t0\nThe results, well, are a shame.  \t0\nDELETE this film from your mind!  \t0\nOne of the worst shows of all time.  \t0\nThe show would begin with smart ass ed comments to each other that would be totally off the wall and uncalled for.  \t0\nThe fat computer geek was unbelievable, the bible thumper, the bad-ass girl, who are these actors???  \t0\nNever heard of any of them except Cole who was totally unbelievable in the part.  \t0\nEvery time he opened his mouth you expect to hear, \"you see kids...\" Pulling the plug was a mercy killing for this horrible show.  \t0\nThe stories were as unbelievable as the actors.  \t0\nLame would be the best way to describe it.  \t0\nStanwyck and Morgan are perfectly cast in what is, in many ways, a modern equivalent of Dickens' Christmas Carol in its sensibility.  \t1\nThe success of the film depends on the casting of Sydney Greenstreet as the Alexander Yardley character.  \t1\nThe attractive set used throughout most of the film is an eye-pleasing gem.  \t1\nIm big fan of RPG games too, but this movie, its a disgrace to any self-respecting RPGer there is.  \t0\nThe lines, the cuts, the audio, everything is wrong.  \t0\nYou can find better movies at youtube.  \t0\nTop line: Don't waste your time and money on this one, its as bad as it comes.  \t0\nA Lassie movie which should have been \"put to sleep\".... FOREVER.  \t0\nThat's how I'd describe this painfully dreary time-waster of a film.  \t0\nSo mediocre in every aspect that it just becomes a dull, uninteresting mess, this is one of the most forgettable movies I've seen.  \t0\nIt isn't even an achievement as a \"so-bad-it's-good\" or \"so-bad-it's-memorable\" movie.  \t0\nIt's an empty, hollow shell of a movie.  \t0\nSeriously, it's not worth wasting your, or your kid's time on.  \t0\nAvoid, avoid, avoid!  \t0\nIt will drive you barking mad!  \t0\nThe transfers are very good.  \t1\nVery nice and relaxing late night viewing.  \t1\nThe movie is full of wonderful dancing (hence the title!  \t1\n) some great music, and terrific scenery.  \t1\nIt handles some tough issues with dignity and grace, and, of course, has (shocking spoiler here!  \t1\n) a happy, wonderful, feel good ending!  \t1\nThe point is the journey, a journey that touches every member of the family.  \t1\nIt's one of the movies I need to see whenever it comes on TV...never mind the fact that I already have it memorized!  \t1\nNothing new there.  \t0\nThat was done in the second movie.  \t0\nThe movie has almost no action scenes in it and very little comedy.  \t0\nThe plot has more holes than a pair of fishnet stockings and the direction and editing is astonishingly ham fisted.  \t0\nWhat on earth is Irons doing in this film?  \t0\nI just saw this film and I recommend it.  \t1\nIt has a very good plot, it holds your complete attention, the acting is superb, Tom Wilkinson was fantastic and Emily Watson was also very good.  \t1\nA very good film indeed, about great and unconditional love.  \t1\nTom Wilkinson's character is a man who is not prepared for the ordeal that is about to begin, but he takes the matter in hand as the story progresses, and this great actor gives a performance that makes you feel the character's anguish and suffering.  \t1\nEmily Watson's character is very strong, and she has only to give a quick glance and you understand everything.  \t1\nDespite the pans of reviewers, I liked this movie.  \t1\nIn fact, I liked it better than Interview With a Vampire and I liked this Lestat (Stuart Townsend) better than Cruise's attempt.  \t1\nAailiyah was pretty good as Akasha, in places compelling (her first entrance and mini dance scene).  \t1\nI'm a big fan of this series mostly due to Anne Rice's style, sensitivities and treatments.  \t1\nI guess I liked the details of his dysfunction--he was believable.  \t1\nThe football scenes at the end were perplexing.  \t0\nBut I thought his acting was skilled.  \t1\nMeredith M was better than all right.  \t1\nA very charming film with wonderful sentiment and heart.  \t1\nIt is rare when a film-maker takes the time to tell a worthy moral tale with care and love that doesn't fall into the trap of being overly syrupy or over indulgent.  \t1\nNine out of ten for a truly lovely film.  \t1\nThis early film from future goremeister Lucio Fulci is a very good addition to the giallo sub-genre.  \t1\nThis is one of the best Italian thrillers of the early 70's.  \t1\nA standout scene.  \t1\nThis scene is very strong and unpleasant.  \t0\nTechnically, the film is well made with impressive camera-work, solid acting and effective music from Riz Ortolani  particularly good is a recurring unaccompanied female vocal that sounds like it's coming from a distant hill.  \t1\nIt's still wild stuff though and is highly recommended to fans of giallo cinema.  \t1\nThe movie was very interesting from beginning to the end.  \t1\nI liked the way Dustin Hoffman's character was ready to do just about everything to stay with his son.  \t1\nThis movie is also revealing.  \t1\nPersonally, I think it shows that people should learn to find a compromise them self without involving other people into issue.  \t1\nAnd it was boring.  \t0\nI am so tired of clichés that is just lazy writing, and here they come in thick and fast.  \t0\nPS the only scene in the movie that was cool is when the central character finds her room blown up.  \t1\nIt's a fresh, subtle, and rather sublime effect.  \t1\nAn Italian reviewer called this \"a small, great film,\" and that's right.  \t1\nAll the actors give a wonderful performance, especially Jennifer Rubin as Jamie Harris, who changes from the nervous starlet in the beginning through the strange events she is part of to the cool star.  \t1\nYou learn a lot about the real inside emotions of people in this movie, and a lot about the movie business itself.  \t1\nThe movie in movie situations in the beginning and through the game that is played with her by the \"acting coach\" are fascinating.  \t1\nAlso the music by Mark Snow is possibly the best score I've ever heard.  \t1\nYou won't forget this movie!  \t1\nWhy was this film made?  \t0\nThe film has an ultra-cheap look to it.  \t0\nThe result is a film that just don't look right.  \t0\nNone of them are engaging or exciting.  \t0\nThe plot is nonsense that doesn't interest in the slightest way or have any uniqueness to it.  \t0\nThe Foreigner is not worth one second of your time.  \t0\nI saw it as a child on TV back in 1973, when it was \"The Stranger\" and I loved it.  \t1\nBut the duet between the astronaut and his doctor at the beginning of the movie is a perfect exchange if one considers that this movie was made well into the Cold War and the astronaut's biggest fear is that he has crashed in the USSR.  \t1\nThis movie is so awesome!  \t1\nI loved it, it was really scary.  \t1\nI love the Scream movies and all horror movies and this one ranks way up there.  \t1\nIf you want a real scare rent this one!  \t1\n10/10  \t1\nThis is an extraordinary film.  \t1\nAs a courtroom drama, it's compelling, as an indictment on the American justice system, it's frightening.  \t1\nThis film highlights the fundamental flaws of the legal process, that it's not about discovering guilt or innocence, but rather, is about who presents better in court.  \t1\nThe film is well paced, understated and one of the best courtroom documentaries I've seen.  \t1\nThis mostly routine fact-based TV drama gets a boost from the fine performance by Cole.  \t1\nPredictable, but not a bad watch.  \t1\nIt was clear that she had the range and ability to pull off this part.  \t1\nShe carries the movie well.  \t1\nConstantine gives everything the right intensity and seems to have a good understanding of the underlying psychological motivations.  \t1\nIt is wonderful and inspiring to watch, and I hope that it gets released again on to video or DVD.  \t1\nHow this piece of trash was ever released is beyond me: the acting, the story, the characters, the supposedly special effects, etc...it's ALL wrong.  \t0\nIn fact, this stinker smells like a direct-to-video release.  \t0\nAvoid at ALL costs!  \t0\nStar Trek V The final Frontier is the worst in the series.  \t0\nThe acting from all involved and that includes those like Shatner and Nimoy is bad and washed out and making them seem as old as they look in real life, the special effects are tacky like when Spock has to rescue Kirk on a jet pack when he falls down from a mountain.  \t0\nThe attempts at humor were pitiful and story is so awful it dosen't bear thinking about which basically involves a Vulcan stealing the Enterprise to find god (seriously) I just didn't care about any of this film and oh not to mention Uhura does a belly dance to distract male guards.  \t0\nThe only place good for this film is in the garbage.  \t0\nThe worst one of the series.  \t0\nEditing: The editing of this film was phenomenal in my opinion.  \t1\nWhen a song could explain the emotions of the subjects better, such as when Jay Adams' unfortunate life was a subject of talk, the song Old Man by Neil Young was played, which evokes many emotions.  \t1\nCinematography: The film was shot in an interesting way.  \t1\nOf course the footage from the 70s was grainy, but that only enhanced the film.  \t1\nThis film offers many delights and surprises.  \t1\nWhen Achille and Philippa beautifully sing a duet from \"Don Giovanni\" that perfectly describes their situation in the movie, you appreciate the subtle layers of this excellent film.  \t1\nThe story unfolds in 18th century Jutland and the use of period music played on period instruments is just one more fine touch.  \t1\nYou share General Loewenhielm's exquisite joy in his partaking of the Cailles en Sarcophage even though you are just watching a movie - but you do wish for just a small sample to savor.  \t1\nBut this understated film leaves a lasting impression.  \t1\nThe warmth it generates is in contrast to its austere backdrop.  \t1\nYou will leave the theater wanting to go out and dance under the stars.  \t1\nThe acting, as you'd expect from this cast, is top notch.  \t1\nThe characters are fleshed out surprisingly well, particularly Grimes and Blake, and all the actors deliver their sharply scripted lines with just the right amount of deadpan tongue in cheek to make the dialogue both hilarious and realistic.  \t1\nAngus Scrimm also turns in a good performance in a somewhat brief but memorable role as the gently menacing, violin-playing anatomist Doctor Quinn.  \t1\nConclusion - I loved it.  \t1\nIt's a long time since I was so entertained by a movie.  \t1\nI struggle to find anything bad to say about it.  \t1\nMark my words, this is one of those cult films like Evil Dead 2 or Phantasm that people will still be discovering and falling in love with 20, 30, 40 years down the line.  \t1\nIt's pretty surprising that this wonderful film was made in 1949, as Hollywood generally had its collective heads in the sand concerning black and white issues at that time.  \t1\nThe film deserves strong kudos for taking this stand, for having exceptional acting from its mostly lesser-known cast and for the super-intelligent script that doesn't insult the audience or take the easy way out when it comes to white racism.  \t1\nPlus, with the movie's rather modest budget and fast running time, it does an amazing job!  \t1\nJuano Hernandez (an exceptional actor who played supporting roles in many films of the era) is a proud black man who is accused of murdering a white man in the South.  \t1\nTrumbull on I LOVE LUCY).  \t1\nSee it with your kids if you have a chance--it will open up some amazing dialog about how far race relations have come in the last 50 years.  \t1\nSee both films if you can.  \t1\nIt was that year, however, that reminded us that Huston was still at the top of his game as evinced by his faithful adaptation of James Joyce's acclaimed novella \"The Dead.  \t1\nFeelings, thoughts...Gabriel's discomfort during the dance...all these intangibles leap to life and come within the viewer's grasp in Huston's portrayal.  \t1\nVery disappointed and wondered how it could be in the Oscar shortlist.  \t0\nIt's very slow.  \t0\nLot of holes in the plot: there's nothing about how he became the emperor; nothing about where he spend 20 years between his childhood and mature age.  \t0\n) Don't waste your time.  \t0\nEnd of Days is one of the worst big-budget action movies I've ever seen.  \t0\nHe surely doesn't know how to make a coherent action movie from the screenwriter of Air Force One who was only obliged to write the script just for a big sum of money.  \t0\nThis was one of the worst films i have ever seen.  \t0\nI'm still trying to get over how bad it was.  \t0\nThis movie is possibly one of the most creative works of horror ever.  \t1\nIt has everything you could want... suspense, drama, comedy, confusing subplots, native americans, brain eating... If you're looking for the be-all, end-all of brainsucking movies, look no further.  \t1\n\" With great sound effects, and impressive special effects, I can't recommend this movie enough.  \t1\nCall me a nut, but I think this is one of the best movies ever.  \t1\nGreat character actors Telly Savalas and Peter Boyle.  \t1\n1 hour 54 minutes of sheer tedium, melodrama and horrible acting, a mess of a script, and a sinking feeling of GOOD LORD, WHAT WERE THEY THINKING?  \t0\nLots of holes in the script.  \t0\nIt's like a bad two hour TV movie.  \t0\nNow imagine that every single one of those decisions was made wrong.  \t0\nThe dialogue is atrocious.  \t0\nThe acting is beyond abysmal.  \t0\nEverything stinks.  \t0\nTrouble is, the writing and directing make it impossible to establish those things that make a movie watchable, like character, story, theme and so on.  \t0\nWorse, there's an incredibly weak sub-plot thrown in that follows a little band of latter-day Mansonites as they go after a reporter who's working on a story on the anniversary of the killings.  \t0\nIt's dumb and pointless, and a complete waste of time.  \t0\nIn short, don't bother with this movie.  \t0\nI won't spoil it, but the ending in pretty amazing.  \t1\nThe best scene in the movie is at the end, but I won't spoil it.  \t1\nIf there was ever an indication of a writer and a director's ability to meld two highly volatile temperaments into a seamless union of creativity, then this is it!  \t1\nThe result is a powerhouse achievement, made more timely now perhaps because of our culture's disturbing fascination with celebrity, and it's distorted interpretations of fame.  \t1\nA film not easily forgotten.  \t1\nBut, Kevin Spacey is an excellent, verbal tsunami as Buddy Ackerman  and totally believable because he is a great actor.  \t1\nThe scripting of the subtle comedy is unmatched by any movie in recent years.  \t1\nThe characters are interesting, even if a bit predictable.  \t1\nHighly recommended for all ages, although the younger set will probably not appreciate some of the more subtle references, they will certainly appreciate one galley scene in particular!  \t1\nGreat movie!  \t1\nAlso the story and acting were weak.  \t0\nAt around 4 pm I bought it, at around 8pm I started to watch, at around 8.15pm I fast forwarded the remaining film to see if there was anything left watchable for a human being with a brain... but there wasn't.  \t0\nEither way, it sucks.  \t0\nThe script is horrendously stupid.  \t0\nThe story starts too fast with absolutely no suspense or build-up in the slightest.  \t0\nEverything Captain Howdy says is either laughable or just plain stupid.  \t0\nWhat the hell kind of crap is that?!  \t0\nThen, there's the plot holes.  \t0\nYou could drive a semi truck into these holes!  \t0\nLinda Cardellini is the only thing good in this film.  \t1\nShe's poised and amazing.  \t1\nDee Snider just plain sucks.  \t0\nHe can't act (one of the least scary villains I have ever seen), he can't write (did he write this damn movie in his sleep?  \t0\nI was bored throughout the whole damn thing.  \t0\nThe acting sucks, the music sucks, the script sucks, the pacing sucks, the special FX suck, the directing sucks... basically, this movie sucks.  \t0\nThis film tries to be a serious and sophisticated thriller/horror flick and it fails miserably.  \t0\nThis is probably one of the least effective and utterly unoriginal films I have ever seen in my entire life.  \t0\nA piece of cinematic garbage captured on celluloid.  \t0\nAvoid at any and all costs.  \t0\nAt any rate this film stinks, its not funny, and Fulci should have stayed with giallo and supernatural zombie movies.  \t0\nAvoid this film at all costs.  \t0\nI don't know what happened in Season Five, what a mess.  \t0\nThe only consistent thread holding the series together were the amazing performances of Leni Parker and Anita LaSelva as the two Taelons in quiet idealogical conflict.  \t0\nNow this is a movie I really dislike.  \t0\nIt's one of the most boring Horror movies from the 90's mainly because it starts slow and centers in a boring atmosphere.  \t0\nThe puppets look really cheesy , not in a good way like in the Puppet Master 80's flicks.  \t0\nThe story is lame, not interesting and NEVER really explains the sinister origins of the puppets.  \t0\nThere aren't death scenes like in previous movies and the f/x are terrible.  \t0\nI felt asleep the first time I watched it, so I can recommend it for insomniacs.  \t0\nThe fact is, this film is a wonderful, heartwarming tale about two people chasing their dreams.  \t1\nThe best part about \"Nurse Betty\" is it's unpredictability.  \t1\nDirector Neil LaBute uses brutal violence to seperate dreams from reality, and along with the touching drama, and hilarious comedy, you can never tell what is going to happen next.  \t1\nOtherwise, don't even waste your time on this.  \t0\nThis one just fails to create any real suspense.  \t0\nAs for the killer, don't expect anything original or even remotely frightening.  \t0\nThere is, however, some pretty good acting (at least, for this type of film).  \t1\nI'm so sorry but I really can't recommend it to anyone.  \t0\nOne of the most boring,pointless movies I have ever seen.  \t0\nThe secondary plot line is incomprehensible and its relation to the primary plot line is mystifying.  \t0\nHated it.  \t0\nThis is one of the worst Sandra Bullock movie since Speed 2 But not quite that bad.  \t0\nI don't understand how this garbage got on the shelves of the movie store, it's not even a real movie!  \t0\nI highly doubt that anyone could ever like this trash.  \t0\nThis is not movie-making.  \t0\nThe acting is like watching wooden puppets moving around and reading from a book, that's how bad it is.  \t0\nSo I am here to warn you--DO NOT RENT THIS MOVIE, it is the dumbest thing you have never seen!  \t0\nI saw this short film on HBO the other day and absolutely loved it.  \t1\nI didn't realize how wonderful the short really is until the last two scenes.  \t1\nExcellent short film.  \t1\nHopefully, the director James Cox can turn the short into a feature length film with the same cast, or win us over with a whole new film.  \t1\nI agree with Jessica, this movie is pretty bad.  \t0\nCharacters are one-dimensional, even the good guys and especially the bad guys.  \t0\nThe story line is totally predictable.  \t0\nNot much dialogue, not much music, the whole film was shot as elaborately and aesthetically like a sculpture.  \t1\nI've seen soap operas more intelligent than this movie.  \t0\nBad characters, bad story and bad acting.  \t0\nReally awful.  \t0\nNot easy to watch.  \t0\nFunny, clever, hip - just like Pray's previous film, Hype!  \t1\nIt was a long time that i didn't see a so charismatic actor on screen.  \t1\nPaolo Sorrentino has written a wonderful story about loneliness and Tony has built one of the most unforgettable characters seen in movies in recent years.  \t1\nThe movie is not completely perfect but 'Titta Di Girolamo' will stay with you for a long time after the vision of the movie.  \t1\nI rate this movie 9/10.  \t1\nI do not know if this was Emilio Estevez's directorial debut, but the pacing, the interplay and development of the characters as well as some clever camera work surrounding the character Estevez plays all suggest a natural eye.  \t1\nThe interplay between Martin and Emilio contains the same wonderful chemistry we saw in Wall Street with Martin and Charlie.  \t1\nKathy Bates is wonderful in her characters subtle desperation and escapism; a variation on her character in \"At Play In The Fields Of The Lord\".  \t1\nFor readers who have already seen one of Miyazaki's films: he is still in top form and made another worthwhile experience.  \t1\nIt never condescends, all the characters have good genuine hearts and believable problems.  \t1\nThe two main characters may be two of the most believable children I ever saw put on screen.  \t1\nThey are so easy to love, but even more easy to identify with.  \t1\nThis movie is great--especially if you enjoy visual arts.  \t1\nThe scenery that the two daughters paint and photograph are beautiful.  \t1\nThe story is also both funny and poignant at times.  \t1\nPeople who like European films and \"art movies\" will like this movie.  \t1\nThis is truly an art movie--it actually has a lot of art in it.  \t1\nGo rent it.  \t1\nHowever, after finally watching this film, I realized that not only had I had a closed mind to the brilliance it depicts, I also found myself watching it over and over again.  \t1\nIt's the one movie that never ceases to interest me, simply because it keeps me alert, as I try to attempt to decipher it's meanings.  \t1\nBrilliance indeed.  \t1\nBut if you liked movies like The Matrix (and better yet, their sequels) I think you'll appreciate the thought provoking, mindblowing experience this film will give you.  \t1\nThink of the film being like a dream.  \t1\nSimply beautiful.  \t1\nBoth Rickman and Stowe play their roles to the hilt in this tale of a childrens' book writer who-- maybe?-- has written a subversive tract.  \t1\nIt's a gloriously fun, fast paced and fairly accurate portrayal of the night of a raver.  \t1\nIt presents a idyllic yet serious portrayal of the ups and downs of the characters lives.  \t1\nJust whatever you do, avoid \"Groove\" as its the antithesis of all that is good about Human Traffic.  \t0\nIt's too bad that everyone else involved didn't share Crowe's level of dedication to quality, for if they did, we'd have a far better film on our hands than this sub-par mess.  \t0\nThe movie seemed a little slow at first.  \t0\nBut it picked up speed and got right to the point.  \t1\nIt showed exactly how the government and the scientist argued for humanity and the reasons of the \"gadget\".  \t1\nI enjoyed it.  \t1\nI have recommended it to friends.  \t1\nI was particularly pleased with the acting ability of Dwight Schultz.  \t1\nBoth actors truly understand and become their particular character, delivering a convincing, sincere performance.  \t1\nTheir on-screen chemistry, critical to the entire film, is genuine.  \t1\nThe film's dialogue is natural, real to life.  \t1\nThe writer, Gorman Bechard, undoubtedly did his homework because all references are industry and character-age appropriate.  \t1\nThe incredible soundtrack truly captures the essence of the film.  \t1\nEach track commands sentiment, actually contributing to the scenes and characters.  \t1\nDefinitely worth seeing it's the sort of thought provoking film that forces you to question your own threshold of loneliness.  \t1\nHayao Miyazaki's latest and eighth film for Studio Ghibili, \"Gake No Ue No Ponyo\" (Ponyo on the Cliff by the Sea) is a wonderfully fun and imaginative look at childhood.  \t1\nAt a time when it seems that film animation has been dominated by Disney/Pixar's CGI masterpieces, it is both refreshing and comforting to know that Miyazaki is still relying on traditional hand-drawn animation to tell his charming and enchanting stories.  \t1\nEnough can not be said of the remarkable animation in this film.  \t1\nThe art style has the appearance of crayon/pencil drawings and is wonderfully colorful and fanciful.  \t1\nIf you act in such a film, you should be glad that you're gonna drift away from earth as far as possible!  \t0\nThis one wants to surf on the small wave of space movies in 1998 (Deep Impact and Armageddon), and this one fails everywhere.  \t0\nIf you haven't choked in your own vomit by the end (by all the cheap drama and worthless dialogue) you've must have bored yourself to death with this waste of time.  \t0\nStill, it makes up for all of this with a super ending that depicts a great sea vessel being taken out by the mighty frost.  \t1\nJust consider the excellent story, solid acting and look of the film as added bonuses.  \t1\nInstead, we got a bore fest about a whiny, spoiled brat babysitting.  \t0\nThen I watched it again two Sundays ago (March 20th, 2005) and I began to really enjoy it and this time I taped the entire thing.  \t1\nIt is a very well acted and done TV Movie.  \t1\nJudith Light is one of my favorite actresses and I think she does a superb job in this film!  \t1\nI keep watching it over and over.  \t1\nIt's a sad movie, but very good.  \t1\nIf you have not seen this movie, I definitely recommend it!  \t1\nShe is as lovely as usual, this cutie!  \t1\nStill it's quite interesting and entertaining to follow.  \t1\n;) Recommend with confidence!  \t1\nThis movie is well-balanced with comedy and drama and I thoroughly enjoyed myself.  \t1\nIt was a riot to see Hugo Weaving play a sex-obsessed gay real estate salesman who uses his clients' houses for his trysts with the flaming Darren (Tom Hollander).  \t1\n:) Anyway, the plot flowed smoothly and the male-bonding scenes were a hoot.  \t1\nThe opening sequence of this gem is a classic, and the cat n mouse games that follow are a delight to watch.  \t1\nFans of the genre will be in heaven.  \t1\nLange had become a great actress.  \t1\nIt looked like a wonderful story.  \t1\nI never walked out of a movie faster.  \t0\nI just got bored watching Jessice Lange take her clothes off!  \t0\nUnfortunately, any virtue in this film's production work was lost on a regrettable script.  \t0\nIn a word, it is embarrassing.  \t0\nExceptionally bad!  \t0\nAll in all its an insult to one's intelligence and a huge waste of money.  \t0\n"
  },
  {
    "path": "machine-learning/ML - Getting Started - Sentiment Analysis.workbook/sentiment-yelp-test.txt",
    "content": "Wow... Loved this place.\t1\nCrust is not good.\t0\nNot tasty and the texture was just nasty.\t0\nStopped by during the late May bank holiday off Rick Steve recommendation and loved it.\t1\nThe selection on the menu was great and so were the prices.\t1\nNow I am getting angry and I want my damn pho.\t0\nHoneslty it didn't taste THAT fresh.)\t0\nThe potatoes were like rubber and you could tell they had been made up ahead of time being kept under a warmer.\t0\nThe fries were great too.\t1\nA great touch.\t1\nService was very prompt.\t1\nWould not go back.\t0\nThe cashier had no care what so ever on what I had to say it still ended up being wayyy overpriced.\t0\nI tried the Cape Cod ravoli, chicken,with cranberry...mmmm!\t1\nI was disgusted because I was pretty sure that was human hair.\t0\nI was shocked because no signs indicate cash only.\t0\nHighly recommended.\t1\nWaitress was a little slow in service.\t0\nThis place is not worth your time, let alone Vegas.\t0\ndid not like at all.\t0\nThe Burrittos Blah!\t0\nThe food, amazing.\t1\nService is also cute.\t1\nI could care less... The interior is just beautiful.\t1\nSo they performed.\t1\nThat's right....the red velvet cake.....ohhh this stuff is so good.\t1\n- They never brought a salad we asked for.\t0\nThis hole in the wall has great Mexican street tacos, and friendly staff.\t1\nTook an hour to get our food only 4 tables in restaurant my food was Luke warm, Our sever was running around like he was totally overwhelmed.\t0\nThe worst was the salmon sashimi.\t0\nAlso there are combos like a burger, fries, and beer for 23 which is a decent deal.\t1\nThis was like the final blow!\t0\nI found this place by accident and I could not be happier.\t1\nseems like a good quick place to grab a bite of some familiar pub food, but do yourself a favor and look elsewhere.\t0\nOverall, I like this place a lot.\t1\nThe only redeeming quality of the restaurant was that it was very inexpensive.\t1\nAmple portions and good prices.\t1\nPoor service, the waiter made me feel like I was stupid every time he came to the table.\t0\nMy first visit to Hiro was a delight!\t1\nService sucks.\t0\nThe shrimp tender and moist.\t1\nThere is not a deal good enough that would drag me into that establishment again.\t0\nHard to judge whether these sides were good because we were grossed out by the melted styrofoam and didn't want to eat it for fear of getting sick.\t0\nOn a positive note, our server was very attentive and provided great service.\t1\nFrozen pucks of disgust, with some of the worst people behind the register.\t0\nThe only thing I did like was the prime rib and dessert section.\t1\nIt's too bad the food is so damn generic.\t0\nThe burger is good beef, cooked just right.\t1\nIf you want a sandwich just go to any Firehouse!!!!!\t1\nMy side Greek salad with the Greek dressing was so tasty, and the pita and hummus was very refreshing.\t1\nWe ordered the duck rare and it was pink and tender on the inside with a nice char on the outside.\t1\nHe came running after us when he realized my husband had left his sunglasses on the table.\t1\nTheir chow mein is so good!\t1\nThey have horrible attitudes towards customers, and talk down to each one when customers don't enjoy their food.\t0\nThe portion was huge!\t1\nLoved it...friendly servers, great food, wonderful and imaginative menu.\t1\nThe Heart Attack Grill in downtown Vegas is an absolutely flat-lined excuse for a restaurant.\t0\nNot much seafood and like 5 strings of pasta at the bottom.\t0\nThe salad had just the right amount of sauce to not over power the scallop, which was perfectly cooked.\t1\nThe ripped banana was not only ripped, but petrified and tasteless.\t0\nAt least think to refill my water before I struggle to wave you over for 10 minutes.\t0\nThis place receives stars for their APPETIZERS!!!\t1\nThe cocktails are all handmade and delicious.\t1\nWe'd definitely go back here again.\t1\nWe are so glad we found this place.\t1\nGreat food and service, huge portions and they give a military discount.\t1\nAlways a great time at Dos Gringos!\t1\nUpdate.....went back for a second time and it was still just as amazing\t1\nWe got the food and apparently they have never heard of salt and the batter on the fish was chewy.\t0\nA great way to finish a great.\t1\nThe deal included 5 tastings and 2 drinks, and Jeff went above and beyond what we expected.\t1\n- Really, really good rice, all the time.\t1\nThe service was meh.\t0\nIt took over 30 min to get their milkshake, which was nothing more than chocolate milk.\t0\nI guess I should have known that this place would suck, because it is inside of the Excalibur, but I didn't use my common sense.\t0\nThe scallop dish is quite appalling for value as well.\t0\n2 times - Very Bad Customer Service !\t0\nThe sweet potato fries were very good and seasoned well.\t1\nToday is the second time I've been to their lunch buffet and it was pretty good.\t1\nThere is so much good food in Vegas that I feel cheated for wasting an eating opportunity by going to Rice and Company.\t0\nComing here is like experiencing an underwhelming relationship where both parties can't wait for the other person to ask to break up.\t0\nwalked in and the place smelled like an old grease trap and only 2 others there eating.\t0\nThe turkey and roast beef were bland.\t0\nThis place has it!\t1\nThe pan cakes everyone are raving about taste like a sugary disaster tailored to the palate of a six year old.\t0\nI love the Pho and the spring rolls oh so yummy you have to try.\t1\nThe poor batter to meat ratio made the chicken tenders very unsatisfying.\t0\nAll I have to say is the food was amazing!!!\t1\nOmelets are to die for!\t1\nEverything was fresh and delicious!\t1\nIn summary, this was a largely disappointing dining experience.\t0\nIt's like a really sexy party in your mouth, where you're outrageously flirting with the hottest person at the party.\t1\nNever been to Hard Rock Casino before, WILL NEVER EVER STEP FORWARD IN IT AGAIN!\t0\nBest breakfast buffet!!!\t1\nsay bye bye to your tip lady!\t0\nWe'll never go again.\t0\nWill be back again!\t1\nFood arrived quickly!\t1\nIt was not good.\t0\nOn the up side, their cafe serves really good food.\t1\nOur server was fantastic and when he found out the wife loves roasted garlic and bone marrow, he added extra to our meal and another marrow to go!\t1\nThe only good thing was our waiter, he was very helpful and kept the bloddy mary's coming.\t1\nBest Buffet in town, for the price you cannot beat it.\t1\nI LOVED their mussels cooked in this wine reduction, the duck was tender, and their potato dishes were delicious.\t1\nThis is one of the better buffets that I have been to.\t1\nSo we went to Tigerlilly and had a fantastic afternoon!\t1\nThe food was delicious, our bartender was attentive and personable AND we got a great deal!\t1\nThe ambience is wonderful and there is music playing.\t1\nWill go back next trip out.\t1\nSooooo good!!\t1\nREAL sushi lovers, let's be honest - Yama is not that good.\t0\nAt least 40min passed in between us ordering and the food arriving, and it wasn't that busy.\t0\nThis is a really fantastic Thai restaurant which is definitely worth a visit.\t1\nNice, spicy and tender.\t1\nGood prices.\t1\nCheck it out.\t1\nIt was pretty gross!\t0\nI've had better atmosphere.\t0\nKind of hard to mess up a steak but they did.\t0\nAlthough I very much liked the look and sound of this place, the actual experience was a bit disappointing.\t0\nI just don't know how this place managed to served the blandest food I have ever eaten when they are preparing Indian cuisine.\t0\nWorst service to boot, but that is the least of their worries.\t0\nService was fine and the waitress was friendly.\t1\nThe guys all had steaks, and our steak loving son who has had steak at the best and worst places said it was the best steak he's ever eaten.\t1\nWe thought you'd have to venture further away to get good sushi, but this place really hit the spot that night.\t1\nHost staff were, for lack of a better word, BITCHES!\t0\nBland... Not a liking this place for a number of reasons and I don't want to waste time on bad reviewing.. I'll leave it at that...\t0\nPhenomenal food, service and ambiance.\t1\nI wouldn't return.\t0\nDefinitely worth venturing off the strip for the pork belly, will return next time I'm in Vegas.\t1\nThis place is way too overpriced for mediocre food.\t0\nPenne vodka excellent!\t1\nThey have a good selection of food including a massive meatloaf sandwich, a crispy chicken wrap, a delish tuna melt and some tasty burgers.\t1\nThe management is rude.\t0\nDelicious NYC bagels, good selections of cream cheese, real Lox with capers even.\t1\nGreat Subway, in fact it's so good when you come here every other Subway will not meet your expectations.\t1\nI had a seriously solid breakfast here.\t1\nThis is one of the best bars with food in Vegas.\t1\nHe was extremely rude and really, there are so many other restaurants I would love to dine at during a weekend in Vegas.\t0\nMy drink was never empty and he made some really great menu suggestions.\t1\nDon't do it!!!!\t0\nThe waiter wasn't helpful or friendly and rarely checked on us.\t0\nMy husband and I ate lunch here and were very disappointed with the food and service.\t0\nAnd the red curry had so much bamboo shoots and wasn't very tasty to me.\t0\nNice blanket of moz over top but i feel like this was done to cover up the subpar food.\t1\nThe bathrooms are clean and the place itself is well decorated.\t1\nThe menu is always changing, food quality is going down & service is extremely slow.\t0\nThe service was a little slow , considering that were served by 3 people servers so the food was coming in a slow pace.\t0\nI give it 2 thumbs down\t0\nWe watched our waiter pay a lot more attention to other tables and ignore us.\t0\nMy fiancé and I came in the middle of the day and we were greeted and seated right away.\t1\nThis is a great restaurant at the Mandalay Bay.\t1\nWe waited for forty five minutes in vain.\t0\nCrostini that came with the salad was stale.\t0\nSome highlights : Great quality nigiri here!\t1\nthe staff is friendly and the joint is always clean.\t1\nthis was a different cut than the piece the other day but still wonderful and tender s well as well flavored.\t1\nI ordered the Voodoo pasta and it was the first time I'd had really excellent pasta since going gluten free several years ago.\t1\nthis place is good.\t1\nUnfortunately, we must have hit the bakery on leftover day because everything we ordered was STALE.\t0\nI came back today since they relocated and still not impressed.\t0\nI was seated immediately.\t1\nTheir menu is diverse, and reasonably priced.\t1\nAvoid at all cost!\t0\nRestaurant is always full but never a wait.\t1\nDELICIOUS!!\t1\nThis place is hands-down one of the best places to eat in the Phoenix metro area.\t1\nSo don't go there if you are looking for good food...\t0\nI've never been treated so bad.\t0\nBacon is hella salty.\t1\nWe also ordered the spinach and avocado salad; the ingredients were sad and the dressing literally had zero taste.\t0\nThis really is how Vegas fine dining used to be, right down to the menus handed to the ladies that have no prices listed.\t1\nThe waitresses are very friendly.\t1\nLordy, the Khao Soi is a dish that is not to be missed for curry lovers!\t1\nEverything on the menu is terrific and we were also thrilled that they made amazing accommodations for our vegetarian daughter.\t1\nPerhaps I caught them on an off night judging by the other reviews, but I'm not inspired to go back.\t0\nThe service here leaves a lot to be desired.\t0\nThe atmosphere is modern and hip, while maintaining a touch of coziness.\t1\nNot a weekly haunt, but definitely a place to come back to every once in a while.\t1\nWe literally sat there for 20 minutes with no one asking to take our order.\t0\nThe burger had absolutely no flavor - the meat itself was totally bland, the burger was overcooked and there was no charcoal flavor.\t0\nI also decided not to send it back because our waitress looked like she was on the verge of having a heart attack.\t0\nI dressed up to be treated so rudely!\t0\nIt was probably dirt.\t0\nLove this place, hits the spot when I want something healthy but not lacking in quantity or flavor.\t1\nI ordered the Lemon raspberry ice cocktail which was also incredible.\t1\nThe food sucked, which we expected but it sucked more than we could have imagined.\t0\nInteresting decor.\t1\nWhat I really like there is the crepe station.\t1\nAlso were served hot bread and butter, and home made potato chips with bacon bits on top....very original and very good.\t1\nyou can watch them preparing the delicious food!)\t1\nBoth of the egg rolls were fantastic.\t1\nWhen my order arrived, one of the gyros was missing.\t0\nI had a salad with the wings, and some ice cream for dessert and left feeling quite satisfied.\t1\nI'm not really sure how Joey's was voted best hot dog in the Valley by readers of Phoenix Magazine.\t0\nThe best place to go for a tasty bowl of Pho!\t1\nThe live music on Fridays totally blows.\t0\nI've never been more insulted or felt disrespected.\t0\nVery friendly staff.\t1\nIt is worth the drive.\t1\nI had heard good things about this place, but it exceeding every hope I could have dreamed of.\t1\nFood was great and so was the serivce!\t1\nThe warm beer didn't help.\t0\nGreat brunch spot.\t1\nService is friendly and inviting.\t1\nVery good lunch spot.\t1\nI've lived here since 1979 and this was the first (and last) time I've stepped foot into this place.\t0\nThe WORST EXPERIENCE EVER.\t0\nMust have been an off night at this place.\t0\nThe sides are delish - mixed mushrooms, yukon gold puree, white corn - beateous.\t1\nIf that bug never showed up I would have given a 4 for sure, but on the other side of the wall where this bug was climbing was the kitchen.\t0\nFor about 10 minutes, we we're waiting for her salad when we realized that it wasn't coming any time soon.\t0\nMy friend loved the salmon tartar.\t1\nWon't go back.\t0\nExtremely Tasty!\t1\nWaitress was good though!\t1\nSoggy and not good.\t0\nThe Jamaican mojitos are delicious.\t1\nWhich are small and not worth the price.\t0\n- the food is rich so order accordingly.\t1\nThe shower area is outside so you can only rinse, not take a full shower, unless you don't mind being nude for everyone to see!\t0\nThe service was a bit lacking.\t0\nLobster Bisque, Bussell Sprouts, Risotto, Filet ALL needed salt and pepper..and of course there is none at the tables.\t0\nHopefully this bodes for them going out of business and someone who can cook can come in.\t0\nIt was either too cold, not enough flavor or just bad.\t0\nI loved the bacon wrapped dates.\t1\nThis is an unbelievable BARGAIN!\t1\nThe folks at Otto always make us feel so welcome and special.\t1\nAs for the \"mains,\" also uninspired.\t0\nThis is the place where I first had pho and it was amazing!!\t1\nThis wonderful experience made this place a must-stop whenever we are in town again.\t1\nIf the food isn't bad enough for you, then enjoy dealing with the world's worst/annoying drunk people.\t0\nVery very fun chef.\t1\nOrdered a double cheeseburger & got a single patty that was falling apart (picture uploaded) Yeah, still sucks.\t0\nGreat place to have a couple drinks and watch any and all sporting events as the walls are covered with TV's.\t1\nIf it were possible to give them zero stars, they'd have it.\t0\nThe descriptions said \"yum yum sauce\" and another said \"eel sauce\", yet another said \"spicy mayo\"...well NONE of the rolls had sauces on them.\t0\nI'd say that would be the hardest decision... Honestly, all of M's dishes taste how they are supposed to taste (amazing).\t1\nIf she had not rolled the eyes we may have stayed... Not sure if we will go back and try it again.\t0\nEveryone is very attentive, providing excellent customer service.\t1\nHorrible - don't waste your time and money.\t0\nNow this dish was quite flavourful.\t1\nBy this time our side of the restaurant was almost empty so there was no excuse.\t0\n(It wasn't busy either) Also, the building was FREEZING cold.\t0\nlike the other reviewer said \"you couldn't pay me to eat at this place again.\"\t0\n-Drinks took close to 30 minutes to come out at one point.\t0\nSeriously flavorful delights, folks.\t1\nMuch better than the other AYCE sushi place I went to in Vegas.\t1\nThe lighting is just dark enough to set the mood.\t1\nBased on the sub-par service I received and no effort to show their gratitude for my business I won't be going back.\t0\nOwner's are really great people.!\t1\nThere is nothing privileged about working/eating there.\t0\nThe Greek dressing was very creamy and flavorful.\t1\nOverall, I don't think that I would take my parents to this place again because they made most of the similar complaints that I silently felt too.\t0\nNow the pizza itself was good the peanut sauce was very tasty.\t1\nWe had 7 at our table and the service was pretty fast.\t1\nFantastic service here.\t1\nI as well would've given godfathers zero stars if possible.\t0\nThey know how to make them here.\t1\nvery tough and very short on flavor!\t0\nI hope this place sticks around.\t1\nI have been in more than a few bars in Vegas, and do not ever recall being charged for tap water.\t0\nThe restaurant atmosphere was exquisite.\t1\nGood service, very clean, and inexpensive, to boot!\t1\nThe seafood was fresh and generous in portion.\t1\nPlus, it's only 8 bucks.\t1\nThe service was not up to par, either.\t0\nThus far, have only visited twice and the food was absolutely delicious each time.\t1\nJust as good as when I had it more than a year ago!\t1\nFor a self proclaimed coffee cafe, I was wildly disappointed.\t0\nThe Veggitarian platter is out of this world!\t1\nYou cant go wrong with any of the food here.\t1\nYou can't beat that.\t1\nStopped by this place while in Madison for the Ironman, very friendly, kind staff.\t1\nThe chefs were friendly and did a good job.\t1\nI've had better, not only from dedicated boba tea spots, but even from Jenni Pho.\t0\nI liked the patio and the service was outstanding.\t1\nThe goat taco didn't skimp on the meat and wow what FLAVOR!\t1\nI think not again\t0\nI had the mac salad and it was pretty bland so I will not be getting that again.\t0\nI went to Bachi Burger on a friend's recommendation and was not disappointed.\t1\nService stinks here!\t0\nI waited and waited.\t0\nThis place is not quality sushi, it is not a quality restaurant.\t0\nI would definitely recommend the wings as well as the pizza.\t1\nGreat Pizza and Salads!\t1\nThings that went wrong: - They burned the saganaki.\t0\nWe waited an hour for what was a breakfast I could have done 100 times better at home.\t0\nThis place is amazing!\t1\nI hate to disagree with my fellow Yelpers, but my husband and I were so disappointed with this place.\t0\nWaited 2 hours & never got either of our pizzas as many other around us who came in later did!\t0\nJust don't know why they were so slow.\t0\nThe staff is great, the food is delish, and they have an incredible beer selection.\t1\nI live in the neighborhood so I am disappointed I won't be back here, because it is a convenient location.\t0\nI didn't know pulled pork could be soooo delicious.\t1\nYou get incredibly fresh fish, prepared with care.\t1\nBefore I go in to why I gave a 1 star rating please know that this was my third time eating at Bachi burger before writing a review.\t0\nI love the fact that everything on their menu is worth it.\t1\nNever again will I be dining at this place!\t0\nThe food was excellent and service was very good.\t1\nGood beer & drink selection and good food selection.\t1\nPlease stay away from the shrimp stir fried noodles.\t0\nThe potato chip order was sad... I could probably count how many chips were in that box and it was probably around 12.\t0\nFood was really boring.\t0\nGood Service-check!\t1\nThis greedy corporation will NEVER see another dime from me!\t0\nWill never, ever go back.\t0\nAs much as I'd like to go back, I can't get passed the atrocious service and will never return.\t0\nIn the summer, you can dine in a charming outdoor patio - so very delightful.\t1\nI did not expect this to be so good!\t1\nFantastic food!\t1\nShe ordered a toasted English muffin that came out untoasted.\t0\nThe food was very good.\t1\nNever going back.\t0\nGreat food for the price, which is very high quality and house made.\t1\nThe bus boy on the other hand was so rude.\t0\nBy this point, my friends and I had basically figured out this place was a joke and didn't mind making it publicly and loudly known.\t0\nBack to good BBQ, lighter fare, reasonable pricing and tell the public they are back to the old ways.\t1\nAnd considering the two of us left there very full and happy for about $20, you just can't go wrong.\t1\nAll the bread is made in-house!\t1\nThe only downside is the service.\t0\nAlso, the fries are without a doubt the worst fries I've ever had.\t0\nService was exceptional and food was a good as all the reviews.\t1\nA couple of months later, I returned and had an amazing meal.\t1\nFavorite place in town for shawarrrrrrma!!!!!!\t1\nThe black eyed peas and sweet potatoes... UNREAL!\t1\nYou won't be disappointed.\t1\nThey could serve it with just the vinaigrette and it may make for a better overall dish, but it was still very good.\t1\nI go to far too many places and I've never seen any restaurant that serves a 1 egg breakfast, especially for $4.00.\t0\nWhen my mom and I got home she immediately got sick and she only had a few bites of salad.\t0\nThe servers are not pleasant to deal with and they don't always honor Pizza Hut coupons.\t0\nBoth of them were truly unbelievably good, and I am so glad we went back.\t1\nWe had fantastic service, and were pleased by the atmosphere.\t1\nEverything was gross.\t0\nI love this place.\t1\nGreat service and food.\t1\nFirst - the bathrooms at this location were dirty- Seat covers were not replenished & just plain yucky!!!\t0\nThe burger... I got the \"Gold Standard\" a $17 burger and was kind of disappointed.\t0\nOMG, the food was delicioso!\t1\nThere is nothing authentic about this place.\t0\nthe spaghetti is nothing special whatsoever.\t0\nOf all the dishes, the salmon was the best, but all were great.\t1\nThe vegetables are so fresh and the sauce feels like authentic Thai.\t1\nIt's worth driving up from Tucson!\t1\nThe selection was probably the worst I've seen in Vegas.....there was none.\t0\nPretty good beer selection too.\t1\nThis place is like Chipotle, but BETTER.\t1\nClassy/warm atmosphere, fun and fresh appetizers, succulent steaks (Baseball steak!!!!!\t1\n5 stars for the brick oven bread app!\t1\nI have eaten here multiple times, and each time the food was delicious.\t1\nWe sat another ten minutes and finally gave up and left.\t0\nHe was terrible!\t0\nEveryone is treated equally special.\t1\nIt shouldn't take 30 min for pancakes and eggs.\t0\nIt was delicious!!!\t1\nOn the good side, the staff was genuinely pleasant and enthusiastic - a real treat.\t1\nSadly, Gordon Ramsey's Steak is a place we shall sharply avoid during our next trip to Vegas.\t0\nAs always the evening was wonderful and the food delicious!\t1\nBest fish I've ever had in my life!\t1\n(The bathroom is just next door and very nice.)\t1\nThe buffet is small and all the food they offered was BLAND.\t0\nThis is an Outstanding little restaurant with some of the Best Food I have ever tasted.\t1\nPretty cool I would say.\t1\nDefinitely a turn off for me & i doubt I'll be back unless someone else is buying.\t0\nServer did a great job handling our large rowdy table.\t1\nI find wasting food to be despicable, but this just wasn't food.\t0\nMy wife had the Lobster Bisque soup which was lukewarm.\t0\nWould come back again if I had a sushi craving while in Vegas.\t1\nThe staff are great, the ambiance is great.\t1\nHe deserves 5 stars.\t1\nI left with a stomach ache and felt sick the rest of the day.\t0\nThey dropped more than the ball.\t0\nThe dining space is tiny, but elegantly decorated and comfortable.\t1\nThey will customize your order any way you'd like, my usual is Eggplant with Green Bean stir fry, love it!\t1\nAnd the beans and rice were mediocre at best.\t0\nBest tacos in town by far!!\t1\nI took back my money and got outta there.\t0\nIn an interesting part of town, this place is amazing.\t1\nRUDE & INCONSIDERATE MANAGEMENT.\t0\nThe staff are now not as friendly, the wait times for being served are horrible, no one even says hi for the first 10 minutes.\t0\nI won't be back.\t0\nThey have great dinners.\t1\nThe service was outshining & I definitely recommend the Halibut.\t1\nThe food was terrible.\t0\nWILL NEVER EVER GO BACK AND HAVE TOLD MANY PEOPLE WHAT HAD HAPPENED.\t0\nI don't recommend unless your car breaks down in front of it and you are starving.\t0\nI will come back here every time I'm in Vegas.\t1\nThis place deserves one star and 90% has to do with the food.\t0\nThis is a disgrace.\t0\nDef coming back to bowl next time\t1\nIf you want healthy authentic or ethic food, try this place.\t1\nI will continue to come here on ladies night andddd date night ... highly recommend this place to anyone who is in the area (;\t1\nI have been here several times in the past, and the experience has always been great.\t1\nWe walked away stuffed and happy about our first Vegas buffet experience.\t1\nService was excellent and prices are pretty reasonable considering this is Vegas and located inside the Crystals shopping mall by Aria.\t1\nTo summarize... the food was incredible, nay, transcendant... but nothing brings me joy quite like the memory of the pneumatic condiment dispenser.\t1\nI'm probably one of the few people to ever go to Ians and not like it.\t0\nKids pizza is always a hit too with lots of great side dish options for the kiddos!\t1\nService is perfect and the family atmosphere is nice to see.\t1\nCooked to perfection and the service was impeccable.\t1\nThis one is simply a disappointment.\t0\nOverall, I was very disappointed with the quality of food at Bouchon.\t0\nI don't have to be an accountant to know I'm getting screwed!\t0\nGreat place to eat, reminds me of the little mom and pop shops in the San Francisco Bay Area.\t1\nToday was my first taste of a Buldogis Gourmet Hot Dog and I have to tell you it was more than I ever thought possible.\t1\nLeft very frustrated.\t0\nI'll definitely be in soon again.\t1\nFood was really good and I got full petty fast.\t1\nService was fantastic.\t1\nTOTAL WASTE OF TIME.\t0\nI don't know what kind it is but they have the best iced tea.\t1\nCome hungry, leave happy and stuffed!\t1\nFor service, I give them no stars.\t0\nI can assure you that you won't be disappointed.\t1\nI can take a little bad service but the food sucks.\t0\nGave up trying to eat any of the crust (teeth still sore).\t0\nBut now I was completely grossed out.\t0\nI really enjoyed eating here.\t1\nFirst time going but I think I will quickly become a regular.\t1\nOur server was very nice, and even though he looked a little overwhelmed with all of our needs, he stayed professional and friendly until the end.\t1\nFrom what my dinner companions told me...everything was very fresh with nice texture and taste.\t1\nOn the ground, right next to our table was a large, smeared, been-stepped-in-and-tracked-everywhere pile of green bird poop.\t0\nFurthermore, you can't even find hours of operation on the website!\t0\nWe've tried to like this place but after 10+ times I think we're done with them.\t0\nWhat a mistake that was!\t0\nNo complaints!\t1\nThis is some seriously good pizza and I'm an expert/connisseur on the topic.\t1\nWaiter was a jerk.\t0\nStrike 2, who wants to be rushed.\t0\nThese are the nicest restaurant owners I've ever come across.\t1\nI never come again.\t0\nWe loved the biscuits!!!\t1\nService is quick and friendly.\t1\nOrdered an appetizer and took 40 minutes and then the pizza another 10 minutes.\t0\nSo absolutley fantastic.\t1\nIt was a huge awkward 1.5lb piece of cow that was 3/4ths gristle and fat.\t0\ndefinitely will come back here again.\t1\nI like Steiners because it's dark and it feels like a bar.\t1\nWow very spicy but delicious.\t1\nIf you're not familiar, check it out.\t1\nI'll take my business dinner dollars elsewhere.\t0\nI'd love to go back.\t1\nAnyway, this FS restaurant has a wonderful breakfast/lunch.\t1\nNothing special.\t0\nEach day of the week they have a different deal and it's all so delicious!\t1\nNot to mention the combination of pears, almonds and bacon is a big winner!\t1\nWill not be back.\t0\nSauce was tasteless.\t0\nThe food is delicious and just spicy enough, so be sure to ask for spicier if you prefer it that way.\t1\nMy ribeye steak was cooked perfectly and had great mesquite flavor.\t1\nI don't think we'll be going back anytime soon.\t0\nFood was so gooodd.\t1\nI am far from a sushi connoisseur but I can definitely tell the difference between good food and bad food and this was certainly bad food.\t0\nI was so insulted.\t0\nThe last 3 times I had lunch here has been bad.\t0\nThe chicken wings contained the driest chicken meat I have ever eaten.\t0\nThe food was very good and I enjoyed every mouthful, an enjoyable relaxed venue for couples small family groups etc.\t1\nNargile - I think you are great.\t1\nBest tater tots in the southwest.\t1\nWe loved the place.\t1\nDefinitely not worth the $3 I paid.\t0\nThe vanilla ice cream was creamy and smooth while the profiterole (choux) pastry was fresh enough.\t1\nIm in AZ all the time and now have my new spot.\t1\nThe manager was the worst.\t0\nThe inside is really quite nice and very clean.\t1\nThe food was outstanding and the prices were very reasonable.\t1\nI don't think I'll be running back to Carly's anytime soon for food.\t0\nThis is was due to the fact that it took 20 minutes to be acknowledged, then another 35 minutes to get our food...and they kept forgetting things.\t0\nLove the margaritas, too!\t1\nThis was my first and only Vegas buffet and it did not disappoint.\t1\nVery good, though!\t1\nThe one down note is the ventilation could use some upgrading.\t0\nGreat pork sandwich.\t1\nDon't waste your time here.\t0\nTotal letdown, I would much rather just go to the Camelback Flower Shop and Cartel Coffee.\t0\nThird, the cheese on my friend's burger was cold.\t0\nWe enjoy their pizza and brunch.\t1\nThe steaks are all well trimmed and also perfectly cooked.\t1\nWe had a group of 70+ when we claimed we would only have 40 and they handled us beautifully.\t1\nI LOVED it!\t1\nWe asked for the bill to leave without eating and they didn't bring that either.\t0\nThis place is a jewel in Las Vegas, and exactly what I've been hoping to find in nearly ten years living here.\t1\nSeafood was limited to boiled shrimp and crab legs but the crab legs definitely did not taste fresh.\t0\nThe selection of food was not the best.\t0\nDelicious and I will absolutely be back!\t1\nThis isn't a small family restaurant, this is a fine dining establishment.\t1\nThey had a toro tartare with a cavier that was extraordinary and I liked the thinly sliced wagyu with white truffle.\t1\nI dont think I will be back for a very long time.\t0\nIt was attached to a gas station, and that is rarely a good sign.\t0\nHow awesome is that.\t1\nI will be back many times soon.\t1\nThe menu had so much good stuff on it i could not decide!\t1\nWorse of all, he humiliated his worker right in front of me..Bunch of horrible name callings.\t0\nCONCLUSION: Very filling meals.\t1\nTheir daily specials are always a hit with my group.\t1\nAnd then tragedy struck.\t0\nThe pancake was also really good and pretty large at that.\t1\nThis was my first crawfish experience, and it was delicious!\t1\nTheir monster chicken fried steak and eggs is my all time favorite.\t1\nWaitress was sweet and funny.\t1\nI also had to taste my Mom's multi-grain pumpkin pancakes with pecan butter and they were amazing, fluffy, and delicious!\t1\nI'd rather eat airline food, seriously.\t0\nCant say enough good things about this place.\t1\nThe ambiance was incredible.\t1\nThe waitress and manager are so friendly.\t1\nI would not recommend this place.\t0\nOverall I wasn't very impressed with Noca.\t0\nMy gyro was basically lettuce only.\t0\nTerrible service!\t0\nThoroughly disappointed!\t0\nI don't each much pasta, but I love the homemade /hand made pastas and thin pizzas here.\t1\nGive it a try, you will be happy you did.\t1\nBy far the BEST cheesecurds we have ever had!\t1\nReasonably priced also!\t1\nEverything was perfect the night we were in.\t1\nThe food is very good for your typical bar food.\t1\nit was a drive to get there.\t0\nAt first glance it is a lovely bakery cafe - nice ambiance, clean, friendly staff.\t1\nAnyway, I do not think i will go back there.\t0\nPoint your finger at any item on the menu, order it and you won't be disappointed.\t1\nOh this is such a thing of beauty, this restaurant.\t1\nIf you haven't gone here GO NOW!\t1\nA greasy, unhealthy meal.\t0\nfirst time there and might just be the last.\t0\nThose burgers were amazing.\t1\nSimilarly, the delivery man did not say a word of apology when our food was 45 minutes late.\t0\nAnd it was way to expensive.\t0\nBe sure to order dessert, even if you need to pack it to-go - the tiramisu and cannoli are both to die for.\t1\nThis was my first time and I can't wait until the next.\t1\nThe bartender was also nice.\t1\nEverything was good and tasty!\t1\nThis place is two thumbs up....way up.\t1\nThe best place in Vegas for breakfast (just check out a Sat, or Sun.\t1\nIf you love authentic Mexican food and want a whole bunch of interesting, yet delicious meats to choose from, you need to try this place.\t1\nTerrible management.\t0\nAn excellent new restaurant by an experienced Frenchman.\t1\nIf there were zero stars I would give it zero stars.\t0\nGreat steak, great sides, great wine, amazing desserts.\t1\nWorst martini ever!\t0\nThe steak and the shrimp are in my opinion the best entrees at GC.\t1\nI had the opportunity today to sample your amazing pizzas!\t1\nWe waited for thirty minutes to be seated (although there were 8 vacant tables and we were the only folks waiting).\t0\nThe yellowtail carpaccio was melt in your mouth fresh.\t1\nI won't try going back there even if it's empty.\t0\nNo, I'm going to eat the potato that I found some strangers hair in it.\t0\nJust spicy enough.. Perfect actually.\t1\nLast night was my second time dining here and I was so happy I decided to go back!\t1\nnot even a \"hello, we will be right with you.\"\t0\nThe desserts were a bit strange.\t0\nMy boyfriend and I came here for the first time on a recent trip to Vegas and could not have been more pleased with the quality of food and service.\t1\nI really do recommend this place, you can go wrong with this donut place!\t1\nNice ambiance.\t1\nI would recommend saving room for this!\t1\nI guess maybe we went on an off night but it was disgraceful.\t0\nHowever, my recent experience at this particular location was not so good.\t0\nI know this is not like the other restaurants at all, something is very off here!\t0\nAVOID THIS ESTABLISHMENT!\t0\nI think this restaurant suffers from not trying hard enough.\t0\nAll of the tapas dishes were delicious!\t1\nI *heart* this place.\t1\nMy salad had a bland vinegrette on the baby greens and hearts of Palm.\t0\nAfter two I felt disgusting.\t0\nA good time!\t1\nI believe that this place is a great stop for those with a huge belly and hankering for sushi.\t1\nGenerous portions and great taste.\t1\nI will never go back to this place and will never ever recommended this place to anyone!\t0\nThe servers went back and forth several times, not even so much as an \"Are you being helped?\"\t0\nFood was delicious!\t1\nAN HOUR... seriously?\t0\nI consider this theft.\t0\nEew... This location needs a complete overhaul.\t0\nWe recently witnessed her poor quality of management towards other guests as well.\t0\nWaited and waited and waited.\t0\nHe also came back to check on us regularly, excellent service.\t1\nOur server was super nice and checked on us many times.\t1\nThe pizza tasted old, super chewy in not a good way.\t0\nI swung in to give them a try but was deeply disappointed.\t0\nService was good and the company was better!\t1\nThe staff are also very friendly and efficient.\t1\nAs for the service: I'm a fan, because it's quick and you're being served by some nice folks.\t1\nBoy was that sucker dry!!.\t0\nOver rated.\t0\nIf you look for authentic Thai food, go else where.\t0\nTheir steaks are 100% recommended!\t1\nAfter I pulled up my car I waited for another 15 minutes before being acknowledged.\t0\nGreat food and great service in a clean and friendly setting.\t1\nAll in all, I can assure you I'll be back.\t1\nI hate those things as much as cheap quality black olives.\t0\nMy breakfast was perpared great, with a beautiful presentation of 3 giant slices of Toast, lightly dusted with powdered sugar.\t1\nThe kids play area is NASTY!\t0\nGreat place fo take out or eat in.\t1\nThe waitress was friendly and happy to accomodate for vegan/veggie options.\t1\nOMG I felt like I had never eaten Thai food until this dish.\t1\nIt was extremely \"crumby\" and pretty tasteless.\t0\nIt was a pale color instead of nice and char and has NO flavor.\t0\nThe croutons also taste homemade which is an extra plus.\t1\nI got home to see the driest damn wings ever!\t0\nIt'll be a regular stop on my trips to Phoenix!\t1\nI really enjoyed Crema Café before they expanded; I even told friends they had the BEST breakfast.\t1\nNot good for the money.\t0\nI miss it and wish they had one in Philadelphia!\t1\nWe got sitting fairly fast, but, ended up waiting 40 minutes just to place our order, another 30 minutes before the food arrived.\t0\nThey also have the best cheese crisp in town.\t1\nGood value, great food, great service.\t1\nCouldn't ask for a more satisfying meal.\t1\nThe food is good.\t1\nIt was awesome.\t1\nI just wanted to leave.\t0\nWe made the drive all the way from North Scottsdale... and I was not one bit disappointed!\t1\nI will not be eating there again.\t0\n!....THE OWNERS REALLY REALLY need to quit being soooooo cheap let them wrap my freaking sandwich in two papers not one!\t0\nI checked out this place a couple years ago and was not impressed.\t0\nThe chicken I got was definitely reheated and was only ok, the wedges were cold and soggy.\t0\nSorry, I will not be getting food from here anytime soon :(\t0\nAn absolute must visit!\t1\nThe cow tongue and cheek tacos are amazing.\t1\nMy friend did not like his Bloody Mary.\t0\nDespite how hard I rate businesses, its actually rare for me to give a 1 star.\t0\nThey really want to make your experience a good one.\t1\nI will not return.\t0\nI had the chicken Pho and it tasted very bland.\t0\nVery disappointing!!!\t0\nThe grilled chicken was so tender and yellow from the saffron seasoning.\t1\na drive thru means you do not want to wait around for half an hour for your food, but somehow when we end up going here they make us wait and wait.\t0\nPretty awesome place.\t1\nAmbience is perfect.\t1\nBest of luck to the rude and non-customer service focused new management.\t0\nAny grandmother can make a roasted chicken better than this one.\t0\nI asked multiple times for the wine list and after some time of being ignored I went to the hostess and got one myself.\t0\nThe staff is always super friendly and helpful, which is especially cool when you bring two small boys and a baby!\t1\nFour stars for the food & the guy in the blue shirt for his great vibe & still letting us in to eat !\t1\nThe roast beef sandwich tasted really good!\t1\nSame evening, him and I are both drastically sick.\t0\nHigh-quality chicken on the chicken Caesar salad.\t1\nOrdered burger rare came in we'll done.\t0\nWe were promptly greeted and seated.\t1\nTried to go here for lunch and it was a madhouse.\t0\nI was proven dead wrong by this sushi bar, not only because the quality is great, but the service is fast and the food, impeccable.\t1\nAfter waiting an hour and being seated, I was not in the greatest of moods.\t0\nThis is a good joint.\t1\nThe Macarons here are insanely good.\t1\nI'm not eating here!\t0\nOur waiter was very attentive, friendly, and informative.\t1\nMaybe if they weren't cold they would have been somewhat edible.\t0\nThis place has a lot of promise but fails to deliver.\t0\nVery bad Experience!\t0\nWhat a mistake.\t0\nFood was average at best.\t0\nGreat food.\t1\nWe won't be going back anytime soon!\t0\nVery Very Disappointed ordered the $35 Big Bay Plater.\t0\nGreat place to relax and have an awesome burger and beer.\t1\nIt is PERFECT for a sit-down family meal or get together with a few friends.\t1\nNot much flavor to them, and very poorly constructed.\t0\nThe patio seating was very comfortable.\t1\nThe fried rice was dry as well.\t0\nHands down my favorite Italian restaurant!\t1\nThat just SCREAMS \"LEGIT\" in my book...somethat's also pretty rare here in Vegas.\t1\nIt was just not a fun experience.\t1\nThe atmosphere was great with a lovely duo of violinists playing songs we requested.\t1\nI personally love the hummus, pita, baklava, falafels and Baba Ganoush (it's amazing what they do with eggplant!).\t1\nVery convenient, since we were staying at the MGM!\t1\nThe owners are super friendly and the staff is courteous.\t1\nBoth great!\t1\nEclectic selection.\t1\nThe sweet potato tots were good but the onion rings were perfection or as close as I have had.\t1\nThe staff was very attentive.\t1\nAnd the chef was generous with his time (even came around twice so we can take pictures with him).\t1\nThe owner used to work at Nobu, so this place is really similar for half the price.\t1\nGoogle mediocre and I imagine Smashburger will pop up.\t0\ndont go here.\t0\nI promise they won't disappoint.\t1\nAs a sushi lover avoid this place by all means.\t0\nWhat a great double cheeseburger!\t1\nAwesome service and food.\t1\nA fantastic neighborhood gem !!!\t1\nI can't wait to go back.\t1\nThe plantains were the worst I've ever tasted.\t0\nIt's a great place and I highly recommend it.\t1\nService was slow and not attentive.\t0\nI gave it 5 stars then, and I'm giving it 5 stars now.\t1\nYour staff spends more time talking to themselves than me.\t0\nDessert: Panna Cotta was amazing.\t1\nVery good food, great atmosphere.1\t1\nDamn good steak.\t1\nTotal brunch fail.\t0\nPrices are very reasonable, flavors are spot on, the sauce is home made, and the slaw is not drenched in mayo.\t1\nThe decor is nice, and the piano music soundtrack is pleasant.\t1\nThe steak was amazing...rge fillet relleno was the best seafood plate i have ever had!\t1\nGood food , good service .\t1\nIt was absolutely amazing.\t1\nI probably won't be back, to be honest.\t0\nwill definitely be back!\t1\nThe sergeant pepper beef sandwich with auju sauce is an excellent sandwich as well.\t1\nHawaiian Breeze, Mango Magic, and Pineapple Delight are the smoothies that I've tried so far and they're all good.\t1\nWent for lunch - service was slow.\t0\nWe had so much to say about the place before we walked in that he expected it to be amazing, but was quickly disappointed.\t0\nI was mortified.\t0\nNeedless to say, we will never be back here again.\t0\nAnyways, The food was definitely not filling at all, and for the price you pay you should expect more.\t0\nThe chips that came out were dripping with grease, and mostly not edible.\t0\nI wasn't really impressed with Strip Steak.\t0\nHave been going since 2007 and every meal has been awesome!!\t1\nOur server was very nice and attentive as were the other serving staff.\t1\nThe cashier was friendly and even brought the food out to me.\t1\nI work in the hospitality industry in Paradise Valley and have refrained from recommending Cibo any longer.\t0\nThe atmosphere here is fun.\t1\nWould not recommend to others.\t0\nService is quick and even \"to go\" orders are just like we like it!\t1\nI mean really, how do you get so famous for your fish and chips when it's so terrible!?!\t0\nThat said, our mouths and bellies were still quite pleased.\t1\nNot my thing.\t0\n2 Thumbs Up!!\t1\nIf you are reading this please don't go there.\t0\nI loved the grilled pizza, reminded me of legit Italian pizza.\t1\nOnly Pros : Large seating area/ Nice bar area/ Great simple drink menu/ The BEST brick oven pizza with homemade dough!\t1\nThey have a really nice atmosphere.\t1\nTonight I had the Elk Filet special...and it sucked.\t0\nAfter one bite, I was hooked.\t1\nWe ordered some old classics and some new dishes after going there a few times and were sorely disappointed with everything.\t0\nCute, quaint, simple, honest.\t1\nThe chicken was deliciously seasoned and had the perfect fry on the outside and moist chicken on the inside.\t1\nThe food was great as always, compliments to the chef.\t1\nSpecial thanks to Dylan T. for the recommendation on what to order :) All yummy for my tummy.\t1\nAwesome selection of beer.\t1\nGreat food and awesome service!\t1\nOne nice thing was that they added gratuity on the bill since our party was larger than 6 or 8, and they didn't expect more tip than that.\t1\nA FLY was in my apple juice.. A FLY!!!!!!!!\t0\nThe Han Nan Chicken was also very tasty.\t1\nAs for the service, I thought it was good.\t1\nThe food was barely lukewarm, so it must have been sitting waiting for the server to bring it out to us.\t0\nRyan's Bar is definitely one Edinburgh establishment I won't be revisiting.\t0\nNicest Chinese restaurant I've been in a while.\t1\nOverall, I like there food and the service.\t1\nThey also now serve Indian naan bread with hummus and some spicy pine nut sauce that was out of this world.\t1\nProbably never coming back, and wouldn't recommend it.\t0\nFriend's pasta -- also bad, he barely touched it.\t0\nTry them in the airport to experience some tasty food and speedy, friendly service.\t1\nI love the decor with the Chinese calligraphy wall paper.\t1\nNever had anything to complain about here.\t1\nThe restaurant is very clean and has a family restaurant feel to it.\t1\nIt was way over fried.\t0\nI'm not sure how long we stood there but it was long enough for me to begin to feel awkwardly out of place.\t0\nWhen I opened the sandwich, I was impressed, but not in a good way.\t0\nWill not be back!\t0\nThere was a warm feeling with the service and I felt like their guest for a special treat.\t1\nAn extensive menu provides lots of options for breakfast.\t1\nI always order from the vegetarian menu during dinner, which has a wide array of options to choose from.\t1\nI have watched their prices inflate, portions get smaller and management attitudes grow rapidly!\t0\nWonderful lil tapas and the ambience made me feel all warm and fuzzy inside.\t1\nI got to enjoy the seafood salad, with a fabulous vinegrette.\t1\nThe wontons were thin, not thick and chewy, almost melt in your mouth.\t1\nLevel 5 spicy was perfect, where spice didn't over-whelm the soup.\t1\nWe were sat right on time and our server from the get go was FANTASTIC!\t1\nMain thing I didn't enjoy is that the crowd is of older crowd, around mid 30s and up.\t0\nWhen I'm on this side of town, this will definitely be a spot I'll hit up again!\t1\nI had to wait over 30 minutes to get my drink and longer to get 2 arepas.\t0\nThis is a GREAT place to eat!\t1\nThe jalapeno bacon is soooo good.\t1\nThe service was poor and thats being nice.\t0\nFood was good, service was good, Prices were good.\t1\nThe place was not clean and the food oh so stale!\t0\nThe chicken dishes are OK, the beef is like shoe leather.\t0\nBut the service was beyond bad.\t0\nI'm so happy to be here!!!\"\t1\nTasted like dirt.\t0\nOne of the few places in Phoenix that I would definately go back to again .\t1\nThe block was amazing.\t1\nIt's close to my house, it's low-key, non-fancy, affordable prices, good food.\t1\n* Both the Hot & Sour & the Egg Flower Soups were absolutely 5 Stars!\t1\nMy sashimi was poor quality being soggy and tasteless.\t0\nGreat time - family dinner on a Sunday night.\t1\nthe food is not tasty at all, not to say its \"real traditional Hunan style\".\t0\nWhat did bother me, was the slow service.\t0\nThe flair bartenders are absolutely amazing!\t1\nTheir frozen margaritas are WAY too sugary for my taste.\t0\nThese were so good we ordered them twice.\t1\nSo in a nutshell: 1) The restaraunt smells like a combination of a dirty fish market and a sewer.\t0\nMy girlfriend's veal was very bad.\t0\nUnfortunately, it was not good.\t0\nI had a pretty satifying experience.\t1\nJoin the club and get awesome offers via email.\t1\nPerfect for someone (me) who only likes beer ice cold, or in this case, even colder.\t1\nBland and flavorless is a good way of describing the barely tepid meat.\t0\nThe chains, which I'm no fan of, beat this place easily.\t0\nThe nachos are a MUST HAVE!\t1\nWe will not be coming back.\t0\nI don't have very many words to say about this place, but it does everything pretty well.\t1\nThe staff is super nice and very quick even with the crazy crowds of the downtown juries, lawyers, and court staff.\t1\nGreat atmosphere, friendly and fast service.\t1\nWhen I received my Pita it was huge it did have a lot of meat in it so thumbs up there.\t1\nOnce your food arrives it's meh.\t0\nPaying $7.85 for a hot dog and fries that looks like it came out of a kid's meal at the Wienerschnitzel is not my idea of a good meal.\t0\nThe classic Maine Lobster Roll was fantastic.\t1\nMy brother in law who works at the mall ate here same day, and guess what he was sick all night too.\t0\nSo good I am going to have to review this place twice - once hereas a tribute to the place and once as a tribute to an event held here last night.\t1\nThe chips and salsa were really good, the salsa was very fresh.\t1\nThis place is great!!!!!!!!!!!!!!\t1\nMediocre food.\t0\nOnce you get inside you'll be impressed with the place.\t1\nI'm super pissd.\t0\nAnd service was super friendly.\t1\nWhy are these sad little vegetables so overcooked?\t0\nThis place was such a nice surprise!\t1\nThey were golden-crispy and delicious.\t1\nI had high hopes for this place since the burgers are cooked over a charcoal grill, but unfortunately the taste fell flat, way flat.\t0\nI could eat their bruschetta all day it is devine.\t1\nNot a single employee came out to see if we were OK or even needed a water refill once they finally served us our food.\t0\nLastly, the mozzarella sticks, they were the best thing we ordered.\t1\nThe first time I ever came here I had an amazing experience, I still tell people how awesome the duck was.\t1\nThe server was very negligent of our needs and made us feel very unwelcome... I would not suggest this place!\t0\nThe service was terrible though.\t0\nThis place is overpriced, not consistent with their boba, and it really is OVERPRICED!\t0\nIt was packed!!\t0\nI love this place.\t1\nI can say that the desserts were yummy.\t1\nThe food was terrible.\t0\nThe seasonal fruit was fresh white peach puree.\t1\nIt kept getting worse and worse so now I'm officially done.\t0\nThis place should honestly be blown up.\t0\nBut I definitely would not eat here again.\t0\nDo not waste your money here!\t0\nI love that they put their food in nice plastic containers as opposed to cramming it in little paper takeout boxes.\t1\nThe crêpe was delicate and thin and moist.\t1\nAwful service.\t0\nWon't ever go here again.\t0\nFood quality has been horrible.\t0\nFor that price I can think of a few place I would have much rather gone.\t0\nThe service here is fair at best.\t0\nI do love sushi, but I found Kabuki to be over-priced, over-hip and under-services.\t0\nDo yourself a favor and stay away from this dish.\t0\nVery poor service.\t0\nNo one at the table thought the food was above average or worth the wait that we had for it.\t0\nBest service and food ever, Maria our server was so good and friendly she made our day.\t1\nThey were excellent.\t1\nI paid the bill but did not tip because I felt the server did a terrible job.\t0\nJust had lunch here and had a great experience.\t1\nI have never had such bland food which surprised me considering the article we read focused so much on their spices and flavor.\t0\nFood is way overpriced and portions are fucking small.\t0\nI recently tried Caballero's and I have been back every week since!\t1\nfor 40 bucks a head, i really expect better food.\t0\nThe food came out at a good pace.\t1\nI ate there twice on my last visit, and especially enjoyed the salmon salad.\t1\nI won't be back.\t0\nWe could not believe how dirty the oysters were!\t0\nThis place deserves no stars.\t0\nI would not recommend this place.\t0\nIn fact I'm going to round up to 4 stars, just because she was so awesome.\t1\nTo my disbelief, each dish qualified as the worst version of these foods I have ever tasted.\t0\nBad day or not, I have a very low tolerance for rude customer service people, it is your job to be nice and polite, wash dishes otherwise!!\t0\nthe potatoes were great and so was the biscuit.\t1\nI probably would not go here again.\t0\nSo flavorful and has just the perfect amount of heat.\t1\nThe price is reasonable and the service is great.\t1\nThe Wife hated her meal (coconut shrimp), and our friends really did not enjoy their meals, either.\t0\nMy fella got the huevos rancheros and they didn't look too appealing.\t0\nWent in for happy hour, great list of wines.\t1\nSome may say this buffet is pricey but I think you get what you pay for and this place you are getting quite a lot!\t1\nI probably won't be coming back here.\t0\nWorst food/service I've had in a while.\t0\nThis place is pretty good, nice little vibe in the restaurant.\t1\nTalk about great customer service of course we will be back.\t1\nHot dishes are not hot, cold dishes are close to room temp.I watched staff prepare food with BARE HANDS, no gloves.Everything is deep fried in oil.\t0\nI love their fries and their beans.\t1\nAlways a pleasure dealing with him.\t1\nThey have a plethora of salads and sandwiches, and everything I've tried gets my seal of approval.\t1\nThis place is awesome if you want something light and healthy during the summer.\t1\nFor sushi on the Strip, this is the place to go.\t1\nThe service was great, even the manager came and helped with our table.\t1\nThe feel of the dining room was more college cooking course than high class dining and the service was slow at best.\t0\nI started this review with two stars, but I'm editing it to give it only one.\t0\nthis is the worst sushi i have ever eat besides Costco's.\t0\nAll in all an excellent restaurant highlighted by great service, a unique menu, and a beautiful setting.\t1\nMy boyfriend and i sat at the bar and had a completely delightful experience.\t1\nWeird vibe from owners.\t0\nThere was hardly any meat.\t0\nI've had better bagels from the grocery store.\t0\nGo To Place for Gyros.\t1\nI love the owner/chef, his one authentic Japanese cool dude!\t1\nNow the burgers aren't as good, the pizza which used to be amazing is doughy and flavorless.\t0\nI found a six inch long piece of wire in my salsa.\t0\nThe service was terrible, food was mediocre.\t0\nWe definately enjoyed ourselves.\t1\nI ordered Albondigas soup - which was just warm - and tasted like tomato soup with frozen meatballs.\t0\nOn three different occasions I asked for well done or medium well, and all three times I got the bloodiest piece of meat on my plate.\t0\nI had about two bites and refused to eat anymore.\t0\nThe service was extremely slow.\t0\nAfter 20 minutes wait, I got a table.\t0\nSeriously killer hot chai latte.\t1\nNo allergy warnings on the menu, and the waitress had absolutely no clue as to which meals did or did not contain peanuts.\t0\nMy boyfriend tried the Mediterranean Chicken Salad and fell in love.\t1\nTheir rotating beers on tap is also a highlight of this place.\t1\nPricing is a bit of a concern at Mellow Mushroom.\t0\nWorst Thai ever.\t0\nIf you stay in Vegas you must get breakfast here at least once.\t1\nI want to first say our server was great and we had perfect service.\t1\nThe pizza selections are good.\t1\nI had strawberry tea, which was good.\t1\nHighly unprofessional and rude to a loyal patron!\t0\nOverall, a great experience.\t1\nSpend your money elsewhere.\t0\nTheir regular toasted bread was equally satisfying with the occasional pats of butter... Mmmm...!\t1\nThe Buffet at Bellagio was far from what I anticipated.\t0\nAnd the drinks are WEAK, people!\t0\n-My order was not correct.\t0\nAlso, I feel like the chips are bought, not made in house.\t0\nAfter the disappointing dinner we went elsewhere for dessert.\t0\nThe chips and sals a here is amazing!!!!!!!!!!!!!!!!!!!\t1\nWe won't be returning.\t0\nThis is my new fav Vegas buffet spot.\t1\nI seriously cannot believe that the owner has so many unexperienced employees that all are running around like chickens with their heads cut off.\t0\nVery, very sad.\t0\ni felt insulted and disrespected, how could you talk and judge another human being like that?\t0\nHow can you call yourself a steakhouse if you can't properly cook a steak, I don't understand!\t0\nI'm not impressed with the concept or the food.\t0\nThe only thing I wasn't too crazy about was their guacamole as I don't like it puréed.\t0\nThere is really nothing for me at postinos, hope your experience is better\t0\nI got food poisoning here at the buffet.\t0\nThey brought a fresh batch of fries and I was thinking yay something warm but no!\t0\nWhat SHOULD have been a hilarious, yummy Christmas Eve dinner to remember was the biggest fail of the entire trip for us.\t0\nNeedless to say, I won't be going back anytime soon.\t0\nThis place is disgusting!\t0\nEvery time I eat here, I see caring teamwork to a professional degree.\t1\nThe RI style calamari was a joke.\t0\nHowever, there was so much garlic in the fondue, it was barely edible.\t0\nI could barely stomach the meal, but didn't complain because it was a business lunch.\t0\nIt was so bad, I had lost the heart to finish it.\t0\nIt also took her forever to bring us the check when we asked for it.\t0\nWe aren't ones to make a scene at restaurants but I just don't get it...definitely lost the love after this one!\t0\nDisappointing experience.\t0\nThe food is about on par with Denny's, which is to say, not good at all.\t0\nIf you want to wait for mediocre food and downright terrible service, then this is the place for you.\t0\nWAAAAAAyyyyyyyyyy over rated is all I am saying.\t0\nWe won't be going back.\t0\nThe place was fairly clean but the food simply wasn't worth it.\t0\nThis place lacked style!!\t0\nThe sangria was about half of a glass wine full and was $12, ridiculous.\t0\nDon't bother coming here.\t0\nThe meat was pretty dry, I had the sliced brisket and pulled pork.\t0\nThe building itself seems pretty neat; the bathroom is pretty trippy, but I wouldn't eat here again.\t0\nIt was equally awful.\t0\nProbably not in a hurry to go back.\t0\nvery slow at seating even with reservation.\t0\nNot good by any stretch of the imagination.\t0\nThe cashew cream sauce was bland and the vegetables were undercooked.\t0\nThe chipolte ranch dipping sause was tasteless, seemed thin and watered down with no heat.\t0\nIt was a bit too sweet, not really spicy enough, and lacked flavor.\t0\nI was VERY disappointed!!\t0\nThis place is horrible and way overpriced.\t0\nMaybe it's just their Vegetarian fare, but I've been twice and I thought it was average at best.\t0\nIt wasn't busy at all and now we know why.\t0\nThe tables outside are also dirty a lot of the time and the workers are not always friendly and helpful with the menu.\t0\nThe ambiance here did not feel like a buffet setting, but more of a douchey indoor garden for tea and biscuits.\t0\nCon: spotty service.\t0\nThe fries were not hot, and neither was my burger.\t0\nBut then they came back cold.\t0\nThen our food came out, disappointment ensued.\t0\nThe real disappointment was our waiter.\t0\nMy husband said she was very rude... did not even apologize for the bad food or anything.\t0\nThe only reason to eat here would be to fill up before a night of binge drinking just to get some carbs in your stomach.\t0\nInsults, profound deuchebaggery, and had to go outside for a smoke break while serving just to solidify it.\t0\nIf someone orders two tacos don't' you think it may be part of customer service to ask if it is combo or ala cart?\t0\nShe was quite disappointed although some blame needs to be placed at her door.\t0\nAfter all the rave reviews I couldn't wait to eat here......what a disappointment!\t0\nDel Taco is pretty nasty and should be avoided if possible.\t0\nIt's NOT hard to make a decent hamburger.\t0\nBut I don't like it.\t0\nHell no will I go back\t0\nWe've have gotten a much better service from the pizza place next door than the services we received from this restaurant.\t0\nI don't know what the big deal is about this place, but I won't be back \"ya'all\".\t0\nI immediately said I wanted to talk to the manager but I did not want to talk to the guy who was doing shots of fireball behind the bar.\t0\nThe ambiance isn't much better.\t0\nUnfortunately, it only set us up for disapppointment with our entrees.\t0\nThe food wasn't good.\t0\nYour servers suck, wait, correction, our server Heimer sucked.\t0\nWhat happened next was pretty....off putting.\t0\ntoo bad cause I know it's family owned, I really wanted to like this place.\t0\nOverpriced for what you are getting.\t0\nI vomited in the bathroom mid lunch.\t0\nI kept looking at the time and it had soon become 35 minutes, yet still no food.\t0\nI have been to very few places to eat that under no circumstances would I ever return to, and this tops the list.\t0\nWe started with the tuna sashimi which was brownish in color and obviously wasn't fresh.\t0\nFood was below average.\t0\nIt sure does beat the nachos at the movies but I would expect a little bit more coming from a restaurant.\t0\nAll in all, Ha Long Bay was a bit of a flop.\t0\nThe problem I have is that they charge $11.99 for a sandwich that is no bigger than a Subway sub (which offers better and more amount of vegetables).\t0\nShrimp- When I unwrapped it (I live only 1/2 a mile from Brushfire) it was literally ice cold.\t0\nIt lacked flavor, seemed undercooked, and dry.\t0\nIt really is impressive that the place hasn't closed down.\t0\nI would avoid this place if you are staying in the Mirage.\t0\nThe refried beans that came with my meal were dried out and crusty and the food was bland.\t0\nSpend your money and time some place else.\t0\nA lady at the table next to us found a live green caterpillar In her salad.\t0\nthe presentation of the food was awful.\t0\nI can't tell you how disappointed I was.\t0\nI think food should have flavor and texture and both were lacking.\t0\nAppetite instantly gone.\t0\nOverall I was not impressed and would not go back.\t0\nThe whole experience was underwhelming, and I think we'll just go to Ninja Sushi next time.\t0\nThen, as if I hadn't wasted enough of my life there, they poured salt in the wound by drawing out the time it took to bring the check.\t0\n"
  },
  {
    "path": "workbooks/README.md",
    "content": "About Workbooks\n============\n\nThese workbooks explain how the app works and help you to write workbooks from scratch."
  },
  {
    "path": "workbooks/getting-started/meta.json",
    "content": "{\n  \"order\":{\n    \"welcome.workbook\":\"Welcome to Workbooks\"\n  }\n}\n"
  },
  {
    "path": "workbooks/getting-started/welcome.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Console\npackages: []\n---\n\nTODO\n\n* Replace “using statement” with using directive somewhere here\n\n*\n\n# Welcome to Workbooks\n\nWorkbooks are live documents that mix text, code and results in the same document.\n\nThis document will teach you how to effectively use Workbooks to explore, experiment and live code workbooks that you can share or reuse.\n\nFor example, the following cell declares a variable name, assigns the value “Miguel” and then prints the result.  To watch it in action, position your cursor at the end of the line below and press the return key.\n\n```csharp\nvar name = \"Miguel\";\n```\n\nThe above should display the result in quotes in the next line as “Miguel” which is the result for the operation, along with a small selector that lets you change the format in which the result will be displayed.\n\nThe return key is special, it will try to do the right thing depending on the context. For example, if you positioned your cursor in the middle of the line, Workbooks would insert a new-line instead of executing the statement and split your text in two.\n\nTo execute the code regardless of where your cursor is, you can either press the small play button icon that shows up, or you can press Command-Return on Mac, or Alt-Return on Windows.   You will be using this from now on.\n\nYou might want to force the insertion of a newline without Workbooks executing the code right away, perhaps you are in the middle of a more complicated statement.   To force the insertion of a new-line, use Shift-Return.   Try it on the cell below, insert a new-line between the `=` and the expression following it, and then force an evaluation.\n\n```csharp\nvar area\n= 10 * 20\n```\n\nFinally, if you feel so inclined, you could run the entire contents of the workbook in one go, by pressing the play icon at the top of this window.\n\nIn C# you can concatenate strings by using the “\\+” operator on strings, the following snippet assigns to the variable “greeting” the result of concatenating “Hello ” and the name defined above.   Position yourself on the cell below and execute it:\n\n```csharp\nvar greeting = \"Hello \" + name\n```\n\nThe result should be “Hello Miguel”.  Now, chances are, your name is not Miguel, so the greeting above is far from appropriate.   Go back to the cell containing that assigned the value “Miguel” to name, change the value to your name, and execute the cell and come back.\n\nWelcome back.   You will notice that not only did the result in the original cell change to your name, but the greeting above was also updated.\n\nWorkbooks will always re-execute all the code between the changes that you make to a cell and the last cell you used and update all the displayed results.   This will come in very handy as you prototype code with Workbooks.\n\nNext to the greeting there is a small bubble showing “C#”, this means that the result of the expression is being displayed as a C# expression.   Results can be displayed in various formats and Workbooks will try to pick the best one for you.   Sometimes you may want to display the information in another format, to do that, click on the bubble and select one of the available formats.    For strings, I happen to know that the possible values are C#, Plain Text and the very cool Object Members.\n\nTry them out above.\n\nObject Members will display the properties for the result, in the case of a string, one interesting property is the Length.  And you can further customize the format in one of the many available forms.\n\nLet us do a couple more exercises:\n\nRun the following cell which will split the provided string at each space:\n\n```csharp\nvar quote = \"Once upon a time, there was a compiler that optimized dreams (or something like that)\";\nquote.Split (' ')\n```\n\nIn this case, Workbooks will display the result of the array as individual elements.   Workbooks will limit the display to the first ten entries, if you want to see more, just click “Continue enumerating” on the result above, that should display the last word shown.\n\nThe above split is acceptable, but clearly we do not want the word “time” to have a comma at the end (see the result at index 3).   Let us put together a list of all the values that we want to remove:\n\n```csharp\nvar removeLetters = new char [] { ' ', '(', ')', ','};\nquote.Split (removeLetters)\n```\n\nWhile this works, the library is indicating that it found two of these removed characters next to each other by returning an empty element at index 4.\n\nWorkbooks is powered by a powerful C# text editor that can provide code completion and parameter completion.   Go back to the `Split` method, and after the word “removeLetter”, insert a comma, this will trigger a popup to show up with the possible method overloads that you can use with the `Split` method.   Use the up/down arrow keys in your keyboard to scroll through the available overloads, you will notice one that takes a `StringSplitOptions.`  Start typing “StringSplitOptions” and you will notice that the completion shrinks to the possible options, once the options are narrowed down, you can press return to complete the word, then press “.” and this will trigger the completion window again.   Use the cursor key to select the word “RemoveEmptyEntries” and press return.\n\nOne convenient feature is that you do not have to type the word “StringSplitOptions”, you can type “SplitOptions” and the completion window will select the matching version.   Or even better, you can just type some of the upper case letters in the match, for instance “sso” (StringSplitOptions) works, and even “ssp” (StringSPlit).\n\n# Writing Code\n\nSo far we have shown trivial C# statements being executed.   Workbooks also allows the definitions of functions, properties and other class members directly into the code, for example:\n\n```csharp\nint Sum (params int [] numbers)\n{\n    int total = 0;\n    foreach (var value in numbers)\n        total = total + value;\n    return total;\n}\n```\n\nAnd you can invoke it either directly there, or you can invoke it from a new cell:\n\n```csharp\nSum (1, 2, 3)\n```\n\n**Excercise**: what is the result of calling `Sum` on `Int32.MaxValue` plus one?\n\n**Excercise**: modify the Sum function above to use the double data type to add numbers instead of integers to avoid overflow values.\n\n**Excercise:** Add a using statement to use the `System.ComponentModel` namespace.\n\n**Exercise:** modify the Sum function above to take an array of objects and use the `System.ComponentModel.TypeConverter.ConvertTo` method to convert the object into a specific type.\n\nYou are not limited to creating members, you can also create full classes, for example, the following code represents a product listing:\n\n```csharp\nclass Flight {\n    public string Origin, Destination;\n    public TimeSpan FlightDuration;\n}\nvar flights = new Flight [] {\n    new Flight () {\n        Origin=\"Boston\",\n        Destination=\"Seattle\",\n        FlightDuration = TimeSpan.FromMinutes (354)\n        },\n    new Flight () {\n        Origin=\"Seattle\",\n        Destination=\"Tokyo\",\n        FlightDuration = TimeSpan.FromMinutes (800)\n    },\n    new Flight () {\n        Origin=\"Boston\",\n        Destination=\"New York\",\n        FlightDuration = TimeSpan.FromMinutes (38)\n    }\n};\n```\n\nIn the cell above, we both defined a class `Flight`, but we also created a local variable `flights`that contains a few flights.\n\nWe can find the flight with the shortes travel time using a C# LINQ expression:\n\n```csharp\n(from f in flights orderby f.FlightDuration select f).FirstOrDefault ()\n```\n\nIn addition to all the C# code that you love, we have provided a convenient “help” property that you can run, when you run it, it will show you specific workbook properties and methods that you can access.   Try evaluating the next cell:\n\n```csharp\nhelp\n```\n\nOne convenient method is the Time method which can be used for simple benchmarks:\n\n```csharp\nusing System.Net;\n\nTime (()=> new WebClient ().DownloadString (\"http://www.google.com\"));\n```\n\nThe help will be different based on the Workbook style that you use, but more on that in the “Workbook Styles” section.\n\n# Consuming Libraries\n\nWhen you start workbooks, a number of namespaces and libraries have already been included for your convenience.   Previously you referenced the `WebClient` from the `System.Net` namespace by using the “using” directive.\n\nThat works as long as the library that you need is already referenced, but if you need to use functionality from a library that is not referenced, you will need to do that using the “#r” instruction.\n\nPreviously in this workbook, we changed our Sum method from integers to doubles, that was an acceptable workaround.   With .NET you can use BigInteger, from the System.Numerics library, to use it, just reference that Library like this:\n\n```csharp\n#r \"System.Numerics\"\nusing System.Numerics;\n```\n\nThis is one way of writing the Sum method with the arbitrary precision `BigInteger`:\n\n```csharp\nBigInteger BigSum (params object [] numbers)\n{\n    BigInteger total = new BigInteger ();\n    foreach (var value in numbers){\n        if (value is BigInteger)\n            total = total + (BigInteger)value;\n        else if (value is int)\n            total = total + (int)value;\n    }\n    return total;\n}\n\n// Show the differences in adding 1 to the maximum value that can be represented by a 32-bit integer:\nConsole.WriteLine ($\"Adding with Sum={Sum (Int32.MaxValue, 1)}\");\nConsole.WriteLine ($\"Adding with Big={BigSum (Int32.MaxValue, 1)}\");\n```\n\nIn addition to system libraries like `System.Numerics`, there is a universe of third party libraries available for .NET called NuGet (pronounced “new-get”) Packages.   For example, a very popular library is the Newtonsoft.Json library.   To use this library in your project, you will want to use “File/Add NuGet Package” which will contact the NuGet server and obtain a list of packages that are available for you to use.\n\nGo ahead and bring the Newtonsoft.Json library, and once you do that, remove the comments around the code in the next cell and run it.   The result will be our list of flights serialized into Json.\n\n```csharp\n/*\n#r \"Newtonsoft.Json\"\nusing Newtonsoft.Json;\n\nJsonConvert.SerializeObject(flights);\n*/\n```\n\n# Workbook Styles\n\nYou are currently reading a Console workbook. This is a universal workbook that will execute code that is suitable to run on all platforms, from mobile applications to server applications.\n\nAdditionally, you can explore, prototype and play not only with this universally portable Workbooks, but also with Workbooks that run on a specific environment. There are Workbooks available for exploring and developing Android applications, iOS applications, Mac applications and Windows applications.\n\nEach Workbook style has special knowledge about the target platform. For example, the iOS workbooks know how to launch the iOS Simulator on demand, and can be used to inspect the hierarchy of the visual elements in Apple’s UIKit and CoreAnimation layers.\n\n# Creating your own Workbooks\n\nYou can try to do that now, select “File/New” from Worksbooks now, and you will be presented with a dialogs box that allows you to choose the kind of Workbook you want to create.\n\nYou can do that now, create a new workbook, and keep this one around.\n\nSo far you have been reading a live workbook that contains both an explanation and code mixed together.   In your new workbook, you will see that there is only an execution cell.   You can use workbooks purely as a playground to try out C# code without having to create a project and compile it.\n\nTry typing an expression after another.  For example type, “1\\+1” followed by return.   The result will be displayed immediately and a new cell will be created.   You can type a new expression right away “2\\+3” press return and get the result.\n\nOver time, your workbook will contain a full log of all your experimentation and its results.\n\nYou can annotate your workbook by moving your mouse just above any code cell.   You will see three icons show up on the right side, these are:\n\n* Plus sign: this is used to insert a code cell just before the current cell, where you can inject some new code to run before your current cell.\n\n* Quote icon: this will create a text block, this is what you will use to edit text just like the one that you are reading now.\n\n* Cross sign: use this icon to delete the code cell below.\n\nWhen you create a text block, you will get a basic text editor.   You might not have had a chance to try this, but the text that you are reading can also be edited.\n\n**Exercise:** Position your cursor after this sentence and type a new sentence.\n\nExercise: oops, I forgot to make the bold the Exercise word at the beginning of this line.   Select the word “Exercise” and make the text bold (pro-tip: in addition to the UI, you can use a hotkey, see “Format/Strong”).\n\nExplore the “Format” menu to see the kind of formatting changes that you can apply to the text in this sentence.\n\n# Behind Workbooks\n\nWe wanted to make it easy to work with Workbooks.   Workbooks are just [Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code \"GitHub flavored Markdown\") files that contain a small header that describe the needs of the Workbook.   The header contains the default agent to use at startup (Console, Android, iOS, Windows, etc) as well as a list of NuGet packages that might be needed to run the workbook.\n\nIf you were to save this Workbook, you would see that any packages that you added with “File/Add NuGet Package” would be listed in this header.\n\nIt is thus very easy to edit Workbook contents even when you do not have the Workbook environment around.\n\n# Community\n\nYou might want to join our community of Workbook users and Workbook creators, check the Help/Community Forums link from the menu.\n"
  },
  {
    "path": "workbooks/meta.json",
    "content": "{\n  \"order\":{\n    \"getting-started\":\"Getting Started\",\n    \"visualizers\":\"Visualizers\"\n  }\n}\n"
  },
  {
    "path": "workbooks/visualizers/README.md",
    "content": "Visualizers\n=========\n\n[Xamarin Workbooks](https://developer.xamarin.com/guides/cross-platform/workbooks/) results visualization examples.\n\n![](Screenshots/ios-mac.png)\n\nThese workbooks (one for each platform) demonstrate\n\n* String\n* Object\n* Color (UIColor)\n* Enumerable\n* Map (CLLocation)\n* Image (UIImage)\n* Exception\n* Html\n* Help\n\nvisualizations of object results."
  },
  {
    "path": "workbooks/visualizers/Visualizers-console.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- Console\n---\n\n# Visualizers (Console)\n\nXamarin Workbooks uses a different visualizers for inline code evaluation results:\n\n* String\n\n* Object\n\n* Enumerable\n\n* Exception\n\n* Html\n\n* Help\n\nBy default, the results of a code-block will shown as a string representation of the *last-referenced object* in the block. The `Monkey` class below demonstrates this: when the `rupert` object is assigned, the **ToString** representation is printed after the code-block.\n\n```csharp\nclass Monkey {\n\tpublic string Name;\n\tpublic string Species;\n\tpublic string Habitat;\n\tpublic DateTime Birthday = DateTime.MinValue;\n\tpublic override string ToString(){\n\t\treturn $\"{Name} the {Species} ({Habitat})\"; //C# 6\n\t}\n}\nvar rupert = new Monkey {Name=\"Rupert\", Species = \"Xamarin\", Habitat=\"San Francisco\"};\n```\n\nUse the popup menu to the right of the result to switch to the **Object Members** view. Most code-block results in Workbooks will have both **ToString** and **Object Members** display options.\n\nDateTime values have a number of display options, including a calendar view:\n\n```csharp\nrupert.Birthday = new DateTime(2011,05,11);\n```\n\nEnumerable collections will be expanded so that you can explore their contents. You can also change the view of each individual object in the collection:\n\n```csharp\nvar enumerable = new List<string> {\"alpha\", \"beta\", \"gamma\", \"delta\"};\n```\n\nExceptions have a custom display:\n\n```csharp\nnew ArgumentNullException (\"name\");\n```\n\nHTML can also be emitted from code-blocks and rendered in the Workbook. This simple example uses string interpolation to customize an HTML string for display using `AsHtml()`:\n\n```csharp\nvar greeting = \"Hello, Workbooks\";  // C# 6 string interpolation\n$\"<html><h2>{greeting}</h2><b>bold</b> <i>italic</i> <u>underline</u></html>\".AsHtml()\n```\n\nThere’s also a `help` command, which just lists some handy tips. The help list is slightly different for each platform supported by Workbooks.\n\n```csharp\nhelp\n```\n\nAnd finally, not really a visualization, but from the help above you can see that it’s possible to affect the culture of the Workbook. These code-blocks show the date rendered in English and then Spanish (after setting the `CurrentCulture`):\n\n```csharp\nDateTime.Now.ToLongDateString()\n```\n\n```csharp\nCurrentCulture = new System.Globalization.CultureInfo(\"es\");\nDateTime.Now.ToLongDateString()\n```\n\n```csharp\n// reset to English\nCurrentCulture = new System.Globalization.CultureInfo(\"en\");\n```"
  },
  {
    "path": "workbooks/visualizers/Visualizers-ios.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\n---\n\n# Visualizers for iOS\n\nXamarin Workbooks uses a different visualizers for inline code evaluation results:\n\n* String\n\n* Object\n\n* Color (`UIColor`)\n\n* Enumerable\n\n* Map (`CLLocation`)\n\n* Image (`UIImage`)\n\n* Argument\n\n* Html\n\n* Help\n\nBy default, the results of a code-block will shown as a string representation of the *last-referenced object* in the block. The `Monkey` class below demonstrates this: when the `rupert` object is assigned, the **ToString** representation is printed after the code-block.\n\n```csharp\nclass Monkey { \n\tpublic string Name;\n\tpublic string Species; \n\tpublic string Habitat; \n\tpublic CoreLocation.CLLocation Location = null;\n\tpublic UIColor Color = null;\n\tpublic DateTime Birthday = DateTime.MinValue;\n\tpublic override string ToString(){\n\t\treturn $\"{Name} the {Species} ({Habitat})\"; //C# 6\n\t}\n}\nvar rupert = new Monkey {Name=\"Rupert\", Species = \"Xamarin\", Habitat=\"San Francisco\"};\n```\n\nUse the popup menu to the right of the result to switch to the **Object Members** view. Most code-block results in Workbooks will have both \\*\\*ToString \\*\\*and **Object Members** display options.\n\nColor types are rendered with an example of the color:\n\n```csharp\nrupert.Color = UIColor.Brown;\n```\n\nDateTime values have a number of display options, including a calendar view:\n\n```csharp\nrupert.Birthday = new DateTime(2011,05,11);\n```\n\nEnumerable collections will be expanded so that you can explore their contents. You can also change the view of each individual object in the collection:\n\n```csharp\nvar enumerable = new List<string> {\"alpha\", \"beta\", \"gamma\", \"delta\"};\n```\n\nLocation objects can be viewed on a map:\n\n```csharp\nrupert.Location = new CoreLocation.CLLocation(37.7749,-122.4194);\n```\n\nImage data can be downloaded or opened from the local filesystem, then previewed inline with the **Image** view:\n\n```csharp\nvar localPath = \"/Users/craigdunn/ProjectsConceptdev/xamarin-workbook-samples/Visualizers/\";\nUIImage.FromFile(localPath+\"bridge.jpg\");\n```\n\nExceptions have a custom display:\n\n```csharp\nnew ArgumentNullException (\"name\");\n```\n\nHTML can also be emitted from code-blocks and rendered in the Workbook. This simple example uses string interpolation to customize an HTML string for display using `AsHtml()`:\n\n```csharp\nvar greeting = \"Hello, Workbooks\";  // C# 6 string interpolation\n$\"<html><h2>{greeting}</h2><b>bold</b> <i>italic</i> <u>underline</u></html>\".AsHtml()\n```\n\nThere’s also a `help` command, which just lists some handy tips. The help list is slightly different for each platform supported by Workbooks.\n\n```csharp\nhelp\n```\n\nAnd finally, not really a visualization, but from the help above you can see that it’s possible to affect the culture of the Workbook. These code-blocks show the date rendered in English and then Spanish (after setting the `CurrentCulture`):\n\n```csharp\nDateTime.Now.ToLongDateString()\n```\n\n```csharp\nCurrentCulture = new System.Globalization.CultureInfo(\"es\");\nDateTime.Now.ToLongDateString()\n```\n\n```csharp\n// reset to English\nCurrentCulture = new System.Globalization.CultureInfo(\"en\");\n```"
  },
  {
    "path": "workbooks/visualizers/Visualizers-mac.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: MacNet45\npackages: []\n---\n\n# Visualizers for Mac\n\nXamarin Workbooks uses a different visualizers for inline code evaluation results:\n\n* String\n\n* Object\n\n* Color (`NSColor`)\n\n* Enumerable\n\n* Map (`CLLocation`)\n\n* Image (`NSImage`)\n\n* Exception\n\n* Html\n\n* Help\n\nBy default, the results of a code-block will shown as a string representation of the *last-referenced object* in the block. The `Monkey` class below demonstrates this: when the `rupert` object is assigned, the **ToString** representation is printed after the code-block.\n\n```csharp\nclass Monkey {\n\tpublic string Name;\n\tpublic string Species;\n\tpublic string Habitat;\n\tpublic CoreLocation.CLLocation Location = null;\n\tpublic NSColor Color = null;\n\tpublic DateTime Birthday = DateTime.MinValue;\n\tpublic override string ToString(){\n\t\treturn $\"{Name} the {Species} ({Habitat})\"; //C# 6\n\t}\n}\nvar rupert = new Monkey {Name=\"Rupert\", Species = \"Xamarin\", Habitat=\"San Francisco\"};\n```\n\nUse the popup menu to the right of the result to switch to the **Object Members** view. Most code-block results in Workbooks will have both **ToString** and **Object Members** display options.\n\nColor types are rendered with an example of the color:\n\n```csharp\nrupert.Color = NSColor.Brown;\n```\n\nDateTime values have a number of display options, including a calendar view:\n\n```csharp\nrupert.Birthday = new DateTime(2011,05,11);\n```\n\nEnumerable collections will be expanded so that you can explore their contents. You can also change the view of each individual object in the collection:\n\n```csharp\nvar enumerable = new List<string> {\"alpha\", \"beta\", \"gamma\", \"delta\"};\n```\n\nLocation objects can be viewed on a map:\n\n```csharp\nrupert.Location = new CoreLocation.CLLocation(37.7749,-122.4194);\n```\n\nImage data can be downloaded or opened from the local filesystem, then previewed inline with the **Image** view:\n\n```csharp\nvar localPath = \"/Users/craigdunn/ProjectsConceptdev/xamarin-workbook-samples/Visualizers/\";\nnew NSImage(localPath+\"bridge.jpg\");\n```\n\nExceptions have a custom display:\n\n```csharp\nnew ArgumentNullException (\"name\");\n```\n\nHTML can also be emitted from code-blocks and rendered in the Workbook. This simple example uses string interpolation to customize an HTML string for display using `AsHtml()`:\n\n```csharp\nvar greeting = \"Hello, Workbooks\";  // C# 6 string interpolation\n$\"<html><h2>{greeting}</h2><b>bold</b> <i>italic</i> <u>underline</u></html>\".AsHtml()\n```\n\nThere’s also a `help` command, which just lists some handy tips. The help list is slightly different for each platform supported by Workbooks.\n\n```csharp\nhelp\n```\n\nAnd finally, not really a visualization, but from the help above you can see that it’s possible to affect the culture of the Workbook. These code-blocks show the date rendered in English and then Spanish (after setting the `CurrentCulture`):\n\n```csharp\nDateTime.Now.ToLongDateString()\n```\n\n```csharp\nCurrentCulture = new System.Globalization.CultureInfo(\"es\");\nDateTime.Now.ToLongDateString()\n```\n\n```csharp\n// reset to English\nCurrentCulture = new System.Globalization.CultureInfo(\"en\");\n```"
  },
  {
    "path": "workbooks/visualizers/Visualizers-wpf.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: WPF\npackages: []\n---\n\n# Visualizers for WPF\n\nXamarin Workbooks uses a different visualizers for inline code evaluation results:\n\n* String\n\n* Object\n\n* Color (`Color`)\n\n* Enumerable\n\n* Image (`Bitmap`)\n\n* Exception\n\n* Html\n\n* Help\n\nBy default, the results of a code-block will shown as a string representation of the *last-referenced object* in the block. The `Monkey` class below demonstrates this: when the `rupert` object is assigned, the **ToString** representation is printed after the code-block.\n\n```csharp\nclass Monkey {\n\tpublic string Name;\n\tpublic string Species;\n\tpublic string Habitat;\n\tpublic System.Drawing.Color Color = System.Drawing.Color.White;\n\tpublic DateTime Birthday = DateTime.MinValue;\n\tpublic override string ToString(){\n\t\treturn $\"{Name} the {Species} ({Habitat})\"; //C# 6\n\t}\n}\nvar rupert = new Monkey {Name=\"Rupert\", Species = \"Xamarin\", Habitat=\"San Francisco\"};\n```\n\nUse the popup menu to the right of the result to switch to the **Object Members** view. Most code-block results in Workbooks will have both \\*\\*ToString\\*\\* and **Object Members** display options.\n\nColor types are rendered with an example of the color:\n\n```csharp\nrupert.Color = System.Drawing.Color.Brown;\n```\n\nDateTime values have a number of display options, including a calendar view:\n\n```csharp\nrupert.Birthday = new DateTime(2011,05,11);\n```\n\nEnumerable collections will be expanded so that you can explore their contents. You can also change the view of each individual object in the collection:\n\n```csharp\nvar enumerable = new List<string> {\"alpha\", \"beta\", \"gamma\", \"delta\"};\n```\n\nImage data can be downloaded or opened from the local filesystem, then previewed inline with the **Image** view:\n\n```csharp\nvar localPath = @\"C:\\ProjectsConceptdev\\xamarin-workbook-samples\\Visualizers\\\";\nnew System.Drawing.Bitmap(localPath+\"bridge.jpg\");\n```\n\nExceptions have a custom display:\n\n```csharp\nnew ArgumentNullException (\"name\");\n```\n\nHTML can also be emitted from code-blocks and rendered in the Workbook. This simple example uses string interpolation to customize an HTML string for display using `AsHtml()`:\n\n```csharp\nvar greeting = \"Hello, Workbooks\";  // C# 6 string interpolation\n$\"<html><h2>{greeting}</h2><b>bold</b> <i>italic</i> <u>underline</u></html>\".AsHtml()\n```\n\nThere’s also a `help` command, which just lists some handy tips. The help list is slightly different for each platform supported by Workbooks.\n\n```csharp\nhelp\n```\n\nAnd finally, not really a visualization, but from the help above you can see that it’s possible to affect the culture of the Workbook. These code-blocks show the date rendered in English and then Spanish (after setting the `CurrentCulture`):\n\n```csharp\nDateTime.Now.ToLongDateString()\n```\n\n```csharp\nCurrentCulture = new System.Globalization.CultureInfo(\"es\");\nDateTime.Now.ToLongDateString()\n```\n\n```csharp\n// reset to English\nCurrentCulture = new System.Globalization.CultureInfo(\"en\");\n```"
  },
  {
    "path": "workbooks/visualizers/meta.json",
    "content": "{\n  \"order\":{\n    \"Visualizers-console.workbook\":\"Visualizers for Console\",\n    \"Visualizers-ios.workbook\":\"Visualizers for iOS\",\n    \"Visualizers-mac.workbook\":\"Visualizers for Mac\",\n    \"Visualizers-wpf.workbook\":\"Visualizers for WPF\",\n  }\n}\n"
  },
  {
    "path": "wpf/README.md",
    "content": "WPF Workbooks\n============\n\n* Getting Started\n* User Interface\n* Advanced\n\n"
  },
  {
    "path": "wpf/getting-started/HelloWPF.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: WPF\npackages: []\n---\n\n# Hello, WPF\n\nThe Windows Presentation Foundation (WPF) is a powerful programming framework for creating traditional Windows desktop applications. WPF is ideal for industrial-strength Windows apps, and it has been very influential in the design of the Universal Windows Platform (UWP) and Xamarin.Forms.\n\nIn this Workbook you’ll learn how to create a standard WPF `Window`and display a short text string using `TextBlock`.\n\nThe first step is specifying several `using` directives for the some of the namespaces common in WPF programming:\n\n```csharp\nusing System;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\n```\n\nYou can then create a `Window` object and set the `Title` property. Calling the `Show` method of the `Window` object causes the window to appear on the desktop:\n\n```csharp\nWindow win = new Window();\nwin.Title = \"My First WPF App\";\nwin.Show();\n```\n\nYou can now create a `TextBlock` object. In WPF, you use `TextBlock` to display short text strings as well as entire paragraphs:\n\n```csharp\nTextBlock txtblk = new TextBlock();\ntxtblk.Text = \"Hello, WPF!\";\n```\n\nHowever, the text does not appear in the window until you set the `TextBlock` object to the `Content` property of the `Window`:\n\n```csharp\nwin.Content = txtblk;\n```\n\nThe text appears in the upper-left corner of the window. You can make the text larger by setting the `FontSize` property:\n\n```csharp\ntxtblk.FontSize = 100;\n```\n\nYou can choose a different font by setting the `FontFamily` property to an object of type `FontFamily`:\n\n```csharp\ntxtblk.FontFamily = new FontFamily(\"Gabriola\");\n```\n\nTry different font families such as “Times New Roman” or “Courier New” or “Comic Sans MS”. If the font family doesn’t exist on your installation of Windows, the default font is used instead.\n\nUntil now, the text has appeared in the upper-left corner of the window. You can change that location using the `HorizontalAlignment` and `VerticalAlignment` properties that `TextBlock` inherits from the `FrameworkElement` class. You set these properties to members of the `HorizontalAlignment` and `VerticalAlignment` enumerations:\n\n```csharp\ntxtblk.HorizontalAlignment = HorizontalAlignment.Center;\ntxtblk.VerticalAlignment = VerticalAlignment.Center;\n```\n\nYou can set these properties to different enumeration values to position the text in any one of nine locations relative to the window. Try the `Left` and `Right` members of `HorizontalAlignment`, and the `Top` and `Bottom` members of `VerticalAlignment`.\n\nThe `HorizontalAlignment` and `VerticalAlignment` properties play a crucial role in WPF layout. Interestingly, the default values of these two properties are `HorizontalAlignment.Stretch` and `VerticalAlignment.Stretch`, which cause the `TextBlock` to fill its container (the `Window`), but the text itself is positioned at the upper-left corner.\n\nYou can also set the color of the text. Visual elements in WPF are often colored with various `Brush` objects that you can use to specify gradients or bitmap images. The simplest type of `Brush` is the `SolidColorBrush`, that you use with a `Color` value.\n\nYou can create a `Color` value using various static methods of the `Color` structure, or you can specify one of the 141 static properties of the `Colors` class:\n\n```csharp\ntxtblk.Foreground = new SolidColorBrush(Colors.Blue);\n```\n\nOr, even more simply, you can specify one of the 141 static properties of the `Brushes` class:\n\n```csharp\ntxtblk.Background = Brushes.Yellow;\n```\n\nYou’ll see that the background color appears in the space above and below the text. This background is sufficient to encompass text diacritical marks and descenders. It is interesting to go back and set the `HorizontalAlignment` or `VerticalAlignment` property (or both) to the default `Stretch` enumeration value to see the background color fill the window. This confirms that the `TextBlock` really is stretched to fill the interior of the window.\n\nYou can also set the background of the `Window` object:\n\n```csharp\nwin.Background = Brushes.Yellow;\n```\n\nSetting the background color of the `Window` is much more common than setting the background color of the `TextBlock`."
  },
  {
    "path": "wpf/getting-started/hello-wpf-workbook.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: WPF\n---\n\n# WPF\n\n\n```csharp\nvar label = new System.Windows.Controls.Label {\n  Content = \"Hello, Workbooks\",\n  FontSize = 36\n};\nSystem.Windows.Application.Current.MainWindow.Content = label;\n```\n"
  },
  {
    "path": "wpf/getting-started/meta.json",
    "content": "{\n  \"order\":{\n    \"hello-wpf-workbook.workbook\":\"Hello, WPF\",\n    \"HelloWPF.workbook\":\"Hello, WPF1\"\n  }\n}\n"
  },
  {
    "path": "wpf/meta.json",
    "content": "{\n  \"order\":{\n    \"getting-started\":\"Getting Started\",\n    \"user-interface\":\"User Interface\"\n  }\n}\n"
  },
  {
    "path": "wpf/user-interface/graphics/PenroseTriangle.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: WPF\npackages: []\n---\n\n# Drawing a Penrose Triangle\n\n## An Introduction to WPF Shapes\n\nThe Shapes library is the primary means of rendering 2D vector graphics in WPF. Shapes is a retained-mode graphics system. A WPF program doesn’t issue drawing commands — as might be the case in a conventional graphics drawing system — but instead creates objects of various graphical types, such as lines and polygons. The objects take responsibility for drawing themselves. The program can then alter or animate these objects by changing their properties.\n\nThe Shapes library consists of one base class named `Shape` and six derived classes named `Line`, `Polyline`, `Polygon`, `Path`, `Rectangle`, and `Ellipse`, all in the `System.Windows.Shapes` namespace. The `Shape` class derives from `FrameworkElement`, so WPF treats the classes that derive from `Shape` much like `TextBlock`, `Button`, and `Slider`. Each of the instances of these classes has a size in layout that is based on the coordinates used to describe the figure.\n\nThis workbook focuses on `Polygon`, which you can use for drawing figures consisting of connected straight lines. You define these lines with a series of `Point` values in a collection property named `Points`. You can stroke these lines with a particular brush, and you can fill enclosed areas with another brush. This workbook shows how you can assemble three `Polygon` objects for drawing an impossible figure known as a Penrose Triangle, which looks like this:\n\n![](PenroseTriangle.png \"Penrose Triangle\")\n\nThe two classes `Polygon` and `Polyline` are very similar. The only difference is that `Polygon` automatically adds a final line to the figure that connects the last point in the `Points` collection to the first point; `Polyline` does not.\n\nGenerally you’ll need several `using` directives to begin working with the Shapes library:\n\n```csharp\nusing System;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media;\nusing System.Windows.Shapes;\n```\n\nAs usual, you can begin by creating a `Window` with a title in its titlebar:\n\n```csharp\nWindow win = new Window();\nwin.Title = \"Penrose Triangle\";\nwin.Show();\n```\n\nYou can put instances of the Shapes classes in any type of WPF layout object, but generally you’ll use `Canvas` or a single-cell `Grid`. The `Grid` has the advantage of being able to size itself based on the composite size of the various `Shape` objects that it contains. The following code creates a `Grid` and sets it as the content of the `Window`:\n\n```csharp\nGrid grid = new Grid();\nwin.Content = grid;\n```\n\nNow you can create a `Polygon` object and add it to the `Children` collection of the `Grid`:\n\n```csharp\nPolygon polygon1 = new Polygon();\ngrid.Children.Add(polygon1);\n```\n\nYou won’t see anything yet because there are no points in the `Point` collection. You need two points to draw a single line:\n\n```csharp\npolygon1.Points.Add(new Point(40, 168));\npolygon1.Points.Add(new Point(192, 168));\n```\n\nThese two `Point` values define a line from the point (40, 168) to the point (192, 168). All points are in the form (*x*, *y*) and are relative to the upper-left corner of the `Polygon` parent, which is the `Grid` that fills the whole window. Increasing values of *x* go to the right, and increasing values of *y* go down.\n\nBut you *still* won’t see anything! The line exists but the default brush used to stroke the line is `null`. You need to set the `Stroke` property of `Polygon` to a `Brush` object. The easiest approach is to use one of the static read-only properties of the `Brushes` class. These properties return `SolidColorBrush` objects:\n\n```csharp\npolygon1.Stroke = Brushes.Black;\n```\n\nNow you’ll see the line. WPF doesn’t draw in units of pixels. Instead, coordinates and sizes are based on 96 units to the inch, which means that a value of 192 is equivalent to two inches.\n\nYou can increase the thickness of the line by setting the `StrokeThickness` property:\n\n```csharp\npolygon1.StrokeThickness = 3;\n```\n\nAlthough the figure might appear to be a single line, it’s really not. As mentioned earlier, `Polygon` automatically connects the last point in the `Points` collection to the first point, so the figure consists of one line from (40, 168) to (192, 168) and a second line from (192, 168) back to (40, 168). This has some implications: At the two points where the two lines meet, a “line join” is drawn. By default this is a pointy miter join, and it extends beyond the geometric end of the line. In general you’ll want a more attractive and less troublesome rounded join:\n\n```csharp\npolygon1.StrokeLineJoin = PenLineJoin.Round;\n```\n\nDid you see the line get a little shorter when you executed that statement?\n\nThe fact that `Polygon` is automatically drawing a line to connect the last point with the first point becomes much more obvious when you add a third point to the `Points` collection. This point continues the polygon to the point (192, 168) for a three-sided figure.\n\n```csharp\npolygon1.Points.Add(new Point(192, 192));\n```\n\n`Polygon` always draws a closed figure. The tilted line on the bottom connects the third point (192, 192) with the first point (40, 168).\n\nWith three points, you can also specify a brush to fill the interior of the figure:\n\n```csharp\npolygon1.Fill = Brushes.DarkGray;\n```\n\nYou can add a fourth point:\n\n```csharp\npolygon1.Points.Add(new Point(0, 192));\n```\n\nAnd a fifth:\n\n```csharp\npolygon1.Points.Add(new Point(108, 2));\n```\n\nAnd a final sixth point to complete this first figure:\n\n```csharp\npolygon1.Points.Add(new Point(132, 2));\n```\n\nThe following code creates the second `Polygon` in its entirety. It slightly overlaps the first at the bottom right, so look at that area when you execute this code:\n\n```csharp\nPolygon polygon2 = new Polygon();\npolygon2.Points.Add(new Point(0, 192));\npolygon2.Points.Add(new Point(192, 192));\npolygon2.Points.Add(new Point(120, 60));\npolygon2.Points.Add(new Point(134, 48));\npolygon2.Points.Add(new Point(234, 216));\npolygon2.Points.Add(new Point(12, 216));\npolygon2.Stroke = Brushes.Black;\npolygon2.StrokeThickness = 3;\npolygon2.StrokeLineJoin = PenLineJoin.Round;\npolygon2.Fill = Brushes.LightGray;\n\ngrid.Children.Add(polygon2);\n```\n\nThe slight overlapping made the calculation of points for the first `Polygon` a little easier.\n\nWhen multiple `Shape` object overlap, the objects later in the `Children` collection might hide or obscure the objects earlier in the `Children` collection. This is known as Z-ordering, in reference to the Z axis that is conceptually perpendicular to the surface of the screen.\n\nHere’s the  third `Polygon`:\n\n```csharp\nPolygon polygon3 = new Polygon();\npolygon3.Points.Add(new Point(40, 168));\npolygon3.Points.Add(new Point(66, 168));\npolygon3.Points.Add(new Point(134, 48));\npolygon3.Points.Add(new Point(234, 216));\npolygon3.Points.Add(new Point(246, 192));\npolygon3.Points.Add(new Point(132, 2));\npolygon3.Stroke = Brushes.Black;\npolygon3.StrokeThickness = 3;\npolygon3.StrokeLineJoin = PenLineJoin.Round;\npolygon3.Fill = Brushes.DimGray;\ngrid.Children.Add(polygon3);\n```\n\nThe Penrose Triangle is now complete.\n\nEvery `Shape` object has a single stroke brush and a single fill brush. Whenever a composite graphics object requires multiple colors, each color must be a different `Shape` object.\n\nIf you’d like to center the Penrose Triangle on the screen, you can’t set the `HorizontalAlignment` and `VerticalAlignment` properties on each `Polygon` because that would center each `Polygon` separately, and they’d no longer fit together properly. Instead, set the `HorizontalAlignment` and `VerticalAlignment` properties on the `Grid` itself:\n\n```csharp\ngrid.HorizontalAlignment = HorizontalAlignment.Center;\ngrid.VerticalAlignment = VerticalAlignment.Center;\n```\n\nThis causes the `Grid` to shrink down to encompass only the area required by all its children. For purposes of layout, the size of each `Shape` object is based on its maximum positive horizontal and vertical coordinates, as well as stroke thickness and line joins.\n\nSuppose you’d like to make the Penrose Triangle fill the `Window`. There’s an WPF class for that! The `Viewbox` class fills its parent container (in this case, the window), and stretches its child to be the same size. The `if` statement below is for some special code just for Workbooks that avoids problems when the four statements at the bottom of this code cell are re-executed. Those statements insert a `Viewbox` between the `Window` and the `Grid`:\n\n```csharp\n// Special code to allow re-execution without causing an error\nif (grid.Parent is Viewbox)\n{\n    (grid.Parent as Viewbox).Child = null;\n}\n\n// Set the Grid as a child of a Viewbox\nwin.Content = null;\nViewbox viewbox = new Viewbox();\nviewbox.Child = grid;\nwin.Content = viewbox;\n```\n\nAnd now the Penrose Triangle fills the window, and it changes size as you change the window size."
  },
  {
    "path": "wpf/user-interface/meta.json",
    "content": "{\n  \"order\":{\n    \"graphics/PenroseTriangle.workbook\":\"Penrose Triangle\",\n  }\n}\n"
  },
  {
    "path": "xamarin-forms/README.md",
    "content": "Xamarin.Forms Workbooks\n============\n\n* Getting Started\n* User Interface\n* Application Fundamentals\n* Advanced\n\n![](advanced/Screenshots/rpncalc.png)\n"
  },
  {
    "path": "xamarin-forms/advanced/MandelbrotTouch.workbook/BitmapInfo.csx",
    "content": "class BitmapInfo\n{\n    public BitmapInfo(int pixelWidth, int pixelHeight, int[] iterationCounts)\n    {\n        PixelWidth = pixelWidth;\n        PixelHeight = pixelHeight;\n        IterationCounts = iterationCounts;\n    }\n\n    public int PixelWidth { private set; get; }\n\n    public int PixelHeight { private set; get; }\n\n    public int[] IterationCounts { private set; get; }\n}\n"
  },
  {
    "path": "xamarin-forms/advanced/MandelbrotTouch.workbook/BmpMaker.csx",
    "content": "using System;\nusing System.IO;\nusing System.Text;\nusing Xamarin.Forms;\n\npublic class BmpMaker\n{\n    const int headerSize = 54;\n    readonly byte[] buffer;\n\n    public BmpMaker(int width, int height)\n    {\n        Width = width;\n        Height = height;\n\n        int numPixels = Width * Height;\n        int numPixelBytes = 4 * numPixels;\n        int fileSize = headerSize + numPixelBytes;\n        buffer = new byte[fileSize];\n\n        // Write headers in MemoryStream and hence the buffer.\n        using (MemoryStream memoryStream = new MemoryStream(buffer))\n        {\n            using (BinaryWriter writer = new BinaryWriter(memoryStream, Encoding.UTF8))\n            {\n                // Construct BMP header (14 bytes).\n                writer.Write(new char[] { 'B', 'M' });  // Signature\n                writer.Write(fileSize);                 // File size\n                writer.Write((short)0);                 // Reserved\n                writer.Write((short)0);                 // Reserved\n                writer.Write(headerSize);               // Offset to pixels\n\n                // Construct BitmapInfoHeader (40 bytes).\n                writer.Write(40);                       // Header size\n                writer.Write(Width);                    // Pixel width\n                writer.Write(Height);                   // Pixel height\n                writer.Write((short)1);                 // Planes\n                writer.Write((short)32);                // Bits per pixel\n                writer.Write(0);                        // Compression\n                writer.Write(numPixelBytes);            // Image size in bytes\n                writer.Write(0);                        // X pixels per meter\n                writer.Write(0);                        // Y pixels per meter\n                writer.Write(0);                        // Number colors in color table\n                writer.Write(0);                        // Important color count\n            }\n        }\n    }\n\n    public int Width\n    {\n        private set;\n        get;\n    }\n\n    public int Height\n    {\n        private set;\n        get;\n    }\n\n    public void SetPixel(int row, int col, Color color)\n    {\n        SetPixel(row, col, (int)(255 * color.R), \n                            (int)(255 * color.G), \n                            (int)(255 * color.B), \n                            (int)(255 * color.A));\n    }\n\n    public void SetPixel(int row, int col, int r, int g, int b, int a = 255)\n    {\n        int index = (row * Width + col) * 4 + headerSize;\n        buffer[index + 0] = (byte)b;\n        buffer[index + 1] = (byte)g;\n        buffer[index + 2] = (byte)r;\n        buffer[index + 3] = (byte)a;\n    }\n\n    public ImageSource Generate()\n    {\n        // Create MemoryStream from buffer with bitmap.\n        MemoryStream memoryStream = new MemoryStream(buffer);\n\n        // Convert to StreamImageSource.\n        ImageSource imageSource = ImageSource.FromStream(() =>\n        {\n            return memoryStream;\n        });\n        return imageSource;\n    }\n}\n"
  },
  {
    "path": "xamarin-forms/advanced/MandelbrotTouch.workbook/Complex.csx",
    "content": "using System;\n\n// Mostly a subset of System.Numerics.Complex.\npublic struct Complex : IEquatable<Complex>, IFormattable\n{\n    bool gotMagnitude, gotMagnitudeSquared;\n    double magnitude, magnitudeSquared;\n\n    public Complex(double real, double imaginary)\n        : this()\n    {\n        Real = real;\n        Imaginary = imaginary;\n    }\n\n    public double Real { private set; get; }\n\n    public double Imaginary { private set; get; }\n\n    // MagnitudeSquare and Magnitude calculated on demand and saved.\n    public double MagnitudeSquared\n    {\n        get\n        {\n            if (gotMagnitudeSquared)\n            {\n                return magnitudeSquared;\n            }\n\n            magnitudeSquared = Real * Real + Imaginary * Imaginary;\n            gotMagnitudeSquared = true;\n            return magnitudeSquared;\n        }\n    }\n\n    public double Magnitude\n    {\n        get\n        {\n            if (gotMagnitude)\n            {\n                return magnitude;\n            }\n\n            magnitude = Math.Sqrt(MagnitudeSquared);\n            gotMagnitude = true;\n            return magnitude;\n        }\n    }\n\n    public static Complex operator +(Complex left, Complex right)\n    {\n        return new Complex(left.Real + right.Real, left.Imaginary + right.Imaginary);\n    }\n\n    public static Complex operator -(Complex left, Complex right)\n    {\n        return new Complex(left.Real - right.Real, left.Imaginary - right.Imaginary);\n    }\n\n    public static Complex operator *(Complex left, Complex right)\n    {\n        return new Complex(left.Real * right.Real - left.Imaginary * right.Imaginary,\n                            left.Real * right.Imaginary + left.Imaginary * right.Real);\n    }\n\n    public static bool operator ==(Complex left, Complex right)\n    {\n        return left.Real == right.Real && left.Imaginary == right.Imaginary;\n    }\n\n    public static bool operator !=(Complex left, Complex right)\n    {\n        return !(left == right);\n    }\n\n    public static implicit operator Complex(double value)\n    {\n        return new Complex(value, 0);\n    }\n\n    public static implicit operator Complex(int value)\n    {\n        return new Complex(value, 0);\n    }\n\n    public override int GetHashCode()\n    {\n        return Real.GetHashCode() + Imaginary.GetHashCode();\n    }\n\n    public override bool Equals(Object value)\n    {\n        return Real.Equals(((Complex)value).Real) &&\n                Imaginary.Equals(((Complex)value).Imaginary);\n    }\n\n    public bool Equals(Complex value)\n    {\n        return Real.Equals(value) && Imaginary.Equals(value);\n    }\n\n    public override string ToString()\n    {\n        return String.Format(\"{0} {1} {2}i\", Real,\n                                                RealImaginaryConnector(Imaginary),\n                                                Math.Abs(Imaginary));\n    }\n\n    public string ToString(string format)\n    {\n        return String.Format(\"{0} {1} {2}i\", Real.ToString(format),\n                                                RealImaginaryConnector(Imaginary),\n                                                Math.Abs(Imaginary).ToString(format));\n    }\n\n    public string ToString(IFormatProvider formatProvider)\n    {\n        return String.Format(\"{0} {1} {2}i\", Real.ToString(formatProvider),\n                                                RealImaginaryConnector(Imaginary),\n                                                Math.Abs(Imaginary).ToString(formatProvider));\n    }\n\n    public string ToString(string format, IFormatProvider formatProvider)\n    {\n        return String.Format(\"{0} {1} {2}i\", Real.ToString(format, formatProvider),\n                                                RealImaginaryConnector(Imaginary),\n                                        Math.Abs(Imaginary).ToString(format, formatProvider));\n    }\n\n    string RealImaginaryConnector(double value)\n    {\n        return Math.Sign(value) > 0 ? \"+\" : \"\\u2013\";\n    }\n}\n"
  },
  {
    "path": "xamarin-forms/advanced/MandelbrotTouch.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/advanced/MandelbrotTouch.workbook/Mandelbrot.png.txt",
    "content": "The Mandelbrot.png file is from the Wikipedia article:\n\nhttps://en.wikipedia.org/wiki/Mandelbrot_set\n\nHere is the page that describes this particular image:\n\nhttps://en.wikipedia.org/wiki/Mandelbrot_set#/media/File:Mandel.png\n\nIt is accompanied by the following:\n\n\"This work has been released into the public domain by its author, Elphaba at Catalan Wikipedia. This applies worldwide. In some countries this may not be legally possible; if so: Elphaba grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.\"\n\nThe image used here has been reduced to 50% of its original size.\n"
  },
  {
    "path": "xamarin-forms/advanced/MandelbrotTouch.workbook/MandelbrotModel.csx",
    "content": "#load \"Complex.csx\"\n#load \"BitmapInfo.csx\"\n\nusing System;\nusing System.Threading; \nusing System.Threading.Tasks;\n\nclass MandelbrotModel\n{\n    public Task<BitmapInfo> CalculateAsync(Complex Center, \n                                           double width, double height,\n                                           int pixelWidth, int pixelHeight, \n                                           int iterations,\n                                           IProgress<double> progress, \n                                           CancellationToken cancelToken)\n    {\n        return Task.Run(() =>\n        {\n            int[] iterationCounts = new int[pixelWidth * pixelHeight];\n            int index = 0;\n\n            for (int row = 0; row < pixelHeight; row++)\n            {\n                progress.Report((double)row / pixelHeight);\n                cancelToken.ThrowIfCancellationRequested();\n\n                double y = Center.Imaginary - height / 2 + row * height / pixelHeight;\n\n                for (int col = 0; col < pixelWidth; col++)\n                {\n                    double x = Center.Real - width / 2 + col * width / pixelWidth;\n                    Complex c = new Complex(x, y);\n\n                    if ((c - new Complex(-1, 0)).MagnitudeSquared < 1.0 / 16)\n                    {\n                        iterationCounts[index++] = -1;\n                    }\n                    // http://www.reenigne.org/blog/algorithm-for-mandelbrot-cardioid/\n                    else if (c.MagnitudeSquared * (8 * c.MagnitudeSquared - 3) < 3.0 / 32 - c.Real)\n                    {\n                        iterationCounts[index++] = -1;\n                    }\n                    else\n                    {\n                        Complex z = 0;\n                        int iteration = 0;\n\n                        do\n                        {\n                            z = z * z + c;\n                            iteration++;\n                        }\n                        while (iteration < iterations && z.MagnitudeSquared < 4);\n\n                        if (iteration == iterations)\n                        {\n                            iterationCounts[index++] = -1;\n                        }\n                        else\n                        {\n                            iterationCounts[index++] = iteration;\n                        }\n                    }\n                }\n            }\n            return new BitmapInfo(pixelWidth, pixelHeight, iterationCounts);\n        }, cancelToken);\n    }\n}\n"
  },
  {
    "path": "xamarin-forms/advanced/MandelbrotTouch.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: D13B7651-1663-4030-A55F-903A3893773D\ntitle: Mandelbrot with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Mandelbrot Touch\n\nIn 1980, while working at an IBM research center, Polish born mathematician Benoit Mandelbrot saw a crude computer-generated image that had been published two years earlier:\n\n![From the public domain image on the Wikipedia article on the Mandelbot Set.](Mandelbrot.png \"The Mandelbrot Set\")\n\nMandelbrot had already been researching complex self-similar geometries for several years. In 1975 he had coined the word *fractal* in connection with his work and wrote a book on the subject: *Les Objects Fractals: Forme, Hasard et Dimension*, later translated as *Fractals: Forms, Chance and Dimension*. Mandelbrot eventually did so much research into the mathematics bethind this particular image that it became known as the *Mandelbrot set*.\n\nThe program described in this workbook draws a more detailed (and colored) rendition of the Mandelbrot set. You can pan the image with your fingers or use a pinch gesture to zoom in and out.\n\n## The Mandelbrot Math\n\nThe Mandelbrot set is graphed on the complex plane, where each point is a complex number of the form:\n\nc = x \\+ y*i*\n\nIn the complex plane, the real part (x) of a complex number is represented by the horizontal axis, and the imaginary part (y) by the vertical axis. In the image shown above, the point between the small circle on the left and the large cardiod is  –0.75 \\+ 0*i*.\n\nTo calculate the Mandebrot set, begin by taking any complex point on this plane and call it c:\n\nc = x \\+ y*i*\n\nInitialize the complex number z to zero:\n\nz = 0\n\nNow perform the following recursive calculation:\n\nz ← z² \\+ c\n\nThe result will either diverge to infinity or it will not. If z does not diverge to infinity, then c is is said to be a member of the Mandelbrot set. (These points are indicated in the diagram above with asterisks.) Otherwise the complex number is not a member of the Mandelbrot set. This operation must be repeated for every point of interest in the complex plane.\n\nSometime the recursive calculation must be performed very many times to determine if z  diverges or not. If the absolute value of z ever becomes 2 or greater, than the values will eventually diverge to infinity. But otherwise, the only way to determine if a point is a member of the Mandelbrot set or not is to continue performing the recursive calculations.\n\nFor that reason, Mandelbrot calculations are notoriously computation-intensive and are best performed in secondary threads of execution.\n\nIt has become common for programs that display Mandelbrot sets to incorporate color. Points that are members of the Mandelbrot set are colored black. Points that are not members are given a color based on the number of iterations required to determine that the calculation will diverge to infinity.\n\nThe program described here uses a bitmap to render the Mandelbrot set. The recursive calculation is performed on each complex point that corresponds to each pixel of the bitmap. The bitmap must be entirely created before it is displayed on the screen.\n\n## The Code Support\n\nThis workbook includes several C# Script files for support:\n\n```csharp\n#load \"MandelbrotModel.csx\"\n#load \"BmpMaker.csx\"\n#load \"FormsInit.csx\"\n```\n\nThe MandelbrotModel.csx file contains a class named `MandelbrotModel` with a single asynchronous method named `CalculateAsync` that performs the basic Mandelbort calculation for an array of points. The results are later used to create a bitmap, so several parameters to this method indicate the pixel size of this bitmap, and the complex coordinates corresponding to that array of pixels.\n\nThe `CalculateAsync` method makes use of a structure named `Complex` that is defined in the Complex.csx file. The Mandelbrot.csx file contains a `#load` command for Complex.csx. The method returns an object of type `Task<BitmapInfo>`. The `BitmapInfo` class (defined in BitmapInfo.csx) contains sufficient information to create a bitmap to render the results of the Mandelbrot calculation — a pixel width and height, and an array of integers indicating the number of iterations that were required for each point to determine that the point was not a member of the Mandelbrot set, or –1 if the point is a member.\n\nThe BmpMaker.csx file contains a class name `BmpMaker` (“bitmap maker”) that creates a Xamarin.Forms `ImageSource` object based on the BMP file format.\n\nMore information on these classes (and the Mandelbrot calculation itself) can be found in [Chapter 13 (Bitmaps)](https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/summaries/chapter13 \"Chapter 13. Bitmaps\")  and [Chapter 20 (Async and File I/O)](https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/summaries/chapter20 \"Chapter 20. Async and File I/O\") of the book *[Creating Mobile Apps with Xamairn.Forms](https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/ \"Creating Mobile Apps with Xamarin.Forms\")*.\n\nFinally, the FormsInit-iOS.csx file contains startup code for a Xamarin.Forms program running under iOS. At the conclusion of that code, a variable named `page` is available of type `ContentPage`.\n\n## Building the User Interface\n\nJust a few standard `using` directives are required:\n\n```csharp\nusing System;\nusing System.Threading;\nusing Xamarin.Forms;\n```\n\nSet some `Padding`on the page that also guards against overwriting the iOS status bar:\n\n```csharp\npage.Padding = new Thickness(5, Device.OnPlatform(20, 5, 5), 5, 10);\n```\n\nThe main layout is a three-row `Grid`. The top row is allocated all the space that is not required by the other two rows:\n\n```csharp\nvar grid = new Grid();\ngrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });\ngrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });\ngrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });\npage.Content = grid;\n```\n\nThe top row is for the bitmap, which in Xamarin.Forms is displayed by an `Image` element. However, for purposes of handling touch gestures, the program makes this `Image` element a child of a `ContentView` named `gestureContainer`. Notice that the `for` loop at the top of this code cell first removes a `ContentView` from the `Children` collection of the `Grid` if this code is re-executed:\n\n```csharp\n// Avoid multiple ContentView elements if this code is re-executed\nfor (int i = 0; i < grid.Children.Count; i++)\n{\n    if (grid.Children[i] is ContentView)\n    {\n        grid.Children.RemoveAt(i);\n        i--;\n    }\n}\n\nvar image = new Image();\nvar gestureContainer = new ContentView();\ngestureContainer.Content = image;\ngestureContainer.IsClippedToBounds = true;\ngrid.Children.Add(gestureContainer, 0, 0);\n```\n\nThis `gestureContainer` allows the progrm to obtain gesture input that affects the `Image` element. See the guides for [Xamarin.Forms gestures](https://developer.xamarin.com/guides/xamarin-forms/user-interface/gestures/ \"Gestures\") for more details about using such a container.\n\nThe second row of the `Grid` contains a `ProgressBar` to show the progress of each complete Mandelbrot calculation. Again, any previous `ProgressBar` is removed first:\n\n```csharp\n// Avoid multiple ProgressBar elements if this code is re-executed\nfor (int i = 0; i < grid.Children.Count; i++)\n{\n    if (grid.Children[i] is ProgressBar)\n    {\n        grid.Children.RemoveAt(i);\n        i--;\n    }\n}\n\nvar progressBar = new ProgressBar();\ngrid.Children.Add(progressBar, 0, 1);\n```\n\nWhen you first execute that code, you should see the `ProgressBar` appear as a dim gray line near the bottom of the screen.\n\nThis `ProgressBar` must be updated in the `CalculateAsync` method of the `MandelbrotModel` class. Because this method runs in a secondary thread of execution, the safest way of updating the `ProgressBar` involves instantiating a class specifically for this purpose named `Progress`:\n\n```csharp\nvar progressReporter = new Progress<double>(progress => progressBar.Progress = progress);\n```\n\nA lambda function is passed to the `Progress` constructor that updates the `ProgressBar` from an argument to the function.\n\n## The Mandelbrot Calculation\n\nNext are some constants and variables that define the Mandelbrot image. Taken together, the `baseSize`, `center`, and `magnification` arguments indicate that the initial Mandelbrot image will have real coordinates ranging from –2.0 (on the left edge of the bitmap) to 0.5 (on the right edge), and imaginary coordinates from 1.25 on the top to –1.25 on the bottom. However, the actual range in either the horizontal or vertical direction will be larger than that depending on the aspect ratio of the bitmap:\n\n```csharp\nstatic readonly Size baseSize = new Size(2.5, 2.5);\nComplex center = new Complex(-0.75, 0);\ndouble magnification = 1.0;\n```\n\nThe `center` variable will change when the image is panned; the `magnification` variable changes as the image is zoomed.\n\nThe `iterations` variable indicates the number of recursive calculations performed before the point is assumed to be in the Mandelbrot Set. The `pixelsPerUnit` variable is calculated by a method later in this workbook based on the pixel size of the bitmap:\n\n```csharp\nint iterations = 256;\ndouble pixelsPerUnit = 0;\n```\n\nFinally, the `MandelbrotModel` class is instantiated to perform the actual calculation.\n\n```csharp\nvar mandelbrotModel = new MandelbrotModel();\n```\n\nRecall that this class is defined in the MandelbrotModel.csx C# script file.\n\nThe `CreateNewImage` method brings all the parts of the calculation together by calling the `CalculateAsync` method in the `MandelbrotModel` instance and then constructing a bitmap from that information. The `CalculateAsync` method is in a `try` and `catch` block to allow the method to gracefully terminate if the asynchronous operation has been cancelled. You’ll see shortly how this `CalculateAsync` method is cancelled if a different calculation must supersede it:\n\n```csharp\nasync void CreateNewImage(CancellationToken cancelToken)\n{\n    double aspect = image.Width / image.Height;\n    double width = baseSize.Width / magnification * (aspect > 1 ? aspect : 1);\n    double height = baseSize.Height / magnification / (aspect < 1 ? aspect : 1);\n    pixelsPerUnit = image.Width / width;\n    BitmapInfo bitmapInfo = null;\n\n    try\n    {\n        bitmapInfo = await mandelbrotModel.CalculateAsync(center, width, height, \n                                                          (int)image.Width, (int)image.Height,\n                                                          iterations, progressReporter, cancelToken);\n    }\n    catch (OperationCanceledException)\n    {\n        return;\n    }\n\n    BmpMaker bmpMaker = new BmpMaker(bitmapInfo.PixelWidth, bitmapInfo.PixelHeight);\n\n    int index = 0;\n    for (int row = 0; row < bitmapInfo.PixelHeight; row++)\n    {\n        for (int col = 0; col < bitmapInfo.PixelWidth; col++)\n        {\n            int iterationCount = bitmapInfo.IterationCounts[index++];\n\n            // In the Mandelbrot set: Color black.\n            if (iterationCount == -1)\n            {\n                bmpMaker.SetPixel(row, col, 0, 0, 0);\n            }\n            // Not in the Mandelbrot set: Pick a color based on count.\n            else\n            {\n                bmpMaker.SetPixel(row, col, Color.FromHsla(iterationCount / 64.0 % 1.0, 1.0, 0.5));\n            }\n        }\n    }\n    image.Source = bmpMaker.Generate();\n    image.TranslationX = 0;\n    image.TranslationY = 0;\n    image.Scale = 1;\n}\n```\n\nThe following code calls `CreateNewImage` for the first time to create the image with the default settings:\n\n```csharp\nCancellationTokenSource cancelTokenSource = new CancellationTokenSource();\nCreateNewImage(cancelTokenSource.Token);\n```\n\nYou should see the `ProgressBar` go from minimum to maximum and then the image will appear.\n\nThe bitmap should be recomputed if the size of the `Image` element changes. On mobile platforms this happens mostly when the orientation of the phone changes from portrait to landscape:\n\n```csharp\n// Remove the previous SizeChanged handler if the code is being reexecuted. \nimage.SizeChanged -= OnSizeChanged;\n\n// Attach the SizeChanged handler\nimage.SizeChanged += OnSizeChanged;\n\nvoid OnSizeChanged(object sender, EventArgs args)\n{\n    if (gestureContainer.Width > 0 && gestureContainer.Height > 0)\n    {\n        cancelTokenSource.Cancel();\n        cancelTokenSource = new CancellationTokenSource();\n        CreateNewImage(cancelTokenSource.Token);\n    }\n}\n```\n\nNow when you switch the orienttion of the simulator between portrait and landscape, the bitmap will be recreated.\n\nIn the course of experimenting with the workbook, the code in the cell that sets the `SizeChanged` handler might be executed more than once. For that reason, the `OnSizeChanged` handler is first detached from the `SizeChanged` event if code has been executed previously. This ensures that the `SizeChanged` event has only one attached handler.\n\nNotice also that the `Cancel` method is called on the previous `CancellationTokenSource`. If the `CalculateAsync` method is curently running, this will cancel it. Then the `OnSizeChanged` handler creates a new `CancellationTokenSource` for calling `CreateNewImage` again. If the orientation of the phone is changed before the image has finished being calculated, that calculation will be interrupted and a new one begun.\n\nThis same strategy is used for implementing the two different types of touch gestures — pan and pinch.\n\n## Panning the Image\n\nIn the next two code cells, the workbook adds `GestureRecognizer` objects to the `GestureRecognizers` collection property of the `ContentView` named `gestureContainer`. The handlers for these `GestureRecognizer` objects then uses the information associated with the gestures to apply transforms to the `gestureContainer`’s child, the `Image` element. When the gesture is complete, a new bitmap is calculated.\n\nThe program instantiates two classes that derive from `GestureRecognizer` — `PanGestureRecognizer` and `PinchGestureRecognizer`. The code cell below begins by removing any existing `PanGestureRecognizer` from the `GestureRecognizers` collection; this is a precaution if the code is re-executed:\n\n```csharp\n// Avoid multiple gesture recognizers when the code is re-executed\nfor (int i = 0; i < gestureContainer.GestureRecognizers.Count; i++)\n{\n    if (gestureContainer.GestureRecognizers[i] is PanGestureRecognizer)\n    {\n        gestureContainer.GestureRecognizers.RemoveAt(i);\n        i--;\n    }\n}\n\nvar pan = new PanGestureRecognizer();\ngestureContainer.GestureRecognizers.Add(pan);\n\ndouble translationX = 0;\ndouble translationY = 0;\n\npan.PanUpdated += (sender, args) =>\n{\n    switch (args.StatusType)\n    {\n        case GestureStatus.Started:\n            cancelTokenSource.Cancel();\n            translationX = image.TranslationX;\n            translationY = image.TranslationY;\n            break;\n\n        case GestureStatus.Running:\n            image.TranslationX = translationX + args.TotalX;\n            image.TranslationY = translationY + args.TotalY;\n            break;\n\n        case GestureStatus.Completed:\n            center = new Complex(center.Real - image.TranslationX / pixelsPerUnit,\n                                 center.Imaginary + image.TranslationY / pixelsPerUnit);\n\n            cancelTokenSource = new CancellationTokenSource();\n            CreateNewImage(cancelTokenSource.Token);\n            break;\n    }\n};\n```\n\nThe `PanUpdated` handler performs different processing based on the `StatusType` property, which indicates if the pan gesture is starting, in progress, or completed. If the pan gesture is just starting, the code cancels any calculation that might be in progress because a new one will be started when the gesture is complete.\n\nWhile the pan gesture is in progress (indicated by a status of `Running`), the code alters the `TranslationX` and `TranslationY` properties based on the total pan offest during this gesture. This causes part of the bitmap to be moved offscreen. At the end of the gesture (when the user removes a finger from the screen), the code recalculates the `center` variable and calls `CreateNewImage` to create  a new bitmap based on that center.\n\nNotice that if the `CreateNewImage` method (shown earlier) is allowed to run to completion, then it concludes by setting the `TranslationX` and `TranslationY` properties back to their default values of 0 because the new bitmap has been calculated based on those translation factors, and it replaces the previous translated bitmap.\n\n## Pinching the Image\n\nThe program uses a similar strategy for pinch gestures, first removing the previous  `PinchGestureRecognizer` object from the `GestureRecognizers` collection if the code is re-executed.\n\nAs with the `PanGestureRecognizer`, the `PinchGestureRecognizer` event includes a property that indicates if the gesture is starting, running, or completed. The code here alters the `Scale` property of the `Image`. This property has a default value of 1, and each call to the `PinchUpdated` method is an additional scaling factor for that event:\n\n```csharp\n// Avoid multiple gesture recognizers when code is re-executed\nfor (int i = 0; i < gestureContainer.GestureRecognizers.Count; i++)\n{\n    if (gestureContainer.GestureRecognizers[i] is PinchGestureRecognizer)\n    {\n        gestureContainer.GestureRecognizers.RemoveAt(i);\n        i--;\n    }\n}\n\nvar pinch = new PinchGestureRecognizer();\ngestureContainer.GestureRecognizers.Add(pinch);\n\ndouble scale = 1;\n\npinch.PinchUpdated += (sender, args) =>\n{\n    switch (args.Status)\n    {\n        case GestureStatus.Started:\n            cancelTokenSource.Cancel();\n            scale = image.Scale;\n            break;\n\n        case GestureStatus.Running:\n            image.Scale += (args.Scale - 1) * scale;\n            break;\n\n        case GestureStatus.Completed:\n            magnification *= image.Scale;\n            cancelTokenSource = new CancellationTokenSource();\n            CreateNewImage(cancelTokenSource.Token);\n            break;\n    }\n};\n```\n\nSimilar to the pan gesture, the gesture concludes with a recalculation of the `magnification` variable for a new bitmap calculation. The `CreateNewImage` method concludes by setting the `Scale` property of the `Image` element back to 1.\n\nThis pinch-gesture code shown here demontrates a simplified approach to `PinchUpdated` processing. In this implementation, all the zooming is relative to the center of the image. It’s possible to use an additional event argument of type `Point` named `ScaleOrigin` to compute a scaling center based on the position of the two fingers performing the pinch operation. See the [PinchGesture sample](https://developer.xamarin.com/samples/xamarin-forms/WorkingWithGestures/PinchGesture/ \"PinchGesture sample\") for a more complex approach.\n\n## Adjusting the Iterations\n\nAn earlier code cell defined an `iterations` variable with a value of 128, which is passed to the `CalculateAsync` method of `MandelbrotModel`. This is the maximum number of iterative calculations performed before the program assumes that a point will not diverge and hence is a member of the Mandelbrot set. As you zoom into the image more and more, you’ll generally need more iterations to see the detail. The final enhancement to the program is the addition of a `Stepper` element with some text to display the values. This allows you to increase or decrease the number of iterations by powers of two:\n\n```csharp\n// Avoid multiple Stepper elements if the code is re-executed\nfor (int i = 0; i < grid.Children.Count; i++)\n{\n    if (grid.Children[i] is StackLayout)\n    {\n        grid.Children.RemoveAt(i);\n        i--;\n    }\n}\n\nvar stepperStack = new StackLayout\n{\n    Orientation = StackOrientation.Horizontal\n};\n\nvar labelStack = new StackLayout\n{\n    Orientation = StackOrientation.Horizontal,\n    VerticalOptions = LayoutOptions.Center,\n    Spacing = 0\n};\nstepperStack.Children.Add(labelStack);\n\nlabelStack.Children.Add(new Label\n{\n    Text = \"Iterations = 2\",\n    FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label))\n});\n\nint exponent = (int)Math.Round(Math.Log(iterations) / Math.Log(2));\n\nLabel exponentLabel = new Label\n{\n    Text = exponent.ToString(),\n    FontSize = Device.GetNamedSize(NamedSize.Micro, typeof(Label))\n};\nlabelStack.Children.Add(exponentLabel);\n\nvar iterationsStepper = new Stepper\n{\n    Value = exponent,\n    VerticalOptions = LayoutOptions.Center\n};\n\niterationsStepper.ValueChanged += (sender, args) =>\n{\n    int exponent = (int)(sender as Stepper).Value;\n    exponentLabel.Text = exponent.ToString();\n    iterations = (int)Math.Pow(2, exponent);\n\n    cancelTokenSource.Cancel();\n    cancelTokenSource = new CancellationTokenSource();\n    CreateNewImage(cancelTokenSource.Token);\n};\nstepperStack.Children.Add(iterationsStepper);\n\ngrid.Children.Add(stepperStack, 0, 2);\n```\n\nThe `ValueChanged` handler at the bottom of the code cell updates the `Label`, sets the `iterations` variable, cancels any calculation currently in progress, and starts a new one.\n\nYou can also decrease the maximum number of iteratons to see the effect. When only a few iterations are allowed, the Mandelbrot set loses its crisp definition and doesn’t provide much more information than the original graphic published in 1978."
  },
  {
    "path": "xamarin-forms/advanced/RPNCalculator/README.md",
    "content": "RPN Calculator Workbook\n============\n\nStep-by-step examination of building a complete iOS application\n\n![](Screenshots/rpncalc.png)"
  },
  {
    "path": "xamarin-forms/advanced/RPNCalculator/RpnCalculator-ios.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages: []\n---\n\n# Building a Xamarin.Forms RPN Calculator (iOS)\n\n> ⚠️ This workbook is deprecated - see **RpnCalculator.workbook** instead\n\nThis workbook describes how to use the `Grid` layout in Xamarin.Forms as the foundation for a calculator. The `Grid` arranges visual elements in rows and columns, so it is ideal for arranging the calculator buttons and elements on the page. To keep the operational logic reasonably simple, this calculator uses Reverse Polish notation (RPN).\n\n## What is RPN?\n\nAround the year 1924, Polish mathematician Jan Łukasiewicz (1878 – 1956) developed a type of notation for logic and arithmetic operations that did not require the use of parentheses. For example, the expression\n\n5 × (3 \\+ 4) – 2\n\nis written in Łukasiewicz’s notaton like this\n\n– × 5 \\+ 3 4 2\n\nThis statement is evaluated starting from the end of the expression. It’s convenient to use the last-in-first-out storage mechanism known as the *stack*. The numbers (starting from the end of the expression) are pushed on a stack. Every time one of the operators is encountered, the two numbers at the top of the stack are popped, and the operator is applied to them. The result is pushed back on the stack. In this example, 2, 4, and 3 are pushed on the stack, and then the plus sign causes 4 and 3 to be popped from the stack and 7 to be pushed on the stack. Now 5 is pushed on the stack, but the multiplication causes 5 and 7 to be popped from the stack and the product, 35, is pushed on the stack. Now the minus sign causes 35 and 2 to be popped from the stack, and the result is 33.\n\nThis is sometimes known as *prefix notation*, but in honor of its inventor — and because his name can be challenging to spell — it’s often called *Polish notation*.\n\nIn the digital computer age, it was realized that it makes more sense to evaluate an expression from the beginning (particularly if the expression can grow as it’s being evaluated), and Reverse Polish notation was born. In RPN (also called postfix notation), the above expression is written as:\n\n5 3 4 \\+ × 2 –\n\nNow the numbers from left to write are pushed on a stack, and a binary operation causes the top two numbers on the stack to be popped, and the result to be pushed on the stack. Because multiplication is commutative, the statement can also be written as:\n\n3 4 \\+ 5 × 2 –\n\nDuring the 1970s and 1980s, some popular calculators used RPN, most notably those manufactured by Hewlett-Packard. Many people with a mathematical or computer bent remain fans of RPN to this day. The Calculator program included with recent versions of macOS has an RPN mode.\n\nRPN calculators are characterized by the presence of an **Enter** button rather than an **=** button or parentheses buttons. Pressing the **Enter** key indicates that the number being typed by the user is ready to be pushed on the internal stack.\n\nWhen programming a calculator, basing it on RPN simplifies the operational logic considerably. Very little state information needs to be maintained other than the stack. In a Xamarin.Forms program, you can use a `Stack<double>` object for this purpose.\n\n## The iOS Prerequisites\n\nAs usual, a Xamarin.Forms workbook requires the Xamairn.Forms NuGet package. This packages has already been added to this workbook, but for a new Xamarin.Forms workbook, you can add it by invoking the **File** and **Add Package** menu item and searching for **Xamarin.Forms**.\n\nNow use the **#r** command to reference the following Xamarin.Forms assemblies:\n\n```csharp\n#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n#r \"Xamarin.Forms.Platform.iOS\"\n```\n\nYou’ll also want a few standard `using` directives:\n\n```csharp\nusing System;\nusing System.Collections.Generic; // for Stack<T>\nusing Xamarin.Forms;\nusing Xamarin.Forms.Platform.iOS;\n```\n\nA Xamarin.Forms application requies a class that derives from `Application` that instantiates a `Page` object in its constructor. This `App` class instantiates a `ContentPage`:\n\n```csharp\nclass App : Application\n{\n    public App()\n    {\n        MainPage = new ContentPage();\n    }\n}\n```\n\nThe standard iOS startup code makes a call to the static `Forms.Init` method, and then instantiates the `App` class. An iOS `ViewController` is obtained from the created page:\n\n```csharp\nForms.Init();\nApp app = new App();\nContentPage page = app.MainPage as ContentPage;\nKeyWindow.RootViewController = page.CreateViewController();\n```\n\nWith that code, the Xamarin.Forms `ContentPage` is displayed.\n\n## Grid Rows and Columns\n\nThe calculator consists of `Button` elements to enter numbers and operations, and `Label` elements to display intermediate and final results. Each of these elements occupies one or more cells of a `Grid`, which divides the area it occupies into rows and columns. You can create the `Grid` and set it to the `Content` property of the `ContentPage` like this:\n\n```csharp\nvar mainGrid = new Grid();\npage.Content = mainGrid;\n```\n\nThe `Grid` occupies the entire area of the page, but it’s invisible by default so you can’t see it. You might want to temporarily set the background color of the `Grid` by replacing the `Transparent` identifier below with one of the Xamarin.Forms colors (such as `Yellow`):\n\n```csharp\nmainGrid.BackgroundColor = Color.Transparent;\n```\n\nThe calculator buttons will look a little better if you give the entire page some padding that provides a little blank space around the perimeter. Also, for iOS, you’ll want to add 20 units padding on the top to avoid overwriting the iOS status bar:\n\n```csharp\npage.Padding = new Thickness(10, 10 + Device.OnPlatform(20, 0, 0), 10, 10);\n```\n\nAlternatively, you can set the `Margin` property of the `mainGrid` object.\n\nGenerally you explicitly specify the number of rows and columns in the `Grid` using objects of type `RowDefinition` and `ColumnDefinition`. You add these objects to the `RowDefinitions` and `ColumnDefinitions` collection properties of the `Grid`.\n\nThe following code creates twelve `RowDefinition` objects. `RowDefinition` has a `Height` property that you set to a value of type `GridLength`:\n\n```csharp\n// Remove previous RowDefinition objects on re-execution:\nmainGrid.RowDefinitions.Clear();\n\nmainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });\nmainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });\n\nfor (int row = 0; row < 10; row++)\n{\n    mainGrid.RowDefinitions.Add(new RowDefinition \n    { \n        Height = new GridLength(1, GridUnitType.Star) \n    });\n}\n```\n\nThe `GridLength.Auto` constant indicates that the height is based on the height of the elements in that row. As you’ll see, those two rows are used for `Label` element. The `GridUnitType.Star` enumeration member indicates that remaining space is allocated proportionally among rows with that height indication. These ten rows are for `Button` elements, and ensures that they all have the same height. Another option is `GridUnitType.Absolute` for a specific height in device-independent units.\n\nThe following code gives the `Grid` four columns of equal width:\n\n```csharp\n// Remove previous ColumnDefinition objects on re-execution:\nmainGrid.ColumnDefinitions.Clear();\n\nfor (int col = 0; col < 4; col++)\n{\n    mainGrid.ColumnDefinitions.Add(new ColumnDefinition\n    {\n        Width = new GridLength(1, GridUnitType.Star)\n    });\n}\n```\n\nThe `Grid` provides space between adjacent cells based on the `RowSpacing` and `ColumnSpacing` properties. These properties have default values of 6 units.\n\n## Entering Numbers\n\nThe calculator needs a `Label` to display the number that the user enters. This `Label` is given a light-gray background color to make it stand out. The `HorizontalTextAlignment` setting causes the text to be right-justified within the `Label`:\n\n```csharp\nLabel entryLabel = new Label\n{\n    Text = \"0\",\n    BackgroundColor = new Color(0.85),\n    HorizontalTextAlignment = TextAlignment.End\n};\nmainGrid.Children.Add(entryLabel, 0, 4, 1, 2);\n```\n\nThe final statement adds the `Label` to the `Children` collection of the `Grid`. Notice the four numeric arguments to the `Add` statement. These four parameters are named `left`, `right`, `top`, and `bottom`, and specify the cell or cells that the element occupies. Column and row numbering is zero-based. If the element is in one cell, only the `left` and `top` arguments are required. The `right` and `bottom` arguments indicate the column and row beyond the last column or row that the element occupies. The `left` and `right` values of 0 and 4 indicate that the `Label` occupies columns 0, 1, 2, and 3, which is the full width of the `Grid`. The `top` and `bottom` values of 1 and 2 indicate that the `Label` occupies row 1, which is the second row of the `Grid`.\n\nWhen you execute that code, you’ll see the `Label` displayed in the `Grid`.\n\nThe next step is to create some buttons, but first consider that not every button press is invalid. For example, when entering a number, you can’t press the decimal point twice. The following static `Beeper.Error` method is iOS specific and is intended to notify the user of an invalid button press:\n\n```csharp\nstatic class Beeper\n{\n    static AudioToolbox.SystemSound systemSound =\n        systemSound = new AudioToolbox.SystemSound(1000);\n\n    public static void Error()\n    {\n        systemSound.PlaySystemSound();\n    }\n}\n```\n\nA calculator number pad has ten `Button` elements for the digits 0 through 9, and another `Button` for the decimal point. One approach to creating several similar elements for a `Grid` is to first define an array of `Tuple` objects. The following tuples indicate the text for each `Button` in the number pad, and the row and column numbers. The `span` value is the number of columns the `Button` occupies:\n\n```csharp\nvar numButtonInfos = new[]\n{\n    new { text = \"7\", row = 7, col = 0, span = 1 },\n    new { text = \"8\", row = 7, col = 1, span = 1 },\n    new { text = \"9\", row = 7, col = 2, span = 1 },\n    new { text = \"4\", row = 8, col = 0, span = 1 },\n    new { text = \"5\", row = 8, col = 1, span = 1 },\n    new { text = \"6\", row = 8, col = 2, span = 1 },\n    new { text = \"1\", row = 9, col = 0, span = 1 },\n    new { text = \"2\", row = 9, col = 1, span = 1 },\n    new { text = \"3\", row = 9, col = 2, span = 1 },\n    new { text = \"0\", row = 10, col = 0, span = 2 },\n    new { text = \".\", row = 10, col = 2, span = 1 }\n}\n```\n\nCreating the eleven `Button` elements can now be handled in a loop:\n\n```csharp\nforeach (var numButtonInfo in numButtonInfos)\n{\n    var button = new Button\n    {\n        Text = numButtonInfo.text,\n        Margin = new Thickness(5)\n    };\n    button.Clicked += (sender, args) =>\n    {\n        string text = entryLabel.Text == \"0\" ? \"\" : entryLabel.Text;\n        text += (sender as Button).Text;\n\n        if (text == \".\")\n        {\n            text = \"0.\";\n        }\n\n        double number;\n        if (Double.TryParse(text, out number))\n        {\n            entryLabel.Text = text;\n        }\n        else\n        {\n            Beeper.Error();\n        }\n    };\n    mainGrid.Children.Add(button, numButtonInfo.col,\n                                  numButtonInfo.col + numButtonInfo.span,\n                                  numButtonInfo.row,\n                                  numButtonInfo.row + 1);\n}\n```\n\nThe `Clicked` handler appends the text of the pressed `Button` to the `Text` property of the `entryLabel` object. It uses the `Double.TryParse` method to determine if the new text string is a valid representation of a number. Only a couple special cases need to be handled: You can’t begin by typing a series of zeroes, and if you begin with a decimal point, a zero is automatically prepended.\n\nAt this point, you can type numbers into the calculator but there’s no way to backspace, so the numbers keep getting longer.\n\nA Xamarin.Forms `Button` in an iOS program doesn’t have a border by default, so these number keys don’t look much like actual buttons. Setting the `BorderWidth` property can fix that. It can be done in the code above, or a uniform property setting can be applied to visual elements by defining a `Style` object.\n\nThe first step is to instantiate a `ResourceDictionary` for the page:\n\n```csharp\nvar resourceDictionary = new ResourceDictionary();\npage.Resources = resourceDictionary;\n```\n\nThe following `Style` object has a target type of `Button` (specified in its constructor) and includes a `Setter` object that associates the `ButtonWidthProperty` bindable property with a value of 1:\n\n```csharp\nvar buttonStyle = new Style(typeof(Button));\nbuttonStyle.Setters.Add(new Setter\n{\n    Property = Button.BorderWidthProperty,\n    Value = 1\n});\n```\n\nThe following code adds the `Style` object to the `ResourceDictionary` but without specifying a dictionary key.\n\n```csharp\nresourceDictionary.Add(buttonStyle);\n```\n\nIf a `Style` is added to the `ResourceDictionary` without a key, a dictionary key is generated automatically and the `Style` becomes an implicit style: It is applied to every `Button` on the page without being explicitly referenced by the `Button`, as you’ll see when you execute the code.\n\nThese `Button` elements for the numeric keypad are a little smaller than they would be normally because they were given a `Margin` setting when they were created. This is to help make the number keys stand out a little from the other keys.\n\n## Managing the Stack\n\nAn RPN calculator is based around a stack, and fortunately a generic `Stack` class is included in the `System.Collections.Generic` namespace. This code instantiates it:\n\n```csharp\nvar stack = new Stack<double>();\n```\n\nThe `Stack` class defines two basic methods: `Push` to add an item to the stack, and `Pop` to remove it. The last item pushed on the stack is the first item popped. `Stack` also defines a `Peek` method that allows examining the most recently pushed item without popping it. The only other member of `Stack<T>` that this program uses is `Count` to obtain the number of items in the stack.\n\nWhen using an RPN calculator, it’s useful to see the a couple items in this stack. The top two items are often referred to as *x* (the number last pushed onto the stack) and *y* (the previous number pushed on the stack). Because displaying these items requires column widths different from the rest of the `Grid`, a new `Grid` is created named `stackGrid` that is nested in the original `Grid`:\n\n```csharp\nvar stackGrid = new Grid();\nstackGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto } );\nstackGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto } );\nstackGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto } );\nstackGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) } );\nmainGrid.Children.Add(stackGrid, 0, 4, 0, 1);\n```\n\nThis nested `Grid` occupies the top row of `mainGrid`, and fills its full width.\n\nThe following code adds four `Label` elements to this nested `Grid` for displaying the top two items in the stack:\n\n```csharp\nvar xLabel = new Label { Text = \"x = \" };\nstackGrid.Children.Add(xLabel, 0, 1);\n\nvar xStackNumber = new Label { HorizontalTextAlignment = TextAlignment.End };\nstackGrid.Children.Add(xStackNumber, 1, 1);\n\nvar yLabel = new Label { Text = \"y = \" };\nstackGrid.Children.Add(yLabel, 0, 0);\n\nvar yStackNumber = new Label { HorizontalTextAlignment = TextAlignment.End };\nstackGrid.Children.Add(yStackNumber, 1, 0);\n```\n\nHere is a method that updates this display based on the top two items in the `stack` object:\n\n```csharp\nvoid UpdateStackDisplay()\n{\n    xStackNumber.Text = stack.Count > 0 ? stack.Peek().ToString() : \"\";\n\n    if (stack.Count > 1)\n    {\n        double hold = stack.Pop();\n        yStackNumber.Text = stack.Peek().ToString();\n        stack.Push(hold);\n    }\n    else\n    {\n        yStackNumber.Text = \"\";\n    }\n}\n```\n\nSo far, the `stack` object has been empty. The following code adds the all-important **Enter** button, which is positioned at the bottom of the main `Grid`:\n\n```csharp\nvar enterButton = new Button\n{\n    Text = \"Enter\"\n};\nenterButton.Clicked += (args, sender) => \n{ \n    stack.Push(Double.Parse(entryLabel.Text));\n    entryLabel.Text = \"0\";\n    UpdateStackDisplay();\n};\nmainGrid.Children.Add(enterButton, 0, 4, 11, 12);\n```\n\nYou can now enter a number, and press the **Enter** key. The number disappears from the `entryLabel` and is moved to the **x** slot in the stack. Entering another number causes the number in the **x** slot to move to **y**, and the new number to move to **x**. With subsequent numbers, the process continues, although you can’t see the earlier entries.\n\n## Clearing and Backspacing\n\nThe calculator needs a few buttons for some standard calculator housekeeping. Here is the **Clear** button:\n\n```csharp\nvar clearAllButton = new Button { Text = \"C\" };\nclearAllButton.Clicked += (args, sender) =>\n{\n    stack.Clear();\n    entryLabel.Text = \"0\";\n    UpdateStackDisplay();\n};\nmainGrid.Children.Add(clearAllButton, 0, 6);\n```\n\nThis is the **Clear Entry** button that only clears the number from the `entryLabel`:\n\n```csharp\nvar clearEntryButton = new Button { Text = \"CE\" };\nclearEntryButton.Clicked += (args, sender) =>\n{\n    entryLabel.Text = \"0\";\n};\nmainGrid.Children.Add(clearEntryButton, 1, 6);\n```\n\nThe following button is a **Backspace** that progressively removes characters from the tail end of the `entryLabel`:\n\n```csharp\nvar backspaceButton = new Button { Text = \"\\x21E6\" };\nbackspaceButton.Clicked += (args, sender) =>\n{\n    entryLabel.Text = entryLabel.Text.Substring(0, entryLabel.Text.Length - 1);\n    if (entryLabel.Text.Length == 0)\n    {\n        entryLabel.Text = \"0\";\n    }\n};\nmainGrid.Children.Add(backspaceButton, 2, 4, 6, 7);\n```\n\n## Binary Operations\n\nAll the other buttons perform operations of sorts on the numbers in the stack. These operations can be divided into *unary* operations and *binary* operations. A unary operation pops the top number off the stack, performs an operation on it (such as *log* or *sin*). and pushes the result back on the stack.\n\nThe binary operations include addition and multiplication. A binary operation is performed on the top two numbers on the stack, and then pushes the result back on the stack. The one exception to this rule is a binary operation that swaps the top two numbers on the stack, usually symbolized as X**↔Y**. Here’s that button:\n\n```csharp\nvar swapButton = new Button { Text = \"x\\x21D4y\"};\nswapButton.Clicked += (args, sender) =>\n{\n    if (stack.Count < 2)\n    {\n        Beeper.Error();\n    }\n    else\n    {\n        double x = stack.Pop();\n        double y = stack.Pop();\n        stack.Push(x);\n        stack.Push(y);\n        UpdateStackDisplay();\n    }\n};\nmainGrid.Children.Add(swapButton, 1, 5);\n```\n\nThe other binary operations are similar enough that they can all be handled with logic that differes only by the operaton itself. These binary operations are of type `Func<double, double, double>`, a method that has two `double` parameters and returns a `double` result. The operaton can be stored right in the `Button` object using a class that derives from `Button` with a property of that type:\n\n```csharp\nclass BinaryOperationButton : Button\n{\n    public Func<double, double, double> Operation { set; get; }\n}\n```\n\nThe five binary operations are division, multiplication, subtraction, addition, and y-to-the-x power.  The following little structure is used for an array that contains the text of each `Button`, its row and column, and the binary operation:\n\n```csharp\nstruct BinaryOpInfo\n{\n    public string Text { set; get; }\n    public int Row { set; get; }\n    public int Col { set; get; }\n    public Func<double, double, double> Operation { set; get; }\n}\n\nBinaryOpInfo[] binaryOpInfos = \n{\n    new BinaryOpInfo { Text = \"\\x00F7\", Row = 7, Col = 3, Operation = (x, y) => x / y },\n    new BinaryOpInfo { Text = \"\\x00D7\", Row = 8, Col = 3, Operation = (x, y) => x * y },\n    new BinaryOpInfo { Text = \"\\x2013\", Row = 9, Col = 3, Operation = (x, y) => x - y },\n    new BinaryOpInfo { Text = \"+\", Row = 10, Col = 3, Operation = (x, y) => x + y },\n    new BinaryOpInfo { Text = \"y\\x1D61\", Row = 2, Col = 0, Operation = Math.Pow } \n}\n```\n\nNotice that the operation is defined as a lambda function for the four basic operations, but the y-to-the-x operation is the static `Math.Pow` method.\n\nThe following code uses that array to create the five binary operation `Button` objects and add them to the `Grid`.\n\n```csharp\nforeach (BinaryOpInfo binaryOpInfo in binaryOpInfos)\n{\n    var binaryOpButton = new BinaryOperationButton\n    {\n        Text = binaryOpInfo.Text,\n        Operation = binaryOpInfo.Operation,\n        Style = buttonStyle\n    };\n    binaryOpButton.Clicked += (sender, args) =>\n    {\n        if (entryLabel.Text != \"0\")\n        {\n            stack.Push(Double.Parse(entryLabel.Text));\n            entryLabel.Text = \"0\";\n        }\n        if (stack.Count < 2)\n        {\n            Beeper.Error();\n        }\n        else\n        {\n            BinaryOperationButton button = sender as BinaryOperationButton;\n            double x = stack.Pop();\n            double y = stack.Pop();\n            stack.Push(button.Operation(y, x));\n            UpdateStackDisplay();\n        }\n    };\n    mainGrid.Children.Add(binaryOpButton, binaryOpInfo.Col, binaryOpInfo.Row);\n}\n```\n\nThe first `if` clause in the event handler isn’t strictly required but makes using the calculator a little easier. For example, suppose you type a number, and press **Enter**, and then a second number, and press the addition key. In theory that shouldn’t work because the second number isn’t on the stack. But the code in the first `if` clause pushes the number on the stack for the operation.\n\n## Unary Operations\n\nThe unary operations are handled similarly to the binary operations. A unary operation is of type `Func<double, double>`, and this derived class defines a property of that type:\n\n```csharp\nclass UnaryOperationButton : Button\n{\n    public Func<double, double> Operation { set; get; }\n}\n```\n\nOnce again, a little structure is defined for the unique characteristics of each unary operation `Button`. Most of these can be handled by static methods in the `Math` class:\n\n```csharp\nstruct UnaryOpInfo\n{\n    public string Text { set; get; }\n    public int Row { set; get; }\n    public int Col { set; get; }\n    public Func<double, double> Operation { set; get; }\n}\n\nUnaryOpInfo[] unaryOpInfos = \n{\n    new UnaryOpInfo { Text = \"log\", Row = 2, Col = 1, Operation = Math.Log10 },\n    new UnaryOpInfo { Text = \"ln\", Row = 2, Col = 2, Operation = Math.Log },\n    new UnaryOpInfo { Text = \"e\\x1D61\", Row = 2, Col = 3, Operation = Math.Exp },\n    new UnaryOpInfo { Text = \"\\x221Ax\", Row = 3, Col = 0, Operation = Math.Sqrt },\n    new UnaryOpInfo { Text = \"sin\", Row = 3, Col = 1, Operation = Math.Sin },\n    new UnaryOpInfo { Text = \"cos\", Row = 3, Col = 2, Operation = Math.Cos },\n    new UnaryOpInfo { Text = \"tan\", Row = 3, Col = 3, Operation = Math.Tan },\n    new UnaryOpInfo { Text = \"1/x\", Row = 4, Col = 0, Operation = x => 1 / x },\n    new UnaryOpInfo { Text = \"asin\", Row = 4, Col = 1, Operation = Math.Asin },\n    new UnaryOpInfo { Text = \"acos\", Row = 4, Col = 2, Operation = Math.Acos },\n    new UnaryOpInfo { Text = \"atan\", Row = 4, Col = 3, Operation = Math.Atan },\n    new UnaryOpInfo { Text = \"+/\\x2013\", Row = 5, Col = 0, Operation = x => -x },\n    new UnaryOpInfo { Text = \"rad\", Row = 5, Col = 2, Operation = d => Math.PI * d / 180 },\n    new UnaryOpInfo { Text = \"deg\", Row = 5, Col = 3, Operation = r => 180 * r / Math.PI }\n}\n```\n\nThe trigonometric functions work with radians, so the final two unary operations in the array convert from degrees to radians, and from radians to degrees. The numeric keypad has no way to type negative numbers, so the **\\+/–** key (third from bottom) changes a positive number on the stack to a negative one.\n\nThe following code creates all the `Button` elements for the unary operations:\n\n```csharp\nforeach (UnaryOpInfo unaryOpInfo in unaryOpInfos)\n{\n    var unaryOpButton = new UnaryOperationButton\n    {\n        Text = unaryOpInfo.Text,\n        Operation = unaryOpInfo.Operation,\n        Style = buttonStyle\n    };\n    unaryOpButton.Clicked += (sender, args) =>\n    {\n        if (entryLabel.Text != \"0\")\n        {\n            stack.Push(Double.Parse(entryLabel.Text));\n            entryLabel.Text = \"0\";\n        }\n        if (stack.Count < 1)\n        {\n            Beeper.Error();\n        }\n        else\n        {\n            UnaryOperationButton button = sender as UnaryOperationButton;\n            double x = stack.Pop();\n            stack.Push(button.Operation(x));\n            UpdateStackDisplay();\n        }\n    };\n    mainGrid.Children.Add(unaryOpButton, unaryOpInfo.Col, unaryOpInfo.Row);\n}\n```\n\nThat completes the RPN calculator."
  },
  {
    "path": "xamarin-forms/advanced/RPNCalculator/RpnCalculator.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: FED481A0-3465-4A72-87F1-4335D7F0C9DB\ntitle: Building a Xamarin.Forms RPN Calculator\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Building a Xamarin.Forms RPN Calculator\n\nThis workbook describes how to use the `Grid` layout in Xamarin.Forms as the foundation for a calculator. The `Grid` arranges visual elements in rows and columns, so it is ideal for arranging the calculator buttons and elements on the page. To keep the operational logic reasonably simple, this calculator uses Reverse Polish notation (RPN).\n\n## What is RPN?\n\nAround the year 1924, Polish mathematician Jan Łukasiewicz (1878 – 1956) developed a type of notation for logic and arithmetic operations that did not require the use of parentheses. For example, the expression\n\n5 × (3 \\+ 4) – 2\n\nis written in Łukasiewicz’s notaton like this\n\n– × 5 \\+ 3 4 2\n\nThis statement is evaluated starting from the end of the expression. It’s convenient to use the last-in-first-out storage mechanism known as the *stack*. The numbers (starting from the end of the expression) are pushed on a stack. Every time one of the operators is encountered, the two numbers at the top of the stack are popped, and the operator is applied to them. The result is pushed back on the stack. In this example, 2, 4, and 3 are pushed on the stack, and then the plus sign causes 4 and 3 to be popped from the stack and 7 to be pushed on the stack. Now 5 is pushed on the stack, but the multiplication causes 5 and 7 to be popped from the stack and the product, 35, is pushed on the stack. Now the minus sign causes 35 and 2 to be popped from the stack, and the result is 33.\n\nThis is sometimes known as *prefix notation*, but in honor of its inventor — and because his name can be challenging to spell — it’s often called *Polish notation*.\n\nIn the digital computer age, it was realized that it makes more sense to evaluate an expression from the beginning (particularly if the expression can grow as it’s being evaluated), and Reverse Polish notation was born. In RPN (also called postfix notation), the above expression is written as:\n\n5 3 4 \\+ × 2 –\n\nNow the numbers from left to write are pushed on a stack, and a binary operation causes the top two numbers on the stack to be popped, and the result to be pushed on the stack. Because multiplication is commutative, the statement can also be written as:\n\n3 4 \\+ 5 × 2 –\n\nDuring the 1970s and 1980s, some popular calculators used RPN, most notably those manufactured by Hewlett-Packard. Many people with a mathematical or computer bent remain fans of RPN to this day. The Calculator program included with recent versions of macOS has an RPN mode.\n\nRPN calculators are characterized by the presence of an **Enter** button rather than an **=** button or parentheses buttons. Pressing the **Enter** key indicates that the number being typed by the user is ready to be pushed on the internal stack.\n\nWhen programming a calculator, basing it on RPN simplifies the operational logic considerably. Very little state information needs to be maintained other than the stack. In a Xamarin.Forms program, you can use a `Stack<double>` object for this purpose.\n\n## The iOS Prerequisites\n\nAs usual, a Xamarin.Forms workbook requires the Xamairn.Forms NuGet package.\n\nNow use the **#r** command to reference the following Xamarin.Forms assemblies:\n\n```csharp\n#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n```\n\nYou’ll also want a few standard `using` directives:\n\n```csharp\nusing System;\nusing System.Collections.Generic; // for Stack<T>\nusing Xamarin.Forms;\n```\n\nWorkbooks has already initialized Xamarin.Forms, so `Application.Current.MainPage` can be set directly:\n\n```csharp\nvar page = new ContentPage();\nApplication.Current.MainPage = page;\n```\n\nWith that code, the Xamarin.Forms `ContentPage` is displayed.\n\n## Grid Rows and Columns\n\nThe calculator consists of `Button` elements to enter numbers and operations, and `Label` elements to display intermediate and final results. Each of these elements occupies one or more cells of a `Grid`, which divides the area it occupies into rows and columns. You can create the `Grid` and set it to the `Content` property of the `ContentPage` like this:\n\n```csharp\nvar mainGrid = new Grid();\npage.Content = mainGrid;\n```\n\nThe `Grid` occupies the entire area of the page, but it’s invisible by default so you can’t see it. You might want to temporarily set the background color of the `Grid` by replacing the `Transparent` identifier below with one of the Xamarin.Forms colors (such as `Yellow`):\n\n```csharp\nmainGrid.BackgroundColor = Color.Transparent;\n```\n\nThe calculator buttons will look a little better if you give the entire page some padding that provides a little blank space around the perimeter. Also, for iOS, you’ll want to add 20 units padding on the top to avoid overwriting the iOS status bar:\n\n```csharp\npage.Padding = new Thickness(10, 10 + Device.OnPlatform(20, 0, 0), 10, 10);\n```\n\nAlternatively, you can set the `Margin` property of the `mainGrid` object.\n\nGenerally you explicitly specify the number of rows and columns in the `Grid` using objects of type `RowDefinition` and `ColumnDefinition`. You add these objects to the `RowDefinitions` and `ColumnDefinitions` collection properties of the `Grid`.\n\nThe following code creates twelve `RowDefinition` objects. `RowDefinition` has a `Height` property that you set to a value of type `GridLength`:\n\n```csharp\n// Remove previous RowDefinition objects on re-execution:\nmainGrid.RowDefinitions.Clear();\n\nmainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });\nmainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });\n\nfor (int row = 0; row < 10; row++)\n{\n    mainGrid.RowDefinitions.Add(new RowDefinition \n    { \n        Height = new GridLength(1, GridUnitType.Star) \n    });\n}\n```\n\nThe `GridLength.Auto` constant indicates that the height is based on the height of the elements in that row. As you’ll see, those two rows are used for `Label` element. The `GridUnitType.Star` enumeration member indicates that remaining space is allocated proportionally among rows with that height indication. These ten rows are for `Button` elements, and ensures that they all have the same height. Another option is `GridUnitType.Absolute` for a specific height in device-independent units.\n\nThe following code gives the `Grid` four columns of equal width:\n\n```csharp\n// Remove previous ColumnDefinition objects on re-execution:\nmainGrid.ColumnDefinitions.Clear();\n\nfor (int col = 0; col < 4; col++)\n{\n    mainGrid.ColumnDefinitions.Add(new ColumnDefinition\n    {\n        Width = new GridLength(1, GridUnitType.Star)\n    });\n}\n```\n\nThe `Grid` provides space between adjacent cells based on the `RowSpacing` and `ColumnSpacing` properties. These properties have default values of 6 units.\n\n## Entering Numbers\n\nThe calculator needs a `Label` to display the number that the user enters. This `Label` is given a light-gray background color to make it stand out. The `HorizontalTextAlignment` setting causes the text to be right-justified within the `Label`:\n\n```csharp\nLabel entryLabel = new Label\n{\n    Text = \"0\",\n    BackgroundColor = new Color(0.85),\n    HorizontalTextAlignment = TextAlignment.End\n};\nmainGrid.Children.Add(entryLabel, 0, 4, 1, 2);\n```\n\nThe final statement adds the `Label` to the `Children` collection of the `Grid`. Notice the four numeric arguments to the `Add` statement. These four parameters are named `left`, `right`, `top`, and `bottom`, and specify the cell or cells that the element occupies. Column and row numbering is zero-based. If the element is in one cell, only the `left` and `top` arguments are required. The `right` and `bottom` arguments indicate the column and row beyond the last column or row that the element occupies. The `left` and `right` values of 0 and 4 indicate that the `Label` occupies columns 0, 1, 2, and 3, which is the full width of the `Grid`. The `top` and `bottom` values of 1 and 2 indicate that the `Label` occupies row 1, which is the second row of the `Grid`.\n\nWhen you execute that code, you’ll see the `Label` displayed in the `Grid`.\n\nThe next step is to create some buttons, but first consider that not every button press is invalid. For example, when entering a number, you can’t press the decimal point twice. The following static `Beeper.Error` method is iOS specific and is intended to notify the user of an invalid button press:\n\n```csharp\n// UNCOMMENT FOR iOS \n\n// static class Beeper\n// {\n//     static AudioToolbox.SystemSound systemSound =\n//         systemSound = new AudioToolbox.SystemSound(1000);\n// \n//     public static void Error()\n//     {\n//         systemSound.PlaySystemSound();\n//     }\n// }\n```\n\nA calculator number pad has ten `Button` elements for the digits 0 through 9, and another `Button` for the decimal point. One approach to creating several similar elements for a `Grid` is to first define an array of `Tuple` objects. The following tuples indicate the text for each `Button` in the number pad, and the row and column numbers. The `span` value is the number of columns the `Button` occupies:\n\n```csharp\nvar numButtonInfos = new[]\n{\n    new { text = \"7\", row = 7, col = 0, span = 1 },\n    new { text = \"8\", row = 7, col = 1, span = 1 },\n    new { text = \"9\", row = 7, col = 2, span = 1 },\n    new { text = \"4\", row = 8, col = 0, span = 1 },\n    new { text = \"5\", row = 8, col = 1, span = 1 },\n    new { text = \"6\", row = 8, col = 2, span = 1 },\n    new { text = \"1\", row = 9, col = 0, span = 1 },\n    new { text = \"2\", row = 9, col = 1, span = 1 },\n    new { text = \"3\", row = 9, col = 2, span = 1 },\n    new { text = \"0\", row = 10, col = 0, span = 2 },\n    new { text = \".\", row = 10, col = 2, span = 1 }\n}\n```\n\nCreating the eleven `Button` elements can now be handled in a loop:\n\n```csharp\nforeach (var numButtonInfo in numButtonInfos)\n{\n    var button = new Button\n    {\n        Text = numButtonInfo.text,\n        Margin = new Thickness(5)\n    };\n    button.Clicked += (sender, args) =>\n    {\n        string text = entryLabel.Text == \"0\" ? \"\" : entryLabel.Text;\n        text += (sender as Button).Text;\n\n        if (text == \".\")\n        {\n            text = \"0.\";\n        }\n\n        double number;\n        if (Double.TryParse(text, out number))\n        {\n            entryLabel.Text = text;\n        }\n        else\n        {\n// UNCOMMENT FOR iOS\n//            Beeper.Error();\n        }\n    };\n    mainGrid.Children.Add(button, numButtonInfo.col,\n                                  numButtonInfo.col + numButtonInfo.span,\n                                  numButtonInfo.row,\n                                  numButtonInfo.row + 1);\n}\n```\n\nThe `Clicked` handler appends the text of the pressed `Button` to the `Text` property of the `entryLabel` object. It uses the `Double.TryParse` method to determine if the new text string is a valid representation of a number. Only a couple special cases need to be handled: You can’t begin by typing a series of zeroes, and if you begin with a decimal point, a zero is automatically prepended.\n\nAt this point, you can type numbers into the calculator but there’s no way to backspace, so the numbers keep getting longer.\n\nA Xamarin.Forms `Button` in an iOS program doesn’t have a border by default, so these number keys don’t look much like actual buttons. Setting the `BorderWidth` property can fix that. It can be done in the code above, or a uniform property setting can be applied to visual elements by defining a `Style` object.\n\nThe first step is to instantiate a `ResourceDictionary` for the page:\n\n```csharp\nvar resourceDictionary = new ResourceDictionary();\npage.Resources = resourceDictionary;\n```\n\nThe following `Style` object has a target type of `Button` (specified in its constructor) and includes a `Setter` object that associates the `ButtonWidthProperty` bindable property with a value of 1:\n\n```csharp\nvar buttonStyle = new Style(typeof(Button));\nbuttonStyle.Setters.Add(new Setter\n{\n    Property = Button.BorderWidthProperty,\n    Value = 1\n});\n```\n\nThe following code adds the `Style` object to the `ResourceDictionary` but without specifying a dictionary key.\n\n```csharp\nresourceDictionary.Add(buttonStyle);\n```\n\nIf a `Style` is added to the `ResourceDictionary` without a key, a dictionary key is generated automatically and the `Style` becomes an implicit style: It is applied to every `Button` on the page without being explicitly referenced by the `Button`, as you’ll see when you execute the code.\n\nThese `Button` elements for the numeric keypad are a little smaller than they would be normally because they were given a `Margin` setting when they were created. This is to help make the number keys stand out a little from the other keys.\n\n## Managing the Stack\n\nAn RPN calculator is based around a stack, and fortunately a generic `Stack` class is included in the `System.Collections.Generic` namespace. This code instantiates it:\n\n```csharp\nvar stack = new Stack<double>();\n```\n\nThe `Stack` class defines two basic methods: `Push` to add an item to the stack, and `Pop` to remove it. The last item pushed on the stack is the first item popped. `Stack` also defines a `Peek` method that allows examining the most recently pushed item without popping it. The only other member of `Stack<T>` that this program uses is `Count` to obtain the number of items in the stack.\n\nWhen using an RPN calculator, it’s useful to see the a couple items in this stack. The top two items are often referred to as *x* (the number last pushed onto the stack) and *y* (the previous number pushed on the stack). Because displaying these items requires column widths different from the rest of the `Grid`, a new `Grid` is created named `stackGrid` that is nested in the original `Grid`:\n\n```csharp\nvar stackGrid = new Grid();\nstackGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto } );\nstackGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto } );\nstackGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto } );\nstackGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) } );\nmainGrid.Children.Add(stackGrid, 0, 4, 0, 1);\n```\n\nThis nested `Grid` occupies the top row of `mainGrid`, and fills its full width.\n\nThe following code adds four `Label` elements to this nested `Grid` for displaying the top two items in the stack:\n\n```csharp\nvar xLabel = new Label { Text = \"x = \" };\nstackGrid.Children.Add(xLabel, 0, 1);\n\nvar xStackNumber = new Label { HorizontalTextAlignment = TextAlignment.End };\nstackGrid.Children.Add(xStackNumber, 1, 1);\n\nvar yLabel = new Label { Text = \"y = \" };\nstackGrid.Children.Add(yLabel, 0, 0);\n\nvar yStackNumber = new Label { HorizontalTextAlignment = TextAlignment.End };\nstackGrid.Children.Add(yStackNumber, 1, 0);\n```\n\nHere is a method that updates this display based on the top two items in the `stack` object:\n\n```csharp\nvoid UpdateStackDisplay()\n{\n    xStackNumber.Text = stack.Count > 0 ? stack.Peek().ToString() : \"\";\n\n    if (stack.Count > 1)\n    {\n        double hold = stack.Pop();\n        yStackNumber.Text = stack.Peek().ToString();\n        stack.Push(hold);\n    }\n    else\n    {\n        yStackNumber.Text = \"\";\n    }\n}\n```\n\nSo far, the `stack` object has been empty. The following code adds the all-important **Enter** button, which is positioned at the bottom of the main `Grid`:\n\n```csharp\nvar enterButton = new Button\n{\n    Text = \"Enter\"\n};\nenterButton.Clicked += (args, sender) => \n{ \n    stack.Push(Double.Parse(entryLabel.Text));\n    entryLabel.Text = \"0\";\n    UpdateStackDisplay();\n};\nmainGrid.Children.Add(enterButton, 0, 4, 11, 12);\n```\n\nYou can now enter a number, and press the **Enter** key. The number disappears from the `entryLabel` and is moved to the **x** slot in the stack. Entering another number causes the number in the **x** slot to move to **y**, and the new number to move to **x**. With subsequent numbers, the process continues, although you can’t see the earlier entries.\n\n## Clearing and Backspacing\n\nThe calculator needs a few buttons for some standard calculator housekeeping. Here is the **Clear** button:\n\n```csharp\nvar clearAllButton = new Button { Text = \"C\" };\nclearAllButton.Clicked += (args, sender) =>\n{\n    stack.Clear();\n    entryLabel.Text = \"0\";\n    UpdateStackDisplay();\n};\nmainGrid.Children.Add(clearAllButton, 0, 6);\n```\n\nThis is the **Clear Entry** button that only clears the number from the `entryLabel`:\n\n```csharp\nvar clearEntryButton = new Button { Text = \"CE\" };\nclearEntryButton.Clicked += (args, sender) =>\n{\n    entryLabel.Text = \"0\";\n};\nmainGrid.Children.Add(clearEntryButton, 1, 6);\n```\n\nThe following button is a **Backspace** that progressively removes characters from the tail end of the `entryLabel`:\n\n```csharp\nvar backspaceButton = new Button { Text = \"\\x21E6\" };\nbackspaceButton.Clicked += (args, sender) =>\n{\n    entryLabel.Text = entryLabel.Text.Substring(0, entryLabel.Text.Length - 1);\n    if (entryLabel.Text.Length == 0)\n    {\n        entryLabel.Text = \"0\";\n    }\n};\nmainGrid.Children.Add(backspaceButton, 2, 4, 6, 7);\n```\n\n## Binary Operations\n\nAll the other buttons perform operations of sorts on the numbers in the stack. These operations can be divided into *unary* operations and *binary* operations. A unary operation pops the top number off the stack, performs an operation on it (such as *log* or *sin*). and pushes the result back on the stack.\n\nThe binary operations include addition and multiplication. A binary operation is performed on the top two numbers on the stack, and then pushes the result back on the stack. The one exception to this rule is a binary operation that swaps the top two numbers on the stack, usually symbolized as X**↔Y**. Here’s that button:\n\n```csharp\nvar swapButton = new Button { Text = \"x\\x21D4y\"};\nswapButton.Clicked += (args, sender) =>\n{\n    if (stack.Count < 2)\n    {\n// UNCOMMENT FOR iOS\n//            Beeper.Error();\n    }\n    else\n    {\n        double x = stack.Pop();\n        double y = stack.Pop();\n        stack.Push(x);\n        stack.Push(y);\n        UpdateStackDisplay();\n    }\n};\nmainGrid.Children.Add(swapButton, 1, 5);\n```\n\nThe other binary operations are similar enough that they can all be handled with logic that differes only by the operaton itself. These binary operations are of type `Func<double, double, double>`, a method that has two `double` parameters and returns a `double` result. The operaton can be stored right in the `Button` object using a class that derives from `Button` with a property of that type:\n\n```csharp\nclass BinaryOperationButton : Button\n{\n    public Func<double, double, double> Operation { set; get; }\n}\n```\n\nThe five binary operations are division, multiplication, subtraction, addition, and y-to-the-x power.  The following little structure is used for an array that contains the text of each `Button`, its row and column, and the binary operation:\n\n```csharp\nstruct BinaryOpInfo\n{\n    public string Text { set; get; }\n    public int Row { set; get; }\n    public int Col { set; get; }\n    public Func<double, double, double> Operation { set; get; }\n}\n\nBinaryOpInfo[] binaryOpInfos = \n{\n    new BinaryOpInfo { Text = \"\\x00F7\", Row = 7, Col = 3, Operation = (x, y) => x / y },\n    new BinaryOpInfo { Text = \"\\x00D7\", Row = 8, Col = 3, Operation = (x, y) => x * y },\n    new BinaryOpInfo { Text = \"\\x2013\", Row = 9, Col = 3, Operation = (x, y) => x - y },\n    new BinaryOpInfo { Text = \"+\", Row = 10, Col = 3, Operation = (x, y) => x + y },\n    new BinaryOpInfo { Text = \"y\\x1D61\", Row = 2, Col = 0, Operation = Math.Pow } \n}\n```\n\nNotice that the operation is defined as a lambda function for the four basic operations, but the y-to-the-x operation is the static `Math.Pow` method.\n\nThe following code uses that array to create the five binary operation `Button` objects and add them to the `Grid`.\n\n```csharp\nforeach (BinaryOpInfo binaryOpInfo in binaryOpInfos)\n{\n    var binaryOpButton = new BinaryOperationButton\n    {\n        Text = binaryOpInfo.Text,\n        Operation = binaryOpInfo.Operation,\n        Style = buttonStyle\n    };\n    binaryOpButton.Clicked += (sender, args) =>\n    {\n        if (entryLabel.Text != \"0\")\n        {\n            stack.Push(Double.Parse(entryLabel.Text));\n            entryLabel.Text = \"0\";\n        }\n        if (stack.Count < 2)\n        {\n// UNCOMMENT FOR iOS\n//            Beeper.Error();\n        }\n        else\n        {\n            BinaryOperationButton button = sender as BinaryOperationButton;\n            double x = stack.Pop();\n            double y = stack.Pop();\n            stack.Push(button.Operation(y, x));\n            UpdateStackDisplay();\n        }\n    };\n    mainGrid.Children.Add(binaryOpButton, binaryOpInfo.Col, binaryOpInfo.Row);\n}\n```\n\nThe first `if` clause in the event handler isn’t strictly required but makes using the calculator a little easier. For example, suppose you type a number, and press **Enter**, and then a second number, and press the addition key. In theory that shouldn’t work because the second number isn’t on the stack. But the code in the first `if` clause pushes the number on the stack for the operation.\n\n## Unary Operations\n\nThe unary operations are handled similarly to the binary operations. A unary operation is of type `Func<double, double>`, and this derived class defines a property of that type:\n\n```csharp\nclass UnaryOperationButton : Button\n{\n    public Func<double, double> Operation { set; get; }\n}\n```\n\nOnce again, a little structure is defined for the unique characteristics of each unary operation `Button`. Most of these can be handled by static methods in the `Math` class:\n\n```csharp\nstruct UnaryOpInfo\n{\n    public string Text { set; get; }\n    public int Row { set; get; }\n    public int Col { set; get; }\n    public Func<double, double> Operation { set; get; }\n}\n\nUnaryOpInfo[] unaryOpInfos = \n{\n    new UnaryOpInfo { Text = \"log\", Row = 2, Col = 1, Operation = Math.Log10 },\n    new UnaryOpInfo { Text = \"ln\", Row = 2, Col = 2, Operation = Math.Log },\n    new UnaryOpInfo { Text = \"e\\x1D61\", Row = 2, Col = 3, Operation = Math.Exp },\n    new UnaryOpInfo { Text = \"\\x221Ax\", Row = 3, Col = 0, Operation = Math.Sqrt },\n    new UnaryOpInfo { Text = \"sin\", Row = 3, Col = 1, Operation = Math.Sin },\n    new UnaryOpInfo { Text = \"cos\", Row = 3, Col = 2, Operation = Math.Cos },\n    new UnaryOpInfo { Text = \"tan\", Row = 3, Col = 3, Operation = Math.Tan },\n    new UnaryOpInfo { Text = \"1/x\", Row = 4, Col = 0, Operation = x => 1 / x },\n    new UnaryOpInfo { Text = \"asin\", Row = 4, Col = 1, Operation = Math.Asin },\n    new UnaryOpInfo { Text = \"acos\", Row = 4, Col = 2, Operation = Math.Acos },\n    new UnaryOpInfo { Text = \"atan\", Row = 4, Col = 3, Operation = Math.Atan },\n    new UnaryOpInfo { Text = \"+/\\x2013\", Row = 5, Col = 0, Operation = x => -x },\n    new UnaryOpInfo { Text = \"rad\", Row = 5, Col = 2, Operation = d => Math.PI * d / 180 },\n    new UnaryOpInfo { Text = \"deg\", Row = 5, Col = 3, Operation = r => 180 * r / Math.PI }\n}\n```\n\nThe trigonometric functions work with radians, so the final two unary operations in the array convert from degrees to radians, and from radians to degrees. The numeric keypad has no way to type negative numbers, so the **\\+/–** key (third from bottom) changes a positive number on the stack to a negative one.\n\nThe following code creates all the `Button` elements for the unary operations:\n\n```csharp\nforeach (UnaryOpInfo unaryOpInfo in unaryOpInfos)\n{\n    var unaryOpButton = new UnaryOperationButton\n    {\n        Text = unaryOpInfo.Text,\n        Operation = unaryOpInfo.Operation,\n        Style = buttonStyle\n    };\n    unaryOpButton.Clicked += (sender, args) =>\n    {\n        if (entryLabel.Text != \"0\")\n        {\n            stack.Push(Double.Parse(entryLabel.Text));\n            entryLabel.Text = \"0\";\n        }\n        if (stack.Count < 1)\n        {\n// UNCOMMENT FOR iOS\n//            Beeper.Error();\n        }\n        else\n        {\n            UnaryOperationButton button = sender as UnaryOperationButton;\n            double x = stack.Pop();\n            stack.Push(button.Operation(x));\n            UpdateStackDisplay();\n        }\n    };\n    mainGrid.Children.Add(unaryOpButton, unaryOpInfo.Col, unaryOpInfo.Row);\n}\n```\n\nThat completes the RPN calculator."
  },
  {
    "path": "xamarin-forms/advanced/meta.json",
    "content": "{\n  \"order\":{\n    \"MandelbrotTouch.workbook\":\"Mandelbrot Touch\",\n    \"RPNCalculator/RpnCalculator.workbook\":\"RPN Calculator\"\n  }\n}\n"
  },
  {
    "path": "xamarin-forms/application-fundamentals/database/database.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n#r \"SQLite-net\"\n\n\nusing System;\nusing Xamarin.Forms;\nusing SQLite;\nusing SQLitePCL;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/application-fundamentals/database/database.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 6AA7FBF5-DF9D-4F0A-B890-15391D71FE9E\ntitle: Accessing a Local Database with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n- id: sqlite-net-pcl\n  version: 1.4.118\n---\n\n# Accessing a Local Database\n\nXamarin.Forms applications can read and write data to a local SQLite database by using the `SQLite.Net` NuGet package.\n\n## Initializing the Workbook\n\nTo use SQLite.Net in Xamarin Workbooks, you must:\n\n* Add the `sqlite-net-pcl` NuGet package to the Workbook.\n\n* Use the `#r` command to reference the `SQLite-net`, `SQLitePCL.raw`, and `SQLitePCL.batteries` assemblies.\n\n* Add a `using` directive to reference the `SQLite` assembly.\n\nThese steps have been performed in this workbook.\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Xamarin.Forms;\nusing SQLite;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Creating the Model\n\nThis workbook uses the `TodoItem` class to model the data that's stored in the SQLite database:\n\n```csharp\n[Table(\"todoitem\")]\npublic class TodoItem\n{\n  [PrimaryKey, AutoIncrement]\n  public int ID { get; set; }\n  public string Name { get; set; }\n  public string Notes { get; set; }\n  public bool Done { get; set; }\n}\n```\n\nThe database schema is defined through attributes that are applied to the class and the `ID` property:\n\n* The `Table` attribute identifies which table the `TodoItem` class is mapped to in SQLite.\n* The `PrimaryKey` attribute uniquely identifies each table row.\n* The `AutoIncrement` attribute causes an integer's value to automatically increment when a new row is inserted into the table.\n\nTherefore, the `ID` property is used to uniquely identify each row in the `todoitem` table, and will be automatically incremented each time a row is inserted into the table.\n\n> ℹ️ Insert, update, and delete operations all require a primary key to be defined.\n\n\n## Creating a Database Connection\n\nTo perform database operations, a connection to an SQLite database file must be established. This is accomplished with the `GetConnection` method:\n\n```csharp\npublic SQLiteConnection GetConnection()\n{\n  var sqliteFilename = \"TodoSQLite.db3\";\n  string documentsPath =\n    Environment.GetFolderPath(Environment.SpecialFolder.Personal);\n  string libraryPath = Path.Combine(documentsPath, \"..\", \"Library\");\n  var path = Path.Combine(libraryPath, sqliteFilename);\n\n  return new SQLiteConnection(path);\n}\n```\n\nThis method places the SQLite database file in the **Library** folder within the application's sandbox.\n\n> ℹ️ In a Xamarin Studio or Visual Studio Xamarin.Forms solution, the `GetConnection` method should reside in the iOS platform project, and be invoked from the Xamarin.Forms project using the `DependencyService` class. For more information, see [Working with a Local Database](https://developer.xamarin.com/guides/xamarin-forms/working-with/databases/).\n\n\nThe `GetConnection` method is invoked as follows:\n\n```csharp\nSQLiteConnection database = GetConnection();\ndatabase.CreateTable<TodoItem>();\n```\n\nOnce a database connection is established, the `todoitem` table is created with the `CreateTable<T>` method. This method operates on an `SQLiteConnection` object, and specifies the class which maps to the underlying database table.\n\n> ℹ️  \n> * A table is only created once per entity. If the table already exists, `CreateTable<T>` has no effect.\n>\n> * Existing tables are automatically updated with new columns when `CreateTable<T>` is called based on the current schema and the attributed class. This auto-upgrade will not change the schema in another other way.\n\n\n## Defining Database Operations\n\nOnce the table is created, create-read-update-delete (CRUD) operations can be performed on it by writing methods that use the `SQLiteConnection` instance.\n\nThe simplest approach for retrieving records from a table is to use the `Table<T>` method on the `SQLiteConnection` instance, with a LINQ extension method such as `ToList` or `FirstOrDefault`. This will execute the query and return the results.\n\nAlternatively, the `Query<T>` method can be used to execute a raw SQL query. The following code shows both approaches:\n\n```csharp\nstatic object locker = new object();\n\npublic IEnumerable<TodoItem> GetItems()\n{\n  lock (locker)\n  {\n    return (from i in database.Table<TodoItem>() select i).ToList();\n  }\n}\n\npublic IEnumerable<TodoItem> GetItemsNotDone()\n{\n  lock (locker)\n  {\n    return database.Query<TodoItem>(\"SELECT * FROM [TodoItem] WHERE [Done] = 0\");\n  }\n}\n\npublic TodoItem GetItem(int id)\n{\n  lock (locker)\n  {\n    return database.Table<TodoItem>().FirstOrDefault(x => x.ID == id);\n  }\n}\n```\n\nInsert, update, and delete operations are performed with the `Insert`, `Update`, and `Delete` methods on the `SQLiteConnection` instance:\n\n```csharp\npublic int SaveItem(TodoItem item)\n{\n  lock (locker)\n  {\n    if (item.ID != 0)\n    {\n      database.Update(item);\n      return item.ID;\n    }\n    else\n      return database.Insert(item);\n  }\n}\n\npublic int DeleteItem(int id)\n{\n  lock (locker)\n  {\n    return database.Delete<TodoItem>(id);\n  }\n}\n```\n\nThe `Insert`, `Update`, and `Delete` methods all return the number of rows that were affected by the operation.\n\n> ⚠️ Simultaneously running two database operations will most likely crash an application, and may even corrupt the database file. Therefore, a `lock` is used to guard each database operation, which ensures that only one thread uses the database connection at once.\n\n\n## Adding Data to the Database\n\nOnce database operation methods have been defined, some sample data can be created and inserted into the database:\n\n```csharp\nvar todoItem1 = new TodoItem\n{\n  Name = \"Learn Xamarin Development\",\n  Notes = \"Attend Xamarin University\",\n  Done = true\n};\nvar todoItem2 = new TodoItem\n{\n  Name = \"Develop Cross-Platform Apps\",\n  Notes = \"Use XAML\",\n  Done = false\n};\nvar todoItem3 = new TodoItem\n{\n  Name = \"Publish Apps\",\n  Notes = \"All stores\",\n  Done = false\n};\n\nSaveItem(todoItem1);\nSaveItem(todoItem2);\nSaveItem(todoItem3);\n```\n\nThis code defines three `TodoItem` instances, which are then inserted into the database using the `SaveItem` method.\n\n## Retrieving Data from the Database\n\nA `ListView` can be populated with data from the database by setting its `ItemsSource` property to the data returned by the `GetItems` method:\n\n```csharp\nvar listView = new ListView\n{\n  ItemsSource = GetItems(),\n  ItemTemplate = new DataTemplate(() =>\n  {\n    var nameLabel = new Label\n    {\n      VerticalTextAlignment = TextAlignment.Center\n    };\n    nameLabel.SetBinding(Label.TextProperty, \"Name\");\n\n    var image = new Image\n    {\n      Source = \"check.png\"\n    };\n    image.SetBinding(Image.IsVisibleProperty, \"Done\");\n\n    var templateStackLayout = new StackLayout\n    {\n      Orientation = StackOrientation.Horizontal,\n      Margin = new Thickness(20, 0, 0, 0),\n      HorizontalOptions = LayoutOptions.StartAndExpand,\n      Children = { nameLabel, image }\n    };\n\n    return new ViewCell {\n      View = templateStackLayout\n    };\n  })\n};\n\nstackLayout.Children.Add(listView);\n```\n\nThe `ListView` uses a `DataTemplate` to create a custom cell that represents each row of data, displaying the values of the `Name` and `Done` properties for each `TodoItem` instance.\n\nAlternatively, the `GetItemsNotDone` method can be invoked to retrieve all the items in the database that are not marked as having been completed:\n\n```csharp\nlistView.ItemsSource = GetItemsNotDone();\n```\n\n## Updating and Deleting Data\n\nThe `GetItem` method can be invoked to retrieve a single row from the database. The `TodoItem` instance can then have its data modified, and be updated in the database with the `SaveItem` method:\n\n```csharp\nvar todoItem = GetItem(2);\ntodoItem.Done = true;\nSaveItem(todoItem);\nlistView.ItemsSource = GetItems();\n```\n\nThis code marks the second row in the database as having been completed, and so a check mark will appear on that row when the code is executed.\n\nIn addition, the `DeleteItem` method can be invoked to remove rows from the database:\n\n```csharp\nDeleteItem(1);\nDeleteItem(2);\nDeleteItem(3);\nlistView.ItemsSource = GetItems();\n```\n\n## 👍 Try it now!\n\n* Add a `CompletedDate` property to the `TodoItem` model.\n* Rewrite the `GetItemsNotDone` method to use the `Table<T>` method to return the rows where the `Done` column is `false`.\n* Add a `GetCompletedItems` method that returns rows where the `CompletedDate` row value is greater than a specified parameter.\n\n## Further Reading\n\nFor more information about displaying a map, see [Working with a Local Database](https://developer.xamarin.com/guides/xamarin-forms/working-with/databases/).\n"
  },
  {
    "path": "xamarin-forms/application-fundamentals/files/files.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/application-fundamentals/files/files.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: C82F7D1A-AB49-473C-A97E-64DF3EB7212F\ntitle: Saving and Loading Text Files with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Saving and Loading Text Files\n\nIn Workbooks, Xamarin.Forms file handling can be performed by using the native filesystem APIs.\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\nusing System.IO;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Adding Platform-Specific FileSystem Access\n\nEach platform has different filesystem capabilities, and a slightly different directory structure. The following code can be used to save and load text files on iOS:\n\n```csharp\npublic void SaveText(string filename, string text)\n{\n  var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);\n  var filePath = Path.Combine(documentsPath, filename);\n  File.WriteAllText(filePath, text);\n}\n\npublic string LoadText(string filename)\n{\n  var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);\n  var filePath = Path.Combine(documentsPath, filename);\n  return File.ReadAllText(filePath);\n}\n```\n\nThe `SaveText` and `LoadText` methods use `System.IO` functionality to save and load text:\n\n* The `File.WriteAllText` method creates a new file, writes the contents to the file, and then closes the file. If the target file already exists, it's overwritten.\n* The `File.ReadAllText` method opens a text file, reads all the lines of the file into a string, and then closes the file.\n\nText is saved to, or loaded from, the folder represented by the `Environment.SpecialFolder.Personal` enumeration constant. This constant identifies the directory that serves as a common repository for documents.\n\n> ℹ️ In a Xamarin Studio or Visual Studio Xamarin.Forms solution, the `SaveText` and `LoadText` methods should reside in the iOS platform project, and be invoked from the Xamarin.Forms project using the `DependencyService` class. For more information, see  [Working with Files](https://developer.xamarin.com/guides/xamarin-forms/working-with/files/).\n\n\n## Invoking the Platform-Specific FileSystem Access Methods\n\nThe `SaveText` and `LoadText` methods can be invoked from Xamarin.Forms to save and load text files:\n\n```csharp\nvar inputEntry = new Entry\n{\n  Placeholder = \"Enter text here\"\n};\nvar outputEntry = new Entry\n{\n  IsEnabled = false\n};\n\nvar loadButton = new Button\n{\n  Text = \"Load\",\n  IsEnabled = false\n};\nloadButton.Clicked += (sender, e) =>\n{\n  outputEntry.Text = LoadText(\"temp.txt\");\n};\n\nvar saveButton = new Button\n{\n  Text = \"Save\"\n};\nsaveButton.Clicked += (sender, e) =>\n{\n  SaveText(\"temp.txt\", inputEntry.Text);\n  loadButton.IsEnabled = true;\n};\n\nstackLayout.Children.Add(inputEntry);\nstackLayout.Children.Add(saveButton);\nstackLayout.Children.Add(loadButton);\nstackLayout.Children.Add(outputEntry);\n```\n\nWhen the `saveButton` is clicked, the platform-specific `SaveText` method is invoked, and when the `loadButton` is clicked, the platform-specific `LoadText` method is invoked.\n\n## 👍 Try it now!\n\n* Change the Xamarin.Forms code to save to, and load from, a text file name `userinput.txt`.\n\n* Specify a `System.Text.Encoding` on the `File.WriteAllText` method call.\n\n* Specify the same `System.Text.Encoding` on the `File.ReadAllText` method call.\n\n\n## Further Reading\n\nFor more information about saving and loading text files, see [Working with Files](https://developer.xamarin.com/guides/xamarin-forms/working-with/files/).\n"
  },
  {
    "path": "xamarin-forms/application-fundamentals/hierarchical-navigation/hierarchical-navigation.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar app = Application.Current;\n"
  },
  {
    "path": "xamarin-forms/application-fundamentals/hierarchical-navigation/hierarchical-navigation.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 500CEAC8-8D46-4305-A1B5-00A6C5A62BEC\ntitle: Performing Hierarchical Navigation with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Performing Hierarchical Navigation\n\nThe Xamarin.Forms `NavigationPage` class provides a hierarchical navigation experience where the user is able to navigate through pages, forwards and backwards, as desired.\n\nTo move from one page to another, an application will push a new page onto the navigation stack, where it will become the active page, as shown in the following diagram:\n\n![](pushing.png)\n\nTo return back to the previous page, the application will pop the current page from the navigation stack, and the new topmost page becomes the active page, as shown in the following diagram:\n\n![](popping.png)\n\nIn hierarchical navigation, the `NavigationPage` class is used to navigate through a stack of `ContentPage` objects.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Creating the Root page\n\nThe `MainPage` property of the `App` class should be set to a `NavigationPage` instance, with the `NavigationPage` constructor expecting a `Page` instance as an argument:\n\n```csharp\nvar firstContentPage = new ContentPage\n{\n  Title = \"First Page\"\n};\n\napp.MainPage = new NavigationPage(firstContentPage);\n```\n\n> ℹ️ In a Xamarin Studio or Visual Studio solution, the code that sets `KeyWindow.RootViewController` will be created by the project template, and will reside in the iOS project.\n\nThe first page added to the navigation stack is referred to as the *root* page of the application, and the value of the `Page.Title` property will be displayed as the page title.\n\n## Pushing Pages to the Navigation Stack\n\nForward navigation is accomplished by invoking the `PushAsync` method on the `Navigation` property of the current page:\n\n```csharp\nvar secondContentPage = new ContentPage\n{\n  Title = \"Second Page\"\n};\nawait firstContentPage.Navigation.PushAsync(secondContentPage);\n```\n\nThis causes the `secondContentPage` instance to be pushed onto the navigation stack, where it becomes the active page.\n\nWhen the `PushAsync` method is invoked, the following events occur:\n\n* The page calling `PushAsync` has its `OnDisappearing` override invoked.\n\n* The page being navigated to has its `OnAppearing` override invoked.\n\n* The `PushAsync` task completes.\n\nHowever, the precise order in which these events occur is platform dependent.\n\n> ⚠️ Calls to the `OnDisappearing` and `OnAppearing` overrides cannot be treated as guaranteed indications of page navigation. For example, on iOS, the `OnDisappearing` override is called on the active page when the application terminates.\n\n## Popping Pages from the Navigation Stack\n\nThe active page can be popped from the navigation stack by pressing the *Back* button on the device, regardless of whether it's a physical button on the device or an on-screen button.\n\nTo programmatically return to the original page, the `secondContentPage` instance must invoke the `PopAsync` method:\n\n```csharp\nawait secondContentPage.Navigation.PopAsync();\n```\n\nThis causes the `secondContentPage` instance to be removed from the navigation stack, with the new topmost page becoming the active page.\n\nWhen the `PopAsync` method is invoked, the following events occur:\n\n* The page calling `PopAsync` has its `OnDisappearing` override invoked.\n\n* The page being returned to has its `OnAppearing` override invoked.\n\n* The `PopAsync` task returns.\n\nHowever, the precise order in which these events occur is platform dependent.\n\nThe `Navigation` property of each page also provides a `PopToRootAsync` method:\n\n```csharp\nvar thirdContentPage = new ContentPage\n{\n  Title = \"Page Three\"\n};\n\nawait firstContentPage.Navigation.PushAsync(secondContentPage);\nawait secondContentPage.Navigation.PushAsync(thirdContentPage);\nawait thirdContentPage.Navigation.PopToRootAsync();\n```\n\nThis method pops all but the root `ContentPage` off the navigation stack, therefore making the root page of the application the active page.\n\n## Animating Page Transitions\n\nThe `Navigation` property of each page also provides overridden push and pop methods that include a `boolean` parameter that controls whether to display a page animation during navigation:\n\n```csharp\nawait firstContentPage.Navigation.PushAsync(secondContentPage, false);\n```\n\nSetting the `boolean` parameter to `false` disables the page-transition animation, while setting the parameter to `true` enables the page-transition animation, provided that it's supported by the the underlying platform. However, the push and pop methods that lack this parameter enable the animation by default:\n\n```csharp\nawait secondContentPage.Navigation.PopAsync();\n```\n\n## Passing Data when Navigating\n\nSometimes it's necessary for a page to pass data to another page during navigation. Two techniques for accomplishing this are passing data through a page constructor, and by setting the new page's `BindingContext` to the data.\n\n## Passing Data through a Page Constructor\n\nThe simplest technique for passing data to another page during navigation is through a page constructor parameter:\n\n```csharp\npublic class FourthContentPage : ContentPage\n{\n  public FourthContentPage(string date)\n  {\n    Title = \"Fourth Page\";\n    Content = new Label\n    {\n      Text = date,\n      HorizontalOptions = LayoutOptions.Center,\n      VerticalOptions = LayoutOptions.CenterAndExpand\n    };\n  }\n}\n\nvar fourthContentPage = new FourthContentPage(DateTime.Now.ToString(\"u\"));\nawait firstContentPage.Navigation.PushAsync(fourthContentPage);\n```\n\nThe current date and time is passed in ISO8601 format to the `FourthContentPage` constructor, where it's displayed by a `Label` instance.\n\n## Passing Data through a BindingContext\n\nAn alternative approach for passing data to another page during navigation is by setting the new page's `BindingContext` to the data:\n\n```csharp\npublic class FifthContentPage : ContentPage\n{\n  public FifthContentPage()\n  {\n    Title = \"Fifth Page\";\n    var label = new Label\n    {\n      HorizontalOptions = LayoutOptions.Center,\n      VerticalOptions = LayoutOptions.CenterAndExpand\n    };\n    label.SetBinding(Label.TextProperty, \".\");\n    Content = label;\n  }\n}\n\nawait fourthContentPage.Navigation.PopAsync();\nvar fifthContentPage = new FifthContentPage();\nfifthContentPage.BindingContext = DateTime.Now.ToString(\"u\");\nawait firstContentPage.Navigation.PushAsync(fifthContentPage);\n```\n\nThis code sets the `BindingContext` of the `FifthContentPage` instance to the current date and time in ISO8601 format and then navigates to the `FifthContentPage`, which uses data binding to display the data.\n\n## Manipulating the Navigation Stack\n\nThe `Navigation` property exposes a `NavigationStack` property from which the pages in the navigation stack can be obtained. While Xamarin.Forms maintains access to the navigation stack, the `Navigation` property provides the `InsertPageBefore` and `RemovePage` methods for manipulating the stack by inserting pages or removing them.\n\nThe `InsertPageBefore` method inserts a specified page in the navigation stack before an existing specified page, as shown in the following diagram:\n\n![](insert-page-before.png)\n\nThe `RemovePage` method removes the specified page from the navigation stack, as shown in the following diagram:\n\n![](remove-page.png)\n\nThese methods allow manipulation of the navigation stack:\n\n```csharp\nfifthContentPage.Navigation.InsertPageBefore(fourthContentPage, fifthContentPage);\nawait fifthContentPage.Navigation.PopAsync();\nfourthContentPage.Navigation.RemovePage(fourthContentPage);\n```\n\nThe `fourthContentPage` instance is inserted before the `fifthContentPage` instance using the `InsertPageBefore` method. The `PopAsync` method then removes the current page from the navigation stack, with the `fourthContentPage` instance becoming the active page. The `fourthContentPage` instance is then removed from the navigation stack with the `RemovePage` method, which makes the root page the active page.\n\n## 👍 Try it now!\n\n* Push some pages to the navigation stack, and then return to the root page without displaying page transition animations.\n\n* Pass an object containing multiple pieces of data to a page, through its `BindingContext`.\n\n* Push some pages to the navigation stack, and then remove the odd numbered pages from the stack.\n\n## Further Reading\n\nFor more information about hierarchical navigation, see [Hierarchical Navigation](https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/hierarchical/).\n"
  },
  {
    "path": "xamarin-forms/application-fundamentals/meta.json",
    "content": "{\n  \"order\":{\n    \"database/database.workbook\":\"Database\",\n    \"files/files.workbook\":\"Files\",\n    \"hierarchical-navigation/hierarchical-navigation.workbook\":\"Hierarchical Navigation\",\n    \"text-to-speech/text-to-speech.workbook\":\"Text to Speech (for iOS)\"\n  }\n}\n"
  },
  {
    "path": "xamarin-forms/application-fundamentals/text-to-speech/text-to-speech.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/application-fundamentals/text-to-speech/text-to-speech.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 520731C2-FD34-445A-96EA-A27490B66B24\ntitle: Translating Text to Speech with Xamarin.Forms (iOS)\nplatforms:\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Translating Text to Speech (iOS-specific)\n\nEach platform provides a native text to speech API that can be invoked from Xamarin.Forms. This workbook uses `AVFoundation` from iOS.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\nusing AVFoundation;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Adding a Platform-Specific Speech Method\n\nEach platform uses a different speech API. The following code, which uses the `AVFoundation` APIs, can be used to translate text to speech on iOS:\n\n```csharp\nfloat volume = 0.5f;\nfloat pitch = 1.0f;\n\npublic void Speak(string text)\n{\n  if (!string.IsNullOrWhiteSpace(text))\n  {\n    var speechSynthesizer = new AVSpeechSynthesizer();\n    var speechUtterance = new AVSpeechUtterance(text)\n    {\n      Rate = AVSpeechUtterance.MaximumSpeechRate / 3,\n      Voice = AVSpeechSynthesisVoice.FromLanguage(\"en-US\"),\n      Volume = volume,\n      PitchMultiplier = pitch\n    };\n    speechSynthesizer.SpeakUtterance(speechUtterance);\n  }\n}\n```\n\nThe `SpeechSynthesizer` class synthesizes the text to speech, with the `AVSpeechUtterance` class encapsulating how the text will be spoken. The following `AVSpeechUtterance` properties are set to control the spoken text:\n\n* `Rate` – the speed at which text is spoken.\n\n* `Voice` – an `AVSpeechSynthesisVoice` instance used to speak the text.\n\n* `Volume` – the volume level of the voice used to speak the text.\n\n* `PitchMultiplier` – a value between 0.5 and 2.0 to control the speech text.\n\n> ℹ️ In a Xamarin Studio or Visual Studio Xamarin.Forms solution, the `Speak` method should reside in the iOS platform project, and be invoked from the Xamarin.Forms project using the `DependencyService` class. For more information, see [Implementing Text-to-Speech](https://developer.xamarin.com/guides/xamarin-forms/dependency-service/text-to-speech/).\n\n## Invoking the Platform-Specific Speech Method\n\nThe `Speak` method can be invoked from Xamarin.Forms to translate text to speech:\n\n```csharp\nvar entry = new Entry\n{\n  Placeholder = \"Enter text to speak here\"\n};\nvar button = new Button\n{\n  Text = \"Speak\"\n};\nbutton.Clicked += (sender, e) =>\n{\n  Speak(entry.Text);\n};\nstackLayout.Children.Add(entry);\nstackLayout.Children.Add(button);\n```\n\nWhen the `Button` is clicked, the platform-specific `Speak` method translates the value of the `entry.Text` property to speech.\n\n## 👍 Try it now!\n\n* Increase the speech volume and pitch.\n\n* Increase the speech speed.\n\n* Change the speech voice.\n\n## Further Reading\n\nFor more information about text-to-speech, see [Implementing Text-to-Speech](https://developer.xamarin.com/guides/xamarin-forms/dependency-service/text-to-speech/).\n"
  },
  {
    "path": "xamarin-forms/getting-started/GettingStartedWithXamarinForms-ios.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.3.2.127\n---\n\n# Getting Started with Xamarin.Forms (iOS)\n\n> ⚠️ This workbook is deprecated - see **GettingStartedWithXamarinForms.workbook** instead\n\nIf you want to create a Xamarin.Forms application in Xamarin Workbooks, you must create either a new Xamarin.iOS or Xamarin.Android workbook. This discussion focuses on using Xamarin.Forms from an iOS application.\n\nAfter creating a new iOS workbook, you must add the Xamarin.Forms NuGet package. That’s already been done for this particular workbook,  but normally you would invoke the **File** and **Add Package** menu item, and search for **Xamarin.Forms**. Select the top item and click the **Add Package** button.\n\nNow use the `#r` command to reference the following Xamarin.Forms assemblies:\n\n```csharp\n#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n#r \"Xamarin.Forms.Platform.iOS\"\n```\n\nYou’ll also want a few standard `using` directives:\n\n```csharp\nusing System;\nusing Xamarin.Forms;\nusing Xamarin.Forms.Platform.iOS;\n```\n\nThe first step is to define a class that derives from `Application` that creates a Xamarin.Forms `ContentPage` object and sets it to its `MainPage` property:\n\n```csharp\nclass App : Application\n{\n    public App()\n    {\n        MainPage = new ContentPage();\n    }\n}\n```\n\nThe `ContentPage` is the simplest kind of page in Xamarin.Forms. This is the page that will contain all your program’s Xamarin.Forms visual elements.\n\nNow you must execute some iOS startup code. You first need to call the `Forms.Init` method to initialize Xamarin.Forms. You can then instantiate the `App` class defined above, and call the `CreateViewController` method of the page that the `App` class creates. This you set to the `RootViewController` property of the iOS window that Workbooks has created for you:\n\n```csharp\nXamarin.Forms.Forms.Init();\nApp app = new App();\nKeyWindow.RootViewController = app.MainPage.CreateViewController();\n```\n\nAt this point, you have a Xamarin.Forms program running on the iOS simulator. Now get access to the `ContentPage` instance that the `App` class constructor created:\n\n```csharp\nContentPage page = app.MainPage as ContentPage;\n```\n\nYou use the Xamarin.Forms `Label` element to display up to a paragraph of text. Create a `Label` and set it to the `Content` property of the `ContentPage`:\n\n```csharp\nLabel label = new Label\n{\n    Text = \"Hello Xamarin.Forms in Workbooks!\"\n};\npage.Content = label;\n```\n\nYou’ll see the `Label` on the iOS Simulator, but it overlaps the iOS status bar. One way to avoid that is to set the `Padding` property on the page. This sets an area within the page that content cannot intrude. The four arguments to the `Thickness` constructor are in the order left, top, right, and bottom. The 20-unit space at the top is the height of the status bar:\n\n```csharp\npage.Padding = new Thickness(0, 20, 0, 0);\n```\n\nNow the `Label` is directly under the status bar.\n\nYou can also center the `Label` on the page by setting its `HorizontalOptions` and `VerticalOptions` properties:\n\n```csharp\nlabel.HorizontalOptions = LayoutOptions.Center;\nlabel.VerticalOptions = LayoutOptions.Center;\n```\n\nTry the `Start` and `End` fields of the `LayoutOptions` structure to position the `Label` in one of nine locations around the page.\n\nYou can set the color of the `Label` with the `TextColor` property. One convenient approach is to obtain a `Color` value from one of the static read-only properties of the `Color` class:\n\n```csharp\nlabel.TextColor = Color.Blue;\n```\n\nAnother approach is using the static `Color.FromRgb`, `Color.FromRgba`, or `Color.FromHsla` methods to define colors using either the RGB (red-green-blue) or the HSL (hue-saturation-luminosity) color models. Or you can use the `Color` constructor to specify floating point values of red, green, blue, and alpha (opacity). This statement sets the page’s background color:\n\n```csharp\npage.BackgroundColor = new Color(1.0, 1.0, 0, 1.0);\n```\n\nYou can set the `FontFamily` property to a string specifying a font that you know is available on the phone:\n\n```csharp\nlabel.FontFamily = \"Times New Roman\";\n```\n\nYou can set the FontAttributes property to a member of the `FontAttributes` enumeration, `Bold`, `Italic`, or `None`. If you want both bold and italic, combine the two members with the C# bitwise OR operator:\n\n```csharp\nlabel.FontAttributes = FontAttributes.Bold | FontAttributes.Italic;\n```\n\nSet the `FontSize` property to increase or decrease the size of the font:\n\n```csharp\nlabel.FontSize = 30;\n```\n\nYou should see the text string wrap to two lines. If not, try a larger value.\n\nThe wrapping behavior is governed by the `LineBreakMode` property that you can set to a member of the `LineBreakMode` enumeration:\n\n```csharp\nlabel.LineBreakMode = LineBreakMode.WordWrap;\n```\n\nThat’s the default, but you can try the other members:\n\n* `NoWrap`\n\n* `CharacterWrap`\n\n* `HeadTruncation`\n\n* `TailTruncation`\n\n* `MiddleTruncation`\n\nGenerally you’ll use one `Label` for every paragraph of text that you display on the screen. If you have multiple paragraphs, you can put the multiple `Label` elements in a `StackLayout`, and then put the `StackLayout` in a `ScrollView`. You’ll see how to do this in a future exercise.\n\nLet’s give `Label` a whole paragraph of text:\n\n```csharp\nlabel.Text = \"Alice was beginning to get very tired of sitting by \" +\n             \"her sister on the bank, and of having nothing to do: \" +\n             \"once or twice she had peeped into the book her sister \" +\n             \"was reading, but it had no pictures or conversations \" + \n             \"in it, “and what is the use of a book,” thought Alice, \" +\n             \"“without pictures or conversations?”\";\n```\n\nYou might want to adjust the `FontSize` so it fits comfortably on the page. If you flip the iOS Simulator between portrait and landscape you can see how the `Label` dynamically reformats the text.\n\nBy default, the lines of the paragraph are left-justified, but you can set the `HorizontalTextAlignment` property to right justify or center each line:\n\n```csharp\nlabel.HorizontalTextAlignment = TextAlignment.Center;\n```\n\nTry the `End` member of the `TextAlignment` enumeration to right justify the line, or `Start` for the default left justification.\n\n`Label` inherits several transform properties from the `VisualElement` class. The `TranslationX` and `TranslationY` properties move the element horizontally and vertically. The default values are 0 but try some other values:\n\n```csharp\nlabel.TranslationX = 0;\nlabel.TranslationY = 0;\n```\n\nThese two properties move the element from the location determined for the element by the Xamarin.Forms layout system. There is nothing to prevent you from setting `TranslationX` or `TranslationY` values that move the element right off the screen!\n\nThe `Scale` property has a default value of 1:\n\n```csharp\nlabel.Scale = 1.0;\n```\n\nTry a value of 2 to double the size of the text or 0.5 to decrease the size in half. You’ll notice that the text does not reformat itself to stay within the width of the page. Like the other transform properties, `Scale` is applied after the Label has formatted the text and only affects the element’s visuals.\n\nFinally, there is `Rotation`, which you can set to an angle in degrees to rotate the text around its center. The default value is 0 but try 90 or 180 or any number you want:\n\n```csharp\nlabel.Rotation = 0;\n```\n\nXamarin.Forms also has a facility to animate these properties. For example, you can apply an animation to the `Label` that is triggered when the user taps the `Label`. To do this, you need to add a `TapGestureRecognizer` object to the `GestureRecognizers` collection of the `Label`:\n\n```csharp\n// Empty the collection during re-executions\nlabel.GestureRecognizers.Clear();\n\nTapGestureRecognizer tap = new TapGestureRecognizer();\ntap.Tapped += async (sender, args) =>\n{\n    label.Rotation = 0;\n    await label.RotateTo(360, 5000);\n};\nlabel.GestureRecognizers.Add(tap);\n```\n\nThe `Tapped` event handler is executed when you tap the `Label` on the phone or click the `Label` in the iOS Simulator. It rotates the text in a 360-degree circle in 5,000 milliseconds.  Notice that the `RotateTo` method is asynchronous. It completes execution when the rotation has completed. This means that you can add other animations to run in sequence, and you can use the static `Task.WhenAll` and `Task.WhenAny` methods to combine animations. Have fun!"
  },
  {
    "path": "xamarin-forms/getting-started/GettingStartedWithXamarinForms.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: EFA61668-239E-4C12-8535-97661698D5B8\ntitle: Getting Started with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Getting Started with Xamarin.Forms (Hello, Xamarin.Forms)\n\nFollow these steps to learn about the basics of Xamarin.Forms through experimentation with the `Label` text control.\n\n## 1. Add references\n\nXamarin.Forms Workbooks already include the NuGet, so the required assemblies can be referenced like this:\n\n```csharp\n#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n```\n\nThen, just like a regular C# file, add the `using` directives:\n\n```csharp\nusing System;\nusing Xamarin.Forms;\n```\n\n## 2. Create the ContentPage\n\nWorkbooks has already initialized Xamarin.Forms, so `Application.Current.MainPage` can be set directly.\n\nThe `ContentPage` is the simplest kind of page in Xamarin.Forms. This is the page that will contain all your program’s Xamarin.Forms visual elements.\n\n```\nvar page = new ContentPage();\nApplication.Current.MainPage = page;\n```\n\n## 3. Add a Label\n\nThe Xamarin.Forms `Label` element can display up to a paragraph of text. Create a `Label` and set it to the `Content` property of the `ContentPage`:\n\n```csharp\nLabel label = new Label\n{\n    Text = \"Hello Xamarin.Forms in Workbooks!\"\n};\npage.Content = label;\n```\n\nYou’ll see the `Label` on the iOS Simulator, but it overlaps the iOS status bar. \n\n## 4. Add some Padding\n\nOne way to avoid that is to set the `Padding` property on the page. This sets an area within the page that content cannot intrude. The four arguments to the `Thickness` constructor are in the order left, top, right, and bottom. The 20-unit space at the top is the height of the status bar:\n\n```csharp\npage.Padding = new Thickness(0, 20, 0, 0);\n```\n\nNow the `Label` is directly under the status bar.\n\n## 5. Add some Layout\n\nYou can also center the `Label` on the page by setting its `HorizontalOptions` and `VerticalOptions` properties:\n\n```csharp\nlabel.HorizontalOptions = LayoutOptions.Center;\nlabel.VerticalOptions = LayoutOptions.Center;\n```\n\nTry the `Start` and `End` fields of the `LayoutOptions` structure to position the `Label` in one of nine locations around the page.\n\n## 6. Change the Color\n\nYou can set the color of the `Label` with the `TextColor` property. One convenient approach is to obtain a `Color` value from one of the static read-only properties of the `Color` class:\n\n```csharp\nlabel.TextColor = Color.Blue;\n```\n\nAnother approach is using the static `Color.FromRgb`, `Color.FromRgba`, or `Color.FromHsla` methods to define colors using either the RGB (red-green-blue) or the HSL (hue-saturation-luminosity) color models. Or you can use the `Color` constructor to specify floating point values of red, green, blue, and alpha (opacity). This statement sets the page’s background color:\n\n```csharp\npage.BackgroundColor = new Color(1.0, 1.0, 0, 1.0);\n```\n\n## 7. Set the Font\n\nYou can set the `FontFamily` property to a string specifying a font that you know is available on the phone:\n\n```csharp\nlabel.FontFamily = \"Times New Roman\";\n```\n\nYou can set the FontAttributes property to a member of the `FontAttributes` enumeration, `Bold`, `Italic`, or `None`. If you want both bold and italic, combine the two members with the C# bitwise OR operator:\n\n```csharp\nlabel.FontAttributes = FontAttributes.Bold | FontAttributes.Italic;\n```\n\nSet the `FontSize` property to increase or decrease the size of the font:\n\n```csharp\nlabel.FontSize = 30;\n```\n\nYou should see the text string wrap to two lines. If not, try a larger value.\n\n## 8. Experiment with WordWrap\n\nThe wrapping behavior is governed by the `LineBreakMode` property that you can set to a member of the `LineBreakMode` enumeration:\n\n```csharp\nlabel.LineBreakMode = LineBreakMode.WordWrap;\n```\n\nThat’s the default, but you can try the other members:\n\n* `NoWrap`\n\n* `CharacterWrap`\n\n* `HeadTruncation`\n\n* `TailTruncation`\n\n* `MiddleTruncation`\n\nGenerally you’ll use one `Label` for every paragraph of text that you display on the screen. If you have multiple paragraphs, you can put the multiple `Label` elements in a `StackLayout`, and then put the `StackLayout` in a `ScrollView`. You’ll see how to do this in a future exercise.\n\nLet’s give `Label` a whole paragraph of text:\n\n```csharp\nlabel.Text = \"Alice was beginning to get very tired of sitting by \" +\n             \"her sister on the bank, and of having nothing to do: \" +\n             \"once or twice she had peeped into the book her sister \" +\n             \"was reading, but it had no pictures or conversations \" + \n             \"in it, “and what is the use of a book,” thought Alice, \" +\n             \"“without pictures or conversations?”\";\n```\n\nYou might want to adjust the `FontSize` so it fits comfortably on the page. If you flip the iOS Simulator between portrait and landscape you can see how the `Label` dynamically reformats the text.\n\n## 9. Text Alignment\n\nBy default, the lines of the paragraph are left-justified, but you can set the `HorizontalTextAlignment` property to right justify or center each line:\n\n```csharp\nlabel.HorizontalTextAlignment = TextAlignment.Center;\n```\n\nTry the `End` member of the `TextAlignment` enumeration to right justify the line, or `Start` for the default left justification.\n\n`Label` inherits several transform properties from the `VisualElement` class. The `TranslationX` and `TranslationY` properties move the element horizontally and vertically. The default values are 0 but try some other values:\n\n```csharp\nlabel.TranslationX = 0;\nlabel.TranslationY = 0;\n```\n\nThese two properties move the element from the location determined for the element by the Xamarin.Forms layout system. There is nothing to prevent you from setting `TranslationX` or `TranslationY` values that move the element right off the screen!\n\n## 10. Scaling\n\nThe `Scale` property has a default value of 1:\n\n```csharp\nlabel.Scale = 1.0;\n```\n\nTry a value of 2 to double the size of the text or 0.5 to decrease the size in half. You’ll notice that the text does not reformat itself to stay within the width of the page. Like the other transform properties, `Scale` is applied after the Label has formatted the text and only affects the element’s visuals.\n\nFinally, there is `Rotation`, which you can set to an angle in degrees to rotate the text around its center. The default value is 0 but try 90 or 180 or any number you want:\n\n```csharp\nlabel.Rotation = 0;\n```\n\n## 11. Animation\n\nXamarin.Forms also has a facility to animate these properties. For example, you can apply an animation to the `Label` that is triggered when the user taps the `Label`. To do this, you need to add a `TapGestureRecognizer` object to the `GestureRecognizers` collection of the `Label`:\n\n```csharp\n// Empty the collection during re-executions\nlabel.GestureRecognizers.Clear();\n\nTapGestureRecognizer tap = new TapGestureRecognizer();\ntap.Tapped += async (sender, args) =>\n{\n    label.Rotation = 0;\n    await label.RotateTo(360, 5000);\n};\nlabel.GestureRecognizers.Add(tap);\n```\n\nThe `Tapped` event handler is executed when you tap the `Label` on the phone or click the `Label` in the iOS Simulator. It rotates the text in a 360-degree circle in 5,000 milliseconds.  Notice that the `RotateTo` method is asynchronous. It completes execution when the rotation has completed. This means that you can add other animations to run in sequence, and you can use the static `Task.WhenAll` and `Task.WhenAny` methods to combine animations. \n\nHave fun!"
  },
  {
    "path": "xamarin-forms/getting-started/meta.json",
    "content": "{\n  \"order\":{\n    \"GettingStartedWithXamarinForms.workbook\":\"Hello, Xamarin.Forms\"\n  }\n}\n"
  },
  {
    "path": "xamarin-forms/meta.json",
    "content": "{\n  \"order\":{\n    \"getting-started\":\"Getting Started\",\n    \"application-fundamentals\":\"Application Fundamentals\",\n    \"user-interface\":\"User Interface\",\n    \"advanced\":\"Advanced\"\n  }\n}\n"
  },
  {
    "path": "xamarin-forms/user-interface/alerts/alerts.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/alerts/alerts.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 4D72C07E-8595-4575-A1F6-0CF473774077\ntitle: Displaying Pop-ups with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Displaying Pop-ups\n\nXamarin.Forms provides two pop-up like user interface elements: an alert and an action sheet. An alert is a modal pop-up to alert the user, or to ask simple question of them. An action sheet is a modal pop-up that' used to guide the user through a task.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Displaying an Alert\n\nAn alert is displayed with the `DisplayAlert` method on any `Page`:\n\n```csharp\nawait page.DisplayAlert(\"Alert\", \"You have been alerted.\", \"OK\");\n```\n\nThe alert displays modally and once dismissed you can continue interacting with the application.\n\n> ℹ️  The `DisplayAlert` method is asynchronous, and should be preceded by the `await` keyword.\n\n\nAn alert can also be used to capture a user's response by presenting two buttons:\n\n```csharp\nbool answer = await page.DisplayAlert(\"Question\", \"Would you like to play a game?\", \"Yes\", \"No\");\n```\n\nThe response to the alert is returned as a `boolean` value.\n\n## Displaying an Action Sheet\n\nAn action sheet is displayed with the `DisplayActionSheet` method on any `Page`:\n\n```csharp\nstring result = await page.DisplayActionSheet(\"Send to?\", \"Cancel\", null, \"Email\", \"Twitter\", \"Facebook\");\n```\n\nThe response to the action sheet is returned as a `string` value.\n\n> ℹ️  The `DisplayActionSheet` method is asynchronous, and should be preceded by the `await` keyword.\n\n\nThe third argument to the `DisplayActionSheet` method is known as the *destruct* button, and can be `null` or given a value:\n\n```csharp\nstring result = await page.DisplayActionSheet(\"Save Photo to?\", \"Cancel\", \"Delete\", \"Photo Roll\", \"Email\");\n```\n\nNotice that the *destruct* button is rendered differently from the other action sheet buttons.\n\n> ℹ️  The fourth argument to the `DisplayActionSheet` method is of type `params string[]`. Therefore, an action sheet can display any number of responses for the user to select from.\n\n## 👍 Try it now!\n\n* Create an alert that contains a cancel button.\n\n* Create an action sheet that contains days of the week as responses.\n\n## Further Reading\n\nFor more information about displaying pop-ups, see [Displaying Pop-ups](https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/pop-ups/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/button/button.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/button/button.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 6E002D34-2399-4D44-97D3-DDC4EA1A94E1\ntitle: Processing Button Clicks with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Processing Button Clicks\n\nThe Xamarin.Forms `Button` view initiates an action when the user presses it. The `Button` displays text, with or without an accompanying image,\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Setting the Button Text and Image\n\nA `Button` exposes the `Text` property, which is used to set the text presented by the `Button`:\n\n```csharp\nvar button = new Button\n{\n  Text = \"Click Me!\"\n};\nstackLayout.Children.Add(button);\n```\n\nA `Button` can optionally display an image next to the text by setting the `Image` property:\n\n```csharp\nbutton.Image = \"coffee.png\";\n```\n\nThe `Button` instance can be left-aligned on the page by setting its `HorizontalOptions` property:\n\n```csharp\nbutton.HorizontalOptions = LayoutOptions.Start;\n```\n\nThe `Button` can be returned to the center by settings its `HorizontalOptions` property to `LayoutOptions.Center`:\n\n```csharp\nbutton.HorizontalOptions = LayoutOptions.Center;\n```\n\nIn addition, the `VerticalOptions` property can be set to center the `Button` vertically.\n\n\n## Responding to Clicks\n\nWhen a user presses the `Button`, its appearance changes to provide feedback. When the finger is released, a `Clicked` event fires:\n\n```csharp\n// Number of times the button has been pressed\nvar count = 0;\n\nvoid OnButtonClicked(object sender, EventArgs e)\n{\n  button.Text = string.Format(\"Clicked {0} times\", ++count);\n}\n\nbutton.Clicked += OnButtonClicked;\n```\n\nThis code defines an event handler named `OnButtonClicked`, which updates the `Button.Text` property on each click. Generally, event handlers are given names beginning with the word `On`, followed by an identifier for the view firing the event, followed by the event name.\n\nAlternatively, the `Clicked` event handler can be written using a lambda expression:\n\n```csharp\nvar count2 = 0;\n\nvar button2 = new Button\n{\n  Text = \"Click Me!\"\n};\nbutton2.Clicked += (sender, e) => button2.Text = string.Format(\"Clicked {0} times\", ++count2);\nstackLayout.Children.Add(button2);\n```\n\n## Setting Colors and Border Options\n\nThe color of a `Button` can be changed by setting the `TextColor` property:\n\n```csharp\nbutton.TextColor = Color.Blue;\n```\n\nAnother approach is using the static `Color.FromRgb` method:\n\n```csharp\nbutton.TextColor = Color.FromRgb(128, 64, 32);\n```\n\nThe background color can be changed by setting the `BackgroundColor` property:\n\n```csharp\nbutton.BackgroundColor = Color.Yellow;\n```\n\nIn addition, a border color can be set with the `BorderColor` property:\n\n```csharp\nbutton.BorderColor = Color.Black;\n```\n\nHowever, the border won't appear until a border width is specified with the `BorderWidth` property:\n\n```csharp\nbutton.BorderWidth = 2;\n```\n\nThe corner radius of the border can be set with the `BorderRadius` property:\n\n```csharp\nbutton.BorderRadius = 0;\n```\n\nA `BorderRadius` value of 0 will ensure that the border corners are square.\n\n## Setting the Font\n\nA `Button`s font can be changed by setting the `FontFamily` property to a string that specifies a font that is available on the phone:\n\n```csharp\nbutton.FontFamily = \"Times New Roman\";\n```\n\nThe `FontAttributes` enumeration can be used to change the text displayed by a `Button` to bold and/or italic:\n\n```csharp\nbutton.FontAttributes = FontAttributes.Italic;\n```\n\nThe size of the text being displayed by a `Button` can be changed with the `FontSize` property:\n\n```csharp\nbutton.FontSize = 30;\n```\n\n## 👍 Try it now!\n\n* Replace the `button` event handler with a lambda expression.\n* Add an image to `button2` by setting its `Image` property.\n* Right align a `Button` by setting its `HorizontalOptions` property to `End`.\n\n## Further Reading\n\nFor more information about the `Button` view, see [Button Class](https://developer.xamarin.com/api/type/Xamarin.Forms.Button/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/editor/editor.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/editor/editor.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 01008EB5-E4F3-44F0-91D1-5D9DBB31EF9D\ntitle: Multi-Line Text with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Entering Multi-Line Text\n\nThe Xamarin.Forms `Editor` view is used for multi-line text input.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Setting and Reading Text\n\nAn `Editor`, like other text-presenting views, exposes the `Text` property, which is used to set and read the text presented by the `Editor`:\n\n```csharp\nvar editor = new Editor {\n    Text = \"Click here to see the virtual keyboard\",\n    HeightRequest = 150\n};\nstackLayout.Children.Add(editor);\n```\n\nTo read text, access the `Text` property:\n\n```csharp\nvar text = editor.Text;\n```\n\n## Changing the Virtual Keyboard\n\nA virtual keyboard appears when an `Editor` has focus. The `Editor` defines a `Keyboard` property that allows you to specify the virtual keyboard that's displayed:\n\n```csharp\neditor.Keyboard = Keyboard.Chat;\n```\n\nClick in the `editor` instance and the chat keyboard will appear.\n\nThe `Keyboard` property is of type `Keyboard`, which defines the following readonly-only properties:\n\n* `Default`\n\n* `Text`\n\n* `Chat`\n\n* `Url`\n\n* `Email`\n\n* `Telephone`\n\n* `Numeric`\n\nFor more information about changing the virtual keyboard, see [Choose a keyboard for an Entry](https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/controls/choose-keyboard-for-entry/).\n\n## Setting Colors\n\nThe colors of an `Editor` can be changed by setting the `TextColor` and `BackgroundColor` properties:\n\n```csharp\neditor.TextColor = Color.White;\neditor.BackgroundColor = Color.Blue;\n```\n\n## Interacting with an Editor\n\nAn `Editor` exposes `Completed` and `TextChanged` events:\n\n* The `Completed` event is raised when the user has ended input by pressing the return key on the keyboard.\n\n* The `TextChanged` event is raised when the text changes in the `Editor`, and provides the text values before and after the change.\n\n```csharp\nvar completedLabel = new Label();\nvar oldTextLabel = new Label();\nvar newTextLabel = new Label();\nstackLayout.Children.Add(oldTextLabel);\nstackLayout.Children.Add(newTextLabel);\nstackLayout.Children.Add(completedLabel);\n\neditor.Completed += (sender, e) => { completedLabel.Text = \"Completed event has fired\"; };\neditor.TextChanged += (sender, e) =>\n{\n  oldTextLabel.Text = e.OldTextValue;\n  newTextLabel.Text = e.NewTextValue;\n};\n```\n\nEnter data in the `editor` instance, and watch the `Label` instances update as the value of the `editor.Text` property changes.\n\n## 👍 Try it now!\n\n* Change the `editor` instance to use the `Text` keyboard.\n\n* Change the `editor` instance to use a cyan background, with black text.\n\n## Further Reading\n\nFor more information about the `Editor` view, see [Entry](https://developer.xamarin.com/guides/xamarin-forms/user-interface/text/editor/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/entry/entry.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/entry/entry.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 1EA7D80E-032E-46ED-9A5A-CADCD9EC9F96\ntitle: Entering Text with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Entering Text\n\nThe Xamarin.Forms `Entry` view is used for single-line text input, and can also be used as a password field.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Setting and Reading Text\n\nAn `Entry`, like other text-presenting views, exposes the `Text` property, which is used to set and read the text presented by the `Entry`:\n\n```csharp\nvar entry = new Entry {\n    Text = \"Click here to see the virtual keyboard\"\n};\nstackLayout.Children.Add(entry);\n```\n\nTo read text, access the `Text` property:\n\n```csharp\nvar text = entry.Text;\n```\n\n> ⚠️ The width of an `Entry` is defined by settings its `WidthRequest` property. Do not depend on the width of an `Entry` being defined based on the value of its `Text` property.\n\n\n## Changing the Virtual Keyboard\n\nA virtual keyboard appears when an `Entry` has focus. The `Entry` defines a `Keyboard` property that allows you to specify the virtual keyboard that's displayed:\n\n```csharp\nentry.Keyboard = Keyboard.Numeric;\n```\n\nClick in the `entry` instance and the numeric keyboard will appear.\n\nThe `Keyboard` property is of type `Keyboard`, which defines the following readonly-only properties:\n\n* `Default`\n\n* `Text`\n\n* `Chat`\n\n* `Url`\n\n* `Email`\n\n* `Telephone`\n\n* `Numeric`\n\nFor more information about changing the virtual keyboard, see [Choose a keyboard for an Entry](https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/controls/choose-keyboard-for-entry/).\n\n## Showing Placeholder Text\n\nAn `Entry` can show placeholder text when it's not storing user input. Placeholder text is often shown to clarify the content that's appropriate for an `Entry`:\n\n```csharp\nvar passwordEntry = new Entry\n{\n  Placeholder = \"Enter password\"\n};\nstackLayout.Children.Add(passwordEntry);\n```\n\n## Inputting a Password\n\nAn `Entry` has an `IsPassword` property. When this property is set to `true`, the contents of the `Text` property will be masked:\n\n```csharp\npasswordEntry.IsPassword = true;\n```\n\nClick in the `passwordEntry` instance and enter some text. You will notice that the text is masked.\n\n## Setting Colors\n\nThe colors of an `Entry` can be changed by setting the `TextColor` and `BackgroundColor` properties:\n\n```csharp\nentry.TextColor = Color.White;\nentry.BackgroundColor = Color.Blue;\n```\n\n> ℹ️  Placeholder text color can't be customized and will be the same regardless of the the `TextColor` setting.\n\n\n## Interacting with an Entry\n\nAn `Entry` exposes `Completed` and `TextChanged` events:\n\n* The `Completed` event is raised when the user has ended input by pressing the return key on the keyboard.\n\n* The `TextChanged` event is raised when the text changes in the `Entry`, and provides the text values before and after the change.\n\n```csharp\nvar eventsEntry = new Entry { Placeholder = \"Enter text to observe events firing\" };\nvar completedLabel = new Label();\nvar oldTextLabel = new Label();\nvar newTextLabel = new Label();\n\neventsEntry.Completed += (sender, e) => { completedLabel.Text = \"Completed event has fired\"; };\neventsEntry.TextChanged += (sender, e) =>\n{\n  oldTextLabel.Text = e.OldTextValue;\n  newTextLabel.Text = e.NewTextValue;\n};\n\nstackLayout.Children.Add(eventsEntry);\nstackLayout.Children.Add(oldTextLabel);\nstackLayout.Children.Add(newTextLabel);\nstackLayout.Children.Add(completedLabel);\n```\n\nEnter data in the `eventsEntry` instance, and watch the `Label` instances update as the value of the `eventsEntry.Text` property changes.\n\n## 👍 Try it now!\n\n* Change the `entry` instance to use the `Url` keyboard.\n\n* Change the `entry` instance to use a gray background, with black text.\n\n## Further Reading\n\nFor more information about the `Entry` view, see [Entry](https://developer.xamarin.com/guides/xamarin-forms/user-interface/text/entry/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/image/image.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/image/image.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 58AF788B-116D-487C-AEB1-7F06A82D010B\ntitle: Displaying Images with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Displaying Images\n\nThe Xamarin.Forms `Image` view displays images on a page. The image source can be local or remote.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Displaying a Local Image\n\nTo display a local image, create a `Image` instance and set its `Source` property to an image filename:\n\n```csharp\nvar image = new Image\n{\n  Source = \"waterfront.jpg\"\n};\nstackLayout.Children.Add(image);\n```\n\nBy default, the displayed image occupies as much space as possible on the page for its resolution, while maintaining its aspect ratio.\n\nThe opacity of the image can be changed by setting the `Opacity` property:\n\n```csharp\nimage.Opacity = 0.5;\n```\n\nThis has the effect of making the image partly translucent.\n\n## Changing the Displayed Aspect Ratio\n\nIn order to demonstrate changing the displayed aspect ratio of the image, the height and width of the image must be changed, and the `Opacity` property will be reset:\n\n```charp\nimage.HeightRequest = 200;\nimage.WidthRequest = 100;\nimage.Opacity = 1;\n```\n\nThe `Aspect` property determines how the image will be scaled to fit the display area, and is set to a value of the `Aspect` enumeration. `Fill` stretches the image to completely fill the display area. This may result in the image aspect ratio being distorted:\n\n```csharp\nimage.Aspect = Aspect.Fill;\n```\n\n`AspectFill` clips the image so that it fills the display area while preserving the aspect ratio:\n\n```csharp\nimage.Aspect = Aspect.AspectFill;\n```\n\n`AspectFit` is the default value, which ensures that the entire image fits into the display area:\n\n```csharp\nimage.Aspect = Aspect.AspectFit;\n```\n\n## Displaying a Remote Image\n\nImages can be downloaded for display by setting the `Source` property of the `Image` view to a URL:\n\n```csharp\nimage.Source = \"https://developer.xamarin.com/demo/IMG_1101.JPG\";\n```\n\nBy default, image caching is enabled for downloaded images, which will be stored locally for 24 hours. However, image caching can be disabled when instantiating the image source:\n\n```csharp\nimage.Source = new UriImageSource\n{\n  Uri = new Uri(\"https://developer.xamarin.com/demo/IMG_0613.JPG\"),\n  CachingEnabled = false\n};\n```\n\nTo set a specific cache period, set the `CacheValidity` property of the `UriImageSource` to a `TimeSpan`:\n\n```csharp\nimage.Source = new UriImageSource\n{\n  Uri = new Uri(\"https://developer.xamarin.com/demo/IMG_2267.JPG\"),\n  CachingEnabled = true,\n  CacheValidity = new TimeSpan(5,0,0,0)\n}\n```\n\nThis will cache the downloaded image for 5 days.\n\n## Obtaining the Loading Status of an Image\n\nThe loading status of the image can be obtained by examining its `IsLoading` property:\n\n```csharp\nvar activityIndicator = new ActivityIndicator();\nactivityIndicator.SetBinding(ActivityIndicator.IsRunningProperty, \"IsLoading\");\nactivityIndicator.BindingContext = image;\n\nstackLayout.Children.Add(activityIndicator);\n\nimage.Source = new UriImageSource\n{\n  Uri = new Uri(\"https://developer.xamarin.com/demo/IMG_4023.JPG\"),\n  CachingEnabled = false\n};\n```\n\nThis code creates an `ActivityIndicator` instance, and binds its `IsRunning` property to the value of the `IsLoading` property on the `Image` instance. Therefore, when the image is loading, the `ActivityIndicator` indicates this.\n\n## 👍 Try it now!\n\n* Set a remote image to be partly transparent.\n\n* Set a remote image to completely fill the display area.\n\n* Set a remote image to be cached for 12 hours when it's first downloaded.\n\n## Further Reading\n\nFor more information about the `Image` view, see [Working with Images](https://developer.xamarin.com/guides/xamarin-forms/working-with/images/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/label/label.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/label/label.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: F36A7045-ABF6-411E-8F1A-EB3374BAC78D\ntitle: Displaying Text with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Displaying Text\n\nThe Xamarin.Forms `Label` view is used for displaying single and multi-line text.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Setting Text\n\nA `Label`, like other text-presenting views, exposes the `Text` property, which is used to set the text presented by the `Label`:\n\n```csharp\nvar label = new Label\n{\n  Text = \"Hello from Xamarin.Forms\"\n};\nstackLayout.Children.Add(label);\n```\n\nThe `Label` instance can be horizontally centered on the page by setting its `HorizontalOptions` property:\n\n```csharp\nlabel.HorizontalOptions = LayoutOptions.Center;\n```\n\nIn addition, the `VerticalOptions` property can be set to center the `Label` vertically.\n\n## Setting Colors\n\nThe color of a `Label` can be changed by setting the `TextColor` property:\n\n```csharp\nlabel.TextColor = Color.Blue;\n```\n\nAnother approach is using the static `Color.FromRgb` method:\n\n```csharp\nlabel.TextColor = Color.FromRgb(32, 64, 128);\n```\n\nIn addition, a background color can be set with the `BackgroundColor` property:\n\n```csharp\nlabel.BackgroundColor = Color.Teal;\n```\n\n## Setting the Font\n\nA `Label`s font can be changed by setting the `FontFamily` property to a string that specifies a font that is available on the phone:\n\n```csharp\nlabel.FontFamily = \"Times New Roman\";\n```\n\nThe `FontAttributes` enumeration can be used to change the text displayed by a `Label` to bold and/or italic:\n\n```csharp\nlabel.FontAttributes = FontAttributes.Italic;\n```\n\nThe size of the text being displayed by a `Label` can be changed with the `FontSize` property:\n\n```csharp\nlabel.FontSize = 30;\n```\n\nThe text should wrap to two lines because of the increased font size.\n\n## Controlling Truncation and Wrapping\n\nText wrapping behavior is controlled by the `LineBreakMode` property, which can be set to a member of the `LineBreakMode` enumeration:\n\n```csharp\nlabel.LineBreakMode = LineBreakMode.WordWrap;\n```\n\nThe other values of the `LineBreakMode` enumeration are:\n\n* `NoWrap`\n\n* `CharacterWrap`\n\n* `HeadTruncation`\n\n* `TailTruncation`\n\n* `MiddleTruncation`\n\n## Controlling Text Alignment\n\nGenerally, a `Label` represents one paragraph of text. By default, the lines of the paragraph are left-justified:\n\n```csharp\nlabel.Text = \"Xamarin.Forms is a cross-platform natively backed UI \" +\n             \"toolkit abstraction that allows developers to easily \" +\n             \"create user interfaces that can be shared across iOS, \" +\n             \"Android, and Windows Phone.\";\n```\n\nHowever, the `HorizontalTextAlignment` property can be set to right justify or center each line:\n\n```csharp\nlabel.HorizontalTextAlignment = TextAlignment.Center;\n```\n\n## 👍 Try it now!\n\n* Make the text displayed by the `Label` to be bold and italic. This can be achieved with the bitwise OR operator (|).\n* Make the text displayed by the `Label` use `MiddleTruncation` line truncation.\n* Make the `Label` text right justified by setting the `End` member of the `TextAlignment` enumeration.\n\n## Further Reading\n\nFor more information about the `Label` view, see [Label](https://developer.xamarin.com/guides/xamarin-forms/user-interface/text/label/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/layout-options/layout-options.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/layout-options/layout-options.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: A7C4BA53-474A-49B3-92A2-E4C2D1D26FE5\ntitle: Setting LayoutOptions with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Setting LayoutOptions\n\nEvery Xamarin.Forms view has `HorizontalOptions` and `VerticalOptions` properties, of type `LayoutOptions`. This structure is used to control alignment and expansion options for a view, relative to its parent, and consists of the following values:\n\n* `Start`\n\n* `Center`\n\n* `End`\n\n* `Fill`\n\n* `StartAndExpand`\n\n* `CenterAndExpand`\n\n* `EndAndExpand`\n\n* `FillAndExpand`\n\nThe `Start`, `Center`, `End`, and `Fill` values are used to define the view's alignment within the parent view, and the `StartAndExpand`, `CenterAndExpand`, `EndAndExpand`, and `FillAndExpand` values are used to define whether the view will occupy more space if available.\n\n> ℹ️  The default value of a view's `HorizontalOptions` and `VerticalOptions` properties is `LayoutOptions.Fill`.\n\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Initializing the User Interface\n\nThe following code initializes the UI with a series of `Button` instances that will be used to demonstrate alignment and expansion options:\n\n```csharp\nvoid AddButton(string text, LayoutOptions options)\n{\n  var button = new Button\n  {\n    Text = text,\n    VerticalOptions = options,\n    HeightRequest = 20,\n    BackgroundColor = Color.White\n  };\n  button.Clicked += (sender, e) => { stackLayout.VerticalOptions = options; };\n\n  stackLayout.Children.Add(button);\n  stackLayout.Children.Add(new BoxView\n  {\n    BackgroundColor = Color.Yellow,\n    HeightRequest = 1\n  });\n}\n\nstackLayout.Spacing = 2;\nstackLayout.Padding = 2;\nstackLayout.BackgroundColor = Color.Gray;\nstackLayout.VerticalOptions = LayoutOptions.Start;\n\nAddButton(\"Start\", LayoutOptions.Start);\nAddButton(\"Center\", LayoutOptions.Center);\nAddButton(\"End\", LayoutOptions.End);\nAddButton(\"Fill\", LayoutOptions.Fill);\nAddButton(\"StartAndExpand\", LayoutOptions.StartAndExpand);\nAddButton(\"CenterAndExpand\", LayoutOptions.CenterAndExpand);\nAddButton(\"EndAndExpand\", LayoutOptions.EndAndExpand);\nAddButton(\"FillAndExpand\", LayoutOptions.FillAndExpand);\n```\n\n## Setting Alignment\n\nAlignment controls how a view is positioned within its parent view when the parent view contains unused space (that is, the parent view is larger than the combined size of all of its children).\n\n> ℹ️  When all the space in a parent view is used, the alignment options have no effect.\n\n\n### Start\n\n`LayoutOptions.Start` is used to define a `View` that will appear at the start of its parent. For horizontal alignment, this positions the `View` on the left hand side of the parent `View`, and for vertical alignment, it positions the `View` at the top of the parent `View`.\n\nClicking the *Start* `Button` vertically aligns `StackLayout` and `Button` instances using `LayoutOptions.Start`. This layout occurs because the `StackLayout` is vertically aligned to the top of the parent `View`. However, setting each `Button.VerticalOptions` property to a different `LayoutOptions` value has no additional effect because the `StackLayout` does not contain any unused space.\n\n### Center\n\n`LayoutOptions.Center` is used to define a `View` that will appear centered in its parent. The `View` is horizontally or vertically centered.\n\nClicking the *Center* `Button` vertically aligns the `StackLayout` and `Button` instances using `LayoutOptions.Center`. This layout occurs because the `StackLayout` is vertically aligned to the center of the parent `View`. However, setting each `Button.VerticalOptions` property to a different `LayoutOptions` value has no additional effect because the `StackLayout` does not contain any unused space.\n\n### End\n\n`LayoutOptions.End` is used to define a `View` that will appear at the end of its parent. For horizontal alignment, this positions the `View` on the right hand side of the parent `View`, and for vertical alignment, it positions the `View` at the bottom of the parent `View`.\n\nClicking the *End* `Button` vertically aligns the `StackLayout` and `Button` instances using `LayoutOptions.End`. This layout occurs because the `StackLayout` is vertically aligned to the bottom of the parent `View`. However, setting each `Button.VerticalOptions` property to a different `LayoutOptions` value has no additional effect because the `StackLayout` does not contain any unused space.\n\n### Fill\n\n`LayoutOptions.Fill` is used to define a `View` that will occupy the full size of its parent. For horizontal alignment, this ensures that the `View` will fill the width of the parent `View`, and for vertical alignment, it ensures that the `View` will fill the height of the parent `View`.\n\nClicking the *Fill* `Button` vertically aligns the `StackLayout` and `Button` instances using `LayoutOptions.Fill`. This layout occurs because the `StackLayout` is vertically aligned to fill the height of the parent `View`. Setting each `Button.VerticalOptions` property to a different `LayoutOptions` value results in different `Button` alignments, because the `StackLayout` is larger than the combined requested size of its children. Therefore, each `Button` uses its vertically specified `LayoutOptions` behavior.\n\n## Expansion\n\nExpansion controls whether a view will occupy more space if available. If a parent view contains unused space (that is, the parent view is larger than the combined size of all of its children), the unused space is given to any child views that use the `AndExpand` suffix.\n\n> ℹ️  When all the space in a parent view is used, the expansion options have no effect.\n\n\n### StartAndExpand\n\n`LayoutOptions.StartAndExpand` is used to define a `View` that will appear at the start of its parent, and that will expand to occupy more space if available.\n\nClicking the *StartAndExpand* `Button` vertically aligns the `StackLayout` and `Button` instances using `LayoutOptions.StartAndExpand`. This layout occurs because the `StackLayout` is vertically aligned to the top of the parent `View`, but expansion doesn't occur because the parent view isn't larger than its children. Setting each `Button.VerticalOptions` property to a different `LayoutOptions` value has no additional effect because the `StackLayout` does not contain any unused space.\n\n### CenterAndExpand\n\n`LayoutOptions.CenterAndExpand` is used to define a `View` that will appear centered in its parent, and that will expand to occupy more space if available.\n\nClicking the *CenterAndExpand* `Button` vertically aligns the `StackLayout` and `Button` instances using `LayoutOptions.CenterAndExpand`. This layout occurs because the `StackLayout` is vertically aligned to the center of the parent `View`, but expansion doesn't occur because the parent view isn't larger than its children. Setting each `Button.VerticalOptions` property to a different `LayoutOptions` value has no additional effect because the `StackLayout` does not contain any unused space.\n\n### EndAndExpand\n\n`LayoutOptions.EndAndExpand` is used to define a `View` that will appear at the end of its parent, and that will expand to occupy more space if available.\n\nClicking the *EndAndExpand* `Button` vertically aligns the `StackLayout` and `Button` instances using `LayoutOptions.EndAndExpand`. This layout occurs because the `StackLayout` is vertically aligned to the bottom of the parent `View`, but expansion doesn't occur because the parent view isn't larger than its children. Setting each `Button.VerticalOptions` property to a different `LayoutOptions` value has no additional effect because the `StackLayout` does not contain any unused space.\n\n### FillAndExpand\n\n`LayoutOptions.FillAndExpand` is used to define a `View` that will occupy the full size of its parent, and that will expand to occupy more space if available.\n\nClicking the *FillAndExpand* `Button` vertically aligns the `StackLayout` and `Button` instances using `LayoutOptions.FillAndExpand`. This layout occurs because the `StackLayout` is vertically aligned to fill the height of the parent `View`. Setting each `Button.VerticalOptions` property to a different `LayoutOptions` value results in different `Button` alignments, because the `StackLayout` is larger than the combined requested size of its children. Therefore, additional space is uniformly given to all the `Button` controls with the `AndExpand` suffix, with the alignment of the `Button` within its space being controlled by its `LayoutOptions` value.\n\n## 👍 Try it now!\n\n* Set alignment and expansion options for a simple layout that sets `HorizontalOptions` properties.\n\n## Further Reading\n\nFor more information about the `LayoutOptions` structure see [LayoutOptions](https://developer.xamarin.com/guides/xamarin-forms/user-interface/layouts/layout-options/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/listview/ListView.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 2e681a85-d259-48cd-bda0-2dc4541ee184\ntitle: Xamarin.Forms ListView\nplatforms:\n- Android\n- iOS\npackages:\n- id: Newtonsoft.Json\n  version: 11.0.1\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Xamarin.Forms ListView with Json\n\n...borrowing some ideas from James Montemagno’s [sample](https://github.com/jamesmontemagno/MonkeysApp-AppIndexing \"Monkey Sample App\")\n\n## 1. Add references\n\nStart by adding the references that we need to the NuGet packages installed in the workbook:\n\n```csharp\n#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Platform\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Newtonsoft.Json\"\n```\n\n## 2. We need `using` statements too\n\n```csharp\nusing Xamarin.Forms;\nusing Xamarin.Forms.Platform;\n```\n\n## 3. Create the ContentPage\n\nWorkbooks has already initialized Xamarin.Forms, so `Application.Current.MainPage` can be set directly.\n\n```csharp\npublic class MonkeyPage : ContentPage\n{\n    public ListView MonkeyList { get; set; }\n    public MonkeyPage () {\n        Title = \"Monkey List\";\n        MonkeyList = new ListView();\n        Content = MonkeyList;\n    }\n}\n\nvar monkeyPage = new MonkeyPage();\nApplication.Current.MainPage = monkeyPage;\n```\n\n## 4. Grab the monkey data from GitHub\n\n```csharp\nusing Newtonsoft.Json;\nusing System.Net.Http;\n\npublic class Monkey\n{\n\tpublic string Name { get; set; }\n\tpublic string Location { get; set; }\n\tpublic string Details { get; set; }\n\tpublic string Image { get; set; }\n\tpublic int Population { get; set; }\n}\n\nvar client = new HttpClient();\nvar json = await client.GetStringAsync (\"https://raw.githubusercontent.com/jamesmontemagno/MonkeysApp-AppIndexing/master/MonkeysApp/monkeydata.json\");\nvar monkeys = JsonConvert.DeserializeObject<List<Monkey>>(json);\n```\n\n## 5. Bind the data to the list ListView\n\nUse the built-in `ImageCell` template and assigning properties from the monkey model:\n\n```csharp\nvar dt = new DataTemplate(typeof(ImageCell));\ndt.SetBinding(TextCell.TextProperty, \"Name\");\ndt.SetBinding(ImageCell.DetailProperty, \"Location\");\ndt.SetBinding(ImageCell.ImageSourceProperty, \"Image\");\nmonkeyPage.MonkeyList.ItemTemplate = dt;\nmonkeyPage.MonkeyList.ItemsSource = monkeys;\n```\n\n## 6. Now we see a list of monkeys and their pictures!"
  },
  {
    "path": "xamarin-forms/user-interface/listview/ListView1-android.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: Android\npackages:\n- id: Newtonsoft.Json\n  version: 8.0.3\n- id: Xamarin.Forms\n  version: 2.2.0.31\n---\n\n# Xamarin.Forms REST —> ListView\n\n> ⚠️ This workbook is deprecated - see **Listview.workbook** instead\n\n## A little hack to demo Xamarin.Forms on iOS with Workbooks...\n\n...borrowing some ideas from James Montemagno’s [sample](https://github.com/jamesmontemagno/MonkeysApp-AppIndexing \"Monkey Sample App\")\n\n### Wire up a Xamarin.Forms app\n\n1) Start by importing the Nugets for Xamarin.Forms and the iOS Platform Renderers (and Json.Net for some parsing later on):\n\n```csharp\n#r \"Xamarin.Forms.Platform.iOS\"\n#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n#r \"Newtonsoft.Json\"\n```\n\n2) We need `using` statements too:\n\n```csharp\nusing Xamarin.Forms;\nusing Xamarin.Forms.Platform.iOS;\n```\n\n3) Set up a simple page with an exposed property to edit (in this case, a `ListView` which will be populated later):\n\n```csharp\npublic class MyPage : ContentPage\n{\n\tpublic ListView MyList {get;set;}\n\tpublic MyPage ()\n\t{\n\t\tTitle = \"A test\";\n\n\t\tMyList = new ListView (); // no data yet, though\n\n\t\tContent = MyList;\n\t}\n}\n```\n\n4) Ok great - but we can’t see anything! Oh, we need to bootstrap the Xamarin.Forms app object too:\n\n```csharp\npublic class App : Application\n{\n\tpublic MyPage Page {get;set;}\n\tpublic App ()\n\t{\n\t\tPage = new MyPage();\n\t\tMainPage = new NavigationPage (Page);\n\t}\n}\n```\n\n5) Now - here comes the “hack” - sneakily bypass requiring the `FormsApplicationDelegate` subclass (thank goodness it’s [open source](https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Platform.iOS/FormsApplicationDelegate.cs \"open source\")) and just set the iOS root view controller directly:\n\n```csharp\nXamarin.Forms.Forms.Init();\nvar a = new App();\nKeyWindow.RootViewController = a.MainPage.CreateViewController();\n```\n\n⚠️ *YMMV with some Xamarin.Forms features when hacking forms to start-up like this*\\\n*BE WARNED!*\n\n### Getting the Monkey Data\n\n6) Now we have a Xamarin.Forms app, page, and listview - but no data! Because the monkey data lives in a Json file on the internet, we’re going to need some additional namespaces (and a Monkey model class):\n\n```csharp\nusing Newtonsoft.Json;\nusing System.Net;\n\npublic class Monkey\n{\n\tpublic string Name { get; set; }\n\tpublic string Location { get; set; }\n\tpublic string Details { get; set; }\n\tpublic string Image { get; set; }\n\tpublic int Population { get; set; }\n}\n```\n\n7) Now let’s grab that monkey data from github - the Json file is downloaded and deserialized in just a few lines of code:\n\n```csharp\nWebClient client = new WebClient();\nvar response = client.DownloadData (\"https://raw.githubusercontent.com/jamesmontemagno/MonkeysApp-AppIndexing/master/MonkeysApp/monkeydata.json\"); // GET\nvar json = System.Text.Encoding.UTF8.GetString(response);\nvar monkeys = JsonConvert.DeserializeObject<List<Monkey>>(json);\n```\n\n8) Now bind that data to the listview - using the built-in `ImageCell` data template - and assigning properties from the monkey model to the Text, Detail, and ImageSource properties of the cell:\n\n```csharp\na.Page.MyList.ItemTemplate = new DataTemplate(typeof(ImageCell));\na.Page.MyList.ItemTemplate.SetBinding(TextCell.TextProperty, \"Name\");\na.Page.MyList.ItemTemplate.SetBinding(ImageCell.DetailProperty, \"Location\");\na.Page.MyList.ItemTemplate.SetBinding(ImageCell.ImageSourceProperty, \"Image\");\na.Page.MyList.ItemsSource = monkeys;\n```\n\n9) And now the iOS app is populated with a list of monkeys! One last thing, update the app title\n\n```csharp\na.Page.Title = \"Monkeys!\";\n```\n\n### The End Result\n\n(for static-content view)\n\n![finished app](Screenshots/ListView1.png)\n"
  },
  {
    "path": "xamarin-forms/user-interface/listview/ListView1-ios.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatform: iOS\npackages:\n- id: Newtonsoft.Json\n  version: 8.0.3\n- id: Xamarin.Forms\n  version: 2.2.0.31\n---\n\n# Xamarin.Forms REST —> ListView\n\n> ⚠️ This workbook is deprecated - see **Listview.workbook** instead\n\n## A little hack to demo Xamarin.Forms on iOS with Workbooks...\n\n...borrowing some ideas from James Montemagno’s [sample](https://github.com/jamesmontemagno/MonkeysApp-AppIndexing \"Monkey Sample App\")\n\n### Wire up a Xamarin.Forms app\n\n1. Start by importing the Nugets for Xamarin.Forms and the iOS Platform Renderers (and Json.Net for some parsing later on):\n\n```csharp\n#r \"Xamarin.Forms.Platform.iOS\"\n#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n#r \"Newtonsoft.Json\"\n```\n\n1. We need `using` statements too:\n\n```csharp\nusing Xamarin.Forms;\nusing Xamarin.Forms.Platform.iOS;\n```\n\n1. Set up a simple page with an exposed property to edit (in this case, a `ListView` which will be populated later):\n\n```csharp\npublic class MyPage : ContentPage\n{\n\tpublic ListView MyList {get;set;}\n\tpublic MyPage ()\n\t{\n\t\tTitle = \"A test\";\n\n\t\tMyList = new ListView (); // no data yet, though\n\n\t\tContent = MyList;\n\t}\n}\n```\n\n1. Ok great - but we can’t see anything! Oh, we need to bootstrap the Xamarin.Forms app object too:\n\n```csharp\npublic class App : Application\n{\n\tpublic MyPage Page {get;set;}\n\tpublic App ()\n\t{\n\t\tPage = new MyPage();\n\t\tMainPage = new NavigationPage (Page);\n\t}\n}\n```\n\n1. Now - here comes the “hack” - sneakily bypass requiring the `FormsApplicationDelegate` subclass (thank goodness it’s [open source](https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Platform.iOS/FormsApplicationDelegate.cs \"open source\")) and just set the iOS root view controller directly:\n\n```csharp\nXamarin.Forms.Forms.Init();\nvar a = new App();\nKeyWindow.RootViewController = a.MainPage.CreateViewController();\n```\n\n⚠️ *YMMV with some Xamarin.Forms features when hacking forms to start-up like this*\\\n*BE WARNED!*\n\n### Getting the Monkey Data\n\n1. Now we have a Xamarin.Forms app, page, and listview - but no data! Because the monkey data lives in a Json file on the internet, we’re going to need some additional namespaces (and a Monkey model class):\n\n```csharp\nusing Newtonsoft.Json;\nusing System.Net;\n\npublic class Monkey\n{\n\tpublic string Name { get; set; }\n\tpublic string Location { get; set; }\n\tpublic string Details { get; set; }\n\tpublic string Image { get; set; }\n\tpublic int Population { get; set; }\n}\n```\n\n1. Now let’s grab that monkey data from github - the Json file is downloaded and deserialized in just a few lines of code:\n\n```csharp\nWebClient client = new WebClient();\nvar response = client.DownloadData (\"https://raw.githubusercontent.com/jamesmontemagno/MonkeysApp-AppIndexing/master/MonkeysApp/monkeydata.json\"); // GET\nvar json = System.Text.Encoding.UTF8.GetString(response);\nvar monkeys = JsonConvert.DeserializeObject<List<Monkey>>(json);\n```\n\n1. Now bind that data to the listview - using the built-in `ImageCell` data template - and assigning properties from the monkey model to the Text, Detail, and ImageSource properties of the cell:\n\n```csharp\na.Page.MyList.ItemTemplate = new DataTemplate(typeof(ImageCell));\na.Page.MyList.ItemTemplate.SetBinding(TextCell.TextProperty, \"Name\");\na.Page.MyList.ItemTemplate.SetBinding(ImageCell.DetailProperty, \"Location\");\na.Page.MyList.ItemTemplate.SetBinding(ImageCell.ImageSourceProperty, \"Image\");\na.Page.MyList.ItemsSource = monkeys;\n```\n\n1. And now the iOS app is populated with a list of monkeys! One last thing, update the app title\n\n```csharp\na.Page.Title = \"Monkeys!\";\n```\n\n### The End Result\n\n\\(for static-content view)\n\n![finished app](Screenshots/ListView1.png)\n\n"
  },
  {
    "path": "xamarin-forms/user-interface/map/map.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n#r \"Xamarin.Forms.Maps\"\n\nusing System;\nusing Xamarin.Forms;\nusing Xamarin.Forms.Maps;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/map/map.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 1E3C44B6-F2D5-4471-9F76-9AF54305E9E1\ntitle: Displaying a Map with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n- id: Xamarin.Forms.Maps\n  version: 2.5.0.121934\n---\n\n# Displaying a Map\n\nThe Xamarin.Forms `Map` view displays a map using the native map for the platform. This provides a fast, familiar maps experience for users.\n\n## Initializing the Workbook\n\nTo use maps in Xamarin Workbooks, you must:\n\n* Add the `Xamarin.Forms.Maps` NuGet package to the Workbook.\n* Use the `#r` command to reference the `Xamarin.Forms.Maps` and `Xamarin.Forms.Maps.iOS` assemblies.\n* Add a `using` directive to reference the `Xamarin.Forms.Maps` assembly.\n* Call the `Xamarin.FormsMaps.Init` method, after the `Xamarin.Forms.Forms.Init` method, to initialize `Xamarin.Forms.Maps`.\n\nThese steps have been performed in this workbook.\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\nusing Xamarin.Forms.Maps;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Adding a Map to a Page\n\nAn instance of the `Map` class is created to display a map:\n\n```csharp\nvar map = new Map(\n  MapSpan.FromCenterAndRadius(\n    new Position(37.8044866, -122.4324132),\n    Distance.FromMiles(0.3)))\n{\n  IsShowingUser = false\n};\nstackLayout.Children.Add(map);\n```\n\nA `MapSpan` represents a circular region on a `Map`. Supplying a `MapSpan` instance to the `Map` constructor sets the initial view (center point and zoom level) of the map when it's loaded. In addition, the `IsShowingUser` property controls whether the `Map` is showing the user's current location.\n\nThe `Position` structure stores latitude and longitude as `double` values. The `Distance` structure contains a number of methods that can be used to set the zoom level of the map. In this case, the `Distance.FromMiles` method is used.\n\n## Changing the Map Type\n\nThe `MapType` property of the `Map` class can be set to a value of the `MapType` enumeration to change the display style of the `Map`:\n\n```csharp\nmap.MapType = MapType.Satellite;\n```\n\nThe values of the `MapType` enumeration are:\n\n* `Hybrid` – a map that combines satellite imagery and street data.\n* `Satellite` – a map that contains satellite imagery.\n* `Street` – a map that contains street data. This is the default value.\n\n## Adding Pins\n\nA location can be marked on the `Map` with a `Pin` instance, which is added to the `Pins` collection of the `Map` class:\n\n```csharp\nvar pin = new Pin\n{\n  Type = PinType.Place,\n  Position = new Position(37.8044866, -122.4324132),\n  Label = \"Pin Title Goes Here\",\n  Address = \"Pin Address Goes Here\"\n};\nmap.Pins.Add(pin);\n```\n\nThe `Pin` instance specifies the data required to display the pin on the `Map`. The values of the `PinType` enumeration are:\n\n* `Generic` – a generic pin.\n* `Place` – a pin for a place.\n* `SavedPin` – a pin for a saved location.\n* `SearchResult` – a pin for a search result.\n\n## Changing the Map Position and Zoom Level\n\nThe `MoveToRegion` method of the `Map` class can be used to change the position and zoom level of the map:\n\n```csharp\nvar slider = new Slider(1, 18, 1);\nslider.ValueChanged += (sender, e) =>\n{\n  var zoomLevel = e.NewValue; // between 1 and 18\n  var latLongDegrees = 360 / (Math.Pow(2, zoomLevel));\n  map.MoveToRegion(\n    new MapSpan(map.VisibleRegion.Center, latLongDegrees, latLongDegrees));\n};\nstackLayout.Children.Insert(0, slider);\n```\n\nHere, the zoom level of the map is changed as the slider moves, without altering the location. This is achieved creating a new `MapSpan` using the current location from the `VisibleRegion.Center` property of the `Map` class.\n\n## 👍 Try it now!\n\n* Set the `Map` instance to a zoom level of 1 kilometer.\n\n* Change the `Map` instance to display hybrid map data.\n\n* Set the `Map` position to a location in another continent.\n\n## Further Reading\n\nFor more information about displaying a map, see [Map Control](https://developer.xamarin.com/guides/xamarin-forms/user-interface/map/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/margins-padding/margins-and-padding/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/margins-padding/margins-and-padding/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.3.2.127\n---\n\n# Controlling Layout Behavior with Margins and Padding\n\nThe `Margin` and `Padding` properties control layout behavior when an element is rendered in the user interface.\n\nThe `Margin` property represents the distance between an element and its adjacent elements, and is used to control the element's rendering position, and the rendering position of its neighbors. `Margin` values can be specified on [layout](https://developer.xamarin.com/guides/xamarin-forms/controls/layouts/) and [view](https://developer.xamarin.com/guides/xamarin-forms/controls/views/) classes.\n\nThe `Padding` property represents the distance between an element and its child elements, and is used to separate the control from its own content. `Padding` values can be specified on [layout](https://developer.xamarin.com/guides/xamarin-forms/controls/layouts/) classes.\n\nThe following diagram illustrates the two concepts:\n\n![](margins-and-padding.png)\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit-iOS.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Specifying a Thickness\n\nThe `Margin` and `Padding` properties are both of type `Thickness`. A `Thickness` structure can be created using three constructor overloads:\n\n```csharp\nstackLayout.Padding = new Thickness(0, 20, 0, 0);\nvar label1  = new Label {\n  Text = \"Xamarin.Forms\",\n  Margin = new Thickness(20)\n};\nvar label2  = new Label {\n  Text = \"Xamarin.iOS\",\n  Margin = new Thickness(10, 25)\n};\nvar label3  = new Label {\n  Text = \"Xamarin.Android\",\n  Margin = new Thickness(0, 20, 15, 5)\n};\nstackLayout.Children.Add(label1);\nstackLayout.Children.Add(label2);\nstackLayout.Children.Add(label3);\n```\n\n> ⚠️ `Thickness` values can be negative, which typically clips or overdraws the content.\n\n\n## 👍 Try it now!\n\n* Change the `label` instances to all use the `Thickness` constructor that specifies a single value.\n\n## Further Reading\n\nFor more information about the `Margin` and `Padding` properties, see [Margin and Padding](https://developer.xamarin.com/guides/xamarin-forms/user-interface/layouts/margin-and-padding/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/meta.json",
    "content": "{\n  \"order\":{\n    \"alerts/alerts.workbook\":\"Alert\",\n    \"button/button.workbook\":\"Button\",\n    \"editor/editor.workbook\":\"Editor\",\n    \"entry/entry.workbook\":\"Entry\",\n    \"image/image.workbook\":\"Image\",\n    \"label/label.workbook\":\"Label\",\n    \"layout-options/layout-options.workbook\":\"Layout Options\",\n    \"listview/ListView.workbook\":\"ListView\",\n    \"map/map.workbook\":\"Map\",\n    \"margins-padding/margins-and-padding/index.workbook\":\"Margins & Padding\",\n    \"picker/picker.workbook\":\"Picker\",\n    \"slider/slider.workbook\":\"Slider\",\n    \"stacklayout/stacklayout.workbook\":\"Stack Layout\",\n    \"switch/switch.workbook\":\"Switch\",\n    \"tabbedpage/tabbedpage.workbook\":\"Tabbed Page\",\n    \"webview/webview.workbook\":\"Web View\",\n    \"xaml/LoadXaml.workbook\":\"Loading XAML in Workbooks\"\n  }\n}\n"
  },
  {
    "path": "xamarin-forms/user-interface/picker/picker.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/picker/picker.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 959F41D8-3A09-4D6C-A3F6-19C4C9108925\ntitle: Xamarin.Forms Picker\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n\n# Selecting Items with a Picker\n\nThe Xamarin.Forms `Picker` view is used for selecting an item from a list.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Creating a Picker\n\nA `Picker` is created as follows:\n\n```\nvar picker = new Picker\n{\n  Title = \"Choose a Color\"\n};\nstackLayout.Children.Add(picker);\n```\n\nThe `Title` property value should instruct the user what action to perform with the `Picker` view, and will be displayed prior to the user selecting an item from the list.\n\n## Populating the Picker with Items\n\nThe items displayed by a `Picker` are set by populating the `Items` collection with data:\n\n```csharp\nvar colors = new List<string>\n{\n  \"Black\", \"Gray\", \"Silver\", \"White\",\n  \"Red\", \"Maroon\", \"Yellow\", \"Olive\",\n  \"Lime\", \"Green\", \"Aqua\", \"Teal\",\n  \"Blue\", \"Navy\", \"Fuchsia\", \"Purple\", \"Pink\"\n};\n\nforeach (string color in colors)\n{\n  picker.Items.Add(color);\n}\n```\n\nThis populates the `Picker` with a list of color names.\n\n## Responding to an Item being Selected\n\nIn order to demonstrate responding to an item being selected from the `Picker`, a `BoxView` is added to the page:\n\n```csharp\nvar boxView = new BoxView\n{\n  HeightRequest = 150,\n  WidthRequest = 150,\n  HorizontalOptions = LayoutOptions.Center,\n  VerticalOptions = LayoutOptions.CenterAndExpand\n};\nstackLayout.Children.Add(boxView);\n```\n\nThe `SelectedIndexChanged` event fires when the user selects an item from the `Picker`. This event should be handled to perform the desired response:\n\n```csharp\nvar colorTypeConverter = new ColorTypeConverter();\n\npicker.SelectedIndexChanged += (sender, args) =>\n{\n  boxView.Color = (Color)colorTypeConverter\n    .ConvertFromInvariantString(picker.Items[picker.SelectedIndex]);\n}\n```\n\nWhen the user selects the name of a color from the `Picker`, the `BoxView` is set to that color. The name of the selected color is retrieved from the `Items` collection by using the `SelectedIndex` property value. The value of this property ranges from 0 to 1 less than the number of items in the `Items` collection. The retrieved color name is then converted to a `Color` instance using the `ColorTypeConverter` class, which is built into Xamarin.Forms.\n\n## 👍 Try it now!\n\n* Create a `Dictionary<string, Color>` that contains a list of color names and corresponding color values.\n\n* Populate the `Items` collection of the `Picker` with the `Dictionary` key values.\n\n* Update the `SelectedIndexChanged` event handler so that the correct `Color` value is retrieved from the `Dictionary` for the selected item.\n\n## Further Reading\n\nFor more information about the `Picker` view, see [Picker Class](https://developer.xamarin.com/api/type/Xamarin.Forms.Picker/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/slider/slider.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/slider/slider.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: AE1F68C3-17C6-440F-9F4B-C11413115334\ntitle: Xamarin.Forms Sliders\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n\n# Changing A Color Value with Sliders\n\nThe Xamarin.Forms `Slider` view is used to input a range of values.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Initializing Sliders\n\nA `Slider` is initialized with its minimum and maximum values, and its initial value. To use a slider, initialize it with a range of values, starting with the `Minimum`, and an intial `Value`:\n\n```csharp\nvar colorLabel = new Label {\n    Text = \"Use the sliders to change the text color\"\n};\n\nvar redSlider = new Slider {\n    Minimum = 0,\n    Maximum = 255,\n    Value = 0\n};\nvar greenSlider = new Slider {\n    Minimum = 0,\n    Maximum = 255,\n    Value = 0\n};\nvar blueSlider = new Slider {\n    Minimum = 0,\n    Maximum = 255,\n    Value = 0\n};\n\nstackLayout.Children.Add(colorLabel);\nstackLayout.Children.Add(redSlider);\nstackLayout.Children.Add(greenSlider);\nstackLayout.Children.Add(blueSlider);\n```\n\n\n## Getting the Slider Value\n\nThe 'Slider' view raises a `ValueChanged` event when the `Value` property is changed by the user. To respond to changes in the slider value, implement and add a handler for this event:\n\n```csharp\nvoid updateColor(object sender, EventArgs e) {\n    var r = redSlider.Value/255.0;\n    var g = greenSlider.Value/255.0;\n    var b = blueSlider.Value/255.0;\n    colorLabel.TextColor = Color.FromRgb(r, g, b);\n}\n\nredSlider.ValueChanged += updateColor;\ngreenSlider.ValueChanged += updateColor;\nblueSlider.ValueChanged += updateColor;\n```\n\n## 👍 Try it now!\n\n* Change the `colorLabel` text value to display the R, G, and B values.\n"
  },
  {
    "path": "xamarin-forms/user-interface/stacklayout/stacklayout.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/stacklayout/stacklayout.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: C0BF140E-EF37-43B8-B0E2-35645D0800F3\ntitle: Xamarin.Forms StackLayout\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n\n# Using a StackLayout\n\nThe Xamarin.Forms `StackLayout` is used to arrange views linearly, either horizontally or vertically. View position and size within the layout is based on a view's `HeightRequest`, `WidthRequest`, `HorizontalOptions`, and `VerticalOptions` property values.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Creating a Vertical StackLayout\n\nA vertical layout is the default layout when creating a `StackLayout`:\n\n```csharp\nvar verticalStackLayout = new StackLayout\n{\n  Margin = new Thickness(20),\n  Children =\n  {\n    new Label\n    {\n      Text = \"StackLayout Demo\",\n      FontAttributes = FontAttributes.Bold,\n      HorizontalOptions = LayoutOptions.Center\n    },\n    new Entry\n    {\n      Placeholder = \"Enter text here\"\n    },\n    new Button\n    {\n      Text = \"This Button does nothing\"\n    }\n  }\n};\npage.Content = verticalStackLayout;\n```\n\nThis `StackLayout` lays out its child views in a vertical stack. The child views are contained in the `Children` collection of the `StackLayout`.\n\n## Creating a Horizontal StackLayout\n\nA horizontal layout can be achieved by setting the `Orientation` property of a `StackLayout`:\n\n```csharp\nvar horizontalStackLayout = new StackLayout\n{\n  Orientation = StackOrientation.Horizontal,\n  Margin = new Thickness(20),\n  Children =\n  {\n    new Label\n    {\n      Text = \"Enter name:\",\n      Margin = new Thickness(0, 5, 0, 0)\n    },\n    new Entry\n    {\n      Placeholder = \"Enter name here\",\n      VerticalOptions = LayoutOptions.Start\n    }\n  }\n};\npage.Content = horizontalStackLayout;\n```\n\nThis `StackLayout` lays out its child views in a horizontal stack.\n\n## Nesting StackLayout Instances\n\nMore complex layouts can be achieved by nesting `StackLayout` instances:\n\n```csharp\npage.Content = null;\nvar stackLayout = new StackLayout\n{\n  Margin = new Thickness(0, 20, 0, 0),\n  Children =\n  {\n    new Label\n    {\n      Text = \"StackLayout Demo\",\n      FontAttributes = FontAttributes.Bold,\n      HorizontalOptions = LayoutOptions.Center\n    },\n    horizontalStackLayout\n  }\n};\npage.Content = stackLayout;\n```\n\nThis code nests a horizontal `StackLayout` inside a vertical `StackLayout`.\n\n## Adding Views to an Existing StackLayout\n\nViews can be added to a `StackLayout` after it has been instantiated:\n\n```csharp\nvar button = new Button\n{\n  Text = \"This Button does nothing\"\n};\nstackLayout.Children.Add(button);\n```\n\nThis code adds a `Button` instance to the bottom of a vertical `StackLayout`.\n\n## Controlling Spacing\n\nBy default, a `StackLayout` will add a 6px margin between views. This can be changed by setting the `Spacing` property:\n\n```csharp\nstackLayout.Spacing = 20;\nhorizontalStackLayout.Spacing = 20;\n```\n\nThis code results in an increased spacing between views in each `StackLayout`.\n\n## Controlling Positioning and Sizing\n\nViews in a `StackLayout` can be positioned by specifying `HorizontalOptions` and `VerticalOptions` property values. The following `LayoutOptions` values define how views will position themselves relative to the layout:\n\n* `Start` – places the view at the start of the layout.\n\n* `Center` – centers the view within the layout.\n\n* `End` – places the view at the end of the layout (bottom or right-most boundary).\n\n* `Fill` – places the view so that it has no padding.\n\nThe size of a view in a `StackLayout` depends on the `HeightRequest`, `WidthRequest`, `HorizontalOptions`, and `VerticalOptions` property values. The following `LayoutOptions` values will result in views taking up as much space as is available from the layout:\n\n* `StartAndExpand` – places the view at the start of the layout, and takes up as much space as the layout will give it.\n\n* `CenterAndExpand` – centers the view within the layout and expands it to take up as much space as the layout will give it.\n\n* `EndAndExpand` – places the view at the end of the layout (bottom or right-most boundary) and expands it to take up as much space as the layout will give it.\n\n* `FillAndExpand` – places the view so that it has no padding and takes up as much space as the layout will give it.\n\nFor examples of setting these `LayoutOption` values, see the Setting LayoutOptions workbook.\n\n## 👍 Try it now!\n\n* Create a horizontal `StackLayout` instance that asks the user to enter their forename.\n\n* Create a horizontal `StackLayout` instance that asks the user to enter their surname.\n\n* Create a vertical `StackLayout` instance, and add the two horizontal `StackLayout` instances to it.\n\n## Further Reading\n\nFor more information about `StackLayout`, see [StackLayout](https://developer.xamarin.com/guides/xamarin-forms/user-interface/layouts/stack-layout/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/switch/switch.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/switch/switch.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: BDEF46FA-E954-4F73-8C18-8D5505ADB6B0\ntitle: Xamarin.Forms Switches\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n\n# Binary Choices with Switches\n\nThe Xamarin.Forms `Switch` view allows a user to toggle between two states.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Initializing Switches\n\nA `Switch` is initialized with default values. To use a `Switch`, call the parameterless constructor and then set the `IsToggled` state property:\n\n```csharp\nvar stateLabel = new Label {\n    Text = \"Off\"\n};\n\nvar simpleSwitch = new Switch();\nsimpleSwitch.IsToggled = false;\n\nstackLayout.Children.Add(stateLabel);\nstackLayout.Children.Add(simpleSwitch);\n```\n## Handling `Toggled` Events\n\nAfter you have set the initial `IsToggled` state, create and assign a handler for the `Toggled` event:\n\n```csharp\nsimpleSwitch.Toggled += (o, e) => {\n    if (simpleSwitch.IsToggled == false) {\n       stateLabel.Text = \"Off\";\n    }\n    else {\n        stateLabel.Text = \"On\";\n    };\n};\n```\n\nNow the text of `stateLabel` should change when `simpleSwitch` is toggled.\n"
  },
  {
    "path": "xamarin-forms/user-interface/tabbedpage/tabbedpage.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new TabbedPage();\npage.Title = \"TabbedWorkbook\";\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/tabbedpage/tabbedpage.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: E73FB600-A386-495A-9D28-5F8163E62265\ntitle: Presenting Multiple Pages with Xamarin.Forms TabbedPage\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n\n# Presenting Multiple Pages with `TabbedPage`\n\nThe Xamarin.Forms `TabbedPage` view descends from `MultiPage<T>` and presents a number of pages in a tabbed layout.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Adding Pages to A `TabbedPage`\n\nA `TabbedPage` can be assigned to the `Application.MainPage` property to make it the view displays. Though `TabbedPage`s can be initialized when that they are created, the one for this workbook has been created, assigned to the application's main page, and stored in a convenience variable, called `page`. The code below creates an `AlphabetBeginning` class that extends from `ContentPage`, and then creates and adds two of them to the `TabbedPage`.\n\n```csharp\npublic class AlphabetBeginning : ContentPage\n{\n    public AlphabetBeginning(String title, String[] letters)\n    {\n        Title = title;\n        Content = new StackLayout\n        {\n            Margin = new Thickness(0, 20, 0, 0)\n        };\n\n        foreach (String letter in letters)\n        {\n            ((StackLayout)Content).Children.Add(new Label { Text = letter});\n        }\n    }\n}\n\npage.Children.Add(new AlphabetBeginning(\"English\", new string[] {\"A\", \"Bee\"}));\npage.Children.Add(new AlphabetBeginning(\"Greek\", new string[] {\"Alpha\", \"Beta\"}));\n```\n\n## Working with the Selected Page\n\nThe `TabbedPage` type inherits the `SelectedItem` property, so you can get or set the selected page:\n\n```csharp\nint nextIndex = page.Children.IndexOf(page.SelectedItem as ContentPage);\nnextIndex = (nextIndex +1) % page.Children.Count;\npage.SelectedItem = page.Children[nextIndex];\n```\n\n## 👍 Try it now!\n\n* Create and add a Hebrew AlphabetBeginning, which begins with Alef and Bet, in the code box below.\n\n```csharp\n// TODO: Create a Hebrew alphabet beginning\n// TODO: Add it to the TabbedPage\n```\n\n* Cycle through the pages to verify that the modulo arithmetic from above still works.\n"
  },
  {
    "path": "xamarin-forms/user-interface/webview/webview.workbook/FormsInit.csx",
    "content": "#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n\nusing System;\nusing Xamarin.Forms;\n\nvar page = new ContentPage();\nStackLayout stackLayout = new StackLayout { Margin = new Thickness(0, 20, 0, 0) };\npage.Content = stackLayout;\nApplication.Current.MainPage = page;"
  },
  {
    "path": "xamarin-forms/user-interface/webview/webview.workbook/index.workbook",
    "content": "---\nuti: com.xamarin.workbook\nid: 3B5760CA-367F-4A93-AF53-FB33006A3DE1\ntitle: Displaying Web Content with Xamarin.Forms\nplatforms:\n- Android\n- iOS\npackages:\n- id: Xamarin.Forms\n  version: 2.5.0.121934\n---\n\n# Displaying Web Content\n\nThe Xamarin.Forms `WebView` view displays web and HTML content in an application.\n\n## Initializing the Workbook\n\nIn order to run a Xamarin.Forms workbook, some initialization code must be executed:\n\n```csharp\n// The Xamarin.Forms initialization code isn't important to understanding this workbook\n#load \"FormsInit.csx\"\nusing Xamarin.Forms;\n```\n\nFor more information about the initialization code, see the Getting Started with Xamarin.Forms workbook.\n\n## Displaying a Website\n\nTo display a website from the internet, create a `WebView` instance and set its `Source` property to a URL:\n\n```csharp\nvar webView = new WebView\n{\n  Source = \"https://www.xamarin.com\"\n};\npage.Content = webView;\n```\n\n> ⚠️ In iOS 9 and greater, App Transport Security (ATS) enforces secure connections between internet resources (such as the app's back-end server) and the app, thereby preventing accidental disclosure of sensitive information. Since ATS is enabled by default in apps built for iOS 9 and greater, all connections will be subject to ATS security requirements. If connections do not meet these requirements, they will fail with an exception.\n> ATS can be opted out of if it is not possible to use the `HTTPS` protocol and secure communication for internet resources. This can be achieved by updating the app's **Info.plist** file. For more information see [App Transport Security](https://developer.xamarin.com/guides/ios/platform_features/introduction_to_ios9/ats/).\n\n## Displaying HTML Strings\n\nA `WebView` can display a HTML string by creating an instance of the `HtmlWebViewSource` type:\n\n```csharp\nvar htmlSource = new HtmlWebViewSource\n{\n  Html = @\"<html><body>\n           <h1>Xamarin.Forms</h1>\n           <p>Welcome to WebView.</p>\n           </body></html>\"\n};\nwebView.Source = htmlSource;\n```\n\n## Handling Navigation Programmatically\n\nA `WebView` supports programmatic access to forward and backward navigation:\n\n```csharp\npage.Content = null;\n\nvar buttonStackLayout = new StackLayout\n{\n  Orientation = StackOrientation.Horizontal,\n  Margin = new Thickness(10, 10)\n};\nvar backButton = new Button\n{\n  Text = \"Back\",\n  HorizontalOptions = LayoutOptions.StartAndExpand\n};\nbackButton.Clicked += (sender, e) =>\n{\n  if (webView.CanGoBack)\n    webView.GoBack();\n};\nvar forwardButton = new Button\n{\n  Text = \"Forward\",\n  HorizontalOptions = LayoutOptions.End\n};\nforwardButton.Clicked += (sender, e) =>\n{\n  if (webView.CanGoForward)\n    webView.GoForward();\n};\n\nbuttonStackLayout.Children.Add(backButton);\nbuttonStackLayout.Children.Add(forwardButton);\nstackLayout.Children.Add(buttonStackLayout);\nstackLayout.Children.Add(webView);\npage.Content = stackLayout;\n\nwebView.WidthRequest = 200;\nwebView.HeightRequest = 500;\nwebView.Source = \"https://www.xamarin.com\";\n```\n\nIf the `WebView.CanGoBack` property is `true`, the `WebView.GoBack` method will navigate to the last visited page when the `backButton` is clicked. If the `WebView.CanGoForward` property is `true`, the `WebView.GoForward` method will navigate forward to the next visited page when the `forwardButton` is clicked.\n\n> ℹ️  When placing a `WebView` inside a `StackLayout`, the `WebView` requires that `HeightRequest` and `WidthRequest` property values are specified, otherwise the `WebView` will not render.\n\n\n## Responding to Navigation\n\nA `WebView` raises two events to help you respond to navigation:\n\n* `Navigating` – raised when the `WebView` begins loading a new page.\n\n* `Navigated` – raised when the page is loaded and navigation has stopped.\n\nThese events can be utilized to provide a status indicator for web page loading:\n\n```csharp\nvar label = new Label {\n  Text = \"Loading...\",\n  HorizontalOptions = LayoutOptions.CenterAndExpand,\n  VerticalOptions = LayoutOptions.Center,\n  IsVisible = false\n};\nbuttonStackLayout.Children.Insert(1, label);\n\nwebView.Navigating += (sender, e) =>\n{\n  label.IsVisible = true;\n};\nwebView.Navigated += (sender, e) =>\n{\n  label.IsVisible = false;\n};\n```\n\nAny page navigation will cause the **Loading...** message to appear, and disappear once navigation has completed.\n\n## 👍 Try it now!\n\n* Make a `WebView` navigate to the Xamarin University website (`https://university.xamarin.com/`).\n\n* Make a `WebView` display a `Hello World` message in HTML.\n\n* Add a `WebView` to a `StackLayout` and ensure it renders correctly.\n\n## Further Reading\n\nFor more information about the `WebView` view, see [WebView](https://developer.xamarin.com/guides/xamarin-forms/user-interface/webview/).\n"
  },
  {
    "path": "xamarin-forms/user-interface/xaml/LoadXaml.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- iOS\npackages:\n- id: Newtonsoft.Json\n  version: 8.0.3\n- id: Xamarin.Forms.Dynamic\n  version: 0.1.18-pre\n- id: Xamarin.Forms\n  version: 2.3.3.166-pre4\n---\n\n# Xamarin.Forms XAML Workbook Demonstration (iOS)\n\nThere’s currently no way to import or reference XAML files from a Workbook,\nso it might seem impossible to use XAML in a demo... however with NuGet helper\nit is possible to use XAML in a Workbook.\n\n> 🚫 This isn't recommended for implementation in production applications, but may be useful to teach or demonstrate XAML concepts using Workbooks\n\n## Steps to use XAML\n\n*1.* Start by importing the NuGets for Xamarin.Forms and the iOS Platform Renderers\n\n```csharp\n#r \"Xamarin.Forms.Platform.iOS\"\n#r \"Xamarin.Forms.Core\"\n#r \"Xamarin.Forms.Xaml\"\n#r \"Xamarin.Forms.Platform\"\n```\n\nAnd for this hack to work, add the [Dynamic Xamarin Forms (preview)](http://www.cazzulino.com/dynamic-forms.html)\nNuGet (which contains the magic to load XAML from a string):\n\n```csharp\n#r \"Xamarin.Forms.Dynamic\"\n```\n\n*2.* Add the `using` statements next:\n\n```csharp\nusing Xamarin.Forms;\nusing Xamarin.Forms.Platform.iOS;\n```\n\n*3.* Write up a simple XAML `ContentPage`to render on iOS:\n\n```csharp\nstatic string xaml = @\"<?xml version='1.0' encoding='UTF-8' ?>\n<ContentPage xmlns='http://xamarin.com/schemas/2014/forms'\n    xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'\n    x:Class='XamlPage'\n    Title='Xaml Text' Padding='40'>\n    <StackLayout Orientation='Vertical'>\n\t\t<Label Text='Hello from XAML' x:Name='helloLabel'/>\n\t\t<BoxView Color='Blue' WidthRequest='300' HeightRequest='2' />\n\t</StackLayout>\n</ContentPage>\";\n```\n\n*4.* Bootstrap the Xamarin.Forms app object and and for the main page class, then use the **Dynamic Xamarin Forms** `LoadFromXaml` extension method to parse the `xaml` string:\n\n```csharp\npublic class App : Application\n{\n\tpublic ContentPage XamlPage {get;set;}\n\tpublic App ()\n\t{\n\t\tXamlPage = new ContentPage();\n\t\tXamlPage.LoadFromXaml (xaml); // loads XAML\n\n\t\tMainPage = XamlPage;\n\t}\n}\n```\n\n*5.* Finally, set the iOS root view controller directly (in a real Xamarin.Forms app, this would be taken care of by the `FormsApplicationDelegate` subclass):\n\n```csharp\nXamarin.Forms.Forms.Init();\nvar a = new App();\nKeyWindow.RootViewController = a.MainPage.CreateViewController();\n```\n\n## One More Thing...\n\nLoading XAML in this way does not allow strongly-typed access to the elements by their `x:Name`, instead they can only be referenced using `FindByName`as shown here to update the label:\n\n```csharp\nvar l = a.XamlPage.FindByName<Xamarin.Forms.Label>(\"helloLabel\");\nl.Text = \"Updated by the Workbook!\";\na.XamlPage.Content\n```"
  }
]